§
    kŠtjÑ'  ã                   óh   — 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
dS )é    )Ú	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                 óN   •— t          ¦   «                              |dd¦  «         d S )NÚGeluÚErf)ÚsuperÚ__init__)Úselfr	   Ú	__class__s     €úb/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/fusion_gelu.pyr   zFusionGelu.__init__   s%   ø€ Ý‰Œ×Ò˜ ¨Ñ.Ô.Ð.Ð.Ð.ó    Úinput_name_to_nodesÚoutput_name_to_nodec                 ó˜   — |                       |||¦  «        rd S |                      |||¦  «        rd S |                      |||¦  «         d S )N)Úfuse_1Úfuse_2Úfuse_3)r   Úerf_noder   r   s       r   ÚfusezFusionGelu.fuse   s^   € Ø�;Š;�xÐ!4Ð6IÑJÔJð 	ØˆFØ�;Š;�xÐ!4Ð6IÑJÔJð 	ØˆFØ�Š�HÐ1Ð3FÑGÔGÐGÐGÐGr   ÚreturnNc                 óŠ  — |j         d         |vrdS ||j         d                  }t          |¦  «        dk    s|d         j        dk    rdS |d         }| j                             |d¦  «        sdS |j         d         |vrdS ||j         d                  }t          |¦  «        dk    s|d         j        dk    rdS |d         }| j                             |dd|¦  «        }|€dS | j                             |dd¬	¦  «        dk    rdS |j        d         }|j        d         |j         d         k    rdnd}	||j        |	         k    rl||j         d                  }t          |¦  «        dk    s|d         j        dk    rdS |d         }
| j                             |
d
¦  «        sdS |
j         d         }nV| j                             |d|	|¦  «        }
|
€dS | j                             |
d
¦  «        sdS ||
j        vrdS |j         d         }|||||
g}| j                             ||g||¦  «        sdS | j	         
                    |¦  «         t          j        d|g|g| j                             d¦  «        ¬¦  «        }d|_        | j                             |¦  «         | j        | j        |j        <   |                      d¦  «         dS )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Ð8ØˆFØ& x¤°qÔ'9Ô:ˆÝˆx‰=Œ=˜AÒÐ ¨!¤Ô!4¸Ò!=Ð!=ØˆFØ  œˆàŒz×,Ò,¨]¸AÑ>Ô>ð 	ØˆFàÔ Ô"Ð*=Ð=Ð=ØˆFØ& }Ô';¸AÔ'>Ô?ˆÝˆx‰=Œ=˜AÒÐ ¨!¤Ô!4¸Ò!=Ð!=ØˆFØ  œˆàŒj×%Ò% h°°qÐ:MÑNÔNˆØˆ;ØˆFàŒ:×)Ò)¨#¨v¸UÐ)ÑCÔCÀqÒHÐHØˆFàœ 1œˆà$Ô*¨1Ô-°Ô1EÀaÔ1HÒHÐH�!�!ÈaˆØ˜]Ô0°Ô9Ò9Ð9Ø*¨=Ô+?ÀÔ+BÔCˆHÝ�8‰}Œ} Ò!Ð! X¨a¤[Ô%8¸EÒ%AÐ%AØ�Ø ”{ˆHØ”:×0Ò0°¸3Ñ?Ô?ð Ø�Ø&œo¨aÔ0ˆOˆOà”z×.Ò.¨}¸eÀWÐNaÑbÔbˆHØÐØ�à”:×0Ò0°¸3Ñ?Ô?ð Ø�à X¤^Ð3Ð3Ø�à+Ô2°1Ô5ˆOà˜x¨¸ÀxÐPˆØŒz×/Ò/Ø˜_Ð-Ð/BÐDWñ
ô 
ð 	ð ˆFàÔ×#Ò# NÑ3Ô3Ð3ÝÔ%Ø˜NÐ+°oÐ5FÈTÌZ×MhÒMhÐioÑMpÔMpð
ñ 
ô 
ˆ
ð ,ˆ
ÔØÔ× Ò  Ñ,Ô,Ð,Ø8<Ô8LˆÔ$ Z¤_Ñ5Ø×Ò˜fÑ%Ô%Ð%Øˆtr   c                 óÀ  — |j         d         |vrdS ||j         d                  }t          |¦  «        dk    s|d         j        dk    rdS |d         }| j                             |d¦  «        sdS |j         d         |vrdS ||j         d                  }t          |¦  «        dk    s|d         j        dk    rdS |d         }| j                             |d¦  «        sdS |j         d         |vrdS ||j         d                  }t          |¦  «        dk    s|d         j        dk    rdS |d         }| j                             |dd|¦  «        }|€dS d}	| j                             |dd	¬
¦  «        dk    r>| j                             |dd|¦  «        }	|	€dS | j                             |	d¦  «        sdS | j                             |d|¦  «        }
|
€dS |
j         d         |j        vrdS |||||g}|	r| 	                    |	¦  «         | j         
                    ||j         d         g||¦  «        sdS | j                             |¦  «         t          j        d|
j         d         g|j         d         g| j                             d¦  «        ¬¦  «        }d|_        | j         	                    |¦  «         | j        | j        |j        <   |                      d¦  «         dS )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Ð8ØˆFØ& x¤°qÔ'9Ô:ˆÝˆx‰=Œ=˜AÒÐ ¨!¤Ô!4¸Ò!=Ð!=ØˆFØ  œˆàŒz×,Ò,¨]¸AÑ>Ô>ð 	ØˆFàÔ Ô"Ð*=Ð=Ð=ØˆFØ& }Ô';¸AÔ'>Ô?ˆÝˆx‰=Œ=˜AÒÐ ¨!¤Ô!4¸Ò!=Ð!=ØˆFØ  œˆàŒz×,Ò,¨]¸CÑ@Ô@ð 	ØˆFàÔ Ô"Ð*=Ð=Ð=ØˆFØ& }Ô';¸AÔ'>Ô?ˆÝˆx‰=Œ=˜AÒÐ ¨!¤Ô!4¸Ò!=Ð!=ØˆFØ�qŒkˆàŒj×%Ò% h°°qÐ:MÑNÔNˆØˆ;ØˆFàˆ	ØŒ:×)Ò)¨#¨v¸UÐ)ÑCÔCÀqÒHÐHØœ
×/Ò/°°V¸QÐ@SÑTÔTˆIØÐ Ø�Ø”:×0Ò0°¸CÑ@Ô@ð Ø�à”J×)Ò)¨#¨qÐ2EÑFÔFˆ	ØÐØˆFàÔ˜AÔ c¤iÐ/Ð/ØˆFà˜x¨¸ÀsÐKˆØð 	-Ø×!Ò! )Ñ,Ô,Ð,àŒz×/Ò/Ø˜SœZ¨œ]˜OÐ-@ÐBUñ
ô 
ð 	ð ˆFàÔ×#Ò# NÑ3Ô3Ð3ÝÔ%Ø˜IÔ,¨QÔ/Ð0¸3¼:Àa¼=¸/ÐPTÔPZ×PkÒPkÐlrÑPsÔPsð
ñ 
ô 
ˆ
ð ,ˆ
ÔØÔ× Ò  Ñ,Ô,Ð,Ø8<Ô8LˆÔ$ Z¤_Ñ5Ø×Ò˜fÑ%Ô%Ð%Øˆtr   c                 ór  — |j         d         |vrdS ||j         d                  }t          |¦  «        dk    s|d         j        dk    rdS |d         }| j                             |d¦  «        sdS |j         d         |vrdS ||j         d                  }t          |¦  «        dk    s|d         j        dk    rdS |d         }| j                             |d¦  «        sdS | j                             |dd|¦  «        }|€dS | j                             |dd¬	¦  «        }|dk     rdS | j                             ||dk    rdnd|¦  «        }	|	€dS |j         d         |vrdS ||j         d                  }t          |¦  «        dk    s|d         j        dk    rdS |d         }
|
j        d         |	j         d         k    s|
j        d         |	j         d         k    sdS |||||
g}| j         	                    ||
j         d         g||¦  «        sdS | j
                             |¦  «         t          j        d
|	j         d         g|
j         d         g| j                             d
¦  «        ¬¦  «        }d|_        | j                             |¦  «         | j        | j        |j        <   |                      d
¦  «         dS )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Ð8ØˆFØ& x¤°qÔ'9Ô:ˆÝˆx‰=Œ=˜AÒÐ ¨!¤Ô!4¸Ò!=Ð!=ØˆFØ  œˆàŒz×,Ò,¨]¸AÑ>Ô>ð 	ØˆFàÔ Ô"Ð*=Ð=Ð=ØˆFØ& }Ô';¸AÔ'>Ô?ˆÝˆx‰=Œ=˜AÒÐ ¨!¤Ô!4¸Ò!=Ð!=ØˆFØ˜A”;ˆàŒz×,Ò,¨X°sÑ;Ô;ð 	ØˆFà”J×+Ò+¨H°e¸QÐ@SÑTÔTˆ	ØÐØˆFàŒJ×*Ò*¨9Ð6HÐPUÐ*ÑVÔVˆØˆqŠ5ˆ5ØˆFà”J×)Ò)¨)¸!¸qº&¸&°Q°QÀaÐI\Ñ]Ô]ˆ	ØÐØˆFàŒ?˜1ÔÐ%8Ð8Ð8ØˆFØ& x¤°qÔ'9Ô:ˆÝˆx‰=Œ=˜AÒÐ ¨!¤Ô!4¸Ò!=Ð!=ØˆFØ˜A”;ˆà”˜qÔ! YÔ%5°aÔ%8Ò8Ð8¸H¼NÈ1Ô<MÐQZÔQaÐbcÔQdÒ<dÐ<dØˆFà# X¨}¸hÈÐQˆØŒz×/Ò/ØØŒ_˜QÔÐ ØØñ	
ô 
ð 	ð ˆFàÔ×#Ò# NÑ3Ô3Ð3ÝÔ%Ø˜IÔ,¨QÔ/Ð0¸8¼?È1Ô;MÐ:NÐUYÔU_×UpÒUpÐqwÑUxÔUxð
ñ 
ô 
ˆ
ð ,ˆ
ÔØÔ× Ò  Ñ,Ô,Ð,Ø8<Ô8LˆÔ$ Z¤_Ñ5Ø×Ò˜fÑ%Ô%Ð%Øˆtr   )Ú__name__Ú
__module__Ú__qualname__r   r   Údictr   Úboolr   r   r   Ú__classcell__)r   s   @r   r   r      s  ø€ € € € € ð/˜ið /ð /ð /ð /ð /ð /ðH°$ð HÈTð Hð Hð Hð HðR°Dð RÈtð RÐX\Ð_cÑXcð Rð Rð Rð RðhK°Dð KÈtð KÐX\Ð_cÑXcð Kð Kð Kð KðZH°Dð HÈtð HÐX\Ð_cÑXcð Hð Hð Hð Hð Hð Hð Hð Hr   r   N)Úloggingr   Úfusion_baser   Úonnxr   Ú
onnx_modelr   rQ   Úloggerr   © r   r   ú<module>r]      sœ   ðð
 Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à	ˆ�8Ñ	Ô	€ðtð tð tð tð t�ñ tô tð tð tð tr   