o
    iF                     @   sh   d dl 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)Fusion)FusionUtils)ndarray)	NodeProtoTensorProto)	OnnxModelc                       sx   e Zd Zdef fddZdededB fddZd	ededB fd
dZ	de
deeee
 f deee
f f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__ _/home/kim/smarthome/.venv/lib/python3.10/site-packages/onnxruntime/transformers/fusion_shape.pyr      s   

zFusionShape.__init__tensor_protoreturnNc                 C   s"   |j jdrt|j jjj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_namec                 C   sX   | j |}|d urt|S | js| j jdd| _d| _| jd ur*| | 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   sv  | j  }t|j}d }d }t|D ]}| j |g d|ddg|}	|	d u r) d S |	\}
}}|dkr7|jd }|d u rK|jd }| ||krJ d S n
|jd |krU d S tj	|
ddddsa d S |dk rqt	|
ddgsp d S n| j
|
ddgs} d S | j |jd }t|tr|jdkr| |ks d S q| j |jd d u r| j |jd | | d d	| _d S d S )
N)Z	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_versionZinputsrootZshape_outputipathZ	unsqueezeZgatherr   valuer   r   r   fuse,   sP   




 

zFusionShape.fuse)__name__
__module____qualname__r   r   r   intr   strr    r   dictlistr1   __classcell__r   r   r   r   r	      s    
r	   N)loggingr   Zfusion_baser   Zfusion_utilsr   numpyr   Zonnxr   r   Z
onnx_modelr   r2   loggerr	   r   r   r   r   <module>   s   