+
    G-j‡(  ã                  óH   € ^ RI Ht ^ RIt^RIHt ^RIHt  ! R R]4      tR# )é    )ÚannotationsN)Ú	ONNXModel)ÚFusionc                  ó^   a € ] tR t^tR V 3R lltR R ltR R ltR R ltR	 R
 ltRt	V ;t
# )Ú
FusionGeluc               ó   € V ^8„  d   QhRR/# )é   Úmodelr   © )Úformats   "Ú}/Volumes/fast/ai/experiments/nudenet-smoke/.venv/lib/python3.14/site-packages/onnxruntime/quantization/fusions/fusion_gelu.pyÚ__annotate__ÚFusionGelu.__annotate__   s   € ÷ /ñ /˜iñ /ó    c                	ó*   <€ \         SV `  VR R4       R# )ÚGeluÚErfN)ÚsuperÚ__init__)Úselfr
   Ú	__class__s   &&€r   r   ÚFusionGelu.__init__   s   ø€ Ü‰Ñ˜ ¨Ö.r   c               ó$   € V ^8„  d   QhRRRRRR/# )r	   Úerf_nodeúonnx.NodeProtoÚinput_name_to_nodesúdict[str, list[onnx.NodeProto]]Úoutput_name_to_nodeúdict[str, onnx.NodeProto]r   )r   s   "r   r   r      s(   € ÷ <ñ <à ð<ð =ð<ð 7ñ	<r   c                óÒ   € V P                  WV4      '       g1   V P                  WV4      '       g   V P                  WV4      '       d   V P                  P	                  R^4       R# R# )zg
Interface function that tries to fuse a node sequence containing an Erf node into a single
Gelu node.
úcom.microsoftN)Úfuse_1Úfuse_2Úfuse_3r
   Úset_opset_import)r   r   r   r   s   &&&&r   ÚfuseÚFusionGelu.fuse   sT   € ð �K‰K˜Ð7J×KÒKØ�{‰{˜8Ð:M×NÒNØ�{‰{˜8Ð:M×NÒNà�J‰J×'Ñ'¨¸Ö;ñ Or   c               ó(   € V ^8„  d   QhRRRRRRRR/# ©	r	   r   r   r   r   r   r   ÚreturnÚboolr   )r   s   "r   r   r   #   s8   € ÷ Uñ Uà ðUð =ðUð 7ð	Uð
 
ñUr   c                ó®  € VP                   ^ ,          V9  d   R# W!P                   ^ ,          ,          p\        V4      ^8w  g   V^ ,          P                  R8w  d   R# V^ ,          pV P                  V^4      '       g   R# VP                   ^ ,          V9  d   R# W%P                   ^ ,          ,          p\        V4      ^8w  g   V^ ,          P                  R8w  d   R# V^ ,          pV P	                  VR^ V4      pVf   R# V P                  VRRR7      ^8w  d   R# VP                  ^ ,          pVP                  ^ ,          VP                   ^ ,          8X  d   ^M^ p	W†P                  V	,          8X  d{   W&P                   ^ ,          ,          p\        V4      ^8w  g   V^ ,          P                  R8w  d   R# V^ ,          p
V P                  V
R4      '       g   R# V
P                   ^ ,          pMXV P	                  VRW“4      p
V
f   R# V P                  V
R4      '       g   R# WŠP                  9  d   R# VP                   ^ ,          pWqWVV
.pV P                  WË.W#4      '       g   R# V P                  P                  V4       \        P                  P                  R	V P                  4       V.V.R
7      pRVn        V P                  P!                  V4       R# )aù  
This pattern is from PyTorch model
Fuse Gelu with Erf into one node:
Pattern 1:
               +-------Mul(0.5)---------------------+
               |                                    |
               |                                    v
            [root] --> Div -----> Erf  --> Add --> Mul -->
                      (B=1.4142...)       (1)

Pattern 2:
               +------------------------------------+
               |                                    |
               |                                    v
            [root] --> Div -----> Erf  --> Add --> Mul -->Mul -->
                      (B=1.4142...)       (1)            (0.5)

Note that constant input for Add and Mul could be first or second input: like either A=0.5 or B=0.5 is fine.
FÚAddÚMulÚDivçà-� ö?çü©ñÒMbP?©Údeltaç      à?r   ©ÚnameÚinputsÚoutputsr!   T©ÚoutputÚlenÚop_typeÚhas_constant_inputÚmatch_parentÚfind_constant_inputÚinputÚis_safe_to_fuse_nodesÚnodes_to_removeÚextendÚonnxÚhelperÚ	make_nodeÚcreate_unique_node_nameÚdomainÚnodes_to_addÚappend)r   r   r   r   ÚchildrenÚadd_after_erfÚmul_after_erfÚdivÚsubgraph_inputÚanotherÚmul_halfÚsubgraph_outputÚsubgraph_nodesÚ
fused_nodes   &&&&          r   r"   ÚFusionGelu.fuse_1#   sw  € ð2 �?‰?˜1ÕÐ%8Ô8ÙØ&§¡°qÕ'9Õ:ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ  �ˆà×&Ñ& }°a×8Ò8Ùà×Ñ Õ"Ð*=Ô=Ùà&×';Ñ';¸AÕ'>Õ?ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=Ùà  �ˆà×Ñ ¨%°Ð4GÓHˆØŠ;Ùà×#Ñ# C¨°uÐ#Ó=ÀÔBÙàŸ™ 1�ˆà$×*Ñ*¨1Õ-°×1EÑ1EÀaÕ1HÔH‘!ÈaˆØ×0Ñ0°Õ9Ô9Ø*×+?Ñ+?ÀÕ+BÕCˆHÜ�8‹} Ô! X¨a¥[×%8Ñ%8¸EÔ%AÙØ •{ˆHØ×*Ñ*¨8°S×9Ò9ÙØ&Ÿo™o¨aÕ0‰Oà×(Ñ(¨¸¸wÓ\ˆHØÒÙà×*Ñ*¨8°S×9Ò9Ùà§^¡^Ô3Ùà+×2Ñ2°1Õ5ˆOà¨ÀxÐPˆØ×)Ñ)¨.Ð:KÐM`×vÒvÙà×Ñ×#Ñ# NÔ3Ü—[‘[×*Ñ*Ø˜×5Ñ5Ó7ÀÐ@PÐ[jÐZkð +ó 
ˆ
ð ,ˆ
ÔØ×Ñ× Ñ  Ô,Ùr   c               ó(   € V ^8„  d   QhRRRRRRRR/# r)   r   )r   s   "r   r   r   z   ó8   € ÷ Jñ Jà ðJð =ðJð 7ð	Jð
 
ñJr   c                ó„  € VP                   ^ ,          V9  d   R# W!P                   ^ ,          ,          p\        V4      ^8w  g   V^ ,          P                  R8w  d   R# V^ ,          pV P                  V^4      '       g   R# VP                   ^ ,          V9  d   R# W%P                   ^ ,          ,          p\        V4      ^8w  g   V^ ,          P                  R8w  d   R# V^ ,          pV P                  VR4      '       g   R# VP                   ^ ,          V9  d   R# W&P                   ^ ,          ,          p\        V4      ^8w  g   V^ ,          P                  R8w  d   R# V^ ,          pV P	                  VR^ V4      pVf   R# Rp	V P                  VRRR	7      ^8w  d5   V P	                  VR
^V4      p	V	f   R# V P                  V	R4      '       g   R# VP                  ^ ,          p
W§P                  9  d   R# W�WVV.pV	'       d   VP                  V	4       V P                  W·P                   ^ ,          .W#4      '       g   R# V P                  P                  V4       \        P                  P                  RV P                  4       V
.VP                   ^ ,          .R7      pRVn        V P                   P                  V4       R# )aÞ  
This pattern is from Keras model
Fuse Gelu with Erf into one node:
               +------------------------------------------+
               |                                          |
               |                                          v
            [root] --> Div -----> Erf  --> Add --> Mul -->Mul
                      (B=1.4142...)       (A=1)   (A=0.5)

Note that constant input for Add and Mul could be first or second input: like either A=0.5 or B=0.5 is fine.
Fr-   r.   r4   r/   Nr0   r1   r2   ÚSqrtg       @r   r5   r!   T)r:   r;   r<   r=   r>   r?   r@   rJ   rA   rB   rC   rD   rE   rF   rG   rH   rI   )r   r   r   r   rK   rL   rM   ÚmulrN   Ú	sqrt_noderO   rS   rT   s   &&&&         r   r#   ÚFusionGelu.fuse_2z   sd  € ð" �?‰?˜1ÕÐ%8Ô8ÙØ&§¡°qÕ'9Õ:ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ  �ˆà×&Ñ& }°a×8Ò8Ùà×Ñ Õ"Ð*=Ô=ÙØ&×';Ñ';¸AÕ'>Õ?ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ  �ˆà×&Ñ& }°c×:Ò:Ùà×Ñ Õ"Ð*=Ô=ÙØ&×';Ñ';¸AÕ'>Õ?ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ�q�kˆà×Ñ ¨%°Ð4GÓHˆØŠ;Ùàˆ	Ø×#Ñ# C¨°uÐ#Ó=ÀÔBØ×)Ñ)¨#¨v°qÐ:MÓNˆIØÒ ÙØ×*Ñ*¨9°c×:Ò:ÙàŸ™ 1�ˆà§¡Ô*Ùà¨ÀsÐKˆßØ×!Ñ! )Ô,à×)Ñ)¨.¿:¹:Àa½=¸/ÐK^×tÒtÙà×Ñ×#Ñ# NÔ3Ü—[‘[×*Ñ*Ø˜×5Ñ5Ó7ÀÐ@PÐ[^×[eÑ[eÐfgÕ[hÐZið +ó 
ˆ
ð ,ˆ
ÔØ×Ñ× Ñ  Ô,Ùr   c               ó(   € V ^8„  d   QhRRRRRRRR/# r)   r   )r   s   "r   r   r   Æ   rW   r   c                óD  € VP                   ^ ,          V9  d   R# W!P                   ^ ,          ,          p\        V4      ^8w  g   V^ ,          P                  R8w  d   R# V^ ,          pV P                  V^4      '       g   R# VP                   ^ ,          V9  d   R# W%P                   ^ ,          ,          p\        V4      ^8w  g   V^ ,          P                  R8w  d   R# V^ ,          pV P                  VR4      '       g   R# V P	                  VR^ V4      pVf   R# V P                  VRRR7      pV^ 8  d   R# ^V,
          p	VP                  V	,          p
VP                   ^ ,          V9  d   R# W&P                   ^ ,          ,          p\        V4      ^8w  g   V^ ,          P                  R8w  d   R# V^ ,          pVP                  ^ ,          V
8X  g   VP                  ^,          V
8X  g   R# WqWVV.pV P                  VVP                   ^ ,          .VV4      '       g   R# V P                  P                  V4       \        P                  P                  RV P                  4       V
.VP                   ^ ,          .R	7      pR
Vn        V P                  P!                  V4       R# )a÷  
This pattern is from TensorFlow model
Fuse Gelu with Erf into one node:
               +----------------------------------------------+
               |                                              |
               |                                              v
            [root] --> Mul -----> Erf    -->   Add --> Mul -->Mul
                       (A=0.7071067690849304)  (B=1)  (B=0.5)

Note that constant input for Add and Mul could be first or second input: like either A=0.5 or B=0.5 is fine.
Fr-   r.   r4   g   `ž æ?r1   r2   r   r5   r!   Tr9   )r   r   r   r   rK   rL   rQ   Ú	first_mulÚiÚroot_input_indexrO   Úlast_mulrS   rT   s   &&&&          r   r$   ÚFusionGelu.fuse_3Æ   sO  € ð$ �?‰?˜1ÕÐ%8Ô8ÙØ&§¡°qÕ'9Õ:ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ  �ˆà×&Ñ& }°a×8Ò8Ùà×Ñ Õ"Ð*=Ô=ÙØ&×';Ñ';¸AÕ'>Õ?ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ˜A•;ˆà×&Ñ& x°×5Ò5Ùà×%Ñ% h°°qÐ:MÓNˆ	ØÒÙà×$Ñ$ YÐ0BÈ%Ð$ÓPˆØˆqŒ5Ùà˜q�5ÐØ"Ÿ™Ð)9Õ:ˆà�?‰?˜1ÕÐ%8Ô8ÙØ&§¡°qÕ'9Õ:ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ˜A•;ˆà—‘˜qÕ! ^Ô3°x·~±~ÀaÕ7HÈNÔ7ZÙà#¨}ÈÐQˆØ×)Ñ)ØØ�_‰_˜QÕÐ ØØ÷	
ò 
ñ à×Ñ×#Ñ# NÔ3Ü—[‘[×*Ñ*Ø˜×5Ñ5Ó7ÀÐ@PÐ[c×[jÑ[jÐklÕ[mÐZnð +ó 
ˆ
ð ,ˆ
ÔØ×Ñ× Ñ  Ô,Ùr   r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r&   r"   r#   r$   Ú__static_attributes__Ú__classcell__)r   s   @r   r   r      s,   ø† ÷/ð /õ<õ"UõnJ÷XJó Jr   r   )Ú
__future__r   rD   Ú
onnx_modelr   Úfusionr   r   r   r   r   Ú<module>rm      s!   ðõ #ã å "Ý ôB�ö Br   