o
    Xi                     @  s   d dl mZ d dlmZ d dlZd dlm  mZ d dl	m
Z
mZ eeejf ZG dd dejZe ZeegZeeZdS )    )annotations)UnionN)_basicspatternc                      s6   e Zd Z fddZdd ZdddZd	d
 Z  ZS )OnnxGroupQueryAttentionc                   s   t  jddd d S )NONNXGQAF)remove_nodes)super__init__)self	__class__ Y/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/rewriter/rules/fusion/_gqa.pyr
      s   z OnnxGroupQueryAttention.__init__c                 C  s   |j ||dd}||d}||tj}	|j|	tjdgd}
|j ||dd}||d}||tj}|j|tjdgd}|j||
|tjddd	d
gd}|||fS )N)axis   present_key_BHStD)_outputspresent_value_BHStDmaskT)can_match_noneattention_BHSDh)Concat	UnsqueezeExpandr   	ANY_VALUEReshape	AttentionVar)r   op
query_BHSD
key_BHkvSDvalue_BHkvSDpast_key_BHkvSpDpast_value_BHkvSpDpresent_key_BHkvStDpresent_key_BHkv1StDpresent_key_BHkvGStDr   present_value_BHkvStDpresent_value_BHkv1StDpresent_value_BHkvGStDr   r   r   r   r   r      s(   


zOnnxGroupQueryAttention.patterncontext_basics.MatchContextc	                 K  s   i }
t |
|g d t |
|g d t |
|g d t |
|g d t |
|g d t |
|g d t |
|g d dS )N)BHSD)r.   Hkvr0   r1   )r.   r2   Pr1   )r.   r/   zS+Pr1   T)_fusion_utilscheck_shape)r   r,   r!   r"   r#   r$   r%   r   r   _bindingsr   r   r   check9   s   zOnnxGroupQueryAttention.checkc	                 K  s2   |  }
|
j}|j||||||fi |ddiS )Nr      )producer
attributesr   )r   r    r!   r"   r#   r$   r%   r   r   r6   original_attention_nodeoriginal_attrsr   r   r   rewriteT   s   zOnnxGroupQueryAttention.rewrite)r,   r-   )__name__
__module____qualname__r
   r   r8   r>   __classcell__r   r   r   r   r      s
    
&r   )
__future__r   typingr   onnx_irir!onnxscript.rewriter._fusion_utilsrewriterr4   onnxscript.rewriterr   r   intSymbolicDimDimRewriteRuleClassBaser   rule_basic_gqa_ruleRewriteRuleSet	gqa_rulesapply_fusion_rulesfuse_gqar   r   r   r   <module>   s   _