
    gw                         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	e      Zy
)    )	getLogger)DictListUnion)Fusion)FusionUtils)ndarray)	NodeProtoTensorProto)	OnnxModelc                        e Zd Zdef fdZdedeedf   fdZde	deedf   fdZ
d	ed
ee	ee   f   dee	ef   fdZ xZS )FusionShapemodelc                 d    t         |   |dd       t        |      | _        d | _        d| _        y )NShapeConcatF)super__init__r   utilsshape_infershape_infer_done)selfr   	__class__s     Z/var/www/openai/venv/lib/python3.12/site-packages/onnxruntime/transformers/fusion_shape.pyr   zFusionShape.__init__   s0    2 '
 %    tensor_protoreturnNc                     |j                   j                  j                  d      r3t        |j                   j                  j                  j
                        S y )Nshape)typetensor_typeHasFieldlenr   dim)r   r   s     r    get_dimensions_from_tensor_protoz,FusionShape.get_dimensions_from_tensor_proto   sB    ((11':|((44::>>??r   
input_namec                 $   | j                   j                  |      }|t        |      S | j                  s(| j                   j	                  d      | _        d| _        | j
                  (| j                  | j
                  j                  |         S y )NT)update)r   	get_shaper#   r   infer_runtime_shaper   r%   	known_vi_)r   r&   r   s      r   get_dimensionszFusionShape.get_dimensions   s    

$$Z0u:$$#zz==T=JD$(D!'889I9I9S9ST^9_``r   concat_nodeinput_name_to_nodesoutput_name_to_nodec                    | j                   j                         }t        |j                        }d }d }t	        |      D ]5  }| j                   j                  |g d|ddg|      }	|	 y |	\  }
}}|dk(  r|j                  d   }|%|j                  d   }| j                  |      |k7  r y |j                  d   |k7  r y t        j                  |
ddd      s y |dk  rt        j                  |
ddg      s" y | j                  j                  |
ddg      s y | j                   j                  |j                  d         }t        |t              r$|j                  dk(  r|j!                         |k(  r6 y  | j                   j#                  |j                  d         B| j                   j%                  |j                  d   |       | j'                  d       d	| _        y y )
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   values                 r   fusezFusionShape.fuse-   s   , 

446[&&'vA:://0Aq	#	D |'+$IvuAv$||A|{{1~&&t,6Q4'33IvqXYZr!"77	6A3Ozz88AsKJJ11&,,q/BEug.5::?uzz|WXGXC F ::''(:(:1(=>FJJ11+2D2DQ2GV!!),#D Gr   )__name__
__module____qualname__r   r   r   r   intr%   strr,   r
   r   r   rQ   __classcell__)r   s   @r   r   r      s    &i &[ USVX\S\M]  sDy1A A$A$ "#tI"67A$ "#y.1	A$r   r   N)loggingr   typingr   r   r   fusion_baser   fusion_utilsr   numpyr	   onnxr
   r   
onnx_modelr   rR   loggerr    r   r   <module>ra      s7     $ $  $  '  	8	\$& \$r   