
    h                     f    S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	  \" \
5      r " S S\5      rg)	    )	getLogger)Fusion)FusionUtils)helper)	OnnxModelc                   B   ^  \ rS rSrS\4U 4S jjrS\S\4S jrSrU =r	$ )FusionQOrderedGelu   modelc                 ,   > [         TU ]  USSS/5        g )NQOrderedGeluGeluFastGelu)super__init__)selfr   	__class__s     g/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/fusion_qordered_gelu.pyr   FusionQOrderedGelu.__init__   s    0DE    input_name_to_nodesoutput_name_to_nodec           
         U R                   R                  X5      n[        U5      S:X  a  US   R                  S:X  d6  [        U5      S:X  a&  US   R                  S:X  a  US   R                  S:X  d  gUS   nSn[        U5      S:X  a  US   n[        R
                  " XPR                   5      (       d  gU R                   R                  US/S/4/U5      u  pxn	US:  a  gUS   n
[        R
                  " XR                   5      (       d  gU/nUR                  XZ/5        U R                   R                  UUb  UR                  S   UR                  S   /OUR                  UU5      (       d  [        R                  S5        gU R                  R                  U5        [        R                  " S	U
R                  S   U
R                  S   UR                  S   /UR                  S   /U R                   R!                  S	S	S
9S9nUb6  U R                   R#                  XfR                  S   UR                  S   5        UR$                  R                  [        R&                  " SS5      /5        UR$                  R                  [        R&                  " SS5      /5        SUl        U R*                  R-                  U5        U R.                  U R0                  UR2                  '   g)z
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   fuseFusionQOrderedGelu.fuse   s    

//J
 1$q)9)A)AEU)UM"a'!!$,,0@@!!$,,7 #0#3  $}"$1!$4!445MzzZZ 6:ZZ5R5R!"QC()6
2 1#;A#> 445MzzZZ 7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____firstlineno__r   r   dictrE   __static_attributes____classcell__)r   s   @r   r	   r	      s1    Fi FbTd bT bT bTr   r	   N)loggingr   fusion_baser   fusion_utilsr   onnxr   
onnx_modelr   rH   r-   r	   rG   r   r   <module>rT      s0      $   	8	fT fTr   