+
    G-jÁ  ã                   ó‚   € ^ RI Ht ^ RIHt ^ RIHt ^ RIHt ^ RIt	^ RI
HtHtHt ^ RIHt ]! ]4      t ! R R	4      tR# )
é    )Údefaultdict)ÚSequence)Ú	getLogger)ÚAnyN)Ú	NodeProtoÚTensorProtoÚhelper)Ú	OnnxModelc                   ó°   a € ] tR t^t o RtRV 3R lR lltV 3R lR ltV 3R lR ltR tRV 3R	 lR
 llt	V 3R lR lt
V 3R lR ltV 3R lR ltRtV tR# )ÚFusionz
Base class for Graph Fusion
c                óR   <€ V ^8„  d   QhRS[ RS[RS[S[S[,          ,          RS[/# )é   ÚmodelÚfused_op_typeÚsearch_op_typesÚdescription)r
   ÚstrÚlist)ÚformatÚ__classdict__s   "€Úu/Volumes/fast/ai/experiments/nudenet-smoke/.venv/lib/python3.14/site-packages/onnxruntime/transformers/fusion_base.pyÚ__annotate__ÚFusion.__annotate__   s;   ø€ ÷ 9ñ 9áð9ñ ð9ñ ™t¡C�y�ð	9ñ
 ñ9ó    c                óú   € \        V\        4      '       d   V.MTV n        W n        V'       d	   V R V R2MTV n        Wn        . V n        . V n        RV n        / V n	        RV n
        \        \        4      V n        R# )Ú(Ú)FN)Ú
isinstancer   r   r   r   r   Únodes_to_removeÚnodes_to_addÚprune_graphÚnode_name_to_graph_nameÚthis_graph_namer   ÚintÚfused_count)Úselfr   r   r   r   s   &&&&&r   Ú__init__ÚFusion.__init__   s{   € ô @JÈ/Ô[^×?_Ò?_¨?Ñ*;ÐetˆÔØ"/ÔßEP = /°°;°-¸qÑ AÐVcˆÔØ %Œ
Ø%'ˆÔØ"$ˆÔØ!&ˆÔØ-/ˆÔ$Ø+/ˆÔä(3´CÓ(8ˆÖr   c                ó    <€ V ^8„  d   QhRS[ /# )r   Úfused_op_name)r   )r   r   s   "€r   r   r   )   s   ø€ ÷ -ñ -©cñ -r   c                óD   € V P                   V;;,          ^,          uu&   R# )z'
Increase counter of a fused operator.
N)r%   )r&   r*   s   &&r   Úincrease_counterÚFusion.increase_counter)   s   € ð 	×Ñ˜×'¨1Õ,Õ'r   c                óh   <€ V ^8„  d   QhRS[ RS[S[S[S[ ,          3,          RS[S[S[ 3,          /# )r   ÚnodeÚinput_name_to_nodesÚoutput_name_to_node)r   Údictr   r   )r   r   s   "€r   r   r   /   s@   ø€ ÷ "ñ "áð"ñ "¡#¡t©I¥Ð"6Õ7ð"ñ "¡#¡y .Õ1ñ	"r   c                ó   € \         h)z,Interface for fusion that starts from a node)ÚNotImplementedError)r&   r/   r0   r1   s   &&&&r   ÚfuseÚFusion.fuse/   s
   € ô "Ð!r   c                óÔ  € \         P                  RV P                   R24       V P                  P	                  4       pV P                  P                  4       pV P                   Fr  pV P                  P                  V4       FP  pV P                  P                  V4      pVf   \        R4      hVP                  V n        V P                  WAV4       KR  	  Kt  	  V P                   Uu. uF  qDP                  NK  	  ppV P                  '       dJ   V P                  P!                  4        F*  w  rxV'       g   K  \         P#                  RV RV 24       K,  	  MGVP%                  V P&                  4      p	V	^ 8”  d&   \         P#                  RV P                   RV	 24       V P                  P)                  V P*                  4       V P                  P-                  V P                  V P.                  4       V P0                  '       d   V P                  P1                  4        R# V P*                  '       g   V P                  '       d   V P                  P3                  4        R# R# u upi )z}
Apply graph fusion on the whole model graph.
It searched nodes of given operators, and start fusion on each of those nodes.
zstart z
 fusion...NzCan not find node in any graphzFused z: )ÚloggerÚdebugr   r   r0   r1   r   Úget_nodes_by_op_typeÚget_graph_by_nodeÚ	ExceptionÚnamer#   r5   r    Úop_typer%   ÚitemsÚinfoÚcountr   Úremove_nodesr   Ú	add_nodesr"   r!   Úupdate_graph)
r&   r0   r1   Úsearch_op_typer/   ÚgraphÚop_listÚkeyÚvaluerA   s
   &         r   ÚapplyÚFusion.apply8   sÙ  € ô
 	�‰�v˜d×.Ñ.Ð/¨zÐ:Ô;Ø"Ÿj™j×<Ñ<Ó>ÐØ"Ÿj™j×<Ñ<Ó>Ðð #×2Ô2ˆNØŸ
™
×7Ñ7¸ÖG�ØŸ
™
×4Ñ4°TÓ:�Ø’=Ü#Ð$DÓEÐEØ',§z¡z�Ô$Ø—	‘	˜$Ð5HÖIó Hñ 3ð -1×,=Ò,=Ó>Ñ,= D—<”<Ñ,=ˆÐ>Ø××ÐØ"×.Ñ.×4Ñ4Ö6‘
�ß‘5Ü—K‘K &¨¨¨R°¨wÐ 7Ö8ò 7ð —M‘M $×"4Ñ"4Ó5ˆEØ�qŒyÜ—‘˜f T×%5Ñ%5Ð$6°b¸¸Ð@ÔAà�
‰
×Ñ × 4Ñ 4Ô5Ø�
‰
×Ñ˜T×.Ñ.°×0LÑ0LÔMà××ÐØ�J‰J×"Ñ"Ö$Ø×!×!Ð! T×%6×%6Ð%6Ø�J‰J×#Ñ#Ö%ñ &7ùò ?s   Ã(I%c          
      óH   <€ V ^8„  d   QhRS[ RS[RS[S[,          RS[RS[/# )r   r=   Ú	data_typeÚdimsÚvalsÚraw)r   r$   r   r   Úbool)r   r   s   "€r   r   r   \   s6   ø€ ÷ ñ ¡Cð ±Cð ¹xÉ½}ð ÑTWð Ñ^bñ r   c                ó¦  € V'       d‰   \        V\        P                  4      '       g=   \        P                  ! V4      p\        P
                  ! WFR 7      P                  4       pMVP                  4       p\        P                  ! VVVVRR7      pM\        P                  ! VVVVRR7      pV P                  P                  W€P                  4       V# ))ÚdtypeT)r=   rM   rN   rO   rP   F)r   ÚnpÚndarrayr	   Útensor_dtype_to_np_dtypeÚarrayÚtobytesÚmake_tensorr   Úadd_initializerr#   )	r&   r=   rM   rN   rO   rP   Únp_typeÚbytesÚtensors	   &&&&&&   r   rZ   ÚFusion.add_initializer\   s§   € ßÜ˜d¤B§J¡J×/Ò/Ü ×9Ò9¸)ÓD�ÜŸš Ô5×=Ñ=Ó?‘àŸ™›�Ü×'Ò'ØØ#ØØØô‰Fô ×'Ò'ØØ#ØØØôˆFð 	�
‰
×"Ñ" 6×+?Ñ+?Ô@Øˆr   c                ó    <€ V ^8„  d   QhRS[ /# )r   r]   )r   )r   r   s   "€r   r   r   v   s   ø€ ÷ .ñ .©ñ .r   c                ó<   € V P                   P                  V4       R # ©N)r   Úremove_initializer)r&   r]   s   &&r   rb   ÚFusion.remove_initializerv   s   € Ø�
‰
×%Ñ% fÖ-r   c                ó0   <€ V ^8„  d   QhRS[ S[,          /# )r   Únodes©r   r   )r   r   s   "€r   r   r   y   s   ø€ ÷ 2ñ 2©©i­ñ 2r   c                ór   € V F0  pW P                   9  g   K  V P                   P                  V4       K2  	  R # ra   ©r   Úappend)r&   re   r/   s   && r   Úadd_nodes_to_removeÚFusion.add_nodes_to_removey   s.   € ó ˆDØ×/Ñ/Ö/Ø×$Ñ$×+Ñ+¨DÖ1ó r   c                óF   <€ V ^8„  d   QhRS[ S[,          RS[ S[,          /# )r   re   Únodes_to_keeprf   )r   r   s   "€r   r   r   Š   s&   ø€ ÷ 2ñ 2¹DÁ½Oð 2Ñ\`ÑajÕ\kñ 2r   c                ó‚   € V F8  pW0P                   9  g   K  W29  g   K  V P                   P                  V4       K:  	  R # ra   rh   )r&   re   rm   r/   s   &&& r   Ú&add_nodes_to_remove_with_nodes_to_keepÚ-Fusion.add_nodes_to_remove_with_nodes_to_keepŠ   s1   € ÛˆDØ×/Ñ/Ö/°DÖ4MØ×$Ñ$×+Ñ+¨DÖ1ó r   )
r   r%   r   r   r"   r    r   r!   r   r#   N)Ú )T)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r'   r,   r5   rJ   rZ   rb   rj   ro   Ú__static_attributes__Ú__classdictcell__)r   s   @r   r   r      sV   ø‡ € ñ÷9ò 9÷&-ð -÷"ð "ò"&÷Hò ÷4.ð .÷2ð 2÷"2ö 2r   r   )Úcollectionsr   Úcollections.abcr   Úloggingr   Útypingr   ÚnumpyrT   Úonnxr   r   r	   Ú
onnx_modelr
   rr   r8   r   © r   r   Ú<module>r�      s5   ðõ
 $Ý $Ý Ý ã ß /Ñ /Ý  á	�8Ó	€÷|2ó |2r   