§
    kŠtjì  ã                   ó’   — 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dS )
é    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 )ÚSam2OnnxModelr   ÚmodelÚ	num_headsÚhidden_sizec                 óŠ   •— |dk    r|dk    s|dk    r	||z  dk    sJ ‚t          ¦   «                              |||¬¦  «         dS )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       €úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/onnxruntime/transformers/onnx_model_sam2.pyr   zSam2OnnxModel.__init__   s\   ø€ ð ˜Q’� ;°!Ò#3Ð#3¸ÀQº¸È;ÐYbÑKbÐfgÒKgÐKgÐKgÐhå‰Œ×Ò˜¨)ÀÐÑMÔMÐMÐMÐMó    c                 óV   — |                       ¦   «          |                      ¦   «          d S ©N)Úprune_graphÚremove_unused_constant)r   s    r   ÚpostprocesszSam2OnnxModel.postprocess   s,   € Ø×ÒÑÔÐØ×#Ò#Ñ%Ô%Ð%Ð%Ð%r   c                 óŽ   •— t          ¦   «                              ¦   «          t          | ¦  «        }|                     ¦   «          d S r   )r   Úfuse_layer_normr   Úapply)r   Úfusionr   s     €r   r   zSam2OnnxModel.fuse_layer_norm#   s7   ø€ Ý‰Œ×ÒÑ!Ô!Ð!å-¨dÑ3Ô3ˆØ�Š‰Œˆˆˆr   NÚoptionsc                 ód   — t          | | j        | j        ¦  «        }|                     ¦   «          d S r   )r   r   r   r   )r   r   Ú
mha_fusions      r   Úfuse_multi_head_attentionz'Sam2OnnxModel.fuse_multi_head_attention)   s0   € Ý1°$¸Ô8HÈ$Ì.ÑYÔYˆ
Ø×ÒÑÔÐÐÐr   FÚadd_dynamic_axesc                 ó\  — t          d¦  «        rldd l}ddlm}  |¦   «         5  d}|                     t	          |¦  «        dd¬¦  «        }|                      ||¦  «         d d d ¦  «         d S # 1 swxY w Y   d S t                               d¦  «         |                      |d ¦  «         d S )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-   s  € Ý˜ÑÔð 
	*ØˆKˆKˆKØBÐBÐBÐBÐBÐBà&Ð&Ñ(Ô(ð 6ð 6Ø�Ø#Ÿyšy­¨u©¬¸qÀ}˜yÑUÔU�Ø—’˜w¨Ñ5Ô5Ð5ð6ð 6ð 6ñ 6ô 6ð 6ð 6ð 6ð 6ð 6ð 6ð 6øøøð 6ð 6ð 6ð 6ð 6ð 6õ
 �KŠKÐVÑWÔWÐWØ�NŠN˜7 DÑ)Ô)Ð)Ð)Ð)s   ¤>A/Á/A3Á6A3c                 ó2  — |�|j         s|                      ¦   «          | j                             ¦   «          |r|                     d¦  «         | j                             ¦   «          |r|                     d¦  «         |�|j        r|                      ¦   «          |r|                     d¦  «         |�|j        r|  	                    ¦   «          |r|                     d¦  «         |  
                    ¦   «          |r|                     d¦  «         |�|j        r|                      |¦  «         |r|                     d¦  «         |�|j        r|                      ¦   «          |r|                     d¦  «         |                      ¦   «          |r|                     d¦  «         | j                             ¦   «          |r|                     d¦  «         |�|j        r|                      ¦   «          |r|                     d¦  «         |�|j        r|                      ¦   «          |r|                     d¦  «         |                      ¦   «          |r|                     d¦  «         t,                               d|                      ¦   «         › �¦  «         d S )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ÐØ×(Ò(Ñ*Ô*Ð*àŒ
×(Ò(Ñ*Ô*Ð*Øð 	#Ø×Ò Ñ"Ô"Ð"ð 	Œ
×,Ò,Ñ.Ô.Ð.Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 9ˆOØ× Ò Ñ"Ô"Ð"Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 3ˆOØ�NŠNÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"à×ÒÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô 8ˆOØ×*Ò*¨7Ñ3Ô3Ð3Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô >ˆOØ×%Ò%Ñ'Ô'Ð'Øð 	#Ø×Ò Ñ"Ô"Ð"à�ŠÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"ð 	Œ
×/Ò/Ñ1Ô1Ð1Øð 	#Ø×Ò Ñ"Ô"Ð"àˆO Ô CˆOà×.Ò.Ñ0Ô0Ð0Øð 	#Ø×Ò Ñ"Ô"Ð"àÐ 7Ô#DÐØ×#Ò#Ñ%Ô%Ð%Øð 	#Ø×Ò Ñ"Ô"Ð"à×ÒÑÔÐØð 	#Ø×Ò Ñ"Ô"Ð"å�ŠÐ@ d×&<Ò&<Ñ&>Ô&>Ð@Ð@ÑAÔAÐAÐAÐAr   c                 ó¤   — i }g d¢}|D ])}|                       |¦  «        }t          |¦  «        ||<   Œ*t                               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   so   € ð ˆð
ð 
ð 
ˆð ð 	&ð 	&ˆBØ×-Ò-¨bÑ1Ô1ˆEÝ˜u™:œ:ˆH�R‰LˆLå�ŠÐ5¨8Ð5Ð5Ñ6Ô6Ð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
      s  ø€ € € € € ð
Nð 
N˜jð 
N°Sð 
NÈ3ð 
Nð 
Nð 
Nð 
Nð 
Nð 
Nð&ð &ð &ðð ð ð ð ðð °ÀÑ1Eð ð ð ð ð*ð * °Ñ 4ð *Ètð *ð *ð *ð *ð=Bð =B °Ñ!5ð =Bð =Bð =Bð =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Ð 9Ð 9Ð 9Ð 9Ð 9Ø (Ð (Ð (Ð (Ð (Ð (Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø )Ð )Ð )Ð )Ð )Ð )à	ˆÔ	˜8Ñ	$Ô	$€ðwð wð wð wð w�Mñ wô wð wð wð wr   