o
    Xi                     @  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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   d/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/rewriter/ort_fusions/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 )RotaryEmbeddingFusionc                   s   t  jddd d S )NRotaryEmbeddingT)nameas_function)super__init__)self	__class__r   r   r       s   zRotaryEmbeddingFusion.__init__c	           	      C  s   || t |||||||  S N)r   )	r!   r   r   cossinr   r   r   r   r   r   r   r      s   zRotaryEmbeddingFusion.patternreturnpattern.MatchResultc           
        s   t  }|d u s|jd u st|jdkr|d|S t|jd ts(|d|S |jd  t ts8|d|S  d }	t|drXt||	rXt||	rXt| fd	d
s]|dS |S )N   zInput is not a 4D tensor.r   z$Input dimension 1 is not an integer.r   zHead size is not an integer.   r   c                   s   |  kS r$   r   )r   	head_sizer   r   <lambda>1   s    z-RotaryEmbeddingFusion.check.<locals>.<lambda>zBx is not being split into two equal halves of size half_head_size.)	r   MatchResultshapelenfail
isinstanceintr   is_singleton_value)
r!   r   r   r   r   r   r   _check_resulthalf_head_sizer   r+   r   check    s*    




zRotaryEmbeddingFusion.checkc                 K  s    |j d }|j|||d|ddS )Nr   r   zai.onnxruntime._fusion)interleaved	num_heads_domain)r/   r   )r!   r   r   r%   r&   r5   r:   r   r   r   rewrite8   s   
zRotaryEmbeddingFusion.rewriter'   r(   )__name__
__module____qualname__r    r   r8   r<   __classcell__r   r   r"   r   r      s
    
r   c                   @  s&   e Zd Zdd Zd
ddZdd Zd	S )PartialRotaryEmbeddingFusionc                 C  sV   | |dg|dgdg}| ||dgdgdg}|j|ddddgd}|j||d	d
S )Nr   r   r   l    Tcom.microsoftx_part_1_rope)_allow_other_inputs_allow_other_attributesr;   _outputsr   r	   )r   r   r   )r!   r   r   r   r   x_part_1x_part_2rD   r   r   r   r   @   s   z$PartialRotaryEmbeddingFusion.patternr'   r(   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 )NzPThe end1 value of first slice and start2 value of second slice are not integers.zMThe end1 value of first slice and start2 value of second slice are not equal.rotary_embedding_dimz1rotary_embedding_dim attribute already specified.r9   r   zinterleaved is not equal to 0.)
r   r.   r   get_singleton_valuer2   r3   r1   producer
attributesvalue)r!   r   r   r   r   rD   r5   r6   
end1_valuestart2_valuerotary_embedding_attributesr   r   r   r8   L   s$   




z"PartialRotaryEmbeddingFusion.checkc           
      K  sN   t |}| }t|j}||d< t|j}	||	d< |j|i |	ddiS )Nr   rJ   r;   rC   )r   rK   rL   listinputsdictrM   r   )
r!   r   r   r   rD   r5   rJ   original_noderS   attrsr   r   r   r<   b   s   


z$PartialRotaryEmbeddingFusion.rewriteNr=   )r>   r?   r@   r   r8   r<   r   r   r   r   rB   ?   s    
rB   N)
__future__r   onnxscript.rewriterr   r   r   r   RewriteRuleClassBaser   rB   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   	&2
