+
    9i'$                         ^ RI t ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RI	H
t
 ^ RIHt ^ RIHt ^ R	IHtHt ^ R
IHt ^ RIHt ^ RIHt ^ RIHt ] P4                  ! ]4      t ! R R]4      tR# )    N)FusionAttentionUnet)FusionBiasAdd)FusionBiasSplitGelu)FusionGroupNorm)FusionNhwcConvFusionOptions)FusionSkipGroupNorm)FusionInsertTransposeFusionTranspose)is_installed)
ModelProto)	OnnxModel)BertOnnxModelc                      a a ] tR t^t oRV3R lV 3R llltR tR tR tR tR t	RV3R lR	 llt
R
 tRV3R lR lltRV3R lR lltR tRtVtV ;t# )UnetOnnxModelc                ,   < V ^8  d   QhRS[ RS[RS[/# )   model	num_headshidden_size)r   int)format__classdict__s   "f/var/www/html/photoedit/myenv/lib/python3.14/site-packages/onnxruntime/transformers/onnx_model_unet.py__annotate__UnetOnnxModel.__annotate__   s'     
N 
Nj 
NS 
N3 
N    c                r   < V^ 8X  d   V^ 8X  g   V^ 8  d   W2,          ^ 8X  g   Q h\         SV `  WVR7       R# )a  Initialize UNet ONNX Model.

Args:
    model (ModelProto): the ONNX model
    num_heads (int, optional): number of attention heads. Defaults to 0 (detect the parameter automatically).
    hidden_size (int, optional): hidden dimension. Defaults to 0 (detect the parameter automatically).
)r   r   N)super__init__)selfr   r   r   	__class__s   &&&&r   r!   UnetOnnxModel.__init__   s<     Q;!#3Q;KbfgKghhMr   c                &    V P                  4        R # N)remove_useless_divr"   s   &r   
preprocessUnetOnnxModel.preprocess%   s    !r   c                F    V P                  4        V P                  4        R # r&   )prune_graphremove_unused_constantr(   s   &r   postprocessUnetOnnxModel.postprocess(   s    ##%r   c                   V P                  4        Uu. uF  qP                  R8X  g   K  VNK  	  pp. pV F-  pV P                  VR4      ^8X  g   K  VP                  V4       K/  	  V F7  pV P	                  VP
                  ^ ,          VP                  ^ ,          4       K9  	  V'       d3   V P                  V4       \        P                  R\        V4      4       R# R# u upi )zRemove Div by 1Divg      ?zRemoved %d Div nodesN)nodesop_typefind_constant_inputappendreplace_input_of_all_nodesoutputinputremove_nodesloggerinfolen)r"   node	div_nodesnodes_to_removedivs   &    r   r'    UnetOnnxModel.remove_useless_div,   s    &*jjlLldlle6KTTl	LC''S1Q6&&s+  $D++DKKNDJJqMJ $ o.KK.O0DE  Ms
   C C c                @    \        V R R7      pVP                  4        R# )T)update_weightN)r   apply)r"   conv_to_nhwc_convs   & r   convert_conv_to_nhwc"UnetOnnxModel.convert_conv_to_nhwc<   s    *4tD!r   c           	     &   \        V 4      pVP                  4        ^ pV P                  R4      pV EF  p\        P                  ! VR4      p\        V\        4      '       g   Q hV\        \        \        V4      4      4      8w  d   KW  V P                  VP                  ^ ,          4      '       gQ   V P                  VP                  ^ ,          4      '       g)   V P                  VP                  ^ ,          4      '       d   Q hV P                  VP                  ^ ,          VP                  ^ ,          4       V P                  V4       V^,          pEK"  	  \        VP                  4      V,           pV'       d   \         P#                  RV4       R# R# )r   	TransposepermzRemoved %d Transpose nodesN)r   rD   get_nodes_by_op_typer   get_node_attribute
isinstancelistranger<   find_graph_outputr7   find_graph_inputr8   r6   remove_noder?   r:   r;   )r"   fusion_transposeremove_countr2   r=   permutationtotals   &      r   merge_adjacent_transpose&UnetOnnxModel.merge_adjacent_transposeA   s5   *40 ))+6D#66tVDKk40000d5[)9#:;;&&t{{1~66((A77))$**Q-88  ++DKKNDJJqMJT"AL! $ $445DKK4e< r   c                .   < V ^8  d   QhRS[ R,          /# r   optionsNr   )r   r   s   "r   r   r   ]   s     ' '1E 'r   c           	     :   VR J ;'       g    VP                   p\        V V P                  V P                  RVRR7      pVP	                  4        VR J ;'       g    VP
                  p\        V V P                  V P                  RRVR7      pVP	                  4        R # )NF)is_cross_attentionenable_packed_qkvenable_packed_kvT)r^   r   r   r   rD   r_   )r"   r[   r^   self_attention_fusionr_   cross_attention_fusions   &&    r   fuse_multi_head_attention'UnetOnnxModel.fuse_multi_head_attention]   s    $_JJ1J1J 3NN$/"!
 	##% $tOHH0H0H!4NN##-"
 	$$&r   c                <    \        V 4      pVP                  4        R # r&   )r   rD   )r"   fusions   & r   fuse_bias_addUnetOnnxModel.fuse_bias_addv   s    t$r   c                .   < V ^8  d   QhRS[ R,          /# rZ   r   )r   r   s   "r   r   r   z   s     * * 4 *r   c                F   \        R 4      '       dU   ^ RIp^ RIHp V! 4       ;_uu_ 4        ^pVP                  \	        V4      ^ RR7      pV P                  W4       RRR4       R# \        P                  R4       V P                  VR4       R#   + '       g   i     R# ; i)tqdmN)logging_redirect_tqdmre   )initialdescz<tqdm is not installed. Run optimization without progress bar)r   rj   tqdm.contrib.loggingrk   rO   	_optimizer:   r;   )r"   r[   rj   rk   stepsprogress_bars   &&    r   optimizeUnetOnnxModel.optimizez   sv    B&((#yyuqxyPw5 )(
 KKVWNN7D) )((s   1BB 	c                .   < V ^8  d   QhRS[ R,          /# rZ   r   )r   r   s   "r   r   r      s     cB cB!5 cBr   c                L	   Ve#   VP                   '       g   V P                  4        V P                  P                  4        V'       d   VP	                  ^4       V P                  P                  4        V'       d   VP	                  ^4       Ve   VP                  '       d   V P                  4        V'       d   VP	                  ^4       Ve   VP                  '       d   V P                  4        V'       d   VP	                  ^4       V P                  4        V'       d   VP	                  ^4       V P                  4        V'       d   VP	                  ^4       Ve   VP                  '       dO   VR J ;'       g    VP                  p\        W4      pVP                  4        \!        V 4      pVP                  4        V'       d   VP	                  ^4       Ve   VP"                  '       d   \%        V 4      pVP                  4        V'       d   VP	                  ^4       Ve   VP&                  '       d   V P)                  V4       V'       d   VP	                  ^4       Ve   VP*                  '       d   V P-                  4        V'       d   VP	                  ^4       V P/                  4        V'       d   VP	                  ^4       V P                  P1                  4        V'       d   VP	                  ^4       Ve   VP2                  '       d   \5        V 4      pVP                  4        V'       d   VP	                  ^4       Ve   VP6                  '       d   V P9                  4        V'       d   VP	                  ^4       Ve#   VP:                  '       d   V P=                  4        V'       d   VP	                  ^4       Ve   VP>                  '       d!   V PA                  4        V PC                  4        V'       d   VP	                  ^4       Ve#   VPD                  '       d   V PG                  4        V'       d   VP	                  ^4       V PI                  4        V'       d   VP	                  ^4       \J        PM                  RV PO                  4        24       R # )Nzopset version: )(enable_shape_inferencedisable_shape_inferenceutilsremove_identity_nodesupdateremove_useless_cast_nodesenable_layer_normfuse_layer_normenable_gelu	fuse_gelur)   fuse_reshapeenable_group_normgroup_norm_channels_lastr   rD   r   enable_bias_splitgelur   enable_attentionrb   enable_skip_layer_normfuse_skip_layer_norm
fuse_shaperemove_useless_reshape_nodesenable_skip_group_normr
   enable_bias_skip_layer_normfuse_add_bias_skip_layer_normenable_gelu_approximationgelu_approximationenable_nhwc_convrF   rW   enable_bias_addrf   r.   r:   r;   get_opset_version)r"   r[   rq   channels_lastgroup_norm_fusioninsert_transpose_fusionbias_split_gelu_fusionskip_group_norm_fusions   &&&     r   ro   UnetOnnxModel._optimize   s_   )G)G)G((*

((*" 	

,,."O 9 9 9  ""O 3 3 3NN"""O 9 9 9$_QQ1Q1QM / D##%&;D&A##))+"O = = =%8%>""((*"O 8 8 8**73"O > > >%%'"" 	

//1"O > > >%8%>""((*"O C C C..0"7#D#D#D##%"?g666%%'))+"7#:#:#: ""od&<&<&>%?@Ar   c                    / p. ROpV F!  pV P                  V4      p\        V4      W&   K#  	  \        P                  RV 24       V# )z(
Returns node count of fused operators.
zOptimized operators:)		AttentionMultiHeadAttentionLayerNormalizationSkipLayerNormalizationBiasSplitGelu	GroupNormSkipGroupNormNhwcConvBiasAdd)rK   r<   r:   r;   )r"   op_countopsopr2   s   &    r   get_fused_operator_statistics+UnetOnnxModel.get_fused_operator_statistics   sR     

 B--b1Eu:HL  	*8*56r    )r   r   r&   )NN)__name__
__module____qualname____firstlineno__r!   r)   r.   r'   rF   rW   rb   rf   rr   ro   r   __static_attributes____classdictcell____classcell__)r#   r   s   @@r   r   r      s]     
N 
N"&F "
=8' '2* *cB cBJ r   r   )loggingfusion_attention_unetr   fusion_bias_addr   fusion_biassplitgelur   fusion_group_normr   fusion_nhwc_convr   fusion_optionsr	   fusion_skip_group_normr
   rS   r   r   import_utilsr   onnxr   
onnx_modelr   onnx_model_bertr   	getLoggerr   r:   r   r   r   r   <module>r      sL     5 ) 4 - + ( 6 C %    )			8	$jM jr   