Ë
    �…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  e j                  e«      Z G d„ d	e«      Zy)
é    N)ÚFusionMultiHeadAttentionSam2)ÚFusionLayerNormalizationNCHW)ÚFusionOptions)Úis_installed)Ú
ModelProto)ÚBertOnnxModelc                   ó„   ‡ — e Zd Zddededefˆ fd„Zd„ Zˆ fd„Zddedz  fd	„Z	ddedz  d
e
fd„Zddedz  fd„Zd„ Zˆ xZS )ÚSam2OnnxModelÚmodelÚ	num_headsÚhidden_sizec                 ó\   •— |dk(  r|dk(  s|dkD  r||z  dk(  sJ ‚t         ‰| �  |||¬«       y)aG  Initialize SAM2 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_sam2.pyr   zSam2OnnxModel.__init__   sA   ø€ ð ˜Q’ ;°!Ò#3¸ÀQºÈ;ÐYbÑKbÐfgÒKgÐhÐhä‰Ñ˜¨)ÀÐÕMó    c                 óD   — | j                  «        | j                  «        y ©N)Úprune_graphÚremove_unused_constant)r   s    r   ÚpostprocesszSam2OnnxModel.postprocess   s   € Ø×ÑÔØ×#Ñ#Õ%r   c                 óX   •— t         ‰| �  «        t        | «      }|j                  «        y r   )r   Úfuse_layer_normr   Úapply)r   Úfusionr   s     €r   r   zSam2OnnxModel.fuse_layer_norm#   s!   ø€ Ü‰ÑÔ!ä-¨dÓ3ˆØ�‰�r   NÚoptionsc                 óf   — t        | | j                  | j                  «      }|j                  «        y r   )r   r   r   r   )r   r   Ú
mha_fusions      r   Úfuse_multi_head_attentionz'Sam2OnnxModel.fuse_multi_head_attention)   s&   € Ü1°$¸×8HÑ8HÈ$Ï.É.ÓYˆ
Ø×ÑÕr   Úadd_dynamic_axesc                 ó  — 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é   zsam2 fusion)ÚinitialÚdescz<tqdm is not installed. Run optimization without progress bar)r   r$   Útqdm.contrib.loggingr%   ÚrangeÚ	_optimizeÚloggerÚinfo)r   r   r"   r$   r%   ÚstepsÚprogress_bars          r   ÚoptimizezSam2OnnxModel.optimize-   sx   € Ü˜ÔÛÝBá&Ó(ñ 6Ø�Ø#Ÿy™y¬¨u«¸qÀ}˜yÓU�Ø—‘˜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                  |«       |r|j	                  d«       |�|j                  r| j                  «        |r|j	                  d«       | 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«       t,        j/                  d| j1                  «       › �«       y )Né   zopset version: )Úenable_shape_inferenceÚdisable_shape_inferenceÚutilsÚremove_identity_nodesÚupdateÚremove_useless_cast_nodesÚenable_layer_normr   Úenable_geluÚ	fuse_geluÚfuse_reshapeÚenable_attentionr!   Úenable_skip_layer_normÚfuse_skip_layer_normÚ
fuse_shapeÚremove_useless_reshape_nodesÚenable_bias_skip_layer_normÚfuse_add_bias_skip_layer_normÚenable_gelu_approximationÚgelu_approximationr   r,   r-   Úget_opset_version)r   r   r/   s      r   r+   zSam2OnnxModel._optimize:   sò  € ØÐ¨×)GÒ)GØ×(Ñ(Ô*à�
‰
×(Ñ(Ô*ÙØ×Ñ Ô"ð 	�
‰
×,Ñ,Ô.ÙØ×Ñ Ô"àˆO × 9Ò 9Ø× Ñ Ô"ÙØ×Ñ Ô"àˆO × 3Ò 3Ø�N‰NÔÙØ×Ñ Ô"à×ÑÔÙØ×Ñ Ô"àˆO × 8Ò 8Ø×*Ñ*¨7Ô3ÙØ×Ñ Ô"àˆO × >Ò >Ø×%Ñ%Ô'ÙØ×Ñ Ô"à�‰ÔÙØ×Ñ Ô"ð 	�
‰
×/Ñ/Ô1ÙØ×Ñ Ô"àˆO × CÒ Cà×.Ñ.Ô0ÙØ×Ñ Ô"àÐ 7×#DÒ#DØ×#Ñ#Ô%ÙØ×Ñ Ô"à×ÑÔÙØ×Ñ Ô"ä�‰�o d×&<Ñ&<Ó&>Ð%?Ð@ÕAr   c                 óŽ   — i }g d¢}|D ]!  }| j                  |«      }t        |«      ||<   Œ# t        j                  d|› �«       |S )z8
        Returns node count of fused operators.
        )ÚMultiHeadAttentionÚLayerNormalizationÚSkipLayerNormalizationzOptimized operators:)Úget_nodes_by_op_typeÚlenr,   r-   )r   Úop_countÚopsÚopÚnodess        r   Úget_fused_operator_statisticsz+Sam2OnnxModel.get_fused_operator_statisticsy   sY   € ð ˆò
ˆð ò 	&ˆBØ×-Ñ-¨bÓ1ˆEÜ˜u›:ˆH�RŠLð	&ô 	�‰Ð*¨8¨*Ð5Ô6Øˆr   )r   r   r   )NF)NN)Ú__name__Ú
__module__Ú__qualname__r   Úintr   r   r   r   r!   Úboolr0   r+   rQ   Ú__classcell__)r   s   @r   r
   r
      sm   ø„ ñ
N˜jð 
N°Sð 
NÈ3õ 
Nò&ôñ°ÀÑ1Eó ñ* °Ñ 4ð *Ètó *ñ=B °Ñ!5ó =Bö~r   r
   )ÚloggingÚfusion_attention_sam2r   Úfusion_layernormr   Úfusion_optionsr   Úimport_utilsr   Úonnxr   Úonnx_model_bertr   Ú	getLoggerrR   r,   r
   © r   r   ú<module>ra      s<   ðó å >Ý 9Ý (Ý %Ý Ý )à	ˆ×	Ñ	˜8Ó	$€ôw�Mõ wr   