
     Ng'                     x    d dl mZ d dlmZ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)DictOptional)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e         fdZ	dededee         fdZ
dededee         fd	Z xZS )

FusionGelumodelc                 N    t                                          |dd           d S )NGeluErf)super__init__)selfr   	__class__s     `/var/www/html/ai-engine/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   returnc                    |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   r0   r1   r2   
get_parentr3   r;   r4   r5   r6   r   r7   r8   r9   r:   r<   r=   r+   r>   )r   r   r   r   r?   r@   rA   mulrB   	sqrt_node	root_noderG   rH   s                r   r   zFusionGelu.fuse_2n   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   r0   r1   r2   rK   r3   r4   r5   r6   r   r7   r8   r9   r:   r;   r<   r=   r+   r>   )r   r   r   r   r?   r@   rE   	first_mulirN   last_mulrG   rH   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   r   r   r   boolr   r   r   __classcell__)r   s   @r   r
   r
      s       /i / / / / / /H$ HT H H H HRD Rt RX`aeXf R R R RhKD Kt KX`aeXf K K K KZHD Ht HX`aeXf H H H H H H H Hr   r
   N)loggingr   typingr   r   fusion_baser   onnxr   
onnx_modelr   rS   loggerr
    r   r   <module>r_      s   
       ! ! ! ! ! ! ! !                        	8		t t t t t t t t t tr   