o
    3Ih,                 	   @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZ d dl	m
Z
 e
eje
dks1J eeZd-ddZdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd-ddZdd Zdd Zdd  ZG d!d" d"Zd#d$ Zed%kre Z e!d&e j"  e j#re!d'e j#  e!d( e$e%e j"e j&e j'e j(e j)Z*e j#re*re j+rej,e*e j#d)e j-e j.e j/d*d+ ne0e*e j# e!d, dS dS dS dS ).    N)helpernumpy_helpershape_inference)versionz1.8.0c                    s*    fdd| j D }|rt|d S |S )Nc                    s   g | ]	}|j  kr|qS  name).0attr	attr_namer   f/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/onnxruntime/tools/symbolic_shape_infer.py
<listcomp>       z!get_attribute.<locals>.<listcomp>r   )	attributer   get_attribute_value)noder   default_valuefoundr   r   r   get_attribute   s   r   c                 C   s&   t | dtu rt| | dS d S )Nvalue)type
WhichOneofstrgetattrdimr   r   r   get_dim_from_proto   s   &r   c                 C   s   |  d}|dv sJ |dkS )Nr   )tensor_typesequence_typer   )r   )
type_protocls_typer   r   r   is_sequence   s   
r"   c                 C   s0   t | rJ | jdrdd | jjjD S d S )Nshapec                 S      g | ]}t |qS r   )r   r	   dr   r   r   r   '       z-get_shape_from_type_proto.<locals>.<listcomp>)r"   r   HasFieldr#   r   r    r   r   r   get_shape_from_type_proto$   s   r*   c                 C   s   t | r
| jjjjS | jjS N)r"   r   	elem_typer   r)   r   r   r   get_elem_type_from_type_proto,   s   r-   c                 C   sR   | j d}|d u rd S t| j r$| j jjddkr"t| j jjS d S t| j S )Nr   r   )r   r   r"   r   r,   r*   )vir!   r   r   r   get_shape_from_value_info3   s   

r/   c                 C   s   t  }| |_|S r+   )onnxValueInfoProtor   )r   r.   r   r   r   make_named_value_info@   s   r2   c                 C   s   dd | D S )Nc                 S   s0   g | ]}|d u r
d nt |rt|nt|qS r+   )
is_literalintr   r	   ir   r   r   r   G      0 z.get_shape_from_sympy_shape.<locals>.<listcomp>r   )sympy_shaper   r   r   get_shape_from_sympy_shapeF      r9   c                 C   s*   t | ttjtjtjfv pt| do| jS )N	is_number)	r   r4   npint64int32sympyIntegerhasattrr;   r   r   r   r   r3   J   s   *r3   c                 C   s*   | |k r	| | ksJ | dkr| S ||  S Nr   r   )axisrankr   r   r   handle_negative_axisN   s   rE   c                 C   sB   |pg d}t |tkr|g}| jD ]}|j|v r|j  S qd S )N) r0   zai.onnx)r   listopset_importdomainr   )mprI   opsetr   r   r   	get_opsetS   s   


rL   c                 C   s>   t | tu rt| dksJ | d S t | tju r|  S | S N   r   )r   rG   lenr<   ndarrayitemxr   r   r   	as_scalar^   s   rT   c                 C   s<   t | tu r| S t | tju rt| S |r| d u rd S | gS r+   )r   rG   r<   rP   )rS   	keep_noner   r   r   as_listh   s   rV   c                 C   s4   t | tu rtd}| D ]}|| }q|S | }|S NrN   )r   rG   r?   r@   )rS   r   vr   r   r   sympy_reduce_products   s   

rY   c                   @   s"  e Zd ZdddZd ddZd ddZd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd d!Zdd"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zdd-d.Zdd/d0Zd d1d2Zdd3d4Zdd6d7Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA Z dBdC Z!dDdE Z"dFdG Z#dHdI Z$dJdK Z%dLdM Z&dNdO Z'dPdQ Z(dRdS Z)dTdU Z*dVdW Z+dXdY Z,dZd[ Z-d\d] Z.d^d_ Z/d`da Z0dbdc Z1ddde Z2dfdg Z3dhdi Z4djdk Z5dldm Z6dndo Z7dpdq Z8drds Z9dtdu Z:dvdw Z;dxdy Z<dzd{ Z=d|d} Z>d~d Z?dd Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`ddÄ Zaddń ZbddǄ ZcddɄ Zddd˄ Zedd̈́ Zfddτ Zgddф Zhddӄ ZiddՄ Zjddׄ Zkddل Zlddۄ Zmdd݄ Zndd߄ Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd ZxdddZydd Zzdd Z{dddZ|dd Z}e~dddZd5S (  SymbolicShapeInferencerF   c                 C   s2  i d| j d| jd| jd| jd| jd| jd| jd| jd	| jd
| j	d| j
d| jd| jd| jd| j d| jd| ji d| j d| j d| jd| jd| jd| jd| jd| jd| jd| jd| jd| j d| jd| jd | j d!| jd"| j i d#| jd$| jd%| jd&| jd'| jd(| jd)| jd*| jd+| jd,| jd-| jd.| jd/| j d0| j!d1| j"d2| j#d3| j$i d4| j%d5| j&d6| j'd7| j'd8| j'd9| j(d:| j)d;| j*d<| j d=| j+d>| j,d?| j-d@| j.dA| j dB| j/dC| j dD| j0i dE| j1dF| j2dG| j3dH| j4dI| j5dJ| j6dK| j7dL| j8dM| j9dN| jdO| j:dP| j;dQ| j<dR| j=dS| j=dT| j>dU| j?i dV| j@dW| jAdX| jBdY| jCdZ| jDd[| jEd\| jFd]| jGd^| jHd_| jHd`| jIda| j8db| jJdc| jKdd| jLde| jMdf| j?| jN| jO| jO| jP| jQdg| _Ri dh| jdi| jSdj| jTdk| jUdl| jVdm| jVdn| jWdo| jXdp| jYdq| jUdr| jUds| j-dt| jZdu| j[dv| j[dw| j[dx| j[| _\dy| _]i | _^i | __i | _`|| _a|| _b|| _c|| _ddz| _e|| _fd S ){NAdd	AllReduceArrayFeatureExtractorAveragePoolBatchNormalizationCastCategoryMapperCompressConcatConcatFromSequenceConstantConstantOfShapeConvCumSumDivEinsumExpandEqualFloorGatherGatherElementsGatherNDIdentityIfLoopMatMulMatMulInteger16MaxPoolMaxMemcpyFromHostMemcpyToHostMinMoEMulNonMaxSuppressionNonZeroOneHotPadRange
Reciprocal	ReduceSum
ReduceMean
ReduceProdReshapeResizeRoundScanScatterElements
SequenceAtSequenceInsertShapeSizeSliceSoftmaxCrossEntropyLossSoftmaxCrossEntropyLossInternal!NegativeLogLikelihoodLossInternalSplitSplitToSequenceSqueezeSubTileTopK	Transpose	UnsqueezeWhereZipMapNeg	AttentionBiasAddBiasGeluBiasSplitGeluDecoderMaskedMultiHeadAttentionDequantizeLinearDynamicTimeWarpingEmbedLayerNormalizationFastGeluGatedRelativePositionBiasGatherBlockQuantizedGeluGemmFastGelu
GemmFloat8	GroupNormGroupNormalizationGroupQueryAttentionLayerNormalizationLongformerAttentionMatMulNBitsMultiHeadAttentionNhwcConvPackedAttentionPackedMultiHeadAttentionPagedAttentionPythonOp
QLinearAdd
QLinearMulQuantizeLinear	QuickGeluRelativePositionBiasRemovePaddingRestorePaddingRotaryEmbeddingSimplifiedLayerNormalization)SkipGroupNormSkipLayerNormalization SkipSimplifiedLayerNormalizationSparseAttentionUnfoldTensor	embedding
bitwise_ordiagonalmax_pool2d_with_indicesmaxminmultinomialunfoldargmax
avg_pool2d_adaptive_avg_pool2dnumpy_Tnative_group_normupsample_nearest1dupsample_nearest2dupsample_nearest3dupsample_bicubic2dTr   )g_infer_symbolic_compute_ops_pass_on_shape_and_type_infer_ArrayFeatureExtractor_infer_Pool_infer_BatchNormalization_infer_Cast_infer_CategoryMapper_infer_Compress_infer_Concat_infer_ConcatFromSequence_infer_Constant_infer_ConstantOfShape_infer_Conv_infer_Einsum_infer_Expand_infer_Gather_infer_GatherElements_infer_GatherND	_infer_If_infer_Loop_infer_MatMul_infer_MatMulInteger_infer_NonMaxSuppression_infer_NonZero_infer_OneHot
_infer_Pad_infer_Range_infer_ReduceSum_infer_ReduceMean_infer_ReduceProd_infer_Reshape_infer_Resize_infer_Scan_infer_ScatterElements_infer_SequenceAt_infer_SequenceInsert_infer_Shape_infer_Size_infer_Slice_infer_SoftmaxCrossEntropyLoss_infer_Split_infer_SplitToSequence_infer_Squeeze_infer_Tile_infer_TopK_infer_Transpose_infer_Unsqueeze_infer_ZipMap_infer_Attention_infer_BiasAdd_infer_BiasGelu_infer_BiasSplitGelu&_infer_DecoderMaskedMultiHeadAttention_infer_DequantizeLinear_infer_DynamicTimeWarping_infer_EmbedLayerNormalization_infer_FastGelu _infer_GatedRelativePositionBias_infer_Gelu_infer_GemmFastGelu_infer_GemmFloat8_infer_GroupNorm_infer_GroupQueryAttention_infer_LayerNormalization_infer_LongformerAttention_infer_MatMulNBits_infer_MultiHeadAttention_infer_NhwcConv_infer_PackedAttention_infer_PackedMultiHeadAttention_infer_PagedAttention_infer_PythonOp_infer_QLinearBinary_infer_QuantizeLinear_infer_RelativePositionBias_infer_RemovePadding_infer_RestorePadding_infer_RotaryEmbedding_infer_SkipGroupNorm_infer_SkipLayerNormalization_infer_SparseAttention_infer_UnfoldTensordispatcher__infer_aten_bitwise_or_infer_aten_diagonal_infer_aten_pool2d_infer_aten_minmax_infer_aten_multinomial_infer_aten_unfold_infer_aten_argmax_infer_aten_group_norm_infer_aten_upsampleaten_op_dispatcher_run_suggested_merge_symbolic_dims_input_symbols_auto_merge_guess_output_rank_verbose_int_max_subgraph_id_prefix_)selfint_max
auto_mergeguess_output_rankverboseprefixr   r   r   __init__~   s   	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh
n	

zSymbolicShapeInference.__init__Fc           	         s  t  fdd|D sJ t|} j D ]\}}||v r(|| || qd }|D ]
}t|r7|} nq-|d u rJ|D ]}| jv rI|} nq>|d u ra|D ]}t j	| t
ju r`|} nqP|d u r jdkrstdd| t|}dd |D }||t| }|| |D ]9}||krqt|rt|rt|t|ksJ t|rt|n| j|<  j D ]\}}||kr| j|< qq|rӈ jrՈ   d S d S d S )Nc                 3   s.    | ]}t |tu r| jv pt|V  qd S r+   )r   r   r6  r3   r	   sr>  r   r   	<genexpr>  s   , z>SymbolicShapeInference._add_suggested_merge.<locals>.<genexpr>r   z9Potential unsafe merge between symbolic expressions: (%s),c                 S   r$   r   rO   rE  r   r   r   r   (  r'   z?SymbolicShapeInference._add_suggested_merge.<locals>.<listcomp>)allsetr5  itemsremoveaddr3   r7  r   r6  r?   Symbolr:  loggerwarningjoinrG   indexr   r4   r8  _apply_suggested_merge)	r>  symbolsapplykrX   map_torF  symbols_listlensr   rG  r   _add_suggested_merge  s\   






z+SymbolicShapeInference._add_suggested_mergec                 C   s|   | j sd S t| jjj|rg nt| jjj D ]$}|jjjj	D ]}|j
| j v r:| j |j
 }t|r7t||_q||_
qqd S r+   )r5  rG   out_mp_graphinput
value_infor   r   r#   r   	dim_paramr3   r4   	dim_value)r>  graph_input_onlyr6   r&   rX   r   r   r   rU  8  s   (z-SymbolicShapeInference._apply_suggested_mergec                 C   s   t  | _| j| dd t| jjjD | _dd | jjjD | _	dd t| jjjD | _
| j
dd | jjjD  d S )Nc                 S      i | ]}|j |qS r   r   r5   r   r   r   
<dictcomp>G  r'   z6SymbolicShapeInference._preprocess.<locals>.<dictcomp>c                 S   rd  r   r   r5   r   r   r   re  H  r'   c                 S   rd  r   r   r5   r   r   r   re  I  r'   c              	   S   s(   i | ]}|j t|j |jt|jqS r   )r   r   make_tensor_value_info	data_typerG   dimsr5   r   r   r   re  K  s    )r0   
ModelProtor]  CopyFromrG   r^  r_  graph_inputs_initializerinitializers_	known_vi_update)r>  in_mpr   r   r   _preprocessD  s   
z"SymbolicShapeInference._preprocessc                    sF  t dd  D sqjrott }dd |D }t|dks!J t|dkrU|d}jdkrJtd|d | ||d d    d||   j	|d	d
 || S jdkrktd|dd   d|d    d S d S t  fdd D r d S fdd D t fddD rd j
v sJ d S d S )Nc                 s   s    | ]	}t |tu V  qd S r+   r   r   r%   r   r   r   rH  R      z8SymbolicShapeInference._merge_symbols.<locals>.<genexpr>c                 S   r$   r   r3   r%   r   r   r   r   U  r'   z9SymbolicShapeInference._merge_symbols.<locals>.<listcomp>rN   r   zdim z has been merged with value Fallow_broadcastz has been merged with dim c                 3       | ]	}| d  kV  qdS r   Nr   r%   rh  r   r   rH  e  rs  c                    s   g | ]	} j ||qS r   )r5  getr%   rG  r   r   r   g  r   c                 3   rw  rx  r   r%   )mergedr   r   rH  h  rs  )rK  r8  rG   rL  sumrT  r:  rQ  debug_check_merged_dimsr6  )r>  rh  unique_dimsis_intint_dimr   )rh  r{  r>  r   _merge_symbolsQ  s0   

*
"z%SymbolicShapeInference._merge_symbolsc                 C   s   g }t |}t |}t||}t|D ]Z}||k r!||d |  nd}||k r/||d |  nd}	|dks9||	kr<|	}
n,|	dkrC|}
n%| ||	g}
|
sh| jrY| j||	gdd ntdt| d t|	  |
g|}q|S )NrN   TrW  zunsupported broadcast between  )	rO   r   ranger  r8  r\  rQ  rR  r   )r>  shape1shape2	new_shaperank1rank2new_rankr6   dim1dim2new_dimr   r   r   _broadcast_shapeso  s$   
z(SymbolicShapeInference._broadcast_shapesc                 C   sD   |j | }|| jv r| j| }t|S || jv sJ t| j| jS r+   )r_  rn  r/   rm  rG   rh  r>  r   idxr   r.   r   r   r   
_get_shape  s   


z!SymbolicShapeInference._get_shapec                 C   sZ   |t |jd krd S |j| }|| jv r| j| }t|S || jv r+t| j| jS d S rW   )rO   r_  rn  r/   rm  rG   rh  r  r   r   r   _try_get_shape  s   



z%SymbolicShapeInference._try_get_shapec                 C   s   t | ||S r+   )rO   r  )r>  r   r  r   r   r   _get_shape_rank  s   z&SymbolicShapeInference._get_shape_rankc                 C   sh   g }|  ||D ])}t|tu r&||| jv r| j| ntj|ddd qd |us,J || q|S )NTintegernonnegative)r  r   r   appendr6  r?   rP  )r>  r   r  r8   r&   r   r   r   _get_sympy_shape  s   

z'SymbolicShapeInference._get_sympy_shapec                 C   sF   |j | }|| jv s|| jv sJ || jv r| j| S t| j| S r+   )r_  sympy_data_rm  r   to_arrayr>  r   r  r   r   r   r   
_get_value  s   
$z!SymbolicShapeInference._get_valuec                 C   s@   |t |jkr	d S |j| }|| jv s|| jv r| ||S d S r+   )rO   r_  r  rm  r  r  r   r   r   _try_get_value  s   
z%SymbolicShapeInference._try_get_valuec                 C   s~   t |D ]8\}}t|s<t|tkr<t|}|| jv r.t| j| r#q| j| j|  ||< qt|| jvr<|| jt|< qd S r+   )	enumerater3   r   r   r5  r6  )r>  new_sympy_shaper6   r  str_dimr   r   r   _update_computed_dims  s   
z,SymbolicShapeInference._update_computed_dimsc           
         s  j dv }|sg }tjdkrj dv rfddjD }j dv rqjd jv rqjjd  }tt|jfddt	tjD }t	j d	v rSd
nd D ]  fdd|D }t|dkrpj
|dd qWtgdfddjD dd jD |}jj| tj_t	tjD ]%}j| }	|	rÈjjj }|s|jjj|  n|	|_|j|	< qd S )N)'rr   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	   )r   c                    s*   g | ]}| j v r| jvr j | qS r   )rm  rk  r	   r   rG  r   r   r     s
    zBSymbolicShapeInference._onnx_infer_single_node.<locals>.<listcomp>	r[   r   r|   ri   rt   MatMulIntegerru   r   Sumr   c                       g | ]}  |qS r   r  r5   r   r>  r   r   r         rt   r  ru      c                    0   g | ]}t |  kr|t |    qS r   rJ  rE  r&   out_rankr   r   r     r7   rN   Tru  tmpc                    s   g | ]	}|r j | qS r   rn  r5   rG  r   r   r     r   c                 S   r$   r   )r2   r5   r   r   r   r     r'   )op_typerL   r]  r_  outputrn  rO   r*   r   r  r~  r   
make_graphtmp_mp_r^  rj  r   infer_shapesr`  rO  r   )
r>  r   
skip_inferinitializersr.   	in_shapesin_dims	tmp_graphi_oor   )r&   r   r  r>  r   _onnx_infer_single_node  sL   
*



z.SymbolicShapeInference._onnx_infer_single_nodeTc                    s6   j dkrtd|j d|jd  d|j  dd t|jt|j D fdd j	D t
t|jd	t|j fd
dD  dd |jD }|jfdd jjjD  |j|j  jj| t j j j j  jd t j d}|r  jd7  _| j  j |_|jr| j  |js|  |r| d |j|jjjd t!|j  | d |j|jjj | d |j"|jjj" | d |j|jjj dd |jjjD } fdd|D }i }	|D ]}
|
|j#v s
J |j#|
 |	|
< q  j#$|	 |S )Nr  zInferencing subgraph of node z with output(r   z...): c                 S      h | ]}|j qS r   r   r5   r   r   r   	<setcomp>5      z>SymbolicShapeInference._onnx_infer_subgraph.<locals>.<setcomp>c                    s   h | ]}| vr|qS r   r   r  )subgraph_inputsr   r   r  6  r  r  c                    s   g | ]} j | qS r   r  r5   rG  r   r   r   :      z?SymbolicShapeInference._onnx_infer_subgraph.<locals>.<listcomp>c                 S   s   g | ]}t |jqS r   )r2   r   r5   r   r   r   r   ;  r  c                    s   g | ]	}|j  v r|qS r   r   r5   )subgraph_implicit_inputr   r   r   =  r   _)rC  rN   r_  r  r`  r   c                 S   r$   r   )r/   r	   r  r   r   r   r   [  r'   c                    s4   h | ]}|r|D ]}t |tu r| jvr|qqS r   r   r   r6  )r	   rF  r&   rG  r   r   r  \  s    ")%r:  rQ  r}  r   r  r  rG   rl  r_  rn  r   r  r   extendr]  r^  r  rj  rZ   r;  r8  r9  r=  r   r<  rq  r5  copyr4  _infer_implr  _update_output_from_vi
ClearFieldrO   r`  r6  ro  )r>  r   subgraphuse_node_inputinc_subgraph_idr  symbolic_shape_inferencesubgraph_shapessubgraph_new_symbolic_dimsnew_dimsr&   r   )r>  r  r  r   _onnx_infer_subgraph.  s^   
& 
 



z+SymbolicShapeInference._onnx_infer_subgraphc           
         s@  dd fddt tjD }tdd |D r]t|D ]<\}}t|tjur,q t|jdkr6d }n"t|jdkrE|	  }nt|jdksNJ  fd	d|D }|||< q d
d |D }t
|}	|	dkr|rt|D ]+\}}|d u r{qrt|trt||	k r||	 ||< qrt||	ksJ qr|g|	 ||< qr|S )Nc                 S   s   |r
| d dkr
| S t | S rM   r4   )r   allow_float_valuesr   r   r   int_or_floatg  s   zESymbolicShapeInference._get_int_or_float_values.<locals>.int_or_floatc                    r  r   )r  r5   r  r   r   r   m  r  zCSymbolicShapeInference._get_int_or_float_values.<locals>.<listcomp>c                 s       | ]}|d uV  qd S r+   r   r	   rX   r   r   r   rH  n      zBSymbolicShapeInference._get_int_or_float_values.<locals>.<genexpr>rN   r   c                    s   g | ]}| qS r   r   )r	   vv)r  r  r   r   r   y  r  c                 S   s"   g | ]}t |trt|nd qS r   )
isinstancerG   rO   r  r   r   r   r   {     " )r  rO   r_  rK  r  r   r<   rP   r#   rQ   r   r  rG   )
r>  r   	broadcastr  valuesr6   rX   new_v
values_lenmax_lenr   )r  r  r   r>  r   _get_int_or_float_valuesf  s2   

z/SymbolicShapeInference._get_int_or_float_valuesc                    s   t |jdks	J |jdv r| j|ddd}n| j|dd}tdd |D rVdd	 |D }t|}|rJ fd
d	t|ddiD | j|jd < d S  || j|jd < d S d S )NrN   )r|   ri   T)r  r  )r  c                 s   r  r+   r   r  r   r   r   rH    r  z@SymbolicShapeInference._compute_on_sympy_data.<locals>.<genexpr>c                 S   s   g | ]}t |tqS r   )r  rG   r  r   r   r   r     r  zASymbolicShapeInference._compute_on_sympy_data.<locals>.<listcomp>c                    s   g | ]} |qS r   r   )r	   vsop_funcr   r   r     r'   strictFr   )rO   r  r  r  rK  anyzipr  )r>  r   r  r  is_listrV   r   r  r   _compute_on_sympy_data  s   
,z-SymbolicShapeInference._compute_on_sympy_datac                 C   s0   t |jdks|jdv sJ | |dd  d S )NrN   )r   r   r   c                 S   s   | d S rB   r   rR   r   r   r   <lambda>  s    z<SymbolicShapeInference._pass_on_sympy_data.<locals>.<lambda>)rO   r_  r  r  r>  r   r   r   r   _pass_on_sympy_data  s   z*SymbolicShapeInference._pass_on_sympy_datac              
   C   sH   | j |jd  }|t|jd t| j |jd  j| |d d S rB   )	rn  r  rj  r   rf  r-   r_  r   r  )r>  r   r.   r   r   r   r     s   
z.SymbolicShapeInference._pass_on_shape_and_typec                 C   sb   | d| }|| j v r"| j | }t|rtt|}|S |}|S tj|ddd}|| j|< |S )N_dTr  )r5  r3   r?   r@   r4   rP  r6  )r>  rC  r   r  rX   new_symbolic_dimr   r   r   _new_symbolic_dim  s   


z(SymbolicShapeInference._new_symbolic_dimr   c              	   C   s6   |  |j | j dt| jjj| d| d|S )Nr  _o)r  r  r=  rG   r]  r^  r   rT  )r>  r   out_idxr   r   r   r   _new_symbolic_dim_from_output  s   ,z4SymbolicShapeInference._new_symbolic_dim_from_outputc                    s    fddt |D S )Nc                    s   g | ]	}  |qS r   r  r5   r   r  r>  r   r   r     r   z>SymbolicShapeInference._new_symbolic_shape.<locals>.<listcomp>)r  )r>  rD   r   r  r   r  r   _new_symbolic_shape  s   z*SymbolicShapeInference._new_symbolic_shapec              	   C   sT  |  |d}t|jdkr6|  |d}t|d }|r$|| d d n|| d  }|d ||r3dnd< nd }t|d}t|}t||d ksKJ |rV|| d d n|| d  }dd |D }t|st| j|jd  }	t|	dkrt|t|	ksJ |rd	d |	| d d D || d d< |S d
d |	| d  D || d < |S t|ddg| }
t|ddg| }dd t||
ddD }t|d}|d u r5dgd|  }t|dd	d}|dkr'|dkr'z dd t|| d  |ddD }dd t|||ddD }W nC t
y&   dd t||ddD }Y n.w |dkr/g }n%dg| }nt|d| ks@J dd t|d | ||d  ddD }t|dd}t|D ]I}|| | |rjdnd  }t|dkr{|||  }|rt|||  ||  }n
|||  ||  }|d || | |rdnd < q^|S )Nr   rN   r     kernel_shapec                 S   s   g | ]}t | qS r   rt  r5   r   r   r   r     r  zCSymbolicShapeInference._compute_conv_pool_shape.<locals>.<listcomp>c                 S      g | ]}t |qS r   r?   r@   r%   r   r   r   r     r  c                 S   r  r   r  r%   r   r   r   r     r  	dilationsstridesc                 S   s    g | ]\}}|d  | d  qS rN   r   )r	   rX  r&   r   r   r   r          Fr  padsauto_pads   NOTSETutf-8VALIDNOTSETc                 S   s   g | ]
\}}t ||qS r   )r?   Modr	   r&   rF  r   r   r   r         c                 S   s0   g | ]\}}}t d |d kr|| n|| qS r  r   )r	   rX  rF  rr   r   r   r     s    c                 S   s   g | ]\}}t d || qS r  r  )r	   rX  rF  r   r   r   r     s    c                 S   s   g | ]\}}|| qS r   r   )r	   p1p2r   r   r   r     r  	ceil_mode)r  rO   r_  r   r  r/   rn  r  r  decode	TypeErrorr  r?   ceiling)r>  r   channels_lastr8   W_shaperD   r  spatial_shapeis_symbolic_dimsr#   r  r   effective_kernel_shaper  r  residual
total_padsr  r6   effective_input_sizestrided_kernel_positionsr   r   r   _compute_conv_pool_shape  sp   $
$*"

"


($z/SymbolicShapeInference._compute_conv_pool_shapec                    s>   |r	dd  D  t  fdd D s| j dd d S d S )Nc                 S   s$   g | ]}t |rt|d ks|qS r  )r3   r4   r%   r   r   r   r   	  s   $ z=SymbolicShapeInference._check_merged_dims.<locals>.<listcomp>c                 3   rw  rx  r   r%   ry  r   r   rH  
  rs  z<SymbolicShapeInference._check_merged_dims.<locals>.<genexpr>Tr  )rK  r\  )r>  rh  rv  r   ry  r   r~    s
   z)SymbolicShapeInference._check_merged_dimsNc                 C   s6  |  |d}|  |d}t|}t|}d}d}|dkr |dks"J |dkr-|dkr-g }	n;|dkr?d}|d | |d g }	n)|dkrLd}|d | }	nd}d}g | |d d |d d |d |d }	| j|| || gdd |d u r| j|jd  jjj}| j|j	d  }
|

t|j	d ||	 d S )Nr   rN   r  Fru  )r  rO   r  r~  rn  r_  r   r   r,   r  rj  r   rf  )r>  r   output_dtype	lhs_shape	rhs_shapelhs_rankrhs_ranklhs_reduce_dimrhs_reduce_dimr  r.   r   r   r   _compute_matmul_shape  s4   0z,SymbolicShapeInference._compute_matmul_shapec              	   C   s  t |r	|jjjn|j}t |r|jjjn|j}|j|jkrB|jr$|jn|j}td| dtjj	j
|j dtjj	j
|j |drtt|jj|jjddD ](\}}	|	d |	d kr|tj }
t |sst| ||||
_|jj| |
 qTd	S || d	S )
zh
        update dst_tensor_type to be compatible with src_tensor_type when dimension mismatches
        z	For node z:, dst_tensor_type.elem_type != src_tensor_type.elem_type: z vs r#   Fr  r   rN   N)r"   r   r,   r   r   r  
ValueErrorr0   onnx_pbTensorProtoDataTypeNamer(   r  r  r#   r   TensorShapeProto	Dimensionr   r  ra  rj  )r>  r   r  dst_typesrc_typedst_tensor_typesrc_tensor_typenode_iddidsr  r   r   r   _fuse_tensor_type,  s.   
"
	z(SymbolicShapeInference._fuse_tensor_typec              	   C   sd   |  |d}|  |d}| j|jd  }|t|jd | j|jd  jjj	|d d |  d S Nr   rN   r  
r  rn  r  rj  r   rf  r_  r   r   r,   )r>  r   
data_shapeindices_shaper.   r   r   r   r   I  s   z3SymbolicShapeInference._infer_ArrayFeatureExtractorc                    sn   dd dd dd dd  fdd fdddd d	d d
d dd d
}|j |v s,J  |||j   d S )Nc                 S   s   | d | d  S Nr   rN   r   lr   r   r   r  W      zDSymbolicShapeInference._infer_symbolic_compute_ops.<locals>.<lambda>c                 S   s:   t | d | d  trt| d | d  S | d | d  S r:  r  floatr4   r;  r   r   r   r  X  s   :c                 S   s   | d | d kS r:  r   r;  r   r   r   r  [  r=  c                 S   s   t | d S rB   )r?   floorr;  r   r   r   r  \  s    c                    sd   t | d rt| d  j k r| d S t | d r(t| d  j k r(| d S t| d | d S r:  )r3   r4   r;  r?   rw   r;  rG  r   r   r  ]  s
   
<c                    s`   t | d rt| d  jkr| d S t | d r&t| d  jkr&| d S t| d | d S r:  )r3   r4   r;  r?   rz   r;  rG  r   r   r  b  s
   
:c                 S   s:   t | d | d  trt| d | d  S | d | d  S r:  r>  r;  r   r   r   r  g  s   : c                 S   s   | d | d  S r:  r   r;  r   r   r   r  h  r=  c                 S   s   | d r| d S | d S Nr   rN   r  r   r;  r   r   r   r  i  r  c                 S   s
   | d  S rB   r   r;  r   r   r   r  j  s   
 )
r[   ri   rl   rm   rw   rz   r|   r   r   r   )r  r  )r>  r   funcsr   rG  r   r   U  s   

z2SymbolicShapeInference._infer_symbolic_compute_opsc                 C      |  | d S r+   )r  r  r   r   r   r   o  r:   z"SymbolicShapeInference._infer_Castc              
   C   sj   | j |jd  jjj}|tjjkrtjj}ntjj}| j |j	d  }|
t|j	d || |d d S rB   )rn  r_  r   r   r,   r0   r)  STRINGINT64r  rj  r   rf  r  )r>  r   
input_typeoutput_typer.   r   r   r   r   r  s   
&z,SymbolicShapeInference._infer_CategoryMapperc                 C   s   |  |d}t| |}t|d}|d u r|g}n|}||t|t|< | j|jd  }|t	
|jd | j|jd  jjj| d S )Nr   rC   )r  r   r  r   rE   rO   rn  r  rj  r   rf  r_  r   r   r,   )r>  r   input_shapecompress_lenrC   output_shaper.   r   r   r   r   {  s   
z&SymbolicShapeInference._infer_Compressc                    s  t fddjD rU}tdd |D rUtddks#J g jjd < ttjD ]"}|| }t	|t
rIjjd  | q2jjd  | q2d}ttdt|}tdtjD ]}|}|r|| ||  ||< qm| tt|D ]>  |krq fddttjD tfd	dD rq}	t|	tu r|	rj|	 nd | < q|	| < qjjd  }
|
tjd jjd  jjjt| d S )
Nc                 3   s$    | ]}| j v p| jv V  qd S r+   )r  rm  r5   rG  r   r   rH    s   " z7SymbolicShapeInference._infer_Concat.<locals>.<genexpr>c                 s   r  r+   r   r  r   r   r   rH    r  rC   r   rN   c                    s(   g | ]} |r |  qS r   r  )r	   i_idx)r&   r   r>  r   r   r     s   ( z8SymbolicShapeInference._infer_Concat.<locals>.<listcomp>c                 3   rw  rx  r   r%   ry  r   r   rH    rs  )r  r_  r  rK  r   r  r  r  rO   r  rG   r  r  r  rE   r  r  r   r   r6  rn  rj  r   rf  r   r,   r9   )r>  r   r  r6   r   r8   rC   rK  rH  r{  r.   r   )r&   rh  r   r>  r   r     sH   


 

z$SymbolicShapeInference._infer_Concatc                 C   s   |  |d}t|drdnd}tt|dt|| }t| |d|}|}|r8|d | |g ||d   }n|||< | j|jd  }|t	
|jd | j|jd  jjjjj| d S )Nr   new_axisrN   rC   )r  r   rE   rO   r   r  rn  r  rj  r   rf  r_  r   r   r,   r   )r>  r   	seq_shaperL  rC   
concat_dimr  r.   r   r   r   r     s     z0SymbolicShapeInference._infer_ConcatFromSequencec                 C   s$   t |d}t|| j|jd < d S )Nr   r   )r   r   r  r  r  )r>  r   tr   r   r   r     s   
z&SymbolicShapeInference._infer_Constantc                 C   s   |  |d }| j|jd  }|d urPt|tkr|g}| | |jjjtj	j
krOtdd |D rOtjdd |D tjdtt|dd | j|jd < n| | |dd |}|t|jd |jjjt| d S )Nr   c                 s   s    | ]}t |V  qd S r+   rt  r	   rS   r   r   r   rH    r  z@SymbolicShapeInference._infer_ConstantOfShape.<locals>.<genexpr>c                 S   r$   r   r  rP  r   r   r   r     r'   zASymbolicShapeInference._infer_ConstantOfShape.<locals>.<listcomp>)dtyper   )r  rn  r  r   rG   r  r   r,   r0   r)  rE  rK  r<   onesr=   r   r  r   r  r  r  rj  r   rf  r9   r>  r   r8   r.   r   r   r   r     s*   
$z-SymbolicShapeInference._infer_ConstantOfShapec                 C   sL   |  |}| | | j|jd  }|t|jd |jjj	t
| d S rB   )r  r  rn  r  rj  r   rf  r   r   r,   r9   rS  r   r   r   r     s   

z"SymbolicShapeInference._infer_Convc                 C   s\   | j |dd}| | | j|jd  }|t|jd | j|jd  jj	j
t| d S )NT)r  r   )r  r  rn  r  rj  r   rf  r_  r   r   r,   r9   rS  r   r   r   r    s   
z&SymbolicShapeInference._infer_NhwcConvc                 C   sP   | j |jd  jjj}| |d}| j |jd  }|t	|jd || d S rM   )
rn  r_  r   r   r,   r  r  rj  r   rf  r>  r   r  rJ  r.   r   r   r   r     s   z.SymbolicShapeInference._infer_DequantizeLinearc                 C   sp   t jj}t|jdkr|jd r| j|jd  jjj}| 	|d}| j|j
d  }|t|j
d || d S )Nr  r   )r0   r)  UINT8rO   r_  rn  r   r   r,   r  r  rj  r   rf  rT  r   r   r   r   
  s   z,SymbolicShapeInference._infer_QuantizeLinearc                 C   sh   | j |jd  jjj}| |d}| |d}| ||}| j |jd  }|t	
|jd || d S Nr   r  )rn  r_  r   r   r,   r  r  r  rj  r   rf  )r>  r   r  input_1_shapeinput_2_shaper  r.   r   r   r   r    s   z+SymbolicShapeInference._infer_QLinearBinaryc                 C   sD  t |d}|dd}|d}|dkr|d | n|}d}d}d}i }|d}	|	D ]U}
|
d}| ||}t|}|dkrP|dkrL|t|
 d	 }|d
 }td
|d
 D ]$}|
|  }|dkr{||  }||vrp|||< qWt|tj	ur{|||< qW|d
 }q+g }ddl
m} | }|dkr||d d  }|d}|dkrt|D ]	}|||  q|D ]}|dkr|||  qn@t|D ]	}|||  q|D ]}|dkr|dkr||v r|| d
 ||< qd
||< q| D ]\}}|d
kr|||  q| j|jd  jjj}| j|jd  }|t|jd || d S )Nequation        s   ->r  r      ,s   ...r  rN   .   )OrderedDictr  ,   )r   replacefindsplitr  rO   r  r   r?   rP  collectionsr^  r  rM  rn  r_  r   r,   r  rj  r   rf  )r>  r   rY  	mid_indexleft_equationnum_operandsnum_ellipsisnum_ellipsis_indicesletter_to_dimtermstermellipsis_indexr#   rD   r6   letterr   r  r^  num_letter_occurrencesright_equationright_ellipsis_indexckeyr   r  r.   r   r   r   r   %  sp   








z$SymbolicShapeInference._infer_Einsumc                 C   s   t | |ddd}|d urA| | | |d}| |t|}| j|jd  }|t	
|jd | j|jd  jjj| d S d S )NrN   TrU   r   )rV   r  r  r  r  r9   rn  r  rj  r   rf  r_  r   r   r,   )r>  r   expand_to_shaper#   r  r.   r   r   r   r   c  s   
z$SymbolicShapeInference._infer_Expandc              
      s  |  |d}tt|ddt|}|  |d}| j|jd  }|jdkr0| j|jd  jj	j
}n|jdkrA| j|jd  jj	j
}ntd|j |t|jd ||d | | ||d d    |jd | jv rt|dkrt|dddkr| |d}|d ur| j|jd   t tu rt|tju rt|jdkr fdd	|D | j|jd < d S  t| | j|jd < d S |dks|d
ksJ  | j|jd < d S d S d S d S d S )Nr   rC   rN   rn   r   r  zUnsupported Gather op_type: c                    s   g | ]} t | qS r   r  r5   datar   r   r     r  z8SymbolicShapeInference._infer_Gather.<locals>.<listcomp>r  )r  rE   r   rO   rn  r  r  r_  r   r   r,   r'  rj  r   rf  r  r  rG   r<   rP   r#   r4   )r>  r   r8  rC   r9  r.   r,   r  r   ru  r   r   s  s8   

,"z$SymbolicShapeInference._infer_Gatherc                 C   sL   |  |d}| j|jd  }|t|jd | j|jd  jjj	| d S rM   r7  )r>  r   r9  r.   r   r   r   r        z,SymbolicShapeInference._infer_GatherElementsc                 C   s   |  |d}t|}|  |d}t| |d }t|r ||ks"J |d d ||d   }| j|jd  }|t|jd | j|jd  j	j
j| d S r6  )r  rO   r3   rn  r  rj  r   rf  r_  r   r   r,   )r>  r   r8  	data_rankr9  last_index_dimensionr  r.   r   r   r   r     s   z&SymbolicShapeInference._infer_GatherNDc           	   	   C   s0  t |dt |dg}| |d}|d ur-t|dkr$|d |d  n	|d |d  t|D ]d\}}| j||dd}tt|jD ]P}| j	|j|  }|dkra||j|  |j| |_
n| |||j|j| j |d ur|t|dkr{dndkr|j| j
|jv r|j|j| j
 | j|j
< qDq1d S )Nthen_branchelse_branchr   rN   F)r  )r   r  rT   rj  r  r  r  rO   r  rn  r   r5  r   r  )	r>  r   	subgraphscondi_subr  subgraph_inferi_outr.   r   r   r   r     s,    z SymbolicShapeInference._infer_Ifc                 C   s`  t |d}t|jt|jksJ t|jd }t|jD ]\}}|j}|| j|j|   ||_q| || d}td|d D ]q}|j	| }	t
|	}
t|	jrk|
rjd |
v rj|j|d  jjj|	jjj d}qB|j|d  }t
|}tt||
ddD ]3\}}|d |d krtj }t| ||||_|jjjj| | |	jjjj| | d}qqB|r| jdkrtd|j d	|j	d  d
 | j||dd t| |}tt|j	D ]L}| j|j	|  }||j	|d   ||kr't|jrJ |j	|d  jjjj}|jjjd |jjjj}|| _|t| |j	| |_qd S )Nbodyr  FrN   Tr  r   zRerun Loop: (z3...), because of sequence in loop carried variables)r  r   ) r   rO   r_  r  r   rj  rn  r  r  r  r/   r"   r   r   r,   r  r0   r,  r-  r   r  ra  r   r#   r   r:  rQ  r}  r  rO  r  rG   )r>  r   r  num_loop_carriedr6   sisi_nameneed_second_inferr  soso_shapesi_shaper3  rh  r  loop_iter_dimr.   subgraph_vi_dimvi_dimr   r   r   r     s^   


 



z"SymbolicShapeInference._infer_Loopc                 C   rC  r+   r&  r  r   r   r   r     r:   z$SymbolicShapeInference._infer_MatMulc                 C   s   |  |tjj d S r+   )r&  r0   r)  INT32r  r   r   r   r   
  s   z+SymbolicShapeInference._infer_MatMulIntegerc                 C   s   |  |d}t|dt|dg}t|}|dksJ |dkr%|dd  }n|d d |dd   }| j|d |d gdd | j|jd  jjj}| j|j	d  }|
t|j	d || d S )Nr   KNrN   r  Fru  )r  r   rO   r~  rn  r_  r   r   r,   r  rj  r   rf  )r>  r   r   r!  r"  r  r  r.   r   r   r   r    s   z)SymbolicShapeInference._infer_MatMulNBitsc                 C   sD   t | |}| j|jd  }|t|jd tjj	|dg d S rV  )
r   r  rn  r  rj  r   rf  r0   r)  rE  )r>  r   selectedr.   r   r   r   r      s   &z/SymbolicShapeInference._infer_NonMaxSuppressionc                 C   sV   |  |d}t| |dd}| j|jd  }|t|jd |jj	j
||g d S r:  )r  r   r  rn  r  rj  r   rf  r   r   r,   )r>  r   
input_ranknz_lenr.   r   r   r   r   %  s   (z%SymbolicShapeInference._infer_NonZeroc                 C   s   |  |d}| |d}t|dd}t|t|d }t|d | t|s*| |n|g ||d   }| j|j	d  }|
t|j	d | j|jd  jjj| d S )Nr   rN   rC   r  r  )r  r  r   rE   rO   r9   r3   r  rn  r  rj  r   rf  r_  r   r   r,   )r>  r   r8   depthrC   r  r.   r   r   r   r   ,  s&   

z$SymbolicShapeInference._infer_OneHotc                 C   s   t | jdkrt|d}n| |d}| |d}t|}|d urFt|d| ks+J dd t||d | ||d  dd	D }| | n| ||}| j	|j
d  jjj}| j	|jd  }|t|jd |t| d S )
N
   r  rN   r   r  c                 S   s   g | ]\}}}|| | qS r   r   )r	   r&   pad_uppad_downr   r   r   r   J  s    
z5SymbolicShapeInference._infer_Pad.<locals>.<listcomp>Fr  )rL   r]  r   r  r  rO   r  r  r  rn  r_  r   r   r,   r  rj  r   rf  r9   )r>  r   r  r8   rD   r  	output_tpr.   r   r   r   r   ?  s"   z!SymbolicShapeInference._infer_Padc              	   C   sR   |  |}| | |jD ]}|sq| j| }|t||jjj	t
| qd S r+   )r  r  r  rn  rj  r   rf  r   r   r,   r9   )r>  r   r8   r  r.   r   r   r   r   Y  s   



z"SymbolicShapeInference._infer_Poolc                 C   sh   |  |d}|  |d}| ||}| j|jd  }| j|jd  }|t|jd |jj	j
| d S r:  )r  r  rn  r_  r  rj  r   rf  r   r   r,   )r>  r   shape0r  r  t0r.   r   r   r   r*  h  s   $z-SymbolicShapeInference._infer_aten_bitwise_orc                 C   s:  |  |d}t|}| |d}| |d}| |d}|d ur(|d ur(|d us*J t||}t||}g }t|D ]\}}	|||fvrI||	 q:|| }
|| }|dkrctdt|
|| }ntdt|
| |}|| |j	d r| j
|j	d  }|t|j	d | j
|jd  jjjt| d S d S Nr   rN   r  r  )r  rO   r  rE   r  r  r?   rw   rz   r  rn  rj  r   rf  r_  r   r   r,   r9   )r>  r   r8   rD   offsetr  r  r  r   valr  r  
diag_shaper.   r   r   r   r+  p  s:   




z+SymbolicShapeInference._infer_aten_diagonalc           	      C   s   |  |d}t|}|dv sJ | |d}|d }|r|nt| |d|}|d d |g }| j|jd  }|t	|jd t
jjt| d S )Nr   rN   r  rN   r  )r  rO   r  r   r  rn  r  rj  r   rf  r0   r)  rE  r9   )	r>  r   r8   rD   num_samplesr3  last_dimrJ  r.   r   r   r   r.    s   z.SymbolicShapeInference._infer_aten_multinomialc              	      s     d}t|dksJ  fdddD |dd < | t jD ]+\}}|s-q&j| }|dkr:tjjn
j j	d  j
jj}|t||t| q&d S )Nr      c                    s   g | ]	}  d |qS r  r  r5   r  r   r   r     r   z=SymbolicShapeInference._infer_aten_pool2d.<locals>.<listcomp>r  r  r  rN   )r  rO   r  r  r  rn  r0   r)  rE  r_  r   r   r,   rj  r   rf  r9   )r>  r   r8   r6   r  r.   r,   r   r  r   r,    s   

&z)SymbolicShapeInference._infer_aten_pool2dc           	      C   s`  | j |jd  }t|jdkr'|t|jd | j |jd  jjj	g  d S t|jdks0J | 
|d}|d us<J | 
|d}|d u rY| |d}| |rR|n|d |}n$| |d}t|t|}|d | }|rs|dg7 }|||d d  7 }t|}|t|jd | j |jd  jjj	| | j |jd  }|t|jd tjj| d S )Nr   rN   r  r  )rn  r  rO   r_  rj  r   rf  r   r   r,   r  r  r  r  rE   r9   r0   r)  rE  )	r>  r   r.   keepdimr   rD   rJ  r#   vi1r   r   r   r-    s8   
"z)SymbolicShapeInference._infer_aten_minmaxc                 C   s   |  |d}| |d}| |d}| |d}|d ur>|d ur>|d ur>|t|k s,J || | | d ||< || nt|}| |d |}| | |jd rv| j|jd  }|t	
|jd | j|jd  jjjt| d S d S r  )r  r  rO   r  r  r  r  rn  rj  r   rf  r_  r   r   r,   r9   )r>  r   r8   	dimensionsizesteprD   r.   r   r   r   r/    s*   

z)SymbolicShapeInference._infer_aten_unfoldc                 C   s   d }|j d s
g }nE| |d}| |d}|d urO| |d}|d ur6t|t|}|r2d||< n||= nt|}| |r@|n|d |}| | t|}|jd rq|d urs| j	|jd  }|
t|jd tjj| d S d S d S NrN   r  r   )r_  r  r  rE   rO   r  r  r9   r  rn  rj  r   rf  r0   r)  rE  )r>  r   r  r   r  r8   rD   r.   r   r   r   r0    s(   


"z)SymbolicShapeInference._infer_aten_argmaxc                 C   s   |  | | |d}|d urt|dkr|d nd }| |d}| j|jd  jjj}dD ]:}|j	| rh| j|j	|  }|
t|j	| ||d urL|nt| ||d|d ur\t|nt| ||dg q.d S )Nr      r  rN   )_propagate_shape_and_typer  rO   r  rn  r_  r   r   r,   r  rj  r   rf  r   r  rT   )r>  r   rH  r  groupr  r6   r.   r   r   r   r1     s*   
 
z-SymbolicShapeInference._infer_aten_group_normc                    s   d }  d}|d ur9|d d } d}|d ur&|dd |D 7 }nt|}| fddtd|D 7 } jd rd|d urfj jd  jjj	}j jd  }|
t jd || d S d S d S )Nr   r  rN   c                 S   s&   g | ]}t |tju r| n|qS r   )r   r<   r=   rQ   )r	   dim_sizer   r   r   r     s   & z?SymbolicShapeInference._infer_aten_upsample.<locals>.<listcomp>c                    s   g | ]}t  d |qS r  )r   r  r5   r  r   r   r   "  s    )r  r  rO   r  r  rn  r_  r   r   r,   rj  r   rf  )r>  r   r  rH  output_sizerD   r  r.   r   r  r   r2    s   z+SymbolicShapeInference._infer_aten_upsamplec                 C   s@   |  | dD ]}|t|jk r|j| r| j |d|d qd S )N)rN   r  r  r  rN   input_indexoutput_indexr  rO   r  )r>  r   r6   r   r   r   r   (  s   
z0SymbolicShapeInference._infer_BatchNormalizationc                 C   s   | j |jd  }| |}tdd |D r7t|d }t|d }t|d }tt|| | dg}n| |g}| 	| |
t|jd | j |jd  jjjt| d S )Nr   c                 s   r  r+   r   r5   r   r   r   rH  4  r  z6SymbolicShapeInference._infer_Range.<locals>.<genexpr>rN   r  )rn  r  r  rK  rT   r?   rw   r  r  r  rj  r   rf  r_  r   r   r,   r9   )r>  r   r.   
input_datastartlimitdeltar  r   r   r   r   1  s    

z#SymbolicShapeInference._infer_Rangec                    s&  t |dd}t| jdkrt|jdkr| |d}| j|jd  }|d u rL|s*J |t	
|jd | j|jd  jjjt| | |d| d S | |d g } fdd|D }t D ]\}}||v rq|rp|d qa|| qa|t	
|jd | j|jd  jjj| d S d S d S )NkeepdimsrN      r   c                       g | ]	}t |t qS r   rE   rO   r	   ar#   r   r   r   V  r   z;SymbolicShapeInference._infer_ReduceSum.<locals>.<listcomp>)r   rL   r]  rO   r_  r  rn  r  rj  r   rf  r   r   r,   r9   r  r  r  r  r  )r>  r   	keep_dimsaxesr.   rJ  r6   r&   r   r  r   r   D  s<   
z'SymbolicShapeInference._infer_ReduceSumc                 C   s    t | jdkr| | d S d S )N   )rL   r]  r   r  r   r   r   r   e  s   z(SymbolicShapeInference._infer_ReduceMeanc                 C   sb   t |d}t |dd}|dkr+|dgkr-| |d }|d ur/t|| j|jd < d S d S d S d S )Nr  r  rN   r   )r   r  rY   r  r  )r>  r   r  r  rv  r   r   r   r   j  s   
z(SymbolicShapeInference._infer_ReduceProdc                 C   s   |  |d}|  |d}|d u s|d u rd S | |dd }d|t|t|g}| j|jd  jjj}| j|jd  }|	t
|jd || d S r  )r  r  r   rn  r_  r   r   r,   r  rj  r   rf  )r>  r   seq_lenreal_seq_len	num_headsr  r  r.   r   r   r   r!  r  s   z2SymbolicShapeInference._infer_RelativePositionBiasc                 C   s  |  |d}| j|jd  }|d u rA| |d}t|dks J |d }t|s*J |t|jd |j	j
jt| || n| |d}d}|D ]}|| }qKg }	d}
d}t|D ]7\}}t	|tju rm|	| n|dkr|	||  |||  }n|	| |dkr|}
q\|dkr|| }q\|	ddk sJ d|	v r|| }||	|
< | |	 |t|jd |j	j
jt|	 | | d S )NrN   r   r  r  )r  rn  r  r  rO   r3   rj  r   rf  r   r   r,   r9   r  r  r  r?   rP  r  countr  r  )r>  r   shape_valuer.   shape_shape
shape_rankinput_sympy_shapetotalr&   r  deferred_dim_idxnon_deferred_sizer6   r  r   r   r   r     s\   


z%SymbolicShapeInference._infer_Reshapec                 C   s  | j |jd  }| |d}t| jdkrL| |d}|d urJdd t||ddD }| | |t	
|jd | j |jd  jjjt| d S d S | |d}| |d}| |d	}|d urod
d |D }| | nV|d urt|}t|ddkrt|d| ksJ t|d | }	t||d  }
n
dg| }	dg| }
t|}dd t||	|
|ddD }| | n
| | |d|}|t	
|jd | j |jd  jjjt| d S )Nr   r  rN   c                 S   s$   g | ]\}}t t || qS r   r?   simplifyr@  r
  r   r   r   r     s    z8SymbolicShapeInference._infer_Resize.<locals>.<listcomp>Fr  r  r  c                 S   s   g | ]
}t t |qS r   r  rE  r   r   r   r     r  coordinate_transformation_modetf_crop_and_resizec              	   S   s0   g | ]\}}}}t t |||  | qS r   r  )r	   r&   r  endscaler   r   r   r     s    
)rn  r  r  rL   r]  r  r  r  rj  r   rf  r_  r   r   r,   r9   rO   r   rG   r  r  )r>  r   r.   r  scalesr  roisizesrD   	roi_startroi_endr   r   r   r     sX   


z$SymbolicShapeInference._infer_Resizec                    s  t  d}t  d}t  ddg| }t j|  fddt|D }t|jt jks3J |jd t j }t|D ]*\}}|j}|j j|   |krh|jjj	j
}	|	|	||    ||_qA | t j }
t  ddg|
 }tj jd  j|d  }	t jD ]M\}}j| }|krt|j| j}t||  t|d	 }|d | |	g ||d   }|t||j| jjj| n||j|  ||_qd S )
Nr  num_scan_inputsscan_input_axesr   c              	      s&   g | ]\}}t | | qS r   )rE   r  )r	   r6   axr   num_scan_statesr>  r   r   r     s    z6SymbolicShapeInference._infer_Scan.<locals>.<listcomp>scan_output_axesr  rN   )r   rO   r_  r  r   rj  rn  r   r   r#   r   rN  r  r  r*   rE   r   rf  r,   )r>  r   r  r  r  r  r6   r  subgraph_namescan_input_dimnum_scan_outputsr  r  r.   r#   r  r   r  r   r     s<   


"z"SymbolicShapeInference._infer_Scanc                 C   sL   |  |d}| j|jd  }|t|jd | j|jd  jjj	| d S rB   r7  )r>  r   r8  r.   r   r   r   r     rw  z-SymbolicShapeInference._infer_ScatterElementsc                 C   s|   |  |d}| j|jd  }|d ur:t|D ]%\}}|d urqtj }t| |d||_	|j
jjj| | qd S d S rB   )r  rn  r  r  r0   r,  r-  r   r  ra  r   r   r#   r   rj  )r>  r   rM  r.   r3  r&   r  r   r   r   r     s   
z(SymbolicShapeInference._infer_SequenceAtc                 C   s^   | j |jd  }| j |jd  }| j |jd  }|| |jd |_| |d|j|j d S r:  )rn  r_  r  rj  r   r5  r   )r>  r   vi_seq	vi_tensor
vi_out_seqr   r   r   r     s   
z,SymbolicShapeInference._infer_SequenceInsertc                 C   s   |  |d| j|jd < d S rB   )r  r  r  r  r   r   r   r   (  s   z#SymbolicShapeInference._infer_Shapec                 C   sN   |  |d}t|| j|jd < | j|jd  t|jd tj	j
g  d S rB   )r  rY   r  r  rn  rj  r   rf  r0   r)  rE  )r>  r   r8   r   r   r   r   +  s
   z"SymbolicShapeInference._infer_Sizec                    s  dd   fddfdd}t jdkr9t|d}t|d	}t|d
}|s1ttt|}dgt| }n_t|ddd}t|ddd}|d}|d}|d u rs|d u re|d u ssttt|d urn|n|}|d u r|d u r|d u sdgt|d ur|n| }t|dd}t|dd}|d}|d u s|d u r|d u rtt|D ]}	|d|||< qnt
|}|D ]}	|d|||< qnt||||ddD ]\}}	}
}||
|| }
t|
r8|
jkr|| }
n~|
j kr|	dkrdnd}
nmt|| r#|
dk rtd|
||  }
t|
|| }
nP|
dkr7|
dkr5t|
|| n|
}
n;t|| rHt|
|| }
n+z|
|| sU|| }
W n tyr   td|
 d||  d || }
Y nw ||	|| }	t|| rt|	rtdt|	|| }	t|
|	 | |dkrdnd | ||< qو| j|jd  }|t|jd |jjjt
| |jd j v r-|dgkr/|d ur1t|dkr3|d ur5t|dkr7|d ur9t|dkr;j |jd  }t|tu st|t!j"u r=t|j#dkr?||d |d |d  j |jd < d S d S d S d S d S d S d S d S d S d S d S )Nc                    sn   t  tjsJ d   fddtt jD }t|dkr4|d  fdd}|d|dgS  gS )Nz%Expected a sum of two arguments, got c                    s"   g | ]}t  j| tjr|qS r   )r  argsr?   rz   )r	   r  )exprr   r   r   <  r  zLSymbolicShapeInference._infer_Slice.<locals>.flatten_min.<locals>.<listcomp>rN   r   c                    sr   t  j}t| tjsJ d d|  t| jdks+J d|  | j|  |< tj| S )Nz#Expected a sympy.Min() at position z, got r  z5Expected a sympy.Min() with exactly 2 arguments, got )rG   r  r  r?   rz   rO   r[   )arg_idxreplacedr  min_posr   r   replace_min_with_arg@  s   

zVSymbolicShapeInference._infer_Slice.<locals>.flatten_min.<locals>.replace_min_with_arg)r  r?   r[   r  rO   r  )r  min_positionsr  r   r  r   flatten_min:  s   z8SymbolicShapeInference._infer_Slice.<locals>.flatten_minc                    s   zt | |kW S  ty   Y nw zt || kW S  ty!   Y nw z	t |  | kW S  ty4   Y nw z	t | |  kW S  tyG   Y nw z	t ||  dkW S  tyg   tdd  ||  D  Y S w )Nr   c                 s   s    | ]	}t |d kV  qdS rx  )boolr%   r   r   r   rH  f  rs  zJSymbolicShapeInference._infer_Slice.<locals>.less_equal.<locals>.<genexpr>)r  r  rK  )rS   y)r  r   r   
less_equalQ  s2   z7SymbolicShapeInference._infer_Slice.<locals>.less_equalc                    s\   z d| st | r| j kr| W S ||  W S W | S  ty-   td|  d Y | S w )z/normalizes a negative index to be in [0, bound)r   zCannot determine if z < 0)r3   r;  r  rQ  rR  )rT  bound)r  r>  r   r   handle_negative_indexh  s   

zBSymbolicShapeInference._infer_Slice.<locals>.handle_negative_indexr  r  startsendsrN   Trs  r  r  r  r   Fr  r  zUnable to determine if z <= z, treat as equal)$rL   r]  r   rG   r  rO   rV   r  r  r  r9   r  r3   r;  r   r   r?   rz   	ExceptionrQ  rR  r  r  rn  r  rj  r   rf  r   r   r,   r_  r  r<   arrayr#   )r>  r   r  r  r  r  stepsr  r6   rF  erO  r.   input_sympy_datar   )r  r  r>  r   r   2  s   







.




 *z#SymbolicShapeInference._infer_Slicec                 C   s   | j |jd  }| j |jd  jjj}t|dd }|d ur|}||jj_|jjjt	
  t|jdkrP| |d}| j |jd  }|t|j|| d S d S )Nr   rG  rN   )rn  r  r_  r   r   r,   r   r#   rj  r0   r,  rO   r  r   rf  r   )r>  r   r.   r,   specified_output_typer8  r   r   r   r     s   
z5SymbolicShapeInference._infer_SoftmaxCrossEntropyLossc           
      C   s8  |  |d}tt|ddt|}t| j}|dk r*t|d}| |dd u s)J n| |d}t|dd u s9J |d u rTt|j}|| t	| g| }| 
| ndd |D }tt|D ]8}| j|j|  }	|	||j| | j|jd  jjjt|d | || g ||d d    |	| j|	j< qad S )Nr   rC   r  rb  rN   c                 S   r  r   r  rE  r   r   r   r     r  z>SymbolicShapeInference._infer_Split_Common.<locals>.<listcomp>)r  rE   r   rO   rL   r]  r  r  r?   r@   r  r  rn  rj  r_  r   r   r,   r9   r   )
r>  r   make_value_info_funcr  rC   op_setrb  num_outputsr  r.   r   r   r   _infer_Split_Common  s0   


(z*SymbolicShapeInference._infer_Split_Commonc                 C      |  |tj d S r+   )r  r   rf  r  r   r   r   r        z#SymbolicShapeInference._infer_Splitc                 C   r  r+   )r  r   make_sequence_value_infor  r   r   r   r     r  z-SymbolicShapeInference._infer_SplitToSequencec                    s  |  |d t| j}|dk rt|d}| |dd u sJ n| |d}t|dd u s.J |d u r\dd  D }| jdkr[dd  D }t|dkr[td|j	 d	|j
 d
|  nS fdd|D }g }tt D ]A}||vr{| |  qm | dkst | tksJ | jdkrt | tkrtd|j	 d	|j
 d |  d| d	 qm| j|jd  }|t|jd | j|jd  jjj| | | d S )Nr   r  r  rN   c                 S   s   g | ]}|d kr|qS r  r   rE  r   r   r   r     r  z9SymbolicShapeInference._infer_Squeeze.<locals>.<listcomp>c                 S   s   g | ]
}t |tkr|qS r   )r   r4   rE  r   r   r   r     r  z+Symbolic dimensions in input shape of op: 'z	' node: 'z;'. Assuming the following dimensions are never equal to 1: c                    r  r   r  r  rH  r   r   r     r   z'. Assuming the dimension 'z' at index z of the input to be equal to 1.)r  rL   r]  r   r  r:  rO   rQ  r}  r  r   r  r  r   r4   rn  r  rj  r   rf  r_  r   r,   r  )r>  r   r  r  rJ  symbolic_dimensionsr6   r.   r   r   r   r    sT   


 z%SymbolicShapeInference._infer_Squeezec           	      C   s   |  |d}g }|d ur,| |d}t|D ]\}}|||  }|| q| | n
| | |d|}| j|jd  }|	t
|jd |jjjt| d S rM   )r  r  r  r  r  r  r  rn  r  rj  r   rf  r   r   r,   r9   )	r>  r   repeats_valuer  r  r6   r&   r  r.   r   r   r   r  4  s"   z"SymbolicShapeInference._infer_Tilec           	      C   s   |  |d}tt|dd|}| |d}t| jdkr"t|d}n| |d }|d u r3| |}nt|}t	|t
tfv rD|||< n| |d}|||< | | t|}tt|jD ]}| j|j|  }|t|j| |j	jj| q^d S )Nr   rC   r  r  rX  rN   )r  rE   r   r  rL   r]  r  r  rT   r   r4   r   r  r  r9   r  rO   r  rn  rj  r   rf  r   r,   )	r>  r   rD   rC   r  rX  r  r  r.   r   r   r   r  H  s*   
"z"SymbolicShapeInference._infer_TopKc                 C   s   |j d | jv r?| |d}t|dtttt|}| j|j d  }tj	t
|j| t|d  | j|jd < d S d S )Nr   perm)r  )r_  r  r  r   reversedrG   r  rO   r<   	transposer  reshapetupleflattentolistr  )r>  r   r8  r  r  r   r   r   r  e  s   $z'SymbolicShapeInference._infer_Transposec           	         s  |  |d}t| j}|dk rt|d}| |dd u sJ n| |d}t|dd u s.J t|t|   fdd|D }d}g }t D ]}||v rS|d qG|||  |d7 }qG| j|j	d  }|
t|j	d | j|jd  jjj| | | d S )Nr   r  r  rN   c                    s   g | ]}t | qS r   )rE   r  output_rankr   r   r   {  r  z;SymbolicShapeInference._infer_Unsqueeze.<locals>.<listcomp>)r  rL   r]  r   r  rO   r  r  rn  r  rj  r   rf  r_  r   r   r,   r  )	r>  r   rH  r  r  
input_axisrJ  r6   r.   r   r
  r   r  n  s2   


z'SymbolicShapeInference._infer_Unsqueezec                 C   s   d }t |dd urtjj}nt |dd urtjj}|d usJ t }|jd |_tjj|j	j
jjjj_||j	j
jj_| j|jd  }|| d S )Nclasslabels_int64sclasslabels_stringsr   )r   r0   r)  rE  rD  r1   r  r   FLOATr   r   r,   map_type
value_typer   key_typern  rj  )r>  r   map_key_typenew_vir.   r   r   r   r    s   
z$SymbolicShapeInference._infer_ZipMapc                 C   s|  |  |d}|  |d}| |d}|d urt|dksJ |d ur&|d n|d }|r8t|dkr:t|d}|d urNt|dksEJ t|d |d< nt|tr[t|d |d< | j|jd  jj	j
}| j|jd  }|t|jd || t|jdkr<|  |d}	t|jdkr|jd r|  |dng }
t|jdkr|jd r|  |dng }|
rt|
dkr|rt|dv r|d	 |
d< n.|	rt|	dkrt|	d trt|
d tr|	d |
d  |
d< n|
d  d
|	d  |
d< | j|jd  }|t|j||
 d S t|d}|	d | }d|	d ||	d |g}| j|jd  }|t|j|| d S d S d S d S )Nr   rN   r  r  qkv_hidden_sizesr     r  r  +r  )r  r  rO   r   r4   r  rn  r_  r   r   r,   r  rj  r   rf  r   )r>  r   r#   shape_weights
shape_biastripled_hidden_sizeqkv_hidden_sizes_attrr  r.   rH  
past_shape
mask_shaper  	head_sizepresent_shaper   r   r   r    sH   

((
z'SymbolicShapeInference._infer_Attentionc                 C   s   t |d}| |d}|d ur|d ||d |d g}n| |d}|d ur,t|dks.J |d ||d |d g}| j|jd  jjj}| j|j	d  }|
t|j	d || d S )Nr  r  r   rN   r  )r   r  r  rO   rn  r_  r   r   r,   r  rj  r   rf  )r>  r   r  token_offset_shaperJ  query_layer_shaper  r.   r   r   r   r    s   
z7SymbolicShapeInference._infer_GatedRelativePositionBiasc           	      C   s   |  |d}|  |d}| |d}|d urt|dksJ |d ur&|d n|d }|r{t|dkr}t|d}|d urLt|dksCJ t|d |d< nt|trYt|d |d< | j|jd  jj	j
}| j|jd  }|t|jd || d S d S d S )Nr   rN   r  r  r  )r  r  rO   r   r4   r  rn  r_  r   r   r,   r  rj  r   rf  )	r>  r   r#   r  r  r  r  r  r.   r   r   r   r    s"   

z-SymbolicShapeInference._infer_PackedAttentionc                 C   s   |  |d}|d urt|dkr|}n| |d}|d ur#t|dks%J |d |d |d  g}| j|jd  jjj}| j|jd  }|	t
|jd || d S )Nr  r   r  rN   r  )r  rO   r  rn  r_  r   r   r,   r  rj  r   rf  )r>  r   r  rJ  shape_queryr  r.   r   r   r   r    s   z6SymbolicShapeInference._infer_PackedMultiHeadAttentionc              	   C   s
  |  |d}|rt|dkr| j|jd  jjj}| j|jd  }|t	
|jd |d|d g | j|jd  }|t	
|jd tjj|d |d g | j|jd  }|t	
|jd tjjdg | j|jd  }|t	
|jd tjjdg d S d S d S )Nr   r  token_countr  rN   zbatch_size + 1r  rO   rn  r_  r   r   r,   r  rj  r   rf  r0   r)  r  )r>  r   r#   r  r.   vi_token_offsetvi_cumulated_seq_lenvi_max_seq_lenr   r   r   r"  	  s    ""$z+SymbolicShapeInference._infer_RemovePaddingc                 C   s   |  |d}|  |d}|rIt|dkrK|rMt|dkrO| j|jd  jjj}| j|jd  }|d |d |d g}|t	
|jd || d S d S d S d S d S rA  )r  rO   rn  r_  r   r   r,   r  rj  r   rf  )r>  r   shape_inputshape_token_offsetr  r.   rJ  r   r   r   r#  	  s    z,SymbolicShapeInference._infer_RestorePaddingc                 C   rC  r+   r  r  r   r   r   r	   	  r:   z&SymbolicShapeInference._infer_BiasGeluc                 C   s  |  |d}d }d }|d urdt|dkrb| |d}|}|d urAt|dkrA| |d}|d ur=t|dkr=|d |d< |d }| j|jd  jjj}| j|jd  }|	t
|jd || nZt|dkrt|d trt|d tr|d |d |d |d  g}n|d |d |d  d|d  g}|d }| j|jd  jjj}| j|jd  }|	t
|jd || t|jdkrf|d }	t|d}
d }t|dkrt|d trt|d |
 n|d  d	|
 }n|d }| |d
}|d urt|d trt|tr|d | }n	|d  d| }|	|
||g}|d us(J t|jdkrh|jd rj|jd rl| j|jd  }|	t
|j|| | j|jd  }|	t
|j|| d S d S d S d S d S d S )Nr   r  rN   r  r  r  *r  /r  r  )r  rO   r  rn  r_  r   r   r,   r  rj  r   rf  r  r4   r   r   )r>  r   query_shapetotal_sequence_lengthr  	key_shaperJ  value_shaper.   
batch_sizer  r  r  r  r   r   r   r  #	  s`   
 $

(z0SymbolicShapeInference._infer_MultiHeadAttentionc                 C   s   |  |d}|d uru|}| j|jd  jjj}|d usJ | j|jd  }|t	|jd || t
|jdkrw|jd ry|jd r{| |d}|d ur}| j|jd  }|t	|j|| | j|jd  }|t	|j|| d S d S d S d S d S d S )Nr   r  rN   r  )r  rn  r_  r   r   r,   r  rj  r   rf  rO   r  r   )r>  r   r-  rJ  r  r.   r  r   r   r   r  o	  s"   "z=SymbolicShapeInference._infer_DecoderMaskedMultiHeadAttentionc                 C   s   |  |d}|d ur}| }| j|jd  jjj}|d usJ t|d d d f\}}}}|jD ]&}	|	j	dkrC|	j
}|dkr@|| n|}q.|	j	dkrL|	j
}q.|	j	dkrT|	j
}q.|| || | | d ||< | j|jd  }
|
t|jd || d S d S )Nr   r   r  r  r  rN   )r  r  rn  r_  r   r   r,   rO   r   r   r6   r  r  rj  r   rf  )r>  r   rH  rJ  r  rD   r   r  r  r
   r.   r   r   r   r(  	  s(   




z*SymbolicShapeInference._infer_UnfoldTensorc           	   	   C   s   |  |d}|d urPt|}|dks|dksJ ||d  ||d  }}dd| d| d| d| g}tjj}| j|jd  }|t	|jd || d S d S )	Nr   r  r  rN   zmax(z, z	) <= O < z + )
r  rO   r0   r)  r  rn  r  rj  r   rf  )	r>  r   rH  	shape_lenMr  rJ  r  r.   r   r   r   r  	  s    z0SymbolicShapeInference._infer_DynamicTimeWarpingc                 C   rC  r+   r*  r  r   r   r   r  	  r:   z&SymbolicShapeInference._infer_FastGeluc                 C   rC  r+   r*  r  r   r   r   r  	  r:   z"SymbolicShapeInference._infer_Geluc                 C   rC  r+   r*  r  r   r   r   _infer_QuickGelu	  r:   z'SymbolicShapeInference._infer_QuickGeluc                 C   rC  r+   r  r  r   r   r   r  	  r:   z*SymbolicShapeInference._infer_GemmFastGeluc                 C   rC  r+   r  r  r   r   r   r  	  r:   z(SymbolicShapeInference._infer_GemmFloat8c                 C   s  |  | t|jdkrt|d}|d u rd}| |d}|d urt|}t||}|d | dd t|| D  }| j|jd  j	j
j}|tjjksR|tjjkrVtjj}| j|jd  }|t|jd || t|jdkr| j|jd  }|t|jd || d S d S d S d S )NrN   rC   r  r   c                 S   s   g | ]}d qS r  r   )r	   r  r   r   r   r   	  r=  zDSymbolicShapeInference._infer_LayerNormalization.<locals>.<listcomp>r  )r  rO   r  r   r  rE   r  rn  r_  r   r   r,   r0   r)  FLOAT16BFLOAT16r  rj  r   rf  )r>  r   rC   x_shaperD   
mean_shape
mean_dtyper.   r   r   r   r  	  s*   


"	z0SymbolicShapeInference._infer_LayerNormalizationc                 C   rC  r+   r*  r  r   r   r   r  	  r:   z1SymbolicShapeInference._infer_LongformerAttentionc                 C   s  |  |d}|  |d}t|dkrt|dksJ g ||d }| j|jd  jjj}| j|jd  }|t	
|jd || t|jdkrj|jd rj|d g}| j|jd  }|t	
|jd tjj| t|jdkr| j|jd  }|t	
|jd || d S d S )Nr   r  rN   r$  )r>  r   input_ids_shapeword_embedding_shaperJ  word_embedding_dtyper.   mask_index_shaper   r   r   r  	  s   
z5SymbolicShapeInference._infer_EmbedLayerNormalizationc                 C   s.   |  | t|jdkr|  |dd d S d S )Nr  r   r  r  r   r   r   r&  	  s   
z4SymbolicShapeInference._infer_SkipLayerNormalizationc                 C   rC  r+   r*  r  r   r   r   r  	  r:   z'SymbolicShapeInference._infer_GroupNormc                 C   rC  r+   r*  r  r   r   r   r  	  r:   z,SymbolicShapeInference._infer_PagedAttentionc           
      C   sT  | j |jd  jjj}| |d}|d ur;| j |jd  }|t	|j
|| | j |jd  }|t	|j
|| |jd dkrR|jd dkrR| |dd d S |jd dkr`|jd dksbJ t|d}t|d}| |d}|d ur|d }t|trt||d|   }	||	 |d< | j |jd  }|t	|jd || d S d S d S )Nr   r  rN   r  rF   r  kv_num_heads)rn  r_  r   r   r,   r  r  rj  r   rf  r   r  r   r  r  r4   )
r>  r   r  r  r.   r  r>  r-  hidden_sizer  r   r   r   r  	  s,    


z1SymbolicShapeInference._infer_GroupQueryAttentionc                 C   rC  r+   )r  r  r   r   r   r'  
  r:   z-SymbolicShapeInference._infer_SparseAttentionc                 C   s2   |  |dd t|jdkr|  |dd d S d S r:  r  r  r   r   r   r%  
  s   z+SymbolicShapeInference._infer_SkipGroupNormc                 C   s   |  |d}|  |d}|rC|rEt|d trG|}t|d d |d< | j|jd  }| j|jd  jjj}|	t
|j|| d S d S d S d S rA  )r  r  r4   rn  r  r_  r   r   r,   rj  r   rf  r   )r>  r   rH  
bias_shaperJ  r.   r  r   r   r   r
  
  s   z+SymbolicShapeInference._infer_BiasSplitGeluc                 C   rC  r+   r*  r  r   r   r   r   
  r:   z%SymbolicShapeInference._infer_BiasAddc                 C   s   t |jdkr| | d S t |jdkr'| j|ddd | j|ddd d S t |jdkrH| j|ddd | j|ddd | j|ddd d S d S )NrN   r  r   r  r  )rO   r  r  r  r   r   r   r$  #
  s   z-SymbolicShapeInference._infer_RotaryEmbeddingc              
   C   s  t |d}|sJ d|j dt |d}|s J d|j dddlm} t |d }||}| j|jd  }|t	|jd t
jjg  |d urg }g }	tt|jD ]}
| ||
}|| | j|j|
  jjj}|	| qW||||	\}}t|t|  krt|jd	 ksn J d| d
t| dt| dt|jd	  d	tt|jd	 D ]}|d	 }| j|j|  }|t	|j| || ||  qd S tt|jd	 D ]+}| j|j|d	   }| || |}t|}t	|j|d	  || |}|| qd S )Noutput_tensor_typesz
PythonOp 'z'' has no output_tensor_types attribute.output_tensor_ranksz'' has no output_tensor_ranks attribute.r   )get_shape_inference_function	func_namerN   z' returned z shapes and z dtypes, but expected z	 outputs.)r   r   onnxruntime.capi._pybind_staterC  r  rn  r  rj  r   rf  r0   r)  rE  r  rO   r_  r  r  r   r   r,   r  r9   )r>  r   rA  rB  rC  rD  shape_infererr.   input_shapesinput_dtypesr  r#   input_dtypeoutput_shapesoutput_dtypesr6   r  r8   r`  r   r   r   r  0
  sJ   


*
z&SymbolicShapeInference._infer_PythonOpc                 C   sP   |  ||}| j|j|  jjj}| j|j|  }|t	|j| || d S r+   )
r  rn  r_  r   r   r,   r  rj  r   rf  )r>  r   r  r  r#   r  r.   r   r   r   r  _
  s   z0SymbolicShapeInference._propagate_shape_and_typec                 C   s.   t |tkrdS d|vrdS || jv rdS dS )NFunk__Tr  )r>  rb  r   r   r   _is_none_dime
  s   
z#SymbolicShapeInference._is_none_dimc                 C   s    |D ]}|  |r|  S qd S r+   )rM  )r>  	out_shapeoutr   r   r   _is_shape_contains_none_dimn
  s
   
z2SymbolicShapeInference._is_shape_contains_none_dimc                    s6
  |pi _ jjd jdd t _jjjD ]C}t|}|d u r&qt	|j
r4|j
jjjjj}n|j
jjj}t|D ]\}}|d u rRt|j||| _q>jdd |D  qjD ]'}|jv r~j| }|jv suJ j| j|< qbtj|dddj|< qbt _jj jjd i }	fdd	jjjD ]}
|
|	|
jd
 < qg }dd t jjjt jjj! D t"fddjjjD r߈jjj}ngt#fddjjjD sFt$|}jjjD ]&jd
 vrt#fdd|	jd
  D rj |% q|t$|kr8t#fddjjjD s8t&dt#fddjjjD r|D ]̉t#fddjD sZJ ' d}j(j)v rqj)j(  n[j(dv rj*jd
  }t$|j
jjjd
krtj+j,|j
j_n:j(dkr̈j-dkr̈j.D ]*}|jdkrt/|j0t1r|j02dn|j0}|j3v rd}j3|   nqj4dkrt56j(d j  tjD ]\}}t56d|||j7v rdnd qj(dv rFj*jd
  }t$t8|j
fddt9t$jD }t9j(d v r&dnd
 D ]  fd!d|D }t$|d"krDj:|dd# q*t9t$jD ]}j(d$ks\j(d%krc|d&v rcqMj(d'krst$jd"krsqMj*j|  }|j
}|;d(}|d)vrڈj4dkr|d*kr|jj;d(}|d+krt56d,<j| tt|tj+j=>|j
jjjj nt56d-j|  d.|  nt56d-j|  d|  qMt||jjtj+j,k}j4dkrt56d-j|  dd/tj+j=>|j
jj  j| j v rt56d0tj j|    d ur-d v s0?s0|rj@rj(d1v rfd2dt9t$jD }j(d v rd v sZ?rd v reAd nA?fd3d|D }t$|d
 dkr|d
 t$|d
 d k sJ t$|d" dkr|d" t$|d" d k sJ nj(d4krBd
Cd"g}ng }|rt9t$D ]4 d urوD sِqƇfd5d|D }t$|d
krEd6d tF||dd7D  qd_Gnd_Gnd_GjGdu rj(j)vr|s|o#d u p#t$d
k}|r4jHr1Id
nd8nt$d
krJ|}|rSj*jd
  j
jj}n|j
jj}|tKL|j|tM| j4d
kr|rt56d9j( d:j d;|j d< j4dkrt56d-j|  d|d/|j
jj  d_GqMj4d
ksj@r|rt56d=j(j t56d> jD ]}|j*v rt56j*|  qt56d?|  qt56d@ jD ]}|j*v rt56j*|  qt56d?|  qj@r|st56dAtj    dS qMqHd_GdS )BNr`  T)rc  c                 S   s   g | ]
}t |tu r|qS r   rr  r%   r   r   r   r   
  r  z6SymbolicShapeInference._infer_impl.<locals>.<listcomp>)r  positiverl  c                    s   dd | j D }g }| jdkrt| dt| dg}n| jdv r%t| dg}|D ]C}dd |jD  t }|jD ]} |j q7|jD ]}| fd	d
|D  qC|| |j D ]}|j|v ri|	|j q\q'|S )Nc                 S   s   h | ]}|r|qS r   r   r5   r   r   r   r  
  r'   zISymbolicShapeInference._infer_impl.<locals>.get_prereq.<locals>.<setcomp>rr   rz  r{  )rs   r   r  c                 S   r  r   r   r5   r   r   r   r  
  r  c                    s   g | ]}| vr|qS r   r   r5   g_outputs_and_initializersr   r   r   
  r  zJSymbolicShapeInference._infer_impl.<locals>.get_prereq.<locals>.<listcomp>)
r_  r  r   rl  rL  r   ro  r  r   rN  )r   namesr|  gg_prereqnr6   )
get_prereqrR  r   rX  
  s,   






z6SymbolicShapeInference._infer_impl.<locals>.get_prereqr   c                 S   r  r   r   r5   r   r   r   r  
  r  z5SymbolicShapeInference._infer_impl.<locals>.<setcomp>c                 3       | ]}|j  v V  qd S r+   r   r  sorted_known_vir   r   rH  
      z5SymbolicShapeInference._infer_impl.<locals>.<genexpr>c                 3   rY  r+   r   r  rZ  r   r   rH  
  r\  c                 3   s    | ]	}|r| v V  qd S r+   r   r5   rZ  r   r   rH  
  s    
c                 3   rY  r+   r   r  rZ  r   r   rH  
  s    

zInvalid model with cyclic graphc                 3   s    | ]
}|r| j v V  qd S r+   r  r5   rG  r   r   rH  
  s    F)ConvTransposeATenzorg.pytorch.atenoperatorr  r  z: z  Input %s: %s %srF   r  c                    r  r   r  r5   r  r   r   r   
  r  r  c                    r  r   rJ  rE  r  r   r   r   
  r7   rN   ru  r   r   r  r   r   )r   sparse_tensor_typeNr   r   z  {}: sequence of {} {}z  z: sequence of r  z  Sympy Data: )r[   r   r|   ri   rt   r  ru   rc   r   r  rl   LessGreaterLessOrEqualGreaterOrEqualrz   rw   c                    r  r   r  r5   r  r   r   r   F  r  c                        g | ]}t |t    qS r   rJ  rE  r  rN  r   r   r   Q  r  rk   c                    re  r   rJ  rE  rf  r   r   r   d  r  c                 S   s8   g | ]\}}|d krt || r|| nt|| qS r  )r3   r   )r	   rF  r6   r   r   r   r   g  s
    r  r  zPossible unknown op: z node: z, guessing z shapez0Stopping at incomplete shape inference at %s: %sznode inputs:znot in known_vi_ for znode outputs:z	Merging: )Nr  r]  r^  r  rU  rL  r7  r_  r/   r"   r   r   r,   r   r#   r   r  r   r  r   ra  ro  r5  r6  r?   rP  r0   ri  r  rj  r   r  rG   rl  r  rK  rO   r  r  r  r  r)  rn  r)  	UNDEFINEDrI   r   r  rF  bytesr  r3  r:  rQ  r}  rm  r*   r  r~  r   formatr*  r+  rP  r8  rT  r  r  rM  r\  r  r4  r9  r  r  r   rf  r9   )r>  start_sympy_datar6   rH  
input_dimsi_dimr   rF  s_mergeprereq_for_noderW  sorted_nodesold_sorted_nodes_lenknown_aten_opr.   r
   aten_op_namer   r  r  r  out_typeout_type_kindseq_cls_typeout_type_undefinedshapesdim_idxis_unknown_opr  	out_dtyper  r   )r&   rX  r  r   r  rN  r>  r[  r   r  t
  s  





&





 $ 






* 
00

 

(



 /z"SymbolicShapeInference._infer_implc                 C   s2   | j jjD ]}|j| jv r|| j|j  qd S r+   )r]  r^  r  r   rn  rj  )r>  r  r   r   r   r    s
   z-SymbolicShapeInference._update_output_from_vic                 C   s~   t | }|r
|dk rtd d S t||||}d}||  |jr)| }|js"|  |s<tj	|j
ddd td|j
S )N   z.Only support models of onnx opset 7 and above.Fzsym_shape_infer_temp.onnxT)save_as_external_dataz#Incomplete symbolic shape inference)rL   rQ  rR  rZ   rq  r4  r  r  r0   
save_modelr]  r  )rp  r?  r@  rA  rB  
onnx_opsetr  all_shapes_inferredr   r   r   r    s   

z#SymbolicShapeInference.infer_shapes)rF   )F)TT)FF)r   r   r  )Tr+   )r{  FFr   )__name__
__module____qualname__rD  r\  rU  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r~  r&  r5  r   r   r   r   r   r   r   r   r   r   r  r  r   r  r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r*  r+  r.  r,  r-  r/  r0  r1  r2  r   r   r   r   r   r!  r   r   r   r   r   r   r   r   r   r   r  r   r   r  r  r  r  r  r  r  r  r  r  r"  r#  r	  r  r  r(  r  r  r  r4  r  r  r  r  r  r&  r  r  r  r'  r%  r
  r  r$  r  r  rM  rP  r  r  staticmethodr  r   r   r   r   rZ   }   s   
 -	g8%

D	)
>!;"!	!42#	 0	#-
L
/	  <rZ   c                  C   s   t  } | jdddd | jddd | jdd	d
dd | jddtdd | jddd
dd | jddtdd | jddd
dd | jddd
dd | jdddd | jddtd d |  S )!Nz--inputTzThe input model file)requiredhelpz--outputzThe output model file)r  z--auto_mergez:Automatically merge symbolic dims when confliction happens
store_trueF)r  actiondefaultz	--int_maxzGmaximum value for integer to be treated as boundless for ops like slicer{  )r  r   r  z--guess_output_rankz;guess output rank to be the same as input 0 for unknown opsz	--verbosezHPrints detailed logs of inference, 0: turn off, 1: warnings, 3: detailedr   z--save_as_external_dataz%Saving an ONNX model to external dataz--all_tensors_to_one_filez(Saving all the external data to one filez--external_data_locationz+The file location to save the external filez./)r  r  z--external_data_size_thresholdz$The size threshold for external datai   )argparseArgumentParseradd_argumentr4   
parse_args)parserr   r   r   parse_arguments  sf   r  __main__zinput model: zoutput model z!Doing symbolic shape inference...TF)r}  all_tensors_to_one_filelocationsize_thresholdconvert_attributezDone!r+   )1r  loggingnumpyr<   r0   r?   r   r   r   	packagingr   parse__version__	getLoggerr  rQ  r   r   r"   r*   r-   r/   r2   r9   r3   rE   rL   rT   rV   rY   rZ   r  r  infor_  r  r  loadr?  r@  rA  rB  out_mpr}  r~  r  external_data_locationexternal_data_size_thresholdsaver   r   r   r   <module>   s   




                      ^6



