Ë
    ÝÍ:jÁ  ã                   ó€   — 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y)
é    )Ú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y)Ú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        «      | _        y )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        úy/home/mcse/projects/srt_converter/srt-converter-venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_base.pyÚ__init__zFusion.__init__   s|   € ô @JÈ/Ô[^Ô?_¨?Ñ*;ÐetˆÔØ"/ˆÔÙEP = /°°;°-¸qÑ AÐVcˆÔØ %ˆŒ
Ø%'ˆÔØ"$ˆÔØ!&ˆÔØ-/ˆÔ$Ø+/ˆÔä(3´CÓ(8ˆÕó    Úfused_op_namec                 ó2   — | j                   |xx   dz  cc<   y)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         j                  d| j                  › d�«       | j                  j	                  «       }| j                  j                  «       }| j                  D ]n  }| j                  j                  |«      D ]N  }| j                  j                  |«      }|€t        d«      ‚|j                  | _        | j                  |||«       ŒP Œp | j                  D �cg c]  }|j                  ‘Œ }}| j                  rA| j                  j!                  «       D ]#  \  }}|sŒ	t         j#                  d|› d|› �«       Œ% nE|j%                  | j&                  «      }	|	dkD  r%t         j#                  d| j                  › d|	› �«       | j                  j)                  | j*                  «       | j                  j-                  | j                  | j.                  «       | j0                  r| j                  j1                  «        y| j*                  s| j                  r| j                  j3                  «        yyc c}w )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Úvaluer5   s
             r   ÚapplyzFusion.apply8   sá  € ô
 	�‰�v˜d×.Ñ.Ð/¨zÐ:Ô;Ø"Ÿj™j×<Ñ<Ó>ÐØ"Ÿj™j×<Ñ<Ó>Ðð #×2Ñ2ò 	JˆNØŸ
™
×7Ñ7¸ÓGò J�ØŸ
™
×4Ñ4°TÓ:�Ø�=Ü#Ð$DÓEÐEØ',§z¡z�Ô$Ø—	‘	˜$Ð 3Ð5HÕIñJð	Jð -1×,=Ñ,=Ö> D�4—<“<Ð>ˆÐ>Ø×ÒØ"×.Ñ.×4Ñ4Ó6ò 9‘
��UÚÜ—K‘K &¨¨¨R°¨wÐ 7Õ8ñ9ð —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Ø�J‰J×#Ñ#Õ%ð &7ùò ?s   Ã#H:r1   Ú	data_typeÚdimsÚvalsÚrawc                 óŠ  — |r€t        |t        j                  «      s;t        j                  |«      }t        j
                  ||¬«      j                  «       }n|j                  «       }t        j                  ||||d¬«      }nt        j                  ||||d¬«      }| j                  j                  || j                  «       |S )N)ÚdtypeT)r1   r?   r@   rA   rB   F)r   ÚnpÚndarrayr	   Útensor_dtype_to_np_dtypeÚarrayÚtobytesÚmake_tensorr   Úadd_initializerr   )	r   r1   r?   r@   rA   rB   Únp_typeÚbytesÚtensors	            r   rK   zFusion.add_initializer\   s¨   € ÙÜ˜d¤B§J¡JÔ/Ü ×9Ñ9¸)ÓD�ÜŸ™ ¨WÔ5×=Ñ=Ó?‘àŸ™›�Ü×'Ñ'ØØ#ØØØô‰Fô ×'Ñ'ØØ#ØØØôˆFð 	�
‰
×"Ñ" 6¨4×+?Ñ+?Ô@Øˆr    rN   c                 ó:   — | j                   j                  |«       y ©N)r   Úremove_initializer)r   rN   s     r   rQ   zFusion.remove_initializerv   s   € Ø�
‰
×%Ñ% fÕ-r    Únodesc                 óf   — |D ],  }|| j                   vsŒ| j                   j                  |«       Œ. y rP   ©r   Úappend)r   rR   r%   s      r   Úadd_nodes_to_removezFusion.add_nodes_to_removey   s5   € ð ò 	2ˆDØ˜4×/Ñ/Ò/Ø×$Ñ$×+Ñ+¨DÕ1ñ	2r    Únodes_to_keepc                 óp   — |D ]1  }|| j                   vsŒ||vsŒ| j                   j                  |«       Œ3 y rP   rT   )r   rR   rW   r%   s       r   Ú&add_nodes_to_remove_with_nodes_to_keepz-Fusion.add_nodes_to_remove_with_nodes_to_keepŠ   s:   € Øò 	2ˆDØ˜4×/Ñ/Ò/°DÀÒ4MØ×$Ñ$×+Ñ+¨DÕ1ñ	2r    N)Ú )T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   Úlistr   r$   r   Údictr*   r>   r   r   r   ÚboolrK   r   rQ   rV   rY   © r    r   r   r      sñ   „ ñð ñ9àð9ð ð9ð ˜t C™y™ð	9ð
 ó9ð&-¨có -ð"àð"ð " # t¨I¡Ð"6Ñ7ð"ð " # y .Ñ1ó	"ò"&ñH Cð °Cð ¸xÈ¹}ð ÐTWð Ð^bó ð4.¨ó .ð2¨¨i©ó 2ð"2¸DÀ¹Oð 2Ð\`ÐajÑ\kô 2r    r   )Úcollectionsr   Úcollections.abcr   Úloggingr   Útypingr   ÚnumpyrE   Úonnxr   r   r	   Ú
onnx_modelr
   r[   r,   r   rb   r    r   ú<module>rj      s5   ðõ
 $Ý $Ý Ý ã ß /Ñ /Ý  á	�8Ó	€÷|2ò |2r    