
    g                     r    d dl mZ d dlm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)Dict)Fusion)FusionUtils)helper)	OnnxModelc                   4     e Zd Zdef fdZdedefdZ xZS )FusionQOrderedGelumodelc                 ,    t         |   |dddg       y )NQOrderedGeluGeluFastGelu)super__init__)selfr   	__class__s     b/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_qordered_gelu.pyr   zFusionQOrderedGelu.__init__   s    0DE    input_name_to_nodesoutput_name_to_nodec           	         | j                   j                  ||      }t        |      dk(  r|d   j                  dk(  s3t        |      dk(  r$|d   j                  dk(  r|d   j                  dk(  sy|d   }d}t        |      dk(  r|d   }t	        j
                  || j                         sy| j                   j                  |dgdgfg|      \  }}}	|dk  ry|d   }
t	        j
                  |
| j                         sy|g}|j                  ||
g       | j                   j                  |||j                  d   |j                  d   gn|j                  ||      st        j                  d       y| j                  j                  |       t        j                  d	|
j                  d   |
j                  d   |j                  d   g|j                  d   g| j                   j!                  d	d	
            }|7| j                   j#                  ||j                  d   |j                  d          |j$                  j                  t        j&                  dd      g       |j$                  j                  t        j&                  dd      g       d|_        | j*                  j-                  |       | j.                  | j0                  |j2                  <   y)a  
        INPUT PATTERN
        Fuse (quantized) Gelu subgraph into one node QOrderedGelu:
            -> quantized input  -> DQ -> Gelu -> Q ->

        (or)

            -> quantized input  -> DQ -> FastGelu -> Q ->

        OUTPUT PATTERN
            -> QOrderedGelu ->
           r   QuantizeLinear   ShapeNDequantizeLinearz.It is not safe to fuse QOrderedGelu node. Skipr   )name_prefix)inputsoutputsnameorder_Xorder_Yzcom.microsoft)r   get_childrenlenop_typer   check_qdq_node_for_fusionmatch_parent_pathsextendis_safe_to_fuse_nodesoutputloggerdebugnodes_to_remover   	make_nodeinputcreate_node_namereplace_node_input	attributemake_attributedomainnodes_to_addappendthis_graph_namenode_name_to_graph_namer!   )r   noder   r   gelu_childrendownstream_quantize_nodedownstream_shape_nodefirst_path_idfirst_input_parent_nodes_upstream_dequantize_nodesubgraph_nodesordered_gelu_nodes                r   fusezFusionQOrderedGelu.fuse   s    

//6IJ
 1$q)9)A)AEU)UM"a'!!$,,0@@!!$,,7 #0#3  $}"$1!$4!445MtzzZ 6:ZZ5R5R!"QC()6
2/ 1#;A#> 445MtzzZ 79QRSzz// )4 Q!9!@!@!CD-44	
 LLIJ##N3",,(..q1(..q1(..q1
 .44Q78,,^,X	
 !,JJ))%'<'B'B1'EG_GfGfghGi 	##**F,A,A)Q,O+PQ##**F,A,A)Q,O+PQ#2   !23?C?S?S$$%6%;%;<r   )__name__
__module____qualname__r   r   r   rD   __classcell__)r   s   @r   r
   r
      s*    Fi FbTd bT bTr   r
   N)loggingr   typingr   fusion_baser   fusion_utilsr   onnxr   
onnx_modelr   rE   r,   r
    r   r   <module>rP      s3       $   	8	fT fTr   