
    fPi                         d dl mZ d dlmZ d dlmZ d dlmZ d dlZ	d dl
mZmZmZ d dlmZ  ee          Z G d d	          ZdS )
    )defaultdict)Sequence)	getLogger)AnyN)	NodeProtoTensorProtohelper)	OnnxModelc                      e Zd ZdZ	 ddededeee         z  defdZdefd	Zd
e	de
eee	         f         de
ee	f         fdZd Zddededee         dedef
dZdefdZdee	         fdZdee	         dee	         fdZdS )Fusionz%
    Base class for Graph Fusion
     modelfused_op_typesearch_op_typesdescriptionc                     t          |t                    r|gn|| _        || _        |r| d| dn|| _        || _        g | _        g | _        d| _        i | _	        d | _
        t          t                    | _        d S )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        x/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/onnxruntime/transformers/fusion_base.py__init__zFusion.__init__   s     @J/[^?_?_*t?*;*;et"/EP c= A A; A A A AVc %
%'"$!&-/$+/(3C(8(8    fused_op_namec                 0    | j         |xx         dz  cc<   dS )z7
        Increase counter of a fused operator.
           N)r   )r   r"   s     r   increase_counterzFusion.increase_counter)   s)     	'''1,'''''r!   nodeinput_name_to_nodesoutput_name_to_nodec                     t           )z,Interface for fusion that starts from a node)NotImplementedError)r   r&   r'   r(   s       r   fusezFusion.fuse/   s
     "!r!   c                    t                               d| j         d           | j                                        }| j                                        }| j        D ]m}| j                            |          D ]P}| j                            |          }|t          d          |j
        | _        |                     |||           Qnd | j        D             }| j        rB| j                                        D ]'\  }}|r t                               d| d|            (nE|                    | j                  }	|	dk    r%t                               d| j         d|	            | j                            | j                   | j                            | j        | j                   | j        r| j                                         dS | j        s| j        r| j                                         dS dS )	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 graphc                     g | ]	}|j         
S  )op_type).0r&   s     r   
<listcomp>z Fusion.apply.<locals>.<listcomp>J   s    >>>D4<>>>r!   zFused z: r   )loggerdebugr   r   r'   r(   r   get_nodes_by_op_typeget_graph_by_node	Exceptionnamer   r+   r   r   itemsinfocountr   remove_nodesr   	add_nodesr   r   update_graph)
r   r'   r(   search_op_typer&   graphop_listkeyvaluer:   s
             r   applyzFusion.apply8   s)   
 	:d.:::;;;"j<<>>"j<<>> #2 	J 	JN
77GG J J
44T::=#$DEEE',z$		$ 35HIIIIJ ?>D,=>>> 	B".4466 9 9
U 9KK 7 7 7 7 78889 MM$"455Eqyy@T%5@@@@AAA
 4555
T.0LMMM 	&J""$$$$$! 	&T%6 	&J##%%%%%	& 	&r!   Tr7   	data_typedimsvalsrawc                    |rt          j        |          }t          |t          j                  s)t          j        ||                                          }n'|                    |                                          }t          j        ||||d          }nt          j        ||||d          }| j	        
                    || j                   |S )N)dtypeT)r7   rD   rE   rF   rG   F)r	   tensor_dtype_to_np_dtyper   npndarrayarraytobytesastypemake_tensorr   add_initializerr   )	r   r7   rD   rE   rF   rG   np_typebytestensors	            r   rQ   zFusion.add_initializer\   s     	5i@@GdBJ// 7W555==??G,,4466'#  FF '#  F 	
""64+?@@@r!   rT   c                 :    | j                             |           d S N)r   remove_initializer)r   rT   s     r   rW   zFusion.remove_initializerv   s    
%%f-----r!   nodesc                 V    |D ]%}|| j         vr| j                             |           &d S rV   r   append)r   rX   r&   s      r   add_nodes_to_removezFusion.add_nodes_to_removey   sC      	2 	2D4///$++D111	2 	2r!   nodes_to_keepc                 ^    |D ])}|| j         vr||vr| j                             |           *d S rV   rZ   )r   rX   r]   r&   s       r   &add_nodes_to_remove_with_nodes_to_keepz-Fusion.add_nodes_to_remove_with_nodes_to_keep   sK     	2 	2D4///D4M4M$++D111	2 	2r!   N)r   )T)__name__
__module____qualname____doc__r
   r   listr    r%   r   dictr+   rC   r   r   r   boolrQ   r   rW   r\   r_   r.   r!   r   r   r      s         9 99 9 tCy	9
 9 9 9 9&-c - - - -"" "#tI"67" "#y.1	" " " ""& "& "&H C C x} TW ^b    4. . . . .2i 2 2 2 2"2DO 2\`aj\k 2 2 2 2 2 2r!   r   )collectionsr   collections.abcr   loggingr   typingr   numpyrK   onnxr   r   r	   
onnx_modelr
   r`   r2   r   r.   r!   r   <module>rn      s   
 $ # # # # # $ $ $ $ $ $                 / / / / / / / / / /            	8		|2 |2 |2 |2 |2 |2 |2 |2 |2 |2r!   