o
    ¢ÄiV  ć                   @   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__© śa/home/kim/smarthome/.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)ZdtypeŚConstantZconstant_shapeZconst_tensorT)ŚnameZ	data_typeŚdimsŚvalsŚraw)ZinputsZ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 |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rd 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 rĮd S | j |g d
¢g d¢|”}|d u rå| j |g d¢g d¢|”}|d u råd 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 rd S t|t	j
r| | ” ” n| |” |j d }d}|D ]}|j d |kr²d}q¦|s¹d S |  |||” d| _d S )Nr   Z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'   )r#   r   r   r   )r%   r-   r*   r+   r'   )r#   r   r   r   r   TF)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"   r1   Ś__classcell__r   r   r   r   r      s    r   )Śloggingr   Śnumpyr   Zfusion_baser   Zonnxr   r   Z
onnx_modelr   r2   Śloggerr   r   r   r   r   Ś<module>   s   