
    i              
          S SK r S SKJr  S SKJrJr  S SKrS SKJrJ	r	J
r
  S SKJrJrJr  S SKJr  S SKJr   " S S	\R(                  R*                  5      r\" S
S9\	" S5      S\\R.                  R0                     4S j5       5       rS\S\R.                  R0                  S\S\\\R.                  R4                        4S jr\
" S5      S\S\R.                  R0                  S\4S j5       rg)    N)	lru_cache)ListOptional)PatternMatchregister_pattern_graphregister_pattern_replacement)EdgeCompileConfigExportedProgramto_edge)ops)exportc                      ^  \ rS rSrSrU 4S jrS\R                  S\R                  S\R                  S\R                  4S jrS	\R                  S
\R                  4S jr	Sr
U =r$ )RotaryEmbeddingPattern   za
Implementation of rotary embedding pattern that matches the one
in examples/model/llama/rope.py
c                 "   > [         TU ]  5         g )N)super__init__)self	__class__s    g/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/executorch/backends/vulkan/patterns/rope.pyr   RotaryEmbeddingPattern.__init__    s        xqxk	freqs_cos	freqs_sinc                 f   UR                  5       R                  UR                  S S S-   5      R                  S5      u  pVUR                  5       R                  UR                  S S S-   5      R                  S5      u  pxU R	                  X55      nU R	                  XE5      nXS-  Xd-  -
  n	XT-  Xc-  -   n
Xs-  X-  -
  nXt-  X-  -   n[
        R                  " X/SS9R                  S5      n[
        R                  " X/SS9R                  S5      nUR                  U5      UR                  U5      4$ )N)r      )dim   )	floatreshapeshapeunbind_reshape_for_broadcasttorchstackflattentype_as)r   r   r   r   r   xq_rxq_ixk_rxk_ixq_out_rxq_out_ixk_out_rxk_out_ixq_outxk_outs                  r   forwardRotaryEmbeddingPattern.forward#   s'    XXZ''"(?@GGK
XXZ''"(?@GGK
 //	@	//	@	 #d&66#d&66#d&66#d&66 h1r:BB1Eh1r:BB1E~~b!6>>"#555r   	freqs_cisxc                 F   UR                   nUR                   nUS:X  a  UR                  UR                  S   UR                  S   UR                  S   4:X  d   e[        UR                  5       VVs/ s H!  u  pVXSS-
  :X  d  XSS-
  :X  d  XSS-
  :X  a  UOSPM#     nnnOgUR                  UR                  S   UR                  S   4:X  d   e[        UR                  5       VVs/ s H  u  pVUS:X  d  XSS-
  :X  a  UOSPM     nnnUR                  U5      $ s  snnf s  snnf )Nr!   r   r      )ndimr$   	enumerateview)r   r7   r8   r=   freqs_cis_ndimidr$   s           r   r&   -RotaryEmbeddingPattern._reshape_for_broadcast?   s   vv"Q??qwwr{AGGBK&MMMM &agg..DA !8mq1H}AXAM.  E ??qwwqz1772;&????ENqwwEWXEWTQ!q&AMQq8EWEX~~e$$ Ys   3(D%D )__name__
__module____qualname____firstlineno____doc__r   r'   Tensorr5   r&   __static_attributes____classcell__)r   s   @r   r   r      sh    
6LL6 LL6 <<	6
 <<68% % % %r   r   r   )maxsizeexport_llama_ropereturnc            	         Sn SnSnSnSn/ n[         R                  n[         R                  " XX$US9n[         R                  " XX4US9n[         R                  " XS-  US9n	[         R                  " XS-  US9n
[        [	        [        5       XxX4SS9[        SS	9S
9nUR                  5       R                  nUR                  U5        U$ )Nr<      r       )dtypeT)strictF)_check_ir_validity)compile_config)
r'   float32randnr   r   r   r	   exported_programgraph_moduleappend)
batch_sizeseq_lenn_heads
n_kv_headshead_dimgraphsrS   r   r   r   r   edgegms                r   get_rope_graphsrd   P   s     JGGJHFMME	Z'5	IB	Z*e	LBG]%@IG]%@I"$Y*	

 )EBD 
			 	-	-B
MM"Mr   eprZ   matchc                     UR                   n[        U5      S:w  a  g Uu  pEpgUR                  n[        U5      S:w  a  g Uu  pXEXgX/$ )NrQ   r   )input_nodeslenoutput_nodes)re   rZ   rf   rh   r   r   r   r   rj   r3   r4   s              r   identify_rotary_emb_io_nodesrk   o   sX     ##K
;1#. BI%%L
<A!NFI&99r   c           	         [        XU5      nUc  g [        U5      S:X  d   eUu  pEpgpUR                  R                  U5         UR                  R	                  S[
        R                  R                  R                  R                  XEXg4S9n
S S S 5        UR                  R                  W
5         UR                  R	                  S[        R                  U
S4S9nUR                  R	                  S[        R                  U
S4S9nS S S 5        [        US5      (       a,  SUR                  ;   a  UR                  S   WR                  S'   [        U	S5      (       a,  SU	R                  ;   a  U	R                  S   WR                  S'   UR                  W5        U	R                  W5        g ! , (       d  f       GN&= f! , (       d  f       N= f)N   call_function)argsr   r<   metaval)rk   ri   graphinserting_beforecreate_nodeexir_opsrb   et_vkapply_rotary_embdefaultinserting_afteroperatorgetitemhasattrrp   replace_all_uses_with)re   rZ   rf   io_nodesr   r   r   r   r3   r4   rotary_emb_node	getitem_0	getitem_1s                r   create_rotary_emb_custom_opr      s    ,BeDHx=A3;0BI& 
			,	,V	4&,,88MM0088)/ 9 
 
5 
			+	+O	< &&22!1% 3 
	
 !&&22!1% 3 
	 
= vv5FKK#7 &E 2	uvv5FKK#7 &E 2	u
  +
  +7 
5	4 
=	<s   A
F,0AF>,
F;>
G)rz   	functoolsr   typingr   r   r'   4executorch.backends.vulkan.patterns.pattern_registryr   r   r   executorch.exirr	   r
   r   executorch.exir.dialects._opsr   ru   torch.exportr   nnModuler   fxGraphModulerd   Noderk   r   rD   r   r   <module>r      s     !   H G 9 3%UXX__ 3%l 1+,ehh223  - :::((&&: : d588==!"	:* 12(,(,((&&(, (, 3(,r   