Ë
    �…j¼5  ã                   ój   — 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
  ee«      Z G d„ de«      Zy)	é    )Ú	getLogger)ÚAttentionMaskÚFusionAttention)ÚAttentionMaskFormat)Ú	NodeProto)Ú	OnnxModelc                   óP   ‡ — e Zd ZdZdededefˆ fd„Zdedeeef   fd„Z	d	„ Z
ˆ xZS )
ÚFusionAttentionClipzB
    Fuse Attention subgraph of Clip into one Attention node.
    ÚmodelÚhidden_sizeÚ	num_headsc                 ór   •— t        |«      }t        j                  |_        t        ‰| �  ||||ddg¬«       y )NFÚSkipLayerNormalization)Úuse_multi_head_attentionÚsearch_op_types)r   r   ÚNoMaskÚmask_formatÚsuperÚ__init__)Úselfr   r   r   Úattention_maskÚ	__class__s        €úo/root/aria/tools/markitdown-venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_attention_clip.pyr   zFusionAttentionClip.__init__   sD   ø€ ô ' uÓ-ˆÜ%8×%?Ñ%?ˆÔ"ä‰ÑØØØØØ%*Ø5Ð6ð 	õ 	
ó    Ú	reshape_qÚreturnc                 óâ  — | j                   j                  |dd«      }|�t        |j                  «      dk7  r| j                  | j
                  fS | j                   j                  |j                  d   «      }|€| j                  | j
                  fS t        |«      dk7  s|d   dk  r| j                  | j
                  fS |d   }| j                   j                  |j                  d   «      }|€| j                  | j
                  fS t        |«      dk7  s|d   dk  r| j                  | j
                  fS |d   }||z  }| j                  dkD  rH|| j                  k7  r9| j                  r-t        j                  d| j                  › d|› d	�«       d
| _        | j
                  dkD  rH|| j
                  k7  r9| j                  r-t        j                  d| j
                  › d|› d	�«       d
| _
        ||fS )zÏDetect num_heads and hidden_size for ONNX model from MiDaS
        Args:
            reshape_q (NodeProto): reshape node for q
        Returns:
            Tuple[int, int]: num_heads and hidden_size
        ÚConcaté   é   é   r   é   z--num_heads is z. Detected value is z. Using detected value.Fz--hidden_size is )r   Úmatch_parentÚlenÚinputr   r   Úget_constant_valueÚnum_heads_warningÚloggerÚwarningÚhidden_size_warning)r   r   ÚconcatÚnum_head_valuer   Úhead_size_valueÚ	head_sizer   s           r   Úget_num_heads_and_hidden_sizez1FusionAttentionClip.get_num_heads_and_hidden_size&   sÜ  € ð —‘×(Ñ(¨°H¸aÓ@ˆØˆ>œS §¡Ó.°!Ò3Ø—>‘> 4×#3Ñ#3Ð3Ð3ð Ÿ™×6Ñ6°v·|±|ÀA±ÓGˆØÐ!Ø—>‘> 4×#3Ñ#3Ð3Ð3äˆ~Ó !Ò# ~°aÑ'8¸AÒ'=Ø—>‘> 4×#3Ñ#3Ð3Ð3à" 1Ñ%ˆ	àŸ*™*×7Ñ7¸¿¹ÀQ¹ÓHˆØÐ"Ø—>‘> 4×#3Ñ#3Ð3Ð3äˆÓ 1Ò$¨¸Ñ(:¸aÒ(?Ø—>‘> 4×#3Ñ#3Ð3Ð3à# AÑ&ˆ	à )Ñ+ˆà�>‰>˜AÒ )¨t¯~©~Ò"=Ø×%Ò%Ü—‘ °·±Ð0@Ð@TÐU^ÐT_Ð_vÐwÔxØ).�Ô&à×Ñ˜aÒ K°4×3CÑ3CÒ$CØ×'Ò'Ü—‘Ø'¨×(8Ñ(8Ð'9Ð9MÈkÈ]ÐZqÐrôð ,1�Ô(à˜+Ð%Ð%r   c                 ó  — d }d }dD ]&  }| j                   j                  |d|«      }|€Œ#|}|}Œ( d }|�|j                  d   }n…dD ]}  }d }| j                   j                  |d|«      }	| j                   j                  |d|«      }
|	�|	}n|
�|
}|€ŒK| j                   j                  |d|d«      }|€Œl|j                  d   }|} n |€y | j                   j	                  |g d¢d	|z
  d d dddg«      }|€9| j                   j	                  |g d
¢g d¢«      }|€t
        j                  d«       y |d   |d   |d   }}}| j                   j	                  |g d¢g d¢«      }|€9| j                   j	                  |g d¢g d¢«      }|€t
        j                  d«       y |d   |d   }}d }d }g }| j                   j	                  |g d¢g d¢|¬«      }|€Ñ| j                   j	                  |ddgddg«      }|€Ë| j                   j	                  |g d¢g d¢«      }|�|d	   }n¢| j                   j	                  |g d¢g d¢«      }|€| j                   j	                  |g d¢g d ¢«      }|�|d   }nV| j                   j	                  |g d!¢g d"¢«      }|€3t
        j                  d#«       y t        |«      d	k(  sJ ‚d	|d   z
  }|d   }|d   }| j                   j	                  |g d$¢g d%¢«      }|€?| j                   j	                  |g d¢g d&¢«      }|€t
        j                  d'«       y |d	   }n|d   }|d   |d   }}| j                   j	                  |g d(¢g d)¢«      }|€9| j                   j	                  |g d¢g d¢«      }|€t
        j                  d*«       y |d   |d   }}|j                  d   |k7  s$|j                  d   |k7  s|j                  d   |k7  rt
        j                  d+«       y | j                  |«      \  }} |dk  s| dk  rt
        j                  d,«       y |}!d-}"d }#d }$|�¸|j                  d	   d.k(  r|j                  d	   }"n–| j                   j	                  |g d/¢g d0¢«      }%|%�|j                  d	   }"nc| j                   j	                  |g d1¢|dddddg«      }#| j                   j	                  |g d2¢|ddddg«      }$|#€|$€t
        j                  d3«       y | j                  d |||||||| ||!j                  d   |"d |#d uxs |$d u¬4«      }&|&€t
        j                  d5«       y | j                  j                  |&«       | j                  | j                  |&j                  <   | j                   j#                  |!|g«       d6| _        y )7N)r   r   r   r   )r   r   ÚAddÚLayerNormalizationF)r1   ÚMatMulÚReshapeÚ	Transposer4   r3   r   )r1   r3   r4   r5   r3   )r   Nr   r   r   z(fuse_attention: failed to match qkv pathr!   r"   éÿÿÿÿ)r4   r5   r4   r1   r3   )r   r   r   r   N)r5   r4   r1   r3   )r   r   r   Nz&fuse_attention: failed to match v pathéþÿÿÿ)ÚSoftmaxr4   r1   r4   r3   )r   r   r   Nr   )Úreturn_indicer8   r3   )r8   r1   ÚMulr3   )r   r   r   r   )r8   r:   r3   )r   r   r   )ÚCastr;   r8   r1   r:   r3   )r   r   r   r   r   r   )r;   r;   r8   r:   r3   )r   r   r   r   r   z'fuse_attention: failed to match qk path)r4   r5   r4   r:   r1   r3   )r   r   r   r   NN)r   r   r   Nz&fuse_attention: failed to match q path)r5   r4   r5   r4   r1   r3   )r   r   r   r   r   Nz&fuse_attention: failed to match k pathz>fuse_attention: expect to have same input to q, k and v matmulz9fuse_attention: failed to detect num_heads or hidden_sizeÚ r   )	ÚWhereÚSubr;   ÚExpandÚ	Unsqueezer@   r4   r4   r;   )	r   r!   r   r   r   r   r   r   r   )r   r?   r@   r@   r=   ÚLess)r?   r@   r@   r=   rA   z4fuse_attention: failed to match causal mask subgraph)Ú
mask_indexÚq_matmulÚk_matmulÚv_matmulÚq_addÚk_addÚv_addr   r   Úfirst_inputÚoutputÚ
add_qk_strÚscaleÚcausalz+fuse_attention: failed to create fused nodeT)r   r#   rJ   Úfind_first_child_by_typeÚmatch_parent_pathr(   Údebugr$   r%   r/   Úcreate_attention_nodeÚnodes_to_addÚappendÚthis_graph_nameÚnode_name_to_graph_nameÚnameÚnodes_to_removeÚextendÚprune_graph)'r   Únormalize_nodeÚinput_name_to_nodesÚoutput_name_to_nodeÚskip_input_indexÚnode_before_layer_normÚiÚparentÚ
root_inputÚnode_before_layer_norm_1Únode_before_layer_norm_2ÚchildÚ	qkv_nodesÚreshape_qkvÚtranspose_qkvÚ
matmul_qkvÚv_nodesÚadd_vÚmatmul_vÚcausal_mask_input_indexÚadd_maskÚadd_mask_indicesÚqk_nodesÚ	matmul_qkÚq_nodesr   Úadd_qÚmatmul_qÚk_nodesÚadd_kÚmatmul_kr   r   Úattention_last_nodeÚadd_qkÚcausal_mask_nodes_1Úcausal_mask_nodes_2Úadd_qk_nodesÚnew_nodes'                                          r   ÚfusezFusionAttentionClip.fuseT   s{  € ØÐØ!%ÐØò 	0ˆAØ—Z‘Z×,Ñ,¨^Ð=UÐWXÓYˆFØÑ!Ø#$Ð Ø)/Ñ&ð		0ð ˆ
Ø!Ð-Ø/×6Ñ6°qÑ9‰Jð ò (�Ø)-Ð&à+/¯:©:×+BÑ+BÀ>ÐSXÐZ[Ó+\Ð(Ø+/¯:©:×+BÑ+BÀ>ÐSgÐijÓ+kÐ(Ø+Ð7ð .FÑ*Ø-Ð9ð .FÐ*à)Ð1ØØŸ
™
×;Ñ;Ø*Ø(Ø'Øó	�ð �=ØØ"Ÿ\™\¨!™_�
Ø#$Ð ÙðQ(ðT  Ð'Øà—J‘J×0Ñ0ØÚJØÐ!Ñ! 4¨¨q°!°QÐ7ó
ˆ	ð
 ÐØŸ
™
×4Ñ4ØÚCÚ"óˆIð
 Ð Ü—‘ÐGÔHØà�a‰LØ�a‰LØ�b‰Mð %/�]ˆð —*‘*×.Ñ.ØÚ@Úó
ˆð
 ˆ?Ø—j‘j×2Ñ2ØÒEÂóˆGð ˆÜ—‘ÐEÔFØà! "™+ w¨r¡{ˆxˆà"&ÐØˆØÐØ—:‘:×/Ñ/ØÚ>ÚØ*ð	 0ó 
ˆð ÐØ—z‘z×3Ñ3ØØ˜HÐ%Ø�A�óˆHð
 ÐØŸ:™:×7Ñ7¸
ÒDgÒiuÓv�ØÐ'Ø'¨™{‘Hð  $Ÿz™z×;Ñ;¸JÒHdÒfoÓp�HØÐ'à#'§:¡:×#?Ñ#?Ø&ÚOÚ.ó$˜ð
 $Ð/Ø'/°¡{™Hð (,§z¡z×'CÑ'CØ *Ú LÚ /ó(˜Hð
  (Ð/Ü &§¡Ð-VÔ WØ &äÐ'Ó(¨AÒ-Ð-Ð-Ø&'Ð*:¸1Ñ*=Ñ&=Ð#Ø ‘{ˆHà˜R‘Lˆ	à—*‘*×.Ñ.ØÚGÚ$ó
ˆð
 ˆ?Ø—j‘j×2Ñ2ØÒDÂoóˆGð ˆÜ—‘ÐEÔFØà ™
‰Ià ™
ˆIà! "™+ w¨r¡{ˆxˆà—*‘*×.Ñ.ØÚMÚ!ó
ˆð
 ˆ?Ø—j‘j×2Ñ2ØÒDÂoóˆGð ˆÜ—‘ÐEÔFØà! "™+ w¨r¡{ˆxˆà�>‰>˜!Ñ 
Ò*¨h¯n©n¸QÑ.?À:Ò.MÐQY×Q_ÑQ_Ð`aÑQbÐfpÒQpÜ�L‰LÐYÔZØà!%×!CÑ!CÀIÓ!NÑˆ	�;Ø˜Š>˜[¨AÒ-Ü�L‰LÐTÔUØà)ÐàˆØ"ÐØ"ÐØÐØ�~‰~˜aÑ Ð$4Ò4Ø!Ÿ™¨Ñ*‘ð  $Ÿz™z×;Ñ;Øò
ò 0ó �ð  Ð+Ø%Ÿ^™^¨AÑ.‘Fð +/¯*©*×*FÑ*FØ ÚWØ0°!°Q¸¸1¸aÐ@ó+Ð'ð +/¯*©*×*FÑ*FØ ÚMØ0°!°Q¸¸1Ð=ó+Ð'ð +Ð2Ð7JÐ7RÜŸ™Ð%[Ô\Øà×-Ñ-ØØØØØØØØØ#Ø"Ø&×-Ñ-¨aÑ0ØØØ'¨tÐ3ÒYÐ9LÐTXÐ9Xð .ó 
ˆð  ÐÜ�L‰LÐFÔGØà×Ñ× Ñ  Ô*Ø6:×6JÑ6Jˆ×$Ñ$ X§]¡]Ñ3Ø×Ñ×#Ñ#Ð%8¸-Ð$HÔIð  ˆÕr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úintr   r   Útupler/   r}   Ú__classcell__)r   s   @r   r
   r
      sL   ø„ ñð
àð
ð ð
ð õ	
ð$,&°yð ,&ÀUÈ3ÐPSÈ8Á_ó ,&ö\@ r   r
   N)Úloggingr   Úfusion_attentionr   r   Úfusion_optionsr   Úonnxr   Ú
onnx_modelr   r~   r(   r
   © r   r   ú<module>r‹      s.   ðõ
 ç ;Ý .Ý Ý  á	�8Ó	€ôE ˜/õ E r   