Ë
    �…j'$  ã                   óÚ   — d dl 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
 d dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dlmZ d dlmZ  e j4                  e«      Z G d„ de«      Zy)é    N)ÚFusionAttentionUnet)ÚFusionBiasAdd)ÚFusionBiasSplitGelu)ÚFusionGroupNorm)ÚFusionNhwcConv)ÚFusionOptions)ÚFusionSkipGroupNorm)ÚFusionInsertTransposeÚFusionTranspose)Úis_installed)Ú
ModelProto)Ú	OnnxModel)ÚBertOnnxModelc                   ó”   ‡ — e Zd Zddededefˆ fd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
dded
z  fd„Zd„ Zdded
z  fd„Zdded
z  fd„Zd„ Zˆ xZS )ÚUnetOnnxModelÚmodelÚ	num_headsÚhidden_sizec                 ó\   •— |dk(  r|dk(  s|dkD  r||z  dk(  sJ ‚t         ‰| �  |||¬«       y)aG  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       €úi/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/onnx_model_unet.pyr   zUnetOnnxModel.__init__   sA   ø€ ð ˜Q’ ;°!Ò#3¸ÀQºÈ;ÐYbÑKbÐfgÒKgÐhÐhä‰Ñ˜¨)ÀÐÕMó    c                 ó$   — | j                  «        y ©N)Úremove_useless_div©r   s    r   Ú
preprocesszUnetOnnxModel.preprocess%   s   € Ø×ÑÕ!r   c                 óD   — | j                  «        | j                  «        y r   )Úprune_graphÚremove_unused_constantr   s    r   ÚpostprocesszUnetOnnxModel.postprocess(   s   € Ø×ÑÔØ×#Ñ#Õ%r   c                 ó”  — | j                  «       D �cg c]  }|j                  dk(  sŒ|‘Œ }}g }|D ])  }| j                  |d«      dk(  sŒ|j                  |«       Œ+ |D ].  }| j	                  |j
                  d   |j                  d   «       Œ0 |r1| j                  |«       t        j                  dt        |«      «       yyc c}w )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   z UnetOnnxModel.remove_useless_div,   sÂ   € à&*§j¡j£lÖL˜d°d·l±lÀeÓ6K’TÐLˆ	ÐLàˆØò 	,ˆCØ×'Ñ'¨¨SÓ1°QÓ6Ø×&Ñ& sÕ+ð	,ð $ò 	KˆDØ×+Ñ+¨D¯K©K¸©N¸D¿J¹JÀq¹MÕJð	Kñ Ø×Ñ˜oÔ.Ü�K‰KÐ.´°OÓ0DÕEð ùò Ms
   “C¨Cc                 ó>   — t        | d¬«      }|j                  «        y )NT)Úupdate_weight)r   Úapply)r   Úconv_to_nhwc_convs     r   Úconvert_conv_to_nhwcz"UnetOnnxModel.convert_conv_to_nhwc<   s   € ä*¨4¸tÔDÐØ×ÑÕ!r   c           	      óž  — t        | «      }|j                  «        d}| j                  d«      }|D ]é  }t        j                  |d«      }t        |t        «      sJ ‚|t        t        t        |«      «      «      k7  rŒL| j                  |j                  d   «      s<| j                  |j                  d   «      s| j                  |j                  d   «      rJ ‚| j                  |j                  d   |j                  d   «       | j                  |«       |dz  }Œë t        |j                  «      |z   }|rt         j#                  d|«       y y )Nr   Ú	TransposeÚpermr'   zRemoved %d Transpose nodes)r   r9   Úget_nodes_by_op_typer   Úget_node_attributeÚ
isinstanceÚlistÚranger2   Úfind_graph_outputr-   Úfind_graph_inputr.   r,   Úremove_noder5   r0   r1   )r   Úfusion_transposeÚremove_countr(   r3   ÚpermutationÚtotals          r   Úmerge_adjacent_transposez&UnetOnnxModel.merge_adjacent_transposeA   s.  € Ü*¨4Ó0ÐØ×ÑÔ àˆØ×)Ñ)¨+Ó6ˆØò 	ˆDÜ#×6Ñ6°t¸VÓDˆKÜ˜k¬4Ô0Ð0Ð0Øœd¤5¬¨[Ó)9Ó#:Ó;Ò;Øà×&Ñ& t§{¡{°1¡~Ô6Ø×(Ñ(¨¯©°A©Ô7Ø×)Ñ)¨$¯*©*°Q©-Ô8ðð ð ×+Ñ+¨D¯K©K¸©N¸D¿J¹JÀq¹MÔJà×Ñ˜TÔ"Ø˜AÑ‰Lð!	ô$ Ð$×4Ñ4Ó5¸ÑDˆÙÜ�K‰KÐ4°eÕ<ð r   NÚoptionsc                 ó   — |d u xs |j                   }t        | | j                  | j                  d|d¬«      }|j	                  «        |d u xs |j
                  }t        | | j                  | j                  dd|¬«      }|j	                  «        y )NF)Úis_cross_attentionÚenable_packed_qkvÚenable_packed_kvT)rO   r   r   r   r9   rP   )r   rL   rO   Úself_attention_fusionrP   Úcross_attention_fusions         r   Úfuse_multi_head_attentionz'UnetOnnxModel.fuse_multi_head_attention]   s˜   € à$¨˜_ÒJ°×1JÑ1JÐÜ 3ØØ×ÑØ�N‰NØ$Ø/Ø"ô!
Ðð 	×#Ñ#Ô%ð $ t˜OÒH°×0HÑ0HÐÜ!4ØØ×ÑØ�N‰NØ#Ø#Ø-ô"
Ðð 	×$Ñ$Õ&r   c                 ó:   — t        | «      }|j                  «        y r   )r   r9   )r   Úfusions     r   Úfuse_bias_addzUnetOnnxModel.fuse_bias_addv   s   € Ü˜tÓ$ˆØ�‰�r   c                 ó  — t        d«      rLdd l}ddlm}  |«       5  d}|j                  t	        |«      dd¬«      }| j                  ||«       d d d «       y t        j                  d«       | j                  |d «       y # 1 sw Y   y xY w)NÚtqdmr   )Úlogging_redirect_tqdmé   rU   )ÚinitialÚdescz<tqdm is not installed. Run optimization without progress bar)r   rX   Útqdm.contrib.loggingrY   rC   Ú	_optimizer0   r1   )r   rL   rX   rY   ÚstepsÚprogress_bars         r   ÚoptimizezUnetOnnxModel.optimizez   sx   € Ü˜ÔÛÝBá&Ó(ñ 6Ø�Ø#Ÿy™y¬¨u«¸qÀx˜yÓP�Ø—‘˜w¨Ô5÷6ð 6ô
 �K‰KÐVÔWØ�N‰N˜7 DÕ)÷6ð 6ús   �2B Â B	c                 ó¨  — |�|j                   s| j                  «        | j                  j                  «        |r|j	                  d«       | j                  j                  «        |r|j	                  d«       |�|j                  r| j                  «        |r|j	                  d«       |�|j                  r| j                  «        |r|j	                  d«       | j                  «        |r|j	                  d«       | j                  «        |r|j	                  d«       |�|j                  rI|d u xs |j                  }t        | |«      }|j                  «        t!        | «      }|j                  «        |r|j	                  d«       |�|j"                  rt%        | «      }|j                  «        |r|j	                  d«       |�|j&                  r| j)                  |«       |r|j	                  d«       |�|j*                  r| j-                  «        |r|j	                  d«       | j/                  «        |r|j	                  d«       | j                  j1                  «        |r|j	                  d«       |�|j2                  rt5        | «      }|j                  «        |r|j	                  d«       |�|j6                  r| j9                  «        |r|j	                  d«       |�|j:                  r| j=                  «        |r|j	                  d«       |�|j>                  r | jA                  «        | jC                  «        |r|j	                  d«       |�|jD                  r| jG                  «        |r|j	                  d«       | jI                  «        |r|j	                  d«       tJ        jM                  d| jO                  «       › �«       y )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   r9   r
   Úenable_bias_splitgelur   Úenable_attentionrS   Ú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;   rK   Úenable_bias_addrV   r$   r0   r1   Úget_opset_version)r   rL   r`   Úchannels_lastÚgroup_norm_fusionÚinsert_transpose_fusionÚbias_split_gelu_fusionÚskip_group_norm_fusions           r   r^   zUnetOnnxModel._optimize‡   s:  € ØÐ¨×)GÒ)GØ×(Ñ(Ô*à�
‰
×(Ñ(Ô*ÙØ×Ñ Ô"ð 	�
‰
×,Ñ,Ô.ÙØ×Ñ Ô"àˆO × 9Ò 9Ø× Ñ Ô"ÙØ×Ñ Ô"àˆO × 3Ò 3Ø�N‰NÔÙØ×Ñ Ô"à�‰ÔÙØ×Ñ Ô"à×ÑÔÙØ×Ñ Ô"àˆO × 9Ò 9Ø$¨˜_ÒQ°×1QÑ1QˆMÜ /°°mÓ 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×#:Ò#:Ø×ÑÔ ÙØ×Ñ Ô"à×ÑÔÙØ×Ñ Ô"ä�‰�o d×&<Ñ&<Ó&>Ð%?Ð@ÕAr   c                 óŽ   — i }g d¢}|D ]!  }| j                  |«      }t        |«      ||<   Œ# t        j                  d|› �«       |S )z8
        Returns node count of fused operators.
        )	Ú	AttentionÚMultiHeadAttentionÚLayerNormalizationÚSkipLayerNormalizationÚBiasSplitGeluÚ	GroupNormÚSkipGroupNormÚNhwcConvÚBiasAddzOptimized operators:)r?   r2   r0   r1   )r   Úop_countÚopsÚopr(   s        r   Úget_fused_operator_statisticsz+UnetOnnxModel.get_fused_operator_statisticsì   sY   € ð ˆò

ˆð ò 	&ˆBØ×-Ñ-¨bÓ1ˆEÜ˜u›:ˆH�RŠLð	&ô 	�‰Ð*¨8¨*Ð5Ô6Øˆr   )r   r   r   )NN)Ú__name__Ú
__module__Ú__qualname__r   Úintr   r    r$   r   r;   rK   r   rS   rV   ra   r^   r�   Ú__classcell__)r   s   @r   r   r      s}   ø„ ñ
N˜jð 
N°Sð 
NÈ3õ 
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	   rG   r
   r   Úimport_utilsr   Úonnxr   Ú
onnx_modelr   Úonnx_model_bertr   Ú	getLoggerr‘   r0   r   © r   r   ú<module>r¤      sN   ðó å 5Ý )Ý 4Ý -Ý +Ý (Ý 6ß CÝ %Ý Ý  Ý )à	ˆ×	Ñ	˜8Ó	$€ôj�Mõ jr   