o
    ;ήc                     @   sd   d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ eeZG dd deZd	S )
    )	getLogger)Dict)Fusion)FusionUtils)helper)	OnnxModelc                       s4   e Zd Zdef fddZdedefddZ  ZS ) FusionQOrderedLayerNormalizationmodelc                    s   t  |dd d S )NQOrderedLayerNormalizationLayerNormalization)super__init__)selfr	   	__class__ Y/tmp/pip-target-vg8gfxp4/lib/python/onnxruntime/transformers/fusion_qordered_layernorm.pyr      s   z)FusionQOrderedLayerNormalization.__init__input_name_to_nodesoutput_name_to_nodec                 C   s  | j ||}t|dkr|d jdks*t|dkr(|d jdkr(|d jdks*dS |d }d}t|dkr:|d }t|| j sCdS | j |dgdgfg|\}}}	|dk rYdS |d }
t|
| j sfdS |g}||g | j |
|}t|dkr||
g | j ||dur|j	d |j	d gn|j	||st
d dS | j| tjd	|
jd |
jd |jd |jd |jd g|j	d g| j jd	d	d
d}|dur| j ||jd |j	d  |jtddg |jtddg d|_| j| | j| j|j< dS )a{  
        Fuse (quantized) Layer Normalization subgraph into one node QOrderedLayerNormalization:
            quantized input  -> DQ
                                |
                                |
            (other inputs)-> LayerNormalization --> Q -->

            should become

            (quantized input + other inputs)->  QOrderedLayerNormalization --> Q -->
           r   QuantizeLinear   ShapeNDequantizeLinearz<It is not safe to fuse QOrderedLayerNormalization node. Skipr
   )name_prefix)inputsoutputsnameorder_Xorder_Yzcom.microsoft)r	   get_childrenlenop_typer   check_qdq_node_for_fusionmatch_parent_pathsextendis_safe_to_fuse_nodesoutputloggerdebugnodes_to_remover   	make_nodeinputcreate_node_namereplace_node_input	attributemake_attributedomainnodes_to_addappendthis_graph_namenode_name_to_graph_namer   )r   noder   r   childrendownstream_quantize_nodedownstream_shape_nodefirst_path_idfirst_input_parent_nodes_upstream_dequantize_nodesubgraph_nodes!upstream_dequantize_node_childrennormalize_noder   r   r   fuse   s   




z%FusionQOrderedLayerNormalization.fuse)__name__
__module____qualname__r   r   r   rA   __classcell__r   r   r   r   r      s    r   N)loggingr   typingr   fusion_baser   fusion_utilsr   onnxr   
onnx_modelr   rB   r(   r   r   r   r   r   <module>   s   