
    fPi'                     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     x/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/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!46IJJ 	F;;x!46IJJ 	FH13F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:))#vU)CCqHHF1$*1-1Ea1HHH!!a]0999*=+?+BCH8}}!!Xa[%8E%A%A{H:003?? &oa0OOz..}eWNabbH:003?? X^33+215OxxPz//_-/BDW
 
 	 F##N333%N+o5FTZMhMhioMpMp
 
 

 ,
  ,,,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qkj%%hq:MNN;F	:))#vU)CCqHH
//VQ@STTI :00C@@ J))#q2EFF	FAci//FxsK 	-!!),,,z//SZ]O-@BU
 
 	 F##N333%I,Q/03:a=/PTPZPkPklrPsPs
 
 

 ,
  ,,,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,,Xs;; 	FJ++HeQ@STT	FJ**96HPU*VVq55FJ)))!q&&QQaI\]]	F?1%888F&xq'9:x==A!!4!=!=FA;q!Y%5a%888HN1<MQZQabcQd<d<dF#X}hQz//_Q 	
 
 	 F##N333%I,Q/08?1;M:NUYU_UpUpqwUxUx
 
 

 ,
  ,,,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\_cXc R R R RhKD Kt KX\_cXc K K K KZHD Ht HX\_cXc 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   