
    g                     r    d dl mZ d dlmZ d dlZd dlmZ d dlm	Z	m
Z
 d dlmZ  ee      Z G d de      Zy)	    )	getLogger)DictN)Fusion)TensorProtohelper)	OnnxModelc                   6     e Zd Zddef fdZdedefdZ xZS )FusionGroupNormmodelc                 6    t         |   |dd       || _        y )N	GroupNormAdd)super__init__channels_last)selfr   r   	__class__s      _/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_group_norm.pyr   zFusionGroupNorm.__init__   s    U3*    input_name_to_nodesoutput_name_to_nodec           	      z   | j                   j                  |g dg d|      }|y|\  }}}}|j                  d   }	| j                   j                  |dgdg|      }
|
y|
d   j                  d   |	k7  ry|
d   }| j                   j                  |d      }d}|'| j                   j                  |dgdg|      }||d   }|j                  d| j                   j	                  |j
                  d   |      z
     }| j                   j                  |d	d
      sy|j                  d| j                   j	                  |j
                  d   |      z
     }| j                   j                  |d	d      sy| j                   j                  |      }|yt        |j                        d	k(  r$|j                  d   dk(  r|j                  d   dk(  sy| j                   j                  |      }|yt        |j                        d	k(  r$|j                  d   dk(  r|j                  d   dk(  syt        t        j                  |j                              }t        t        j                  |j                              }||k7  ry| j                   j                  |j                  d         }|t        |j                        dk7  ry| j                   j                  |j                  d         }||j                  |j                  k7  ryt        j                  t        j                  |      |      syt        j                  t        j                  |      |      sy| j                   j!                  dd      }| j#                  |dz   t$        j&                  |g|       | j#                  |dz   t$        j&                  |g|       |}||||||g}|xr |}|r|r|j)                  ||g       |}| j                   j+                  ||j
                  ||      s| j,                  j)                  |g       n| j,                  j)                  |       d| _        |	}|j
                  d   }| j0                  r|dz   n|}| j0                  r|dz   n|}| j0                  rwt3        j4                  d|g|g| j                   j!                  dd      g d      }| j6                  j9                  |       | j:                  | j<                  |j>                  <   t3        j4                  d||dz   |dz   g|g|      } | j@                  j)                  |j@                         | j@                  j)                  t3        jB                  dd      g       | j@                  j)                  t3        jB                  d|rdnd      g       | j0                  s0| j@                  j)                  t3        jB                  dd      g       d| _"        | j6                  j9                  |        | j:                  | j<                  | j>                  <   | j0                  rxt3        j4                  d|g|g| j                   j!                  dd      g d      }!| j6                  j9                  |!       | j:                  | j<                  |!j>                  <   yy) a  
         Fuse Group Normalization subgraph into one node GroupNorm.
         The following is the pattern with swish activation:
               +----------------Shape-------------------------------+
               |                                                    |
               |    (0, 32, -1)                                     v     (512x1x1) (512x1x1) (optional)
           [Root] --> Reshape -------> InstanceNormalization --> Reshape ---> Mul --> Add --> Mul--> [output]
        Bx512xHxW                 (scale=ones(32), B=zeros(32))                        |       ^     Bx512xHxW
                                                                                       |       |
                                                                                       +--->Sigmoid (optional)
        The Mul and Sigmoid before output is for Swish activation. They are optional.
        )MulReshapeInstanceNormalizationr   )r   r   r   r   Nr   Shape   r   Sigmoid   zgroup norm weightzlayernorm bias   r   )name_prefix_gamma)name	data_typedimsvals_betaT_NHWC	TransposeTranspose_NCHW_to_NHWC)r   r    r   r   )r#   perm)inputsoutputsr#   groups    
activationr   zcom.microsoftTranspose_NHWC_to_NCHW)r   r   r   r    )#r   match_parent_pathinputfind_first_child_by_typeinput_indexoutput$is_constant_with_specified_dimensionget_constant_valuelenshapeintnpprodallclose	ones_like
zeros_likecreate_node_nameadd_initializerr   FLOATextendis_safe_to_fuse_nodesnodes_to_removeprune_graphr   r   	make_nodenodes_to_addappendthis_graph_namenode_name_to_graph_namer#   	attributemake_attributedomain)"r   add_noder   r   nodes
weight_mul
reshape_4dinstance_norm
reshape_3drootparents
shape_node	swish_mulswish_sigmoidsigmoid_pathweight_input
bias_inputweightbiasweight_elementsbias_elementsinstance_norm_scaleinstance_norm_biasgroup_norm_name	last_nodesubgraph_nodeshas_swish_activation
input_nameoutput_namegroup_norm_input_namegroup_norm_output_nametranspose_inputnew_nodetranspose_outputs"                                     r   fusezFusionGroupNorm.fuse   sL    

,,Ll\o
 =<A9
Jz"**..zG9qcK^_?1:A$&QZ
 JJ77%H	 ::77	I;QUPVXklL' ,Q!''DJJ,B,B:CTCTUVCWYc,d(dezz>>|QPcd^^A

(>(>z?P?PQR?SU](^$^_
zz>>z1N^_..|<>FLL!Q&6<<?a+?FLLQROWXDXzz,,Z8<DJJ1$A!);

1QR@Rbggfll34BGGDJJ/0m+"jj;;M<O<OPQ<RS&#.A.G.G*HA*M!ZZ::=;N;Nq;QR%)<)B)BFYF_F_)_{{2<<(;<>QR{{2==);<>PQ**55k{5[ 8+!''!"	 	 	
 	 7*!''	 	 	
 	"J
M:Wab(:]!!9m"<=!Izz//	
   ''4  ''7  
&&q)8<8J8J
W 4PZ:>:L:Lw!6R] $..&'ZZ00Jb0c!O $$_5AEAUAUD(()=)=>##)?X+EY`G`a+, 	
 	!!-"9"9:!!6#8#82#F"GH!!6#8#8L`qfg#h"ij!!%%v'<'<_a'P&QR)  *6:6J6J$$X]]3 %//'(ZZ00Jb0c!  $$%56BFBVBVD(()9)>)>? r   )T)__name__
__module____qualname__r   r   r   ro   __classcell__)r   s   @r   r
   r
      s(    +i +^W$ ^WT ^Wr   r
   )loggingr   typingr   numpyr<   fusion_baser   onnxr   r   
onnx_modelr   rp   loggerr
    r   r   <module>r|      s3   
     $  	8	cWf cWr   