
    h                         S SK Jr  S SKJr  S SKJr  S SKJr  S SKr	S SK
JrJrJr  S SKJr  \" \5      r " S S	5      rg)
    )defaultdict)Sequence)	getLogger)AnyN)	NodeProtoTensorProtohelper)	OnnxModelc                       \ rS rSrSr SS\S\S\\\   -  S\4S jjrS\4S	 jr	S
\
S\\\\
   4   S\\\
4   4S jrS rSS\S\S\\   S\S\4
S jjrS\4S jrS\\
   4S jrS\\
   S\\
   4S jrSrg)Fusion   z
Base class for Graph Fusion
modelfused_op_typesearch_op_typesdescriptionc                     [        U[        5      (       a  U/OUU l        X l        U(       a  U SU S3OUU l        Xl        / U l        / U l        SU l        0 U l	        S U l
        [        [        5      U l        g )N()F)
isinstancestrr   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        ^/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/fusion_base.py__init__Fusion.__init__   s{     @J/[^?_?_?*;et"/EP=/;-q AVc %
%'"$!&-/$+/(3C(8    fused_op_namec                 2    U R                   U==   S-  ss'   g)z'
Increase counter of a fused operator.
   N)r   )r   r#   s     r   increase_counterFusion.increase_counter)   s     	'1,'r"   nodeinput_name_to_nodesoutput_name_to_nodec                     [         e)z,Interface for fusion that starts from a node)NotImplementedError)r   r(   r)   r*   s       r   fuseFusion.fuse/   s
     "!r"   c                    [         R                  SU R                   S35        U R                  R	                  5       nU R                  R                  5       nU R                   Hq  nU R                  R                  U5       HO  nU R                  R                  U5      nUc  [        S5      eUR                  U l        U R                  XAU5        MQ     Ms     U R                   Vs/ s H  oDR                  PM     nnU R                  (       aH  U R                  R!                  5        H)  u  pxU(       d  M  [         R#                  SU SU 35        M+     OFUR%                  U R&                  5      n	U	S:  a%  [         R#                  SU R                   SU	 35        U R                  R)                  U R*                  5        U R                  R-                  U R                  U R.                  5        U R0                  (       a  U R                  R1                  5         gU R*                  (       d  U R                  (       a  U R                  R3                  5         ggs  snf )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: r   )loggerdebugr   r   r)   r*   r   get_nodes_by_op_typeget_graph_by_node	Exceptionnamer   r-   r   op_typer   itemsinfocountr   remove_nodesr   	add_nodesr   r   update_graph)
r   r)   r*   search_op_typer(   graphop_listkeyvaluer9   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JJ##% &7 ?s   'Ir5   	data_typedimsvalsrawc                    U(       a  [         R                  " U5      n[        U[        R                  5      (       d#  [        R
                  " XFS9R                  5       nOUR                  U5      R                  5       n[         R                  " UUUUSS9nO[         R                  " UUUUSS9nU R                  R                  XR                  5        U$ )N)dtypeT)r5   rD   rE   rF   rG   F)r	   tensor_dtype_to_np_dtyper   npndarrayarraytobytesastypemake_tensorr   add_initializerr   )	r   r5   rD   rE   rF   rG   np_typebytestensors	            r   rQ   Fusion.add_initializer\   s    55i@GdBJJ//5==?G,446''#F ''#F 	

""6+?+?@r"   rT   c                 :    U R                   R                  U5        g N)r   remove_initializer)r   rT   s     r   rX   Fusion.remove_initializerv   s    

%%f-r"   nodesc                 n    U H/  nX R                   ;  d  M  U R                   R                  U5        M1     g rW   r   append)r   rZ   r(   s      r   add_nodes_to_removeFusion.add_nodes_to_removey   s.     D///$$++D1 r"   nodes_to_keepc                 |    U H6  nX0R                   ;  d  M  X2;  d  M  U R                   R                  U5        M8     g rW   r\   )r   rZ   r`   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   listr    r&   r   dictr-   rB   r   r   r   boolrQ   r   rX   r^   rb   __static_attributes__ r"   r   r   r      s     99 9 tCy	9
 9&-c -"" "#tI"67" "#y.1	""&HC C x} TW ^b 4. .2i 2"2DO 2\`aj\k 2r"   r   )collectionsr   collections.abcr   loggingr   typingr   numpyrK   onnxr   r   r	   
onnx_modelr
   re   r0   r   rn   r"   r   <module>rv      s5   
 $ $    / /  	8	|2 |2r"   