U
    T?hw                     @   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__ W/var/www/html/venv/lib/python3.8/site-packages/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   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 |}|d k	rt|S | js8| j jdd| _d| _| jd k	rT| | jj| S d S )NT)update)r   	get_shaper   r   Zinfer_runtime_shaper   r   Z	known_vi_)r   r    r   r   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   r5   __classcell__r   r   r   r   r      s   
r   N)loggingr   typingr   r   r   Zfusion_baser   Zfusion_utilsr   numpyr   Zonnxr	   r
   Z
onnx_modelr   r6   loggerr   r   r   r   r   <module>   s   