
    rhB6              #       *   U d dl Z d dlZd dlmZmZ d dlZd dlmZ  ej                  de      Zi Z	e
ej                  j                  ef   ed<    eh d      Zded	ed
eegef   fdZ edd      	 d3dd d ddej&                  dej&                  dej&                  deej&                     dededed
ej&                  fd       Zdee   ded
efdZdej&                  deded
ej&                  fdZdej&                  dej&                  d ed!edee   d"ed
ej&                  fd#Zd ed!ed
dfd$Zdej&                  dej&                  d ed!edee   d
ej&                  fd%Z ed&d      	 	 	 d4dd d d dd'dd(dej&                  dej&                  d)ej&                  d*eej&                     d+eej&                     d,eej&                     d-ed.ed/ed"edee   d0ed1ee   d
eej&                  ej&                  ej&                  ej&                  f   fd2       Zy)5    N)CallableOptional)_dtype_mappings_T)boundONNX_ATEN_DECOMP_TABLE>      
         op_typeopset_versionreturnc                 0     dt         dt         f fd}|S )zDDecorator to register an ONNX operator with a custom implementation.funcr   c                     d }t        j                  j                  d d| d      |       }| t        t	        t	        t         j
                  j                        |      <   |j                  |        |S )Nopsetzonnx::. )mutates_args)torchlibrary	custom_opr   getattropsonnxregister_fake)r   overloadtorch_opr   r   s      g/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/torch/onnx/ops/_impl.py	decoratorz_onnx_op.<locals>.decorator   s|    =/*==**WIQxj) + 

  	wwuyy~~w'GRS
 	t$    )r   )r   r   r!   s   `` r    _onnx_opr#      s     r  r"   RotaryEmbedding   F)interleaved	num_headsrotary_embedding_dimx	cos_cache	sin_cacheposition_idsr&   r'   r(   c                     j                   d   } j                   d   }t         j                         dk(  rL j                   d   }	t        j                  |dk7   fd       |	|z  }
||||
g}t        j                   |       t        j                  t         j                         dk(  d         j                   d   }
|dk(  r|
} ddddddd|f   } dddddd|df   }|dz  }|||   }||   }n|}|}|ddddd|f   }|ddddd|f   }t        j
                  |d      }t        j
                  |d      }|r%|dddddddddf   }|dddddddddf   }nt        j                  |dd	
      \  }}||z  ||z  z
  }||z  ||z  z   }|rft        j
                  |d	      }t        j
                  |d	      }t        j                  ||fd	
      }t        j                  ||j                         }nt        j                  ||fd	
      }t        j                  ||fd	
      }t         j                         dk(  r t        j                  | j                         }|S )z_RotaryEmbedding-23 https://onnx.ai/onnx/operators/onnx__RotaryEmbedding.html#rotaryembedding-23r   r	         c                  "    d j                    S )NzKnum_heads must be provided for 3D inputs. Received input tensor with shape )shape)r)   s   r    <lambda>z%rotary_embedding_23.<locals>.<lambda>>   s    abcbibiajk r"      c                       y)Nzx should be a 4D tensor by nowr   r   r"   r    r2   z%rotary_embedding_23.<locals>.<lambda>C       r"   Ndim)r1   lenr   _checkreshape	unsqueezechunkcat)r)   r*   r+   r,   r&   r'   r(   
batch_sizesequence_lengthhidden_size	head_size	new_shapex_rotatex_not_rotaterotary_embedding_dim_halfcossinx1x2realimagx_rotate_concatoutputs   `                      r    rotary_embedding_23rO   +   s    JggajO
177|qggajNk	
  9,	)YG	MM!Y'	LLQWW"$LM
I q (Aq////0HQ12334L 4 9 
 
 
	1((((C 	1((((C //QC //QC
 aAqt!tm$aAqt!tm$Xqb1B 8cBhD8cBhD  tR(tR())T4Lb9==(..A99dD\r2YY,/R8F
177|qvqww/Mr"   scalerB   c                 :    | | S dt        j                  |      z  S )z/Get the scale factor for attention computation.g      ?)mathsqrt)rP   rB   s     r    _get_scale_factorrT      s     %5GC$))I2F,FGr"   tensorr?   c                     | j                   d   | j                   d   }}||z  }| j                  ||||      j                  dd      j                         S )z1Reshape 3D tensor to 4D for multi-head attention.r	   r/   )r1   view	transpose
contiguous)rU   r?   r'   r@   rA   rB   s         r    _reshape_3d_to_4drZ      sP     $*<<?FLLO[Oy(IJIF	1a	r"   QKcurrent_q_num_headscurrent_kv_num_headsqk_matmul_output_modec           	          |dk(  rt        | ||||      S t        j                  t        j                  | |j	                  dd                  S )z1Get QK output tensor based on the specified mode.r   r6   )_compute_qk_output_for_mode_0r   
zeros_likematmulrX   )r[   r\   r]   r^   rP   r_   s         r    _get_qk_output_for_aten_spdare      sO     !,q%';U
 	

 QB0C DEEr"   c                 H     t        j                   z  dk(   fd       y)z-Validate Group Query Attention configuration.r   c                      d d  dS )Nzq_num_heads (z%) must be divisible by kv_num_heads (z	) for GQAr   )r^   r]   s   r    r2   z-_validate_gqa_configuration.<locals>.<lambda>   s    - 344YZnYooxy r"   N)r   r:   )r]   r^   s   ``r    _validate_gqa_configurationrh      s"     
LL22a7yr"   c                     |}||k7  r||z  }|j                  |d      }t        || j                  d         }t        j                  |      }| |z  }	||z  }
t        j                  |	|
j                  dd            S )zDHelper function to compute QK output for qk_matmul_output_mode == 0.r	   r7   r.   ra   r6   )repeat_interleaverT   r1   rR   rS   r   rd   rX   )r[   r\   r]   r^   rP   K_for_qkrepeat_factorscale_factor
sqrt_scaleQ_scaledK_scaleds              r    rb   rb      s     H22+/CC&&}!&<$UAGGAJ7L<(J:~H*$H<<("4"4R"<==r"   	Attention        )	is_causalkv_num_headsq_num_headsr_   rP   softcapsoftmax_precisionV	attn_maskpast_key
past_valuers   rt   ru   rv   rw   c                	   d\  }}}t        | j                        }| j                  d   }t        | j                        dk(  rWt        j                  |dk7  xr |dk7  d        | j                  d   }t	        | ||      } t	        |||      }t	        |||      }t        j                  t        | j                        dk(  xr2 t        |j                        dk(  xr t        |j                        dk(  d        | j                  |   }t        |
|      }
|t        j                  ||g|	      n|j                         }|t        j                  ||g|	      n|j                         }||}}| j                  |   }|j                  |   }| j                  |   }|j                  |   }|d
k(  xr0 |	dk(  xr) |du xr# |du xs |j                  t        j                  k(  }t        ||       |rud}|"|j                  t        j                  k(  r| n|}t        j                  j                  j                  | |||d
||
t        ||k7              }t        | ||||
|	      }nY||k7  r+||z  }|j                  ||	      }|j                  ||	      }t        j                   ||| j                  | j"                        }|ryt        j                  |du d        t        j$                  t        j&                  ||t        j                  | j"                              }|j)                  | t+        d            }|?|j                  t        j                  k(  r|j)                  | t+        d            }n||z   }t        |
| j                  d         } t-        j.                  |       }!| |!z  }"||!z  }#t        j0                  |"|#j3                  dd            }$|$}|$|z   }%|	dk(  r|%}|d
kD  r|t        j4                  |%|z        z  }%|	dk(  r|%}|w|t6        v rW|%j                  }&|%j9                  t:        j<                  |         }%t        j>                  |%d	      }'|'j9                  |&      }'n/t        j>                  |%d	      }'nt        j>                  |%d	      }'|	dk(  r|'}t        j0                  |'|      }|dk(  r1|j3                  dd      jA                         jC                  ||d      }||||fS )zMAttention-23 https://onnx.ai/onnx/operators/onnx__Attention.html#attention-23)r	   r/   r.   r   r.   c                       y)Nz;q_num_heads and kv_num_heads must be provided for 3D inputsr   r   r"   r    r2   zattention_23.<locals>.<lambda>   r5   r"   r	   r3   c                       y)Nz'Q, K, and V should be 4D tensors by nowr   r   r"   r    r2   zattention_23.<locals>.<lambda>   r5   r"   Nr7   rr   )ry   	dropout_prs   rP   
enable_gqa)dtypedevicec                       y)Nz'Cannot use both is_causal and attn_maskr   r   r"   r    r2   zattention_23.<locals>.<lambda>@  r5   r"   z-infra   r6   r/   )"r9   r1   r   r:   rZ   rT   r>   cloner   boolrh   nn
functionalscaled_dot_product_attentionre   rj   zerosr   trilonesmasked_fillfloatrR   rS   rd   rX   tanh-_ATTENTION_23_ALLOWED_INTERMEDIATE_PRECISIONStor   ONNX_DTYPE_TO_TORCH_DTYPEsoftmaxrY   rW   )(r[   r\   rx   ry   rz   r{   rs   rt   ru   r_   rP   rv   rw   num_head_dimsequence_dimhead_diminput_shape_lenr?   q_sequence_lengthq_head_sizepresent_keypresent_valuer]   r^   kv_sequence_lengthcan_use_sdpasdpa_attn_maskrN   	qk_outputrl   	attn_biascausal_maskrm   rn   ro   rp   qk_matmul_outputqk_with_biasoriginal_dtype
qk_softmaxs(                                           r    attention_23r      s	   & ,3(L, !''lOJ 177|q12!2Q	
 GGAJa[9a\:a\:	LLAGGEc!''la/ECLA4E9 ''(#Ke[1E
  			8Q-\2WWY  ! 			:q/|4WWY  qA '',/77<0-. 	3 	A!Q&	A%	A $?)//UZZ"?	    35IJ  +4??ejj+HiZiN$$AA$#';; B 
 1 !
	 "66/3GGM##M|#DA##M|#DA KK1
	
 LLT!#T  **

%&**88	K "--{lE&MJI  %**,%119*eFmL	 &	1	 )
; YY|,
z>z> !<<(2D2DR2LM %	 ()3 A%$I S="UZZw0F%GGL A%$I ( $QQ!-!3!3+#==>OP  #]]<R@
']]>:
"]]<R@
|<J A%"I j!, ! Q"--/44ZARTVW 	 ;y88r"   )N)NNN)rR   typingr   r   r   torch.onnx.opsr   TypeVarr   r   dict_ops
OpOverload__annotations__	frozensetr   strintr#   Tensorr   rO   r   rT   rZ   re   rh   rb   tupler   r   r"   r    <module>r      sb     %  * V^^D) AC UZZ22H<= B091 -c # (B482D & 

R 
 ,0	R  !R||R||R ||R 5<<(	R R R R \\R !RjHXe_ H H H

LL
&)
69

\\
F||F||F F 	F
 E?F F \\F$47	>||>||> > 	>
 E?> \\>, 
+r
 )-'+)-F9 !"!'+F9||F9||F9 ||F9 %	F9
 u||$F9 &F9 F9 F9 F9 F9 E?F9 F9  }F9 5<<u||U\\ABF9 F9r"   