o
    3IhV                     @   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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__ g/home/air/sanwanet/gpt-api/venv/lib/python3.10/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)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	j
r||  n|| t|j dkrq| j|j d d u rqd|v r=d S | j|g dg d|}|d u rc| j|g dg d|}|d u rcd S ||d g |d n,t|j dkr| j|j d }|d u rd S t|t	j
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      )r9   Mulr:   r;   )r<   r   r   r   )r9   r=   SqueezeSlicer;   )r<   r   r   r   r   )r<   r   r   r   )r<   r   r   r   r   )r9   Divr:   r;   )r7   r   r   r   )r9   rA   r>   r?   r;   )r7   r   r   r   r   TF)r)   op_typelenr   match_parent_pathget_constant_valuer-   r+   
isinstancer    ndarraytolistr5   r   )r   r0   input_name_to_nodesoutput_name_to_noder1   path0unsqueeze_0gather_0shape_0path1unsqueeze_1gather_1shape_1r'   gather_valuepath2path3shape_nodesconcat_value
root_inputsame_shape_input
shape_noder   r   r   fuse*   s   &



$

(






zFusionReshape.fuse)__name__
__module____qualname__r   r   r5   r[   __classcell__r   r   r   r   r      s    r   )loggingr   numpyr    fusion_baser   onnxr   r   
onnx_modelr   r\   loggerr   r   r   r   r   <module>   s   