o
    3IhF                     @   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ShapeConcatF)super__init__r   utilsshape_infershape_infer_done)selfr
   	__class__ e/home/air/sanwanet/gpt-api/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)typetensor_type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   infer_runtime_shaper   r   	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)	UnsqueezeGatherr   r   axis)default_value   axes   ReshapeT)r
   get_opset_versionr   inputrangematch_parent_pathoutputr%   r   check_node_attributer   check_node_input_valueget_constant_value
isinstancer   sizeitemfind_graph_outputreplace_input_of_all_nodesincrease_counterprune_graph)r   r&   r'   r(   opset_versioninputsrootshape_outputipath	unsqueezegatherr   valuer   r   r   fuse,   sP   




 

zFusionShape.fuse)__name__
__module____qualname__r   r   r   intr   strr%   r   dictlistrI   __classcell__r   r   r   r   r	      s    
r	   N)loggingr   fusion_baser   fusion_utilsr   numpyr   onnxr   r   
onnx_modelr   rJ   loggerr	   r   r   r   r   <module>   s   