o
    Xib	                     @  sZ   d dl mZ d dlZd dlmZmZmZ 	 G dd dejZe	e
 gZeeZdS )    )annotationsN)_fusion_utils	_ir_utilspatternc                   @  s$   e Zd Zdd Zdd Zdd ZdS )FuseMHAScalec                 C  s$   | ||}|j|dddgd}|S )NTcom.microsoft
mha_output)_allow_other_inputs_domain_outputs)MulMultiHeadAttention)selfopqueryscalescaled_queryr    r   ]/home/ubuntu/.local/lib/python3.10/site-packages/onnxscript/rewriter/ort_fusions/mha_scale.pyr      s   zFuseMHAScale.patternc                 K  s:   t |}|d u st|ttfst d|S || _dS )Nz'Scale must be a constant numeric value.T)	r   get_singleton_value
isinstanceintfloatr   MatchResultfail_scale)r   contextr   _scale_valuer   r   r   check$   s
   
zFuseMHAScale.checkc                 K  s   |  }|d us
J |j}|dd }|d u r1|dd }|d u r#d S |jd | }	dt|	 }|  j|9  _t|j	}
||
d< t
|}| j|d< |j|
i |dddS )	Nr   	num_headsg      ?r   r      )r
   r   )producer
attributes	get_floatget_intshapemathsqrtr   listinputsdictr   )r   r   r   r   r   mha_noder$   original_scaler    	head_sizer+   r   r   r   rewrite+   s,   


zFuseMHAScale.rewriteN)__name__
__module____qualname__r   r   r0   r   r   r   r   r      s    
r   )
__future__r   r(   onnxscript.rewriterr   r   r   RewriteRuleClassBaser   RewriteRuleSetrule_mha_scale_rulesapply_fusion_rulesfuse_mha_scaler   r   r   r   <module>   s   )