o
    ;ήc                     @   s\   d dl mZ d dlZd dlmZ d dlmZmZm	Z	 d dl
mZ eeZG dd deZdS )    )	getLoggerN)Fusion)TensorProtohelpernumpy_helper)	OnnxModelc                       s2   e Zd Zdef fddZdd Zdd Z  ZS )FusionReshapemodelc                    s   t  |dd d| _d S )NReshapeF)super__init__prune_graph)selfr	   	__class__ N/tmp/pip-target-vg8gfxp4/lib/python/onnxruntime/transformers/fusion_reshape.pyr      s   
zFusionReshape.__init__c                 C   s   t j|t jd}| jdd}tjdg |gtjdtj	|j
t|ddd}||jd< | jd	d
|_| j|g | j| | j| j|j< d S )N)dtypeConstantconstant_shapeconst_tensorT)name	data_typedimsvalsraw)inputsoutputsvalue   r
   Reshape_Fuse)npasarrayint64r	   create_node_namer   	make_nodemake_tensorr   INT64shapebytesinputr   nodes_to_removeextendnodes_to_addappendthis_graph_namenode_name_to_graph_name)r   r(   reshape_nodeconcat_nodeshape_valueconstant_shape_namenew_noder   r   r   replace_reshape_node   s&   
z"FusionReshape.replace_reshape_nodec                 C   s  |j d |vr	d S ||j d  }|jdks#t|j dk s#t|j dkr%d S | j|g dg d|}|d u r8d S |\}}}| j|g dg d|}	|	d u rPd S |	\}
}}g }| j|j d }|dkri|d | j|j d }|dkr{|d t|d	krd S g }g }||g}t|j dkr| j|j d	 d u r| j|g d
g d|}|d u r| j|g dg d|}|d u rd S | j|g d
g d|}|d u r| j|g dg d|}|d u rd S ||d |d g |d n.t|j d	kr$| j|j d	 }|d u rd S t	
|}t|tr|| n|| t|j dkrs| j|j d d u rsd|v r?d S | j|g dg d|}|d u re| j|g dg d|}|d u red S ||d g |d n.t|j dkr| j|j d }|d u rd S t	
|}t|tr|| n|| |j d }d}|D ]}|j d |krd}q|sd S | ||| d| _d S )Nr   Concat      )	UnsqueezeGatherShape)r   r   r   )r   r   r   r      )r:   Mulr;   r<   )r=   r   r   r   )r:   r>   SqueezeSlicer<   )r=   r   r   r   r   )r=   r   r   r   )r=   r   r   r   r   )r:   Divr;   r<   )r8   r   r   r   )r:   rB   r?   r@   r<   )r8   r   r   r   r   TF)r*   op_typelenr	   match_parent_pathget_constant_valuer.   get_initializerr,   r   to_array
isinstancelistr6   r   )r   r1   input_name_to_nodesoutput_name_to_noder2   path0unsqueeze_0gather_0shape_0path1unsqueeze_1gather_1shape_1r(   gather_valuepath2path3shape_nodesconcat_2concat_valueconcat_3
root_inputsame_shape_input
shape_noder   r   r   fuse*   s   &



$


(







zFusionReshape.fuse)__name__
__module____qualname__r   r   r6   r_   __classcell__r   r   r   r   r      s    r   )loggingr   numpyr!   fusion_baser   onnxr   r   r   
onnx_modelr   r`   loggerr   r   r   r   r   <module>   s   