o
    gw                     @   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                       s   e Zd Zdef fddZdedeedf fddZd	e	deedf 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__ \/var/www/visachat/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
   r   intr"   strr(   r	   r   r   rL   __classcell__r   r   r   r   r      s    
r   N)loggingr   typingr   r   r   fusion_baser   fusion_utilsr   numpyr   onnxr	   r
   
onnx_modelr   rM   loggerr   r   r   r   r   <module>   s   