+
    9i                         ^ 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   "b/var/www/html/photoedit/myenv/lib/python3.14/site-packages/onnxruntime/transformers/fusion_base.py__annotate__Fusion.__annotate__   s;     9 99 9 tCy	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 AVc %
%'"$!&-/$+/(3C(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@     " "" "#tI"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   
 	vd../z:;"jj<<>"jj<<> #22N

77G

44T:=#$DEE',zz$		$5HI H 3 -1,=,=>,=D<<,=>"..446
5KK&Rw 78 7 MM$"4"45EqyfT%5%5$6b@A

 4 45

T..0L0LMJJ""$!!!T%6%6%6JJ##% &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                  WP                  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    dBJJ// 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 2D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///D4M$$++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   