+
    G-jÑ'  ã                   ó\   € ^ RI Ht ^ RIHt ^ RIHt ^ RIHt ]! ]4      t	 ! R R]4      t
R# )é    )Ú	getLogger)ÚFusion)Úhelper©Ú	OnnxModelc                   ó†   a a€ ] tR t^t oV3R lV 3R lltV3R lR ltV3R lR ltV3R lR ltV3R	 lR
 ltRt	Vt
V ;t# )Ú
FusionGeluc                ó    <€ V ^8„  d   QhRS[ /# )é   Úmodelr   )ÚformatÚ__classdict__s   "€Úu/Volumes/fast/ai/experiments/nudenet-smoke/.venv/lib/python3.14/site-packages/onnxruntime/transformers/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S[ RS[ /# )r   Úinput_name_to_nodesÚoutput_name_to_node)Údict)r   r   s   "€r   r   r      s   ø€ ÷ Hñ H±$ð HÉTñ Hr   c                ó’   € V P                  WV4      '       d   R # V P                  WV4      '       d   R # V P                  WV4       R # )N)Úfuse_1Úfuse_2Úfuse_3)r   Úerf_noder   r   s   &&&&r   ÚfuseÚFusionGelu.fuse   s;   € Ø�;‰;�xÐ6I×JÒJÙØ�;‰;�xÐ6I×JÒJÙØ�‰�HÐ3FÖGr   c                ó:   <€ V ^8„  d   QhRS[ RS[ RS[R,          /# ©r   r   r   ÚreturnN©r   Úbool)r   r   s   "€r   r   r      s.   ø€ ÷ Rñ R±Dð RÉtð RÑX\Ð_cÕXcñ R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                  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                  P                  VR^ V4      pVf   R# V P                  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                  P	                  V
R4      '       g   R# V
P                   ^ ,          pMlV P                  P                  VRW“4      p
V
f   R# V P                  P	                  V
R4      '       g   R# WŠP                  9  d   R# VP                   ^ ,          pWqWVV
.pV P                  P                  WË.W#4      '       g   R# V P                  P                  V4       \        P                  ! R	V.V.V P                  P                  R	4      R
7      pRVn        V P                  P!                  V4       V P"                  V P$                  VP&                  &   V P)                  R	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.
NÚAddÚMulÚDivçà-� ö?çü©ñÒMbP?©Údeltaç      à?r   ©ÚinputsÚoutputsÚnameúcom.microsoftT)ÚoutputÚlenÚop_typer   Úhas_constant_inputÚmatch_parentÚfind_constant_inputÚinputÚis_safe_to_fuse_nodesÚnodes_to_removeÚextendr   Ú	make_nodeÚcreate_node_nameÚdomainÚnodes_to_addÚappendÚthis_graph_nameÚnode_name_to_graph_namer7   Úincrease_counter)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   s¿  € ð( �?‰?˜1ÕÐ%8Ô8ÙØ&§¡°qÕ'9Õ:ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ  �ˆà�z‰z×,Ñ,¨]¸A×>Ò>Ùà×Ñ Õ"Ð*=Ô=ÙØ&×';Ñ';¸AÕ'>Õ?ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ  �ˆà�j‰j×%Ñ% h°°qÐ:MÓNˆØŠ;Ùà�:‰:×)Ñ)¨#¨v¸UÐ)ÓCÀqÔHÙàŸ™ 1�ˆà$×*Ñ*¨1Õ-°×1EÑ1EÀaÕ1HÔH‘!ÈaˆØ×0Ñ0°Õ9Ô9Ø*×+?Ñ+?ÀÕ+BÕCˆHÜ�8‹} Ô! X¨a¥[×%8Ñ%8¸EÔ%AÙØ •{ˆHØ—:‘:×0Ñ0°¸3×?Ò?ÙØ&Ÿo™o¨aÕ0‰Oà—z‘z×.Ñ.¨}¸eÀWÓbˆHØÒÙà—:‘:×0Ñ0°¸3×?Ò?Ùà§^¡^Ô3Ùà+×2Ñ2°1Õ5ˆOà¨ÀxÐPˆØ�z‰z×/Ñ/ØÐ-Ð/B÷
ò 
ñ à×Ñ×#Ñ# NÔ3Ü×%Ò%Ø˜NÐ+°oÐ5FÈTÏZÉZ×MhÑMhÐioÓMpô
ˆ
ð ,ˆ
ÔØ×Ñ× Ñ  Ô,Ø8<×8LÑ8Lˆ×$Ñ$ Z§_¡_Ñ5Ø×Ñ˜fÔ%Ùr   c                ó:   <€ V ^8„  d   QhRS[ RS[ RS[R,          /# r'   r)   )r   r   s   "€r   r   r   m   s.   ø€ ÷ Kñ K±Dð KÉtð KÑX\Ð_cÕXcñ K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                  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                  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                  P                  VR^ V4      pVf   R# Rp	V P                  P                  VRRR7      ^8w  dI   V P                  P                  VR	^V4      p	V	f   R# V P                  P	                  V	R
4      '       g   R# V P                  P                  V^ V4      p
V
f   R# V
P                   ^ ,          VP                  9  d   R# W�WVV.pV	'       d   VP                  V	4       V P                  P                  W·P                   ^ ,          .W#4      '       g   R# V P                  P                  V4       \        P                  ! RV
P                   ^ ,          .VP                   ^ ,          .V P                  P                  R4      R7      pRVn        V P"                  P                  V4       V P$                  V P&                  VP(                  &   V P+                  R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.
Nr,   r-   r3   r.   r/   r0   r1   ÚSqrtg       @r   r4   r8   T)r9   r:   r;   r   r<   r=   r>   Ú
get_parentr?   rG   r@   rA   rB   r   rC   rD   rE   rF   rH   rI   r7   rJ   )r   r#   r   r   rK   rL   rM   ÚmulrN   Ú	sqrt_nodeÚ	root_noderS   rT   s   &&&&         r   r!   ÚFusionGelu.fuse_2m   s×  € ð �?‰?˜1ÕÐ%8Ô8ÙØ&§¡°qÕ'9Õ:ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ  �ˆà�z‰z×,Ñ,¨]¸A×>Ò>Ùà×Ñ Õ"Ð*=Ô=ÙØ&×';Ñ';¸AÕ'>Õ?ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ  �ˆà�z‰z×,Ñ,¨]¸C×@Ò@Ùà×Ñ Õ"Ð*=Ô=ÙØ&×';Ñ';¸AÕ'>Õ?ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ�q�kˆà�j‰j×%Ñ% h°°qÐ:MÓNˆØŠ;Ùàˆ	Ø�:‰:×)Ñ)¨#¨v¸UÐ)ÓCÀqÔHØŸ
™
×/Ñ/°°V¸QÐ@SÓTˆIØÒ ÙØ—:‘:×0Ñ0°¸C×@Ò@Ùà—J‘J×)Ñ)¨#¨qÐ2EÓFˆ	ØÒÙà×Ñ˜AÕ c§i¡iÔ/Ùà¨ÀsÐKˆßØ×!Ñ! )Ô,à�z‰z×/Ñ/ØŸZ™Z¨�]˜OÐ-@÷
ò 
ñ à×Ñ×#Ñ# NÔ3Ü×%Ò%Ø˜I×,Ñ,¨QÕ/Ð0¸3¿:¹:Àa½=¸/ÐPT×PZÑPZ×PkÑPkÐlrÓPsô
ˆ
ð ,ˆ
ÔØ×Ñ× Ñ  Ô,Ø8<×8LÑ8Lˆ×$Ñ$ Z§_¡_Ñ5Ø×Ñ˜fÔ%Ùr   c                ó:   <€ V ^8„  d   QhRS[ RS[ RS[R,          /# r'   r)   )r   r   s   "€r   r   r   º   s.   ø€ ÷ Hñ H±Dð HÉtð HÑX\Ð_cÕXcñ H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                  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                  P	                  VR4      '       g   R# V P                  P                  VR^ V4      pVf   R# V P                  P                  VRRR7      pV^ 8  d   R# V P                  P                  Yx^8X  d   ^ M^V4      p	V	f   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	P                   ^ ,          8X  g,   V
P                  ^,          V	P                   ^ ,          8X  g   R# WqWVV
.pV P                  P                  VV
P                   ^ ,          .VV4      '       g   R# V P                  P                  V4       \        P                  ! RV	P                   ^ ,          .V
P                   ^ ,          .V P                  P                  R4      R	7      pR
Vn        V P                   P#                  V4       V P$                  V P&                  VP(                  &   V P+                  R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.
Nr,   r-   r3   g   `ž æ?r0   r1   r   r4   r8   T)r9   r:   r;   r   r<   r=   r>   rY   r?   r@   rA   rB   r   rC   rD   rE   rF   rG   rH   rI   r7   rJ   )r   r#   r   r   rK   rL   rQ   Ú	first_mulÚir\   Úlast_mulrS   rT   s   &&&&         r   r"   ÚFusionGelu.fuse_3º   s»  € ð �?‰?˜1ÕÐ%8Ô8ÙØ&§¡°qÕ'9Õ:ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ  �ˆà�z‰z×,Ñ,¨]¸A×>Ò>Ùà×Ñ Õ"Ð*=Ô=ÙØ&×';Ñ';¸AÕ'>Õ?ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ˜A•;ˆà�z‰z×,Ñ,¨X°s×;Ò;Ùà—J‘J×+Ñ+¨H°e¸QÐ@SÓTˆ	ØÒÙà�J‰J×*Ñ*¨9Ð6HÐPUÐ*ÓVˆØˆqŒ5Ùà—J‘J×)Ñ)¨)¸q¼&±QÀaÐI\Ó]ˆ	ØÒÙà�?‰?˜1ÕÐ%8Ô8ÙØ&§¡°qÕ'9Õ:ˆÜˆx‹=˜AÔ ¨!¥×!4Ñ!4¸Ô!=ÙØ˜A•;ˆà—‘˜qÕ! Y×%5Ñ%5°aÕ%8Ô8¸H¿N¹NÈ1Õ<MÐQZ×QaÑQaÐbcÕQdÔ<dÙà#¨}ÈÐQˆØ�z‰z×/Ñ/ØØ�_‰_˜QÕÐ ØØ÷	
ò 
ñ à×Ñ×#Ñ# NÔ3Ü×%Ò%Ø˜I×,Ñ,¨QÕ/Ð0¸8¿?¹?È1Õ;MÐ:NÐUY×U_ÑU_×UpÑUpÐqwÓUxô
ˆ
ð ,ˆ
ÔØ×Ñ× Ñ  Ô,Ø8<×8LÑ8Lˆ×$Ñ$ Z§_¡_Ñ5Ø×Ñ˜fÔ%Ùr   © )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r$   r    r!   r"   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r   r   s   @@r   r	   r	      sG   ù‡ € ÷/ó /÷Hð H÷Rð R÷hKð K÷ZH÷ Hð Hr   r	   N)Úloggingr   Úfusion_baser   Úonnxr   Ú
onnx_modelr   re   Úloggerr	   rd   r   r   Ú<module>rq      s+   ðõ
 å Ý Ý  á	�8Ó	€ôt�ö tr   