
    h'$                         S SK r 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
  S SKJr  S SKJr  S S	KJrJr  S S
KJr  S SKJr  S SKJr  S SKJr  \ R4                  " \5      r " S S\5      rg)    N)FusionAttentionUnet)FusionBiasAdd)FusionBiasSplitGelu)FusionGroupNorm)FusionNhwcConv)FusionOptions)FusionSkipGroupNorm)FusionInsertTransposeFusionTranspose)is_installed)
ModelProto)	OnnxModel)BertOnnxModelc                      ^  \ rS rSrSS\S\S\4U 4S jjjrS rS rS r	S	 r
S
 rSS\S-  4S jjrS rSS\S-  4S jjrSS\S-  4S jjrS rSrU =r$ )UnetOnnxModel   model	num_headshidden_sizec                 Z   > US:X  a  US:X  d  US:  a  X2-  S:X  d   e[         TU ]  XUS9  g)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   r   N)super__init__)selfr   r   r   	__class__s       b/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/onnx_model_unet.pyr   UnetOnnxModel.__init__   s<     Q;!#3Q;KbfgKghhM    c                 $    U R                  5         g N)remove_useless_divr   s    r   
preprocessUnetOnnxModel.preprocess%   s    !r   c                 D    U R                  5         U R                  5         g r   )prune_graphremove_unused_constantr!   s    r   postprocessUnetOnnxModel.postprocess(   s    ##%r   c                    U R                  5        Vs/ s H  oR                  S:X  d  M  UPM     nn/ nU H,  nU R                  US5      S:X  d  M  UR                  U5        M.     U H/  nU R	                  UR
                  S   UR                  S   5        M1     U(       a1  U R                  U5        [        R                  S[        U5      5        ggs  snf )zRemove Div by 1Divg      ?   r   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Lldlle6KTl	LC''S1Q6&&s+  $D++DKKNDJJqMJ $ o.KK.O0DE  Ms
   CCc                 8    [        U SS9nUR                  5         g )NT)update_weight)r   apply)r   conv_to_nhwc_convs     r   convert_conv_to_nhwc"UnetOnnxModel.convert_conv_to_nhwc<   s    *4tD!r   c           	         [        U 5      nUR                  5         SnU R                  S5      nU GH  n[        R                  " US5      n[        U[        5      (       d   eU[        [        [        U5      5      5      :w  a  MU  U R                  UR                  S   5      (       dF  U R                  UR                  S   5      (       d#  U R                  UR                  S   5      (       a   eU R                  UR                  S   UR                  S   5        U R                  U5        US-  nGM     [        UR                  5      U-   nU(       a  [         R#                  SU5        g g )Nr   	Transposepermr+   zRemoved %d Transpose nodes)r   r>   get_nodes_by_op_typer   get_node_attribute
isinstancelistranger6   find_graph_outputr1   find_graph_inputr2   r0   remove_noder9   r4   r5   )r   fusion_transposeremove_countr,   r7   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   Noptionsc           	      (   US L =(       d    UR                   n[        U U R                  U R                  SUSS9nUR	                  5         US L =(       d    UR
                  n[        U U R                  U R                  SSUS9nUR	                  5         g )NF)is_cross_attentionenable_packed_qkvenable_packed_kvT)rV   r   r   r   r>   rW   )r   rS   rV   self_attention_fusionrW   cross_attention_fusions         r   fuse_multi_head_attention'UnetOnnxModel.fuse_multi_head_attention]   s    $_J1J1J 3NN$/"!
 	##% $tOH0H0H!4NN##-"
 	$$&r   c                 :    [        U 5      nUR                  5         g r   )r   r>   )r   fusions     r   fuse_bias_addUnetOnnxModel.fuse_bias_addv   s    t$r   c                 $   [        S5      (       aH  SS KnSSKJn  U" 5          SnUR                  [	        U5      SSS9nU R                  X5        S S S 5        g [        R                  S5        U R                  US 5        g ! , (       d  f       g = f)Ntqdmr   )logging_redirect_tqdm   r]   )initialdescz<tqdm is not installed. Run optimization without progress bar)r   ra   tqdm.contrib.loggingrb   rI   	_optimizer4   r5   )r   rS   ra   rb   stepsprogress_bars         r   optimizeUnetOnnxModel.optimizez   sp    B&(#yyuqxyPw5 )(
 KKVWNN7D) )(s   .B
Bc                    Ub!  UR                   (       d  U R                  5         U R                  R                  5         U(       a  UR	                  S5        U R                  R                  5         U(       a  UR	                  S5        Ub  UR                  (       a  U R                  5         U(       a  UR	                  S5        Ub  UR                  (       a  U R                  5         U(       a  UR	                  S5        U R                  5         U(       a  UR	                  S5        U R                  5         U(       a  UR	                  S5        Ub  UR                  (       aM  US L =(       d    UR                  n[        X5      nUR                  5         [!        U 5      nUR                  5         U(       a  UR	                  S5        Ub  UR"                  (       a  [%        U 5      nUR                  5         U(       a  UR	                  S5        Ub  UR&                  (       a  U R)                  U5        U(       a  UR	                  S5        Ub  UR*                  (       a  U R-                  5         U(       a  UR	                  S5        U R/                  5         U(       a  UR	                  S5        U R                  R1                  5         U(       a  UR	                  S5        Ub  UR2                  (       a  [5        U 5      nUR                  5         U(       a  UR	                  S5        Ub  UR6                  (       a  U R9                  5         U(       a  UR	                  S5        Ub!  UR:                  (       a  U R=                  5         U(       a  UR	                  S5        Ub  UR>                  (       a   U RA                  5         U RC                  5         U(       a  UR	                  S5        Ub!  URD                  (       a  U RG                  5         U(       a  UR	                  S5        U RI                  5         U(       a  UR	                  S5        [J        RM                  SU RO                  5        35        g )Nr+   z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   r>   r
   enable_bias_splitgelur   enable_attentionrZ   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_convr@   rQ   enable_bias_addr^   r'   r4   r5   get_opset_version)r   rS   ri   channels_lastgroup_norm_fusioninsert_transpose_fusionbias_split_gelu_fusionskip_group_norm_fusions           r   rg   UnetOnnxModel._optimize   s8   )G)G((*

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

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

//1"O > >%8%>""((*"O C C..0"7#D#D##%"?g66%%'))+"7#:#: ""od&<&<&>%?@Ar   c                     0 n/ SQnU H!  nU R                  U5      n[        U5      X'   M#     [        R                  SU 35        U$ )z(
Returns node count of fused operators.
)		AttentionMultiHeadAttentionLayerNormalizationSkipLayerNormalizationBiasSplitGelu	GroupNormSkipGroupNormNhwcConvBiasAddzOptimized operators:)rE   r6   r4   r5   )r   op_countopsopr,   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   intr   r"   r'   r    r@   rQ   r   rZ   r^   rj   rg   r   __static_attributes____classcell__)r   s   @r   r   r      s    
Nj 
NS 
N3 
N 
N"&F "
=8'1E '2* 4 *cB!5 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	   rM   r
   r   import_utilsr   onnxr   
onnx_modelr   onnx_model_bertr   	getLoggerr   r4   r   r   r   r   <module>r      sL     5 ) 4 - + ( 6 C %    )			8	$jM jr   