U
    h                     @   s|   d dl mZ d dlmZmZmZ d dlmZ d dlm	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 )    )	getLogger)DictListUnion)Fusion)FusionUtils)ndarray)	NodeProtoTensorProto)	OnnxModelc                       sx   e Zd Zed fddZeeedf dddZe	eedf dd	d
Z
eee	ee f ee	ef dddZ  ZS )FusionShape)modelc                    s*   t  |dd t|| _d | _d| _d S )NShapeZConcatF)super__init__r   utilsshape_infershape_infer_done)selfr   	__class__ I/tmp/pip-unpacked-wheel-socb9apf/onnxruntime/transformers/fusion_shape.pyr      s    
zFusionShape.__init__N)tensor_protoreturnc                 C   s&   |j jdrt|j jjjS d S d S )Nshape)typeZtensor_typeZHasFieldlenr   Zdim)r   r   r   r   r    get_dimensions_from_tensor_proto   s    z,FusionShape.get_dimensions_from_tensor_proto)
input_namer   c                 C   sX   | j |}|r| |S | js8| j ji dd| _d| _| jd k	rT| | jj| S d S )NT)update)r   Zfind_graph_inputr   r   Zinfer_runtime_shaper   Z	known_vi_)r   r   Zgraph_inputr   r   r   get_dimensions   s    

zFusionShape.get_dimensions)concat_nodeinput_name_to_nodesoutput_name_to_nodec                 C   s|  | j  }t|j}d }d }t|D ]}| j |dddg|ddg|}	|	d krV d S |	\}
}}|dkrr|jd }|d kr|jd }| ||kr d S n|jd |kr d S tj	|
dddds d S |dk rt	|
ddgs d S n| j
|
d	dgs d S | j |jd	 }t|tr4|jd	kr4| |ks$ d S q$| j |jd d krx| j |jd | | d
 d| _d S )NZ	UnsqueezeZGatherr   r   Zaxis)default_value   Zaxes   ZReshapeT)r   Zget_opset_versionr   inputrangeZmatch_parent_pathoutputr!   r   Zcheck_node_attributer   Zcheck_node_input_valueZget_constant_value
isinstancer   sizeitemZfind_graph_outputZreplace_input_of_all_nodesZincrease_counterZprune_graph)r   r"   r#   r$   Zopset_versioninputsrootZshape_outputipathZ	unsqueezeZgatherr   valuer   r   r   fuse-   sH    




$
zFusionShape.fuse)__name__
__module____qualname__r   r   r
   r   intr   strr!   r	   r   r   r3   __classcell__r   r   r   r   r      s   
r   N)loggingr   typingr   r   r   Zfusion_baser   Zfusion_utilsr   Znumpyr   Zonnxr	   r
   Z
onnx_modelr   r4   loggerr   r   r   r   r   <module>   s   