Ë
    �…jÑ'  ã                   óZ   — d dl mZ d dlmZ d dlmZ d dlmZ  ee«      Z	 G d„ de«      Z
y)é    )Ú	getLogger)ÚFusion)Úhelper)Ú	OnnxModelc                   ó‚   ‡ — e Zd Zdefˆ fd„Zdedefd„Zdedededz  fd„Zdedededz  fd	„Z	dedededz  fd
„Z
ˆ xZS )Ú
FusionGeluÚmodelc                 ó(   •— t         ‰| �  |dd«       y )NÚGeluÚErf)ÚsuperÚ__init__)Úselfr	   Ú	__class__s     €úe/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_gelu.pyr   zFusionGelu.__init__   s   ø€ Ü‰Ñ˜ ¨Õ.ó    Úinput_name_to_nodesÚoutput_name_to_nodec                 óz   — | j                  |||«      ry | j                  |||«      ry | j                  |||«       y )N)Úfuse_1Úfuse_2Úfuse_3)r   Úerf_noder   r   s       r   ÚfusezFusionGelu.fuse   s>   € Ø�;‰;�xÐ!4Ð6IÔJØØ�;‰;�xÐ!4Ð6IÔJØØ�‰�HÐ1Ð3FÕGr   ÚreturnNc                 óŽ  — |j                   d   |vry||j                   d      }t        |«      dk7  s|d   j                  dk7  ry|d   }| j                  j	                  |d«      sy|j                   d   |vry||j                   d      }t        |«      dk7  s|d   j                  dk7  ry|d   }| j                  j                  |dd|«      }|€y| j                  j                  |dd¬	«      dk7  ry|j                  d   }|j                  d   |j                   d   k(  rdnd}	||j                  |	   k(  re||j                   d      }t        |«      dk7  s|d   j                  dk7  ry|d   }
| j                  j	                  |
d
«      sy|
j                   d   }n\| j                  j                  |d|	|«      }
|
€y| j                  j	                  |
d
«      sy||
j                  vry|j                   d   }|||||
g}| j                  j                  ||g||«      sy| j                  j                  |«       t        j                  d|g|g| j                  j                  d«      ¬«      }d|_        | j                  j!                  |«       | j"                  | j$                  |j&                  <   | j)                  d«       y)ay  
        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.
        r   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_namer)   Ú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   zFusionGelu.fuse_1   sÇ  € ð( �?‰?˜1ÑÐ%8Ñ8ØØ& x§¡°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ÐNaÓbˆHØÐØà—:‘:×0Ñ0°¸3Ô?Øà X§^¡^Ñ3Øà+×2Ñ2°1Ñ5ˆOà˜x¨¸ÀxÐPˆØ�z‰z×/Ñ/Ø˜_Ð-Ð/BÐDWô
ð à×Ñ×#Ñ# NÔ3Ü×%Ñ%Ø˜NÐ+°oÐ5FÈTÏZÉZ×MhÑMhÐioÓMpô
ˆ
ð ,ˆ
ÔØ×Ñ× Ñ  Ô,Ø8<×8LÑ8Lˆ×$Ñ$ Z§_¡_Ñ5Ø×Ñ˜fÔ%Ør   c                 ó¼  — |j                   d   |vry||j                   d      }t        |«      dk7  s|d   j                  dk7  ry|d   }| j                  j	                  |d«      sy|j                   d   |vry||j                   d      }t        |«      dk7  s|d   j                  dk7  ry|d   }| j                  j	                  |d«      sy|j                   d   |vry||j                   d      }t        |«      dk7  s|d   j                  dk7  ry|d   }| j                  j                  |dd|«      }|€yd}	| j                  j                  |dd	¬
«      dk7  r>| j                  j                  |dd|«      }	|	€y| j                  j	                  |	d«      sy| j                  j                  |d|«      }
|
€y|
j                   d   |j                  vry|||||g}|	r|j                  |	«       | j                  j                  ||j                   d   g||«      sy| j                  j                  |«       t        j                  d|
j                   d   g|j                   d   g| j                  j                  d«      ¬«      }d|_        | j"                  j                  |«       | j$                  | j&                  |j(                  <   | j+                  d«       y)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.
        r   Nr   r   r   r%   r    r!   r"   r#   ÚSqrtg       @r   r&   r*   T)r+   r,   r-   r	   r.   r/   r0   Ú
get_parentr1   r9   r2   r3   r4   r   r5   r6   r7   r8   r:   r;   r)   r<   )r   r   r   r   r=   r>   r?   Úmulr@   Ú	sqrt_nodeÚ	root_noderE   rF   s                r   r   zFusionGelu.fuse_2m   sØ  € ð �?‰?˜1ÑÐ%8Ñ8ØØ& x§¡°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Ñ/Øà˜x¨¸ÀsÐKˆÙØ×!Ñ! )Ô,à�z‰z×/Ñ/Ø˜SŸZ™Z¨™]˜OÐ-@ÐBUô
ð à×Ñ×#Ñ# NÔ3Ü×%Ñ%Ø˜I×,Ñ,¨QÑ/Ð0¸3¿:¹:Àa¹=¸/ÐPT×PZÑPZ×PkÑPkÐlrÓPsô
ˆ
ð ,ˆ
ÔØ×Ñ× Ñ  Ô,Ø8<×8LÑ8Lˆ×$Ñ$ Z§_¡_Ñ5Ø×Ñ˜fÔ%Ør   c                 óp  — |j                   d   |vry||j                   d      }t        |«      dk7  s|d   j                  dk7  ry|d   }| j                  j	                  |d«      sy|j                   d   |vry||j                   d      }t        |«      dk7  s|d   j                  dk7  ry|d   }| j                  j	                  |d«      sy| j                  j                  |dd|«      }|€y| j                  j                  |dd¬	«      }|dk  ry| j                  j                  ||dk(  rdnd|«      }	|	€y|j                   d   |vry||j                   d      }t        |«      dk7  s|d   j                  dk7  ry|d   }
|
j                  d   |	j                   d   k(  s |
j                  d   |	j                   d   k(  sy|||||
g}| j                  j                  ||
j                   d   g||«      sy| j                  j                  |«       t        j                  d
|	j                   d   g|
j                   d   g| j                  j                  d
«      ¬«      }d|_        | j                   j#                  |«       | j$                  | j&                  |j(                  <   | j+                  d
«       y)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.
        r   Nr   r   r   r%   g   `ž æ?r"   r#   r   r&   r*   T)r+   r,   r-   r	   r.   r/   r0   rI   r1   r2   r3   r4   r   r5   r6   r7   r8   r9   r:   r;   r)   r<   )r   r   r   r   r=   r>   rC   Ú	first_mulÚirL   Úlast_mulrE   rF   s                r   r   zFusionGelu.fuse_3º   s¼  € ð �?‰?˜1ÑÐ%8Ñ8ØØ& x§¡°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ØØ& x§¡°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Øà# X¨}¸hÈÐ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__r   r   Údictr   Úboolr   r   r   Ú__classcell__)r   s   @r   r   r      s–   ø„ ð/˜iõ /ðH°$ð HÈTó HðR°Dð RÈtð RÐX\Ð_cÑXcó RðhK°Dð KÈtð KÐX\Ð_cÑXcó KðZH°Dð HÈtð HÐX\Ð_cÑXc÷ Hr   r   N)Úloggingr   Úfusion_baser   Úonnxr   Ú
onnx_modelr   rQ   Úloggerr   © r   r   ú<module>r]      s+   ðõ
 å Ý Ý  á	�8Ó	€ôt�õ tr   