
    h5                     j    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
  \" \5      r " S S\5      rg)	    )	getLogger)AttentionMaskFusionAttention)AttentionMaskFormat)	NodeProto)	OnnxModelc                   ^   ^  \ rS rSrSrS\S\S\4U 4S jjrS\S\	\\4   4S	 jr
S
 rSrU =r$ )FusionAttentionClip   z:
Fuse Attention subgraph of Clip into one Attention node.
modelhidden_size	num_headsc           	      l   > [        U5      n[        R                  Ul        [        TU ]  UUUUSS/S9  g )NFSkipLayerNormalization)use_multi_head_attentionsearch_op_types)r   r   NoMaskmask_formatsuper__init__)selfr   r   r   attention_mask	__class__s        h/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/transformers/fusion_attention_clip.pyr   FusionAttentionClip.__init__   sD     'u-%8%?%?"%*56 	 	
    	reshape_qreturnc                    U R                   R                  USS5      nUb  [        UR                  5      S:w  a  U R                  U R
                  4$ U R                   R                  UR                  S   5      nUc  U R                  U R
                  4$ [        U5      S:w  d	  US   S::  a  U R                  U R
                  4$ US   nU R                   R                  UR                  S   5      nUc  U R                  U R
                  4$ [        U5      S:w  d	  US   S::  a  U R                  U R
                  4$ US   nXF-  nU R                  S:  aM  X@R                  :w  a>  U R                  (       a-  [        R                  SU R                   SU S	35        S
U l        U R
                  S:  aM  XpR
                  :w  a>  U R                  (       a-  [        R                  SU R
                   SU S	35        S
U l
        XG4$ )zDetect 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_size1FusionAttentionClip.get_num_heads_and_hidden_size&   s    ((Ha@>S.!3>>4#3#333 66v||AG!>>4#3#333~!#~a'8A'=>>4#3#333"1%	**77QH">>4#3#3331$(:a(?>>4#3#333#A&	+>>A)~~"=%%0@@TU^T__vwx).&aK3C3C$C'''(8(8'99Mk]Zqr ,1(%%r   c                    S nS nS H)  nU R                   R                  USU5      nUc  M%  UnUnM+     S nUb  UR                  S   nOS H  nS nU R                   R                  USU5      n	U R                   R                  USU5      n
U	b  U	nOU
b  U
nUc  MO  U R                   R                  USUS5      nUc  Mr  UR                  S   nUn  O   Uc  g U R                   R	                  U/ SQS	U-
  S S SSS/5      nUc:  U R                   R	                  U/ S
Q/ SQ5      nUc  [
        R                  S5        g US   US   US   pnU R                   R	                  U/ SQ/ SQ5      nUc:  U R                   R	                  U/ SQ/ SQ5      nUc  [
        R                  S5        g US   US   nnS nS n/ nU R                   R	                  U/ SQ/ SQUS9nUc  U R                   R	                  USS/SS/5      nUc  U R                   R	                  U/ SQ/ SQ5      nUb  US	   nOU R                   R	                  U/ SQ/ SQ5      nUcd  U R                   R	                  U/ SQ/ S Q5      nUb  US   nOYU R                   R	                  U/ S!Q/ S"Q5      nUc  [
        R                  S#5        g O[        U5      S	:X  d   eS	US   -
  nUS   nUS   nU R                   R	                  U/ S$Q/ S%Q5      nUc@  U R                   R	                  U/ SQ/ S&Q5      nUc  [
        R                  S'5        g US	   nOUS   nUS   US   nnU R                   R	                  U/ S(Q/ S)Q5      nUc:  U R                   R	                  U/ SQ/ SQ5      nUc  [
        R                  S*5        g US   US   nnUR                  S   U:w  d&  UR                  S   U:w  d  UR                  S   U:w  a  [
        R                  S+5        g U R                  U5      u  nn US::  d  U S::  a  [
        R                  S,5        g Un!S-n"S n#S n$Ub  UR                  S	   S.:X  a  UR                  S	   n"OU R                   R	                  U/ S/Q/ S0Q5      n%U%b  UR                  S	   n"OeU R                   R	                  U/ S1QUSSSSS/5      n#U R                   R	                  U/ S2QUSSSS/5      n$U#c  U$c  [
        R                  S35        g U R                  S UUUUUUUU UU!R                  S   U"S U#S L=(       d    U$S LS49n&U&c  [
        R                  S55        g U R                  R                  U&5        U R                  U R                  U&R                  '   U R                   R#                  U!U/5        U R%                  U&R&                  5        S6U l        g )7N)r!   r   r   r   )r   r!   AddLayerNormalizationF)r4   MatMulReshape	Transposer7   r6   r!   )r4   r6   r7   r8   r6   )r!   Nr   r   r   z(fuse_attention: failed to match qkv pathr#   r$   )r7   r8   r7   r4   r6   )r!   r   r   r   N)r8   r7   r4   r6   )r!   r   r   Nz&fuse_attention: failed to match v path)Softmaxr7   r4   r7   r6   )r   r   r   Nr   )return_indicer;   r6   )r;   r4   Mulr6   )r   r   r   r   )r;   r=   r6   )r   r   r   )Castr>   r;   r4   r=   r6   )r   r   r   r   r   r   )r>   r>   r;   r=   r6   )r   r   r   r   r   z'fuse_attention: failed to match qk path)r7   r8   r7   r=   r4   r6   )r   r   r   r   NN)r   r   r   Nz&fuse_attention: failed to match q path)r8   r7   r8   r7   r4   r6   )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	UnsqueezerC   r7   r7   r>   )	r!   r#   r!   r   r   r   r   r   r   )r    rB   rC   rC   r@   Less)rB   rC   rC   r@   rD   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%   rM   find_first_child_by_typematch_parent_pathr*   debugr&   r'   r1   create_attention_nodenodes_to_addappendthis_graph_namenode_name_to_graph_namenamenodes_to_removeextendincrease_counterop_type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   fuseFusionAttentionClip.fuseT   s   !%AZZ,,^=UWXYF!#$ )/&	  
!-/66q9J )-&+/::+B+B>SXZ[+\(+/::+B+B>Sgij+k(+7 .F*-9 .F*)1

;;*('	 ="\\!_
#$ Q T  'JJ00J!!4q!Q7
	
 

44C"I
  GHaLaLbM %/ **..@

 ?jj22EG EF!"+wr{x"&:://>*	 0 
 zz33H%AH
 ::77
Dgiuv''{H  $zz;;JHdfopH'#'::#?#?&O.$
 $/'/{H (,zz'C'C * L /(H
  (/ &-V W &'(A---&'*:1*=&=#{HRL	**..G$

 ?jj22DoG EF
I
I!"+wr{x**..M!

 ?jj22DoG EF!"+wr{x>>!
*hnnQ.?:.MQYQ_Q_`aQbfpQpLLYZ!%!C!CI!N	;>[A-LLTU)""~~a $44!*  $zz;;
 0   +%^^A.F +/***F*F W0!Q1a@+' +/***F*F M0!Q1=+' +27J7R%[\--#"&--a0't3Y9LTX9X . 
  LLFG  *6:6J6J$$X]]3##%8-$HIh../  r   )r,   r)   r^   )__name__
__module____qualname____firstlineno____doc__r   intr   r   tupler1   r   __static_attributes____classcell__)r   s   @r   r
   r
      sR    

 
 	
$,&y ,&U3PS8_ ,&\A  A r   r
   N)loggingr   fusion_attentionr   r   fusion_optionsr   onnxr   
onnx_modelr   r   r*   r
    r   r   <module>r      s.   
  ; .   	8	F / F r   