U
    T?hV                     @   sX   d dl mZ d dlZd dlmZ d dlmZmZ d dl	m
Z
 eeZG dd deZdS )    )	getLoggerN)Fusion)TensorProtohelper)	OnnxModelc                       s2   e Zd Zed 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__ Y/var/www/html/venv/lib/python3.8/site-packages/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)ZdtypeConstantZconstant_shapeZconst_tensorT)nameZ	data_typeZdimsvalsraw)inputsoutputsvalue   r	   ZReshape_Fuse)npZasarrayZint64r   Zcreate_node_namer   Z	make_nodeZmake_tensorr   ZINT64shapebytesinputr   Znodes_to_removeextendZnodes_to_addappendZthis_graph_nameZnode_name_to_graph_name)r   r   reshape_nodeconcat_nodeZshape_valueZconstant_shape_namenew_noder   r   r   replace_reshape_node   s&    
z"FusionReshape.replace_reshape_nodec              	   C   s  |j d |krd S ||j d  }|jdksFt|j dk sFt|j dkrJd S | j|dddgdddg|}|d krtd S |\}}}| j|dddgdddg|}	|	d krd S |	\}
}}g }| j|j d }|dkr|d | j|j d }|dkr|d t|d	krd S g }g }||g}t|j dkr*| j|j d	 d kr*| j|dd
ddgd	dddg|}|d kr| j|dd
dddgd	ddddg|}|d krd S | j|dd
ddgd	dddg|}|d kr| j|dd
dddgd	ddddg|}|d krd S ||d |d g |d nXt|j d	kr| j|j d	 }|d krZd S t|t	j
rx||  n
|| t|j dkr4| j|j d d kr4d|krd S | j|ddddgddddg|}|d kr| j|dddddgdddddg|}|d krd S ||d g |d nXt|j dkr| j|j d }|d krdd S t|t	j
r||  n
|| |j d }d}|D ]}|j d |krd}q|sd S | ||| d| _d S )Nr   ZConcat      Z	UnsqueezeZGatherZShaper      ZMulZSqueezeSliceDivTF)r   Zop_typelenr   Zmatch_parent_pathZget_constant_valuer   r   
isinstancer   Zndarraytolistr#   r   )r   r    Zinput_name_to_nodesZoutput_name_to_noder!   Zpath0Zunsqueeze_0Zgather_0Zshape_0Zpath1Zunsqueeze_1Zgather_1Zshape_1r   Zgather_valueZpath2Zpath3Zshape_nodesZconcat_valueZ
root_inputZsame_shape_inputZ
shape_noder   r   r   fuse*   s    &



(









(







zFusionReshape.fuse)__name__
__module____qualname__r   r   r#   r-   __classcell__r   r   r   r   r      s   r   )loggingr   numpyr   Zfusion_baser   Zonnxr   r   Z
onnx_modelr   r.   loggerr   r   r   r   r   <module>   s   