o
    XiB                     @  s   d dl mZ d dlmZmZmZ dd ZG dd dejZdZ	G dd	 d	ejZ
e Ze
 ZeegZeegZeeZeeZd
S )    )annotations)_fusion_utils	_ir_utilspatternc           
      C  sJ   |  |||dgdg}|  |||dgdg}| |}| j||dd}	|	S )N      axis)SliceNegConcat)
opxstart1end1start2end2x1x2minus_x2	rotated_x r   f/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/rewriter/rules/fusion/_rotary_embedding.py_rotate_half_pattern   s
   
r   c                      s6   e Zd Z fddZdd ZdddZd	d
 Z  ZS )RotaryEmbedding23Fusionc                   s   t  jddd d S )NRotaryEmbedding23F)nameremove_nodes)super__init__)self	__class__r   r   r        s   z RotaryEmbedding23Fusion.__init__c
                 C  sZ   |j ||dd}
||
}||
}|||}|||	}|| t|||||||  S )Nr   r	   )r   CosSin	Unsqueezer   )r!   r   r   freqsr   r   r   r   one1one2freqs_repeatedcossincos_4dsin_4dr   r   r   r   #   s   

zRotaryEmbedding23Fusion.patternreturnpattern.MatchResultc	                   s   t  }
t|ds|
d|S t|ds|
d|S |d u s,|jd u s,t|jdkr2|
d|S t|jd ts@|
d|S |jd  t tsP|
d|S  d }t|d	rpt||rpt||rpt| fd
dsu|
dS |
S )Nr   zUnsqueeze axes is not [1]   z%Input is not known to be a 4D tensor.z,Input dimension 1 (num_heads) is not static.r   zHead size is not static.   r   c                   s   |  kS )Nr   )r   	head_sizer   r   <lambda>B   s    z/RotaryEmbedding23Fusion.check.<locals>.<lambda>zBx is not being split into two equal halves of size half_head_size.)	r   MatchResultr   is_singleton_valuefailshapelen
isinstanceint)r!   r   r   r   r   r   r   r(   r)   _check_resulthalf_head_sizer   r3   r   check+   s2    




zRotaryEmbedding23Fusion.checkc                 K  s2   |j d }||}||}|j|||d|dS )Nr   r   )interleaved	num_heads)r9   r$   r%   RotaryEmbedding)r!   r   r   r'   r=   rB   r+   r,   r   r   r   rewriteI   s   


zRotaryEmbedding23Fusion.rewriter/   r0   )__name__
__module____qualname__r    r   r@   rD   __classcell__r   r   r"   r   r      s
    
r   l    c                   @  s&   e Zd Zdd Zd
ddZdd Zd	S )PartialRotaryEmbedding23Fusionc                 C  sT   | |dg|dgdg}| ||tgdgdg}|j|dddgd}|j||ddS )	Nr   r   r   Tx_part_1_rope)_allow_other_inputs_allow_other_attributes_outputsr   r	   )r   	MAX_INT64rC   r   )r!   r   r   r   r   x_part_1x_part_2rK   r   r   r   r   ^   s   z&PartialRotaryEmbedding23Fusion.patternr/   r0   c                 K  s   t  }t|}t|}	t|trt|	ts|dS ||	kr&|dS | j}
d|
v r4|dS d|
v rD|
d j	dkrD|dS |S )Nz*Unable to validate slice start/end values.zMThe end1 value of first slice and start2 value of second slice are not equal.rotary_embedding_dimz1rotary_embedding_dim attribute already specified.rA   r   zinterleaved is not equal to 0.)
r   r6   r   get_singleton_valuer;   r<   r8   producer
attributesvalue)r!   r   r   r   r   rK   r=   r>   
end1_valuestart2_valuerotary_embedding_attributesr   r   r   r@   i   s    





z$PartialRotaryEmbedding23Fusion.checkc           
      K  sF   t |}| }t|j}||d< t|j}	||	d< |j|i |	S )Nr   rR   )r   rS   rT   listinputsdictrU   rC   )
r!   r   r   r   rK   r=   rR   original_noder[   attrsr   r   r   rD   }   s   


z&PartialRotaryEmbedding23Fusion.rewriteNrE   )rF   rG   rH   r   r@   rD   r   r   r   r   rJ   ]   s    
rJ   N)
__future__r   onnxscript.rewriterr   r   r   r   RewriteRuleClassBaser   rO   rJ   rule_rule_partial_embedding_ruleRewriteRuleSetrotary_embedding_rulespartial_embedding_rulesapply_fusion_rulesfuse_rotary_embeddingfuse_partial_rotary_embeddingr   r   r   r   <module>   s   	;.
