
     Nge                         d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlZd dlmZmZ d dlmZ  ee          Z G d d          ZdS )	    )defaultdict)	getLogger)AnyDictListOptionalSequenceUnionN)	NodeProtohelper)	OnnxModelc                      e Zd ZdZ	 ddededeeee         f         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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        `/var/www/html/ai-engine/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 %
%'"$!&-/$.2(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>I   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.apply7   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$   Tr:   	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)r:   rG   rH   rI   rJ   F)r   tensor_dtype_to_np_dtyper   npndarrayarraytobytesastypemake_tensorr   add_initializerr   )	r!   r:   rG   rH   rI   rJ   np_typebytestensors	            r"   rT   zFusion.add_initializer[   s     	5i@@GdBJ// 7W555==??G,,4466'#  FF '#  F 	
""64+?@@@r$   nodesc                 V    |D ]%}|| j         vr| j                             |           &d S Nr   append)r!   rX   r)   s      r"   add_nodes_to_removezFusion.add_nodes_to_removeu   sC      	2 	2D4///$++D111	2 	2r$   nodes_to_keepc                 ^    |D ])}|| j         vr||vr| j                             |           *d S rZ   r[   )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   r
   r   r#   r(   r   r   r.   rF   r   r	   r   boolrT   r]   r`   r1   r$   r"   r   r      so         9 99 9 sDI~.	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   loggingr   typingr   r   r   r   r	   r
   numpyrN   onnxr   r   
onnx_modelr   ra   r5   r   r1   r$   r"   <module>rl      s   
 $ # # # # #       = = = = = = = = = = = = = = = =     " " " " " " " "            	8		y2 y2 y2 y2 y2 y2 y2 y2 y2 y2r$   