o
    i,                 	   @   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   `/home/kim/smarthome/.venv/lib/python3.10/site-packages/onnxruntime/tools/symbolic_shape_infer.py
<listcomp>       z!get_attribute.<locals>.<listcomp>r   )	attributer   Z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   r1   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      r8   c                 C   s*   t | ttjtjtjfv pt| do| jS )N	is_number)	r   r3   npint64Zint32sympyIntegerhasattrr:   r   r   r   r   r2   J   s   *r2   c                 C   s*   | |k r	| | ksJ | dkr| S ||  S Nr   r   )axisrankr   r   r   handle_negative_axisN   s   rC   c                 C   sB   |pg d}t |tkr|g}| jD ]}|j|v r|j  S qd S )N) r/   zai.onnx)r   listZopset_importdomainr   )mprF   Zopsetr   r   r   	get_opsetS   s   


rH   c                 C   s>   t | tu rt| dksJ | d S t | tju r|  S | S N   r   )r   rE   lenr;   ndarrayitemxr   r   r   	as_scalar^   s   rP   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   rE   r;   rL   )rO   	keep_noner   r   r   as_listh   s   rR   c                 C   s4   t | tu rtd}| D ]}|| }q|S | }|S NrJ   )r   rE   r=   r>   )rO   r   vr   r   r   sympy_reduce_products   s   

rU   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 (  SymbolicShapeInferencerD   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AddZ	AllReduceZArrayFeatureExtractorZAveragePoolZBatchNormalizationZCastZCategoryMapperZCompressConcatZConcatFromSequenceConstantZConstantOfShapeZConvZCumSumDivZEinsumExpandEqualFloorGatherZGatherElementsZGatherNDZIdentityIfLoopMatMulMatMulInteger16ZMaxPoolMaxZMemcpyFromHostZMemcpyToHostMinZMoEMulZNonMaxSuppressionZNonZeroZOneHotZPadRangeZ
ReciprocalZ	ReduceSumZ
ReduceMeanZ
ReduceProdReshapeZResizeZRoundScanZScatterElementsZ
SequenceAtZSequenceInsertZShapeSizeSliceZSoftmaxCrossEntropyLossZSoftmaxCrossEntropyLossInternalZ!NegativeLogLikelihoodLossInternalZSplitSplitToSequenceSqueezeSubZTileZTopKZ	Transpose	UnsqueezeWhereZipMapNeg	AttentionBiasAddBiasGeluBiasSplitGeluZDecoderMaskedMultiHeadAttentionDequantizeLinearDynamicTimeWarpingEmbedLayerNormalizationFastGeluZGatedRelativePositionBiasGatherBlockQuantizedGeluGemmFastGeluZ
GemmFloat8	GroupNormGroupNormalizationGroupQueryAttentionLayerNormalizationLongformerAttentionZMatMulNBitsMultiHeadAttentionNhwcConvPackedAttentionZPackedMultiHeadAttentionPagedAttentionPythonOp
QLinearAdd
QLinearMulQuantizeLinear	QuickGeluRelativePositionBiasRemovePaddingRestorePaddingRotaryEmbeddingSimplifiedLayerNormalization)SkipGroupNormSkipLayerNormalization SkipSimplifiedLayerNormalizationSparseAttentionZUnfoldTensorZ	embeddingZ
bitwise_orZdiagonalZmax_pool2d_with_indicesmaxminZmultinomialZunfoldZargmaxZ
avg_pool2dZ_adaptive_avg_pool2dZnumpy_TZnative_group_normZupsample_nearest1dZupsample_nearest2dZupsample_nearest3dZ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   r   r2   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   rK   r  r   r   r   r   (  r&   z?SymbolicShapeInference._add_suggested_merge.<locals>.<listcomp>)allsetr   itemsremoveaddr2   r   r   r   r=   Symbolr   loggerwarningjoinrE   indexr   r3   r   _apply_suggested_merge)	r   symbolsapplykrT   Zmap_tor  Zsymbols_listZlensr   r  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*   )r   rE   out_mp_graphinput
value_infor   r   r"   r   	dim_paramr2   r3   	dim_value)r   graph_input_onlyr5   r%   rT   r   r   r   r  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   r4   r   r   r   
<dictcomp>G  r&   z6SymbolicShapeInference._preprocess.<locals>.<dictcomp>c                 S   r   r   r   r4   r   r   r   r!  H  r&   c                 S   r   r   r   r4   r   r   r   r!  I  r&   c              	   S   s(   i | ]}|j t|j |jt|jqS r   )r   r   make_tensor_value_infoZ	data_typerE   dimsr4   r   r   r   r!  K  s    )r/   
ModelProtor  CopyFromrE   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   r  R      z8SymbolicShapeInference._merge_symbols.<locals>.<genexpr>c                 S   r#   r   r2   r$   r   r   r   r   U  r&   z9SymbolicShapeInference._merge_symbols.<locals>.<listcomp>rJ   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$   r#  r   r   r  e  r.  c                    s   g | ]	} j ||qS r   )r   getr$   r  r   r   r   g  r   c                 3   r2  r3  r   r$   )mergedr   r   r  h  r.  )r
  r   rE   r  sumr  r   r  debug_check_merged_dimsr   )r   r#  Zunique_dimsZis_intZint_dimr   )r#  r6  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 )NrJ   Tr  zunsupported broadcast between  )	rK   r   ranger:  r   r  r  r  r   )r   shape1shape2	new_shapeZrank1Zrank2Znew_rankr5   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  r)  r.   r(  rE   r#  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 rS   )rK   r  r)  r.   r(  rE   r#  rE  r   r   r   _try_get_shape  s   



z%SymbolicShapeInference._try_get_shapec                 C   s   t | ||S r*   )rK   rG  )r   r   rF  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integerZnonnegative)rG  r   r   appendr   r=   r  )r   r   rF  r7   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_r(  r   to_arrayr   r   rF  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*   )rK   r  rN  r(  rQ  rP  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*   )	enumerater2   r   r   r   r   )r   new_sympy_shaper5   rC  Z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)'r_   r`   rh   rk   rp   rr   rs   rt   ru   rv   rw   rx   ry   rz   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   	   )rn   c                    s*   g | ]}| j v r| jvr j | qS r   )r(  r&  r	   r   r  r   r   r     s
    zBSymbolicShapeInference._onnx_infer_single_node.<locals>.<listcomp>	rW   rm   re   rZ   ra   MatMulIntegerrb   ro   Sumr   c                       g | ]}  |qS r   rG  r4   r   r   r   r   r         ra   rY  rb      c                    0   g | ]}t |  kr|t |    qS r   r	  r  r%   out_rankr   r   r     r6   rJ   Tr0  tmpc                    s   g | ]	}|r j | qS r   r)  r4   r  r   r   r     r   c                 S   r#   r   )r1   r4   r   r   r   r     r&   )op_typerH   r  r  outputr)  rK   r)   r   r=  r9  r   
make_graphtmp_mp_r  r%  r   infer_shapesr  r  r   )
r   r   Z
skip_inferZinitializersr-   	in_shapesin_dims	tmp_graphi_oor   )r%   r   rc  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   r4   r   r   r   	<setcomp>5      z>SymbolicShapeInference._onnx_infer_subgraph.<locals>.<setcomp>c                    s   h | ]}| vr|qS r   r   rW  )subgraph_inputsr   r   rr  6  r^  rd  c                    s   g | ]} j | qS r   re  r4   r  r   r   r   :      z?SymbolicShapeInference._onnx_infer_subgraph.<locals>.<listcomp>c                 S   s   g | ]}t |jqS r   )r1   r   r4   r   r   r   r   ;  ru  c                    s   g | ]	}|j  v r|qS r   r   r4   )subgraph_implicit_inputr   r   r   =  r   _)r  rJ   r  rg  r  r   c                 S   r#   r   )r.   r	   ro  r   r   r   r   [  r&   c                    s4   h | ]}|r|D ]}t |tu r| jvr|qqS r   r   r   r   )r	   r  r%   r  r   r   rr  \  s    ")%r   r  r8  r   rg  rf  rE   r'  r  r)  r   rh  r   extendr  r  ri  r%  rV   r   r   r   r   r   r   r,  r   copyr   _infer_implrN  _update_output_from_vi
ClearFieldrK   r  r   r*  )r   r   subgraphuse_node_inputinc_subgraph_idrm  symbolic_shape_inferenceZsubgraph_shapesZsubgraph_new_symbolic_dimsZnew_dimsr%   r   )r   rv  rt  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 rI   r3   )r   allow_float_valuesr   r   r   int_or_floatg  s   zESymbolicShapeInference._get_int_or_float_values.<locals>.int_or_floatc                    r[  r   )rR  r4   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	   rT   r   r   r   r  n      zBSymbolicShapeInference._get_int_or_float_values.<locals>.<genexpr>rJ   r   c                    s   g | ]}| qS r   r   )r	   Zvv)r  r  r   r   r   y  ru  c                 S   s"   g | ]}t |trt|nd qS r   )
isinstancerE   rK   r  r   r   r   r   {     " )r=  rK   r  r
  rS  r   r;   rL   r"   rM   r   r  rE   )
r   r   	broadcastr  valuesr5   rT   new_vZ
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 )NrJ   )re   rZ   T)r  r  )r  c                 s   r  r*   r   r  r   r   r   r    r  z@SymbolicShapeInference._compute_on_sympy_data.<locals>.<genexpr>c                 S   s   g | ]}t |tqS r   )r  rE   r  r   r   r   r     ru  zASymbolicShapeInference._compute_on_sympy_data.<locals>.<listcomp>c                    s   g | ]} |qS r   r   )r	   vsop_funcr   r   r     r&   strictFr   )rK   rg  rf  r  r
  anyziprN  )r   r   r  r  Zis_listrR   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 )NrJ   )rg   rn   rl   c                 S   s   | d S r@   r   rN   r   r   r   <lambda>  s    z<SymbolicShapeInference._pass_on_sympy_data.<locals>.<lambda>)rK   r  rf  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 r@   )	r)  rg  r%  r   r"  r,   r  r   rG  )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 )NZ_dTrJ  )r   r2   r=   r>   r3   r  r   )r   r  r   rC  rT   Z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 )Nrw  Z_o)r  rf  r   rE   r  r  r   r  )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  r4   r   r  r   r   r   r     r   z>SymbolicShapeInference._new_symbolic_shape.<locals>.<listcomp>)r=  )r   rB   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   rJ   r`     kernel_shapec                 S   s   g | ]}t | qS r   r/  r4   r   r   r   r     ru  zCSymbolicShapeInference._compute_conv_pool_shape.<locals>.<listcomp>c                 S      g | ]}t |qS r   r=   r>   r$   r   r   r   r     ru  c                 S   r  r   r  r$   r   r   r   r     ru  	dilationsstridesc                 S   s    g | ]\}}|d  | d  qS rJ   r   )r	   r  r%   r   r   r   r          Fr  padsauto_pads   NOTSETutf-8ZVALIDNOTSETc                 S   s   g | ]
\}}t ||qS r   )r=   Modr	   r%   r  r   r   r   r         c                 S   s0   g | ]\}}}t d |d kr|| n|| qS r  r   )r	   r  r  rr   r   r   r     s    c                 S   s   g | ]\}}t d || qS r  r  )r	   r  r  r   r   r   r     s    c                 S   s   g | ]\}}|| qS r   r   )r	   p1Zp2r   r   r   r     r^  	ceil_mode)rM  rK   r  r   r  r.   r)  rg  r  decode	TypeErrorr=  r=   ceiling)r   r   channels_lastr7   ZW_shaperB   r  Zspatial_shapeZis_symbolic_dimsr"   r  r  Zeffective_kernel_shaper  r  ZresidualZ
total_padsr  r5   Zeffective_input_sizeZ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  )r2   r3   r$   r   r   r   r   	  s   $ z=SymbolicShapeInference._check_merged_dims.<locals>.<listcomp>c                 3   r2  r3  r   r$   r4  r   r   r  
  r.  z<SymbolicShapeInference._check_merged_dims.<locals>.<genexpr>Tr;  )r
  r  )r   r#  r1  r   r4  r   r9    s
   z)SymbolicShapeInference._check_merged_dimsNc                 C   s8  |  |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}g |d | |d }	n)|dkrMd}|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   rJ   r  Fr0  )rG  rK   rD  r9  r)  r  r   r   r+   rg  r%  r   r"  )r   r   output_dtype	lhs_shape	rhs_shapelhs_rankZrhs_rankZlhs_reduce_dimZ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   rJ   N)r!   r   r+   r   r   rf  
ValueErrorr/   Zonnx_pbTensorProtoDataTypeNamer'   rS  r  r"   r   TensorShapeProto	Dimensionr   r  r  r%  )r   r   r  Zdst_typeZsrc_typeZdst_tensor_typeZsrc_tensor_typeZnode_iddiZdsrC  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   rJ   r  
rG  r)  rg  r%  r   r"  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   rJ   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  floatr3   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 r@   )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  )r2   r3   r   r=   rc   r  r  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  )r2   r3   r   r=   rd   r  r  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   rJ   r`  r   r  r   r   r   r  i  r^  c                 S   s
   | d  S r@   r   r  r   r   r   r  j  s   
 )
rW   rZ   r\   r]   rc   rd   re   rm   ro   rq   )rf  r  )r   r   funcsr   r  r   r   U  s   

z2SymbolicShapeInference._infer_symbolic_compute_opsc                 C      |  | d S r*   )r  r  r   r   r   r   o  r9   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 r@   )r)  r  r   r   r+   r/   r  STRINGINT64rg  r%  r   r"  rG  )r   r   Z
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   rA   )rG  r   r  r   rC   rK   r)  rg  r%  r   r"  r  r   r   r+   )r   r   input_shapeZcompress_lenrA   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*   )rN  r(  r4   r  r   r   r    s   " z7SymbolicShapeInference._infer_Concat.<locals>.<genexpr>c                 s   r  r*   r   r  r   r   r   r    r  rA   r   rJ   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   r2  r3  r   r$   r4  r   r   r    r.  )r  r  r  r
  r   rN  rg  r=  rK   r  rE   rz  rL  rM  rC   rU  r:  r   r   r   r)  r%  r   r"  r   r+   r8   )r   r   r  r5   r   r7   rA   r  r  r6  r-   r   )r%   r#  r   r   r   r     sH   


 

z$SymbolicShapeInference._infer_Concatc                 C   s   |  |d}t|drdnd}tt|dt|| }t| |d|}|}|r9g |d | |||d  }n|||< | j|jd  }|t	
|jd | j|jd  jjjjj| d S )Nr   new_axisrJ   rA   )rG  r   rC   rK   r   r  r)  rg  r%  r   r"  r  r   r   r+   r   )r   r   	seq_shaper  rA   Z
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   rO  rN  rg  )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*   r/  r	   rO   r   r   r   r    r  z@SymbolicShapeInference._infer_ConstantOfShape.<locals>.<genexpr>c                 S   r#   r   r  r  r   r   r   r     r&   zASymbolicShapeInference._infer_ConstantOfShape.<locals>.<listcomp>)Zdtyper   )r  r)  rg  r   rE   rU  r   r+   r/   r  r  r
  r;   Zonesr<   r   rO  r   rN  r  rG  r%  r   r"  r8   r   r   r7   r-   r   r   r   r     s*   
$z-SymbolicShapeInference._infer_ConstantOfShapec                 C   sL   |  |}| | | j|jd  }|t|jd |jjj	t
| d S r@   )r  rU  r)  rg  r%  r   r"  r   r   r+   r8   r  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  rU  r)  rg  r%  r   r"  r  r   r   r+   r8   r  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 rI   )
r)  r  r   r   r+   rG  rg  r%  r   r"  r   r   r  r  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   )r/   r  ZUINT8rK   r  r)  r   r   r+   rG  rg  r%  r   r"  r  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  )r)  r  r   r   r+   rG  rD  rg  r%  r   r"  )r   r   r  Zinput_1_shapeZ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  rJ   .   )OrderedDictr`  ,   )r   replacefindsplitrG  rK   r=  r   r=   r  collectionsr  rL  r  r)  r  r   r+   rg  r%  r   r"  )r   r   r  Z	mid_indexZleft_equationZnum_operandsZnum_ellipsisZnum_ellipsis_indicesZletter_to_dimZtermstermZellipsis_indexr"   rB   r5   letterr   rT  r  Znum_letter_occurrencesZright_equationZ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 )NrJ   TrQ   r   )rR   rR  rU  rG  rD  r8   r)  rg  r%  r   r"  r  r   r   r+   )r   r   Z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   rA   rJ   r^   rz   r`  zUnsupported Gather op_type: c                    s   g | ]} t | qS r   r  r4   datar   r   r     r^  z8SymbolicShapeInference._infer_Gather.<locals>.<listcomp>r  )rG  rC   r   rK   r)  rg  rf  r  r   r   r+   r  r%  r   r"  rN  rR  rE   r;   rL   r"   r3   )r   r   r  rA   r  r-   r+   rF  r   r  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 rI   r  )r   r   r  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 r  )rG  rK   r2   r)  rg  r%  r   r"  r  r   r   r+   )r   r   r  Z	data_rankr  Z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   rJ   F)r  )r   rR  rP   r%  rS  r  r=  rK   rg  r)  r   r  r   rN  )	r   r   	subgraphsZcondZi_subr  Z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`  FrJ   Tr  r   zRerun Loop: (z3...), because of sequence in loop carried variables)r  r   ) r   rK   r  rS  r   r%  r)  r  r=  rg  r.   r!   r   r   r+   r  r/   r  r  r   r  r  r   r"   r   r   r  r8  r~  r  rz  rE   )r   r   r  Znum_loop_carriedr5   siZsi_nameZneed_second_inferr  soZso_shapeZsi_shaper  r#  rC  Zloop_iter_dimr-   Zsubgraph_vi_dimZvi_dimr   r   r   r     s^   


 



z"SymbolicShapeInference._infer_Loopc                 C   r  r*   r  r  r   r   r   r     r9   z$SymbolicShapeInference._infer_MatMulc                 C   s   |  |tjj d S r*   )r  r/   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NrJ   r  Fr0  )rG  r   rK   r9  r)  r  r   r   r+   rg  r%  r   r"  )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 r  )
r   r  r)  rg  r%  r   r"  r/   r  r  )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  )rI  r   r  r)  rg  r%  r   r"  r   r   r+   )r   r   Z
input_rankZnz_lenr-   r   r   r   r   %  s   (z%SymbolicShapeInference._infer_NonZeroc                 C   s   |  |d}| |d}t|dd}t|t|d }tg |d | t|s,| |n|||d  }| j|j	d  }|
t|j	d | j|jd  jjj| d S )Nr   rJ   rA   r  r`  )rM  rR  r   rC   rK   r8   r2   r  r)  rg  r%  r   r"  r  r   r   r+   )r   r   r7   depthrA   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  rJ   r   r`  c                 S   s   g | ]\}}}|| | qS r   r   )r	   r%   Zpad_upZpad_downr   r   r   r   L  s    
z5SymbolicShapeInference._infer_Pad.<locals>.<listcomp>Fr  )rH   r  r   rR  rM  rK   r  rU  r  r)  r  r   r   r+   rg  r%  r   r"  r8   )r   r   r  r7   rB   rT  Z	output_tpr-   r   r   r   r   A  s"   z!SymbolicShapeInference._infer_Padc              	   C   sR   |  |}| | |jD ]}|sq| j| }|t||jjj	t
| qd S r*   )r  rU  rg  r)  r%  r   r"  r   r   r+   r8   )r   r   r7   ro  r-   r   r   r   r   [  s   



z"SymbolicShapeInference._infer_Poolc                 C   sh   |  |d}|  |d}| ||}| j|jd  }| j|jd  }|t|jd |jj	j
| d S r  )rG  rD  r)  r  rg  r%  r   r"  r   r   r+   )r   r   Zshape0r>  r@  t0r-   r   r   r   r   j  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   rJ   r`  r  )rM  rK   rR  rC   rS  rL  r=   rc   rd   rg  r)  r%  r   r"  r  r   r   r+   r8   )r   r   r7   rB   offsetrA  rB  r@  r   valr>  r?  Z
diag_shaper-   r   r   r   r   r  s:   




z+SymbolicShapeInference._infer_aten_diagonalc           	      C   s   |  |d}t|}|dv sJ | |d}|d }|r|nt| |d|}g |d d |}| j|jd  }|t	|jd t
jjt| d S )Nr   rJ   r`  rJ   r  )rM  rK   rR  r   r  r)  rg  r%  r   r"  r/   r  r  r8   )	r   r   r7   rB   Znum_samplesr  Zlast_dimr  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  r4   r]  r   r   r     r   z=SymbolicShapeInference._infer_aten_pool2d.<locals>.<listcomp>r`  r  r  rJ   )rM  rK   rU  rS  rg  r)  r/   r  r  r  r   r   r+   r%  r   r"  r8   )r   r   r7   r5   ro  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   rJ   r  r`  )r)  rg  rK   r  r%  r   r"  r   r   r+   rR  rI  r  rM  rC   r8   r/   r  r  )	r   r   r-   keepdimr   rB   r  r"   Z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  )rM  rR  rK   rL  r  rU  rg  r)  r%  r   r"  r  r   r   r+   r8   )r   r   r7   	dimensionsizesteprB   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 NrJ   r`  r   )r  rR  rM  rC   rK   r  rU  r8   rg  r)  r%  r   r"  r/   r  r  )r   r   r@  r   r  r7   rB   r-   r   r   r   r     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  rJ   )_propagate_shape_and_typerG  rK   rR  r)  r  r   r   r+   rg  r%  r   r"  r   r  rP   )r   r   r  r  groupr  r5   r-   r   r   r   r     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`  rJ   c                 S   s&   g | ]}t |tju r| n|qS r   )r   r;   r<   rM   )r	   Zdim_sizer   r   r   r   !  s   & z?SymbolicShapeInference._infer_aten_upsample.<locals>.<listcomp>c                    s   g | ]}t  d |qS r  )r   r  r4   r]  r   r   r   $  s    )rG  rR  rK   r=  rg  r)  r  r   r   r+   r%  r   r"  )r   r   r@  r  Zoutput_sizerB   r  r-   r   r]  r   r     s   z+SymbolicShapeInference._infer_aten_upsamplec                 C   s@   |  | dD ]}|t|jk r|j| r| j |d|d qd S )N)rJ   r`  r  r  rJ   input_indexoutput_indexr  rK   rg  )r   r   r5   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   r4   r   r   r   r  6  r  z6SymbolicShapeInference._infer_Range.<locals>.<genexpr>rJ   r`  )r)  rg  r  r
  rP   r=   rc   r  r  rU  r%  r   r"  r  r   r   r+   r8   )r   r   r-   
input_datastartlimitdeltarT  r   r   r   r   3  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keepdimsrJ      r   c                       g | ]	}t |t qS r   rC   rK   r	   ar"   r   r   r   X  r   z;SymbolicShapeInference._infer_ReduceSum.<locals>.<listcomp>)r   rH   r  rK   r  rR  r)  rg  r%  r   r"  r   r   r+   r8   r  rI  rG  rS  rL  )r   r   	keep_dimsaxesr-   r  r5   r%   r   r$  r   r   F  s<   
z'SymbolicShapeInference._infer_ReduceSumc                 C   s    t | jdkr| | d S d S )N   )rH   r  r   r  r   r   r   r   g  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  rJ   r   )r   r  rU   rN  rg  )r   r   r&  r%  r  r   r   r   r   l  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  )rR  rM  r   r)  r  r   r   r+   rg  r%  r   r"  )r   r   Zseq_lenZreal_seq_len	num_headsr@  r  r-   r   r   r   r   t  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 )NrJ   r   r  r`  )rR  r)  rg  rG  rK   r2   r%  r   r"  r   r   r+   r8   r  rM  rS  r=   r  rL  countrU  r  )r   r   shape_valuer-   Zshape_shapeZ
shape_rankinput_sympy_shapetotalr%   rT  Zdeferred_dim_idxZnon_deferred_sizer5   rC  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  rJ   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-  r  r   r   r   r     r  Zcoordinate_transformation_modeZtf_crop_and_resizec              	   S   s0   g | ]\}}}}t t |||  | qS r   r-  )r	   r%   r  endscaler   r   r   r     s    
)r)  rg  rM  rH   r  rR  r  rU  r%  r   r"  r  r   r   r+   r8   rK   r   rE   r  rI  )r   r   r-   r+  scalesrT  ZroisizesrB   Z	roi_startZ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 ]N\}}j| }|krt|j| j}t||  t|d	 }g |d | |	||d  }|t||j| jjj| n||j|  ||_qd S )
Nr  num_scan_inputsscan_input_axesr   c              	      s&   g | ]\}}t | | qS r   )rC   rI  )r	   r5   axr   Znum_scan_statesr   r   r   r     s    z6SymbolicShapeInference._infer_Scan.<locals>.<listcomp>scan_output_axesr  rJ   )r   rK   r  rS  r   r%  r)  r   r   r"   r   r  r  rg  r)   rC   r   r"  r+   )r   r   r  r3  r4  rt  r5   r  Zsubgraph_nameZscan_input_dimZnum_scan_outputsr7  ro  r-   r"   rC  r   r6  r   r     s<   


 "z"SymbolicShapeInference._infer_Scanc                 C   sL   |  |d}| j|jd  }|t|jd | j|jd  jjj	| d S r@   r  )r   r   r  r-   r   r   r   r   
  r  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 r@   )rG  r)  rg  rS  r/   r  r  r   r  r  r   r   r"   r   r%  )r   r   r  r-   r  r%   rC  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  )r)  r  rg  r%  r   r  r   )r   r   Zvi_seqZ	vi_tensorZ
vi_out_seqr   r   r   r   !  s   
z,SymbolicShapeInference._infer_SequenceInsertc                 C   s   |  |d| j|jd < d S r@   )rM  rN  rg  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 r@   )rM  rU   rN  rg  r)  r%  r   r"  r/   r  r  )r   r   r7   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=   rd   )r	   rF  )exprr   r   r   >  r  zLSymbolicShapeInference._infer_Slice.<locals>.flatten_min.<locals>.<listcomp>rJ   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 )rE   r8  r  r=   rd   rK   rW   )Zarg_idxZreplacedr9  Zmin_posr   r   replace_min_with_argB  s   

zVSymbolicShapeInference._infer_Slice.<locals>.flatten_min.<locals>.replace_min_with_arg)r  r=   rW   r=  rK   r8  )r9  Z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 r3  )boolr$   r   r   r   r  h  r.  zJSymbolicShapeInference._infer_Slice.<locals>.less_equal.<locals>.<genexpr>)r=  r  r
  )rO   y)r<  r   r   
less_equalS  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)r2   r   r  r  r  )r  bound)r?  r   r   r   handle_negative_indexj  s   

zBSymbolicShapeInference._infer_Slice.<locals>.handle_negative_indexrV  r&  startsendsrJ   Tr  r`  r  r  r   Fr  r  zUnable to determine if z <= z, treat as equal)$rH   r  r   rE   r=  rK   rR   rR  rM  r  r8   r  r2   r   r   r   r=   rd   	Exceptionr  r  r.  rU  r)  rg  r%  r   r"  r   r   r+   r  rN  r;   arrayr"   )r   r   rA  r&  rB  rC  ZstepsrT  r5   r  er  r-   Zinput_sympy_datar   )r<  r?  r   r   r   4  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   r  rJ   )r)  rg  r  r   r   r+   r   r"   r%  r/   r  rK   rG  r   r"  r   )r   r   r-   r+   Zspecified_output_typer  r   r   r   r     s   
z5SymbolicShapeInference._infer_SoftmaxCrossEntropyLossc           
      C   s:  |  |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 ]9}| j|j|  }	|	||j| | j|jd  jjjtg |d | || ||d d   |	| j|	j< qad S )Nr   rA   r  r  rJ   c                 S   r  r   r  r  r   r   r   r     ru  z>SymbolicShapeInference._infer_Split_Common.<locals>.<listcomp>)rM  rC   r   rK   rH   r  rR  rg  r=   r>   rU  r=  r)  r%  r  r   r   r+   r8   r   )
r   r   Zmake_value_info_funcr+  rA   op_setr  Znum_outputsrn  r-   r   r   r   _infer_Split_Common  s0   


*z*SymbolicShapeInference._infer_Split_Commonc                 C      |  |tj d S r*   )rH  r   r"  r  r   r   r   r         z#SymbolicShapeInference._infer_Splitc                 C   rI  r*   )rH  r   Zmake_sequence_value_infor  r   r   r   r     rJ  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&  rJ   c                 S   s   g | ]}|d kr|qS r  r   r  r   r   r   r     r^  z9SymbolicShapeInference._infer_Squeeze.<locals>.<listcomp>c                 S   s   g | ]
}t |tkr|qS r   )r   r3   r  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"  r  r   r   r     r   z'. Assuming the dimension 'z' at index z of the input to be equal to 1.)rG  rH   r  r   rR  r   rK   r  r8  rf  r   r=  rL  r   r3   r)  rg  r%  r   r"  r  r   r+   r  )r   r   rG  r&  r  Zsymbolic_dimensionsr5   r-   r   rK  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 rI   )rR  rM  rS  rL  rU  r  rI  r)  rg  r%  r   r"  r   r   r+   r8   )	r   r   Zrepeats_valuerT  r+  r5   r%   rC  r-   r   r   r   r   6  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   rA   r  rV  r  rJ   )rI  rC   r   rG  rH   r  r  r  rP   r   r3   r   rM  rU  r8   r=  rK   rg  r)  r%  r   r"  r   r+   )	r   r   rB   rA   r@  r  rT  rn  r-   r   r   r   r   J  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  rN  rG  r   reversedrE   r=  rK   r;   Z	transposerE  Zreshapetupleflattentolistrg  )r   r   r  rL  r  r   r   r   r   g  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&  rJ   c                    s   g | ]}t | qS r   )rC   r"  Zoutput_rankr   r   r   }  ru  z;SymbolicShapeInference._infer_Unsqueeze.<locals>.<listcomp>)rG  rH   r  r   rR  rK   r=  rL  r)  rg  r%  r   r"  r  r   r   r+   r  )	r   r   r  rG  r&  Z
input_axisr  r5   r-   r   rQ  r   r   p  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 )NZclasslabels_int64sZclasslabels_stringsr   )r   r/   r  r  r  r0   rg  r   FLOATr   r   r+   Zmap_typeZ
value_typer   Zkey_typer)  r%  )r   r   Zmap_key_typeZ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   rJ   r`  r  qkv_hidden_sizesr     r  r  +r(  )rG  rH  rK   r   r3   r  r)  r  r   r   r+   rg  r%  r   r"  r   )r   r   r"   shape_weights
shape_biastripled_hidden_sizeqkv_hidden_sizes_attrr  r-   r  
past_shapeZ
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   rJ   r  )r   rH  rG  rK   r)  r  r   r   r+   rg  r%  r   r"  )r   r   r(  Ztoken_offset_shaper  Z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   rJ   r`  rS  r  )rG  rH  rK   r   r3   r  r)  r  r   r   r+   rg  r%  r   r"  )	r   r   r"   rV  rW  rX  rY  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  rJ   r  )rH  rK   rG  r)  r  r   r   r+   rg  r%  r   r"  )r   r   r*  r  Z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  Ztoken_countr`  rJ   zbatch_size + 1rG  rK   r)  r  r   r   r+   rg  r%  r   r"  r/   r  r  )r   r   r"   r  r-   Zvi_token_offsetZvi_cumulated_seq_lenZ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 r  )rG  rK   r)  r  r   r   r+   rg  r%  r   r"  )r   r   Zshape_inputZshape_token_offsetr  r-   r  r   r   r   r   	  s    z,SymbolicShapeInference._infer_RestorePaddingc                 C   r  r*   r  r  r   r   r   r   "	  r9   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  rJ   r`  rT  r  *r(  /r  rU  )rG  rK   rH  r)  r  r   r   r+   rg  r%  r   r"  r  r3   r   r   )r   r   query_shapeZtotal_sequence_lengthr  Z	key_shaper  Zvalue_shaper-   Z
batch_sizer(  r[  rZ  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`  rJ   rT  )rG  r)  r  r   r   r+   rg  r%  r   r"  rK   rH  r   )r   r   ra  r  r  r-   rZ  r   r   r   r   q	  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  rJ   )rG  r{  r)  r  r   r   r+   rK   r   r   r5   rL  rg  r%  r   r"  )r   r   r  r  r  rB   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  rJ   zmax(z, z	) <= O < z + )
rG  rK   r/   r  rR  r)  rg  r%  r   r"  )	r   r   r  Z	shape_lenMr  r  r  r-   r   r   r   r   	  s    z0SymbolicShapeInference._infer_DynamicTimeWarpingc                 C   r  r*   r^  r  r   r   r   r   	  r9   z&SymbolicShapeInference._infer_FastGeluc                 C   r  r*   r^  r  r   r   r   r   	  r9   z"SymbolicShapeInference._infer_Geluc                 C   r  r*   r^  r  r   r   r   _infer_QuickGelu	  r9   z'SymbolicShapeInference._infer_QuickGeluc                 C   r  r*   r   r  r   r   r   r   	  r9   z*SymbolicShapeInference._infer_GemmFastGeluc                 C   r  r*   r   r  r   r   r   r   	  r9   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 )NrJ   rA   r  r   c                 S   s   g | ]}d qS r  r   )r	   rw  r   r   r   r   	  r  zDSymbolicShapeInference._infer_LayerNormalization.<locals>.<listcomp>r`  )r  rK   rg  r   rG  rC   r=  r)  r  r   r   r+   r/   r  ZFLOAT16ZBFLOAT16rR  r%  r   r"  )r   r   rA   Zx_shaperB   Z
mean_shapeZ
mean_dtyper-   r   r   r   r   	  s*   


"	z0SymbolicShapeInference._infer_LayerNormalizationc                 C   r  r*   r^  r  r   r   r   r   	  r9   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`  rJ   r]  )r   r   Zinput_ids_shapeZword_embedding_shaper  Zword_embedding_dtyper-   Z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   r  r*   r^  r  r   r   r   r   	  r9   z'SymbolicShapeInference._infer_GroupNormc                 C   r  r*   r^  r  r   r   r   r   	  r9   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  rJ   r`  rD   r(  kv_num_heads)r)  r  r   r   r+   rH  rg  r%  r   r"  r   r  r   rG  r  r3   )
r   r   r  rZ  r-   r(  rd  ra  Zhidden_sizer[  r   r   r   r   	  s,    


z1SymbolicShapeInference._infer_GroupQueryAttentionc                 C   r  r*   )r   r  r   r   r   r   
  r9   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 r  )rG  r  r3   r)  rg  r  r   r   r+   r%  r   r"  r   )r   r   r  Z
bias_shaper  r-   r  r   r   r   r   
  s   z+SymbolicShapeInference._infer_BiasSplitGeluc                 C   r  r*   r^  r  r   r   r   r   "
  r9   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 )NrJ   r`  r   r  r  )rK   rg  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_namerJ   z' returned z shapes and z dtypes, but expected z	 outputs.)r   r   Zonnxruntime.capi._pybind_staterg  r  r)  rg  r%  r   r"  r/   r  r  r=  rK   r  rG  rL  r   r   r+   r  r8   )r   r   re  rf  rg  rh  Zshape_infererr-   Zinput_shapesZinput_dtypesr  r"   Zinput_dtypeZoutput_shapesZoutput_dtypesr5   r  r7   r  r   r   r   r   2
  sJ   


*
z&SymbolicShapeInference._infer_PythonOpc                 C   sP   |  ||}| j|j|  jjj}| j|j|  }|t	|j| || d S r*   )
rG  r)  r  r   r   r+   rg  r%  r   r"  )r   r   r  r  r"   r  r-   r   r   r   r  a
  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 )NFZunk__Try  )r   r  r   r   r   _is_none_dimg
  s   
z#SymbolicShapeInference._is_none_dimc                 C   s    |D ]}|  |r|  S qd S r*   )ri  )r   	out_shapeoutr   r   r   _is_shape_contains_none_dimp
  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)r  c                 S   s   g | ]
}t |tu r|qS r   r-  r$   r   r   r   r   
  r  z6SymbolicShapeInference._infer_impl.<locals>.<listcomp>)rK  Zpositiver'  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 ]>}dd |jD  t }|jD ]} |j q7|jD ]}| fd	d
|D  qC|| |j D ]}||j	 q\q'|S )Nc                 S   s   h | ]}|r|qS r   r   r4   r   r   r   rr  
  r&   zISymbolicShapeInference._infer_impl.<locals>.get_prereq.<locals>.<setcomp>r_   r  r  )r`   rh   r  c                 S   rq  r   r   r4   r   r   r   rr  
  rs  c                    s   g | ]}| vr|qS r   r   r4   Zg_outputs_and_initializersr   r   r   
  r^  zJSymbolicShapeInference._infer_impl.<locals>.get_prereq.<locals>.<listcomp>)
r  rf  r   r'  r  r   r*  rg  discardr   )r   namesr  gZg_prereqnr5   )
get_prereqrm  r   rr  
  s(   





z6SymbolicShapeInference._infer_impl.<locals>.get_prereqr   c                 S   rq  r   r   r4   r   r   r   rr  
  rs  z5SymbolicShapeInference._infer_impl.<locals>.<setcomp>c                 3       | ]}|j  v V  qd S r*   r   rx  sorted_known_vir   r   r  
      z5SymbolicShapeInference._infer_impl.<locals>.<genexpr>c                 3   rs  r*   r   rx  rt  r   r   r  
  rv  c                 3   s    | ]	}|r| v V  qd S r*   r   r4   rt  r   r   r  
  s    
c                 3   rs  r*   r   rx  rt  r   r   r  
  s    

zInvalid model with cyclic graphc                 3   s    | ]
}|r| j v V  qd S r*   re  r4   r  r   r   r  
  s    F)ZConvTransposeZATenzorg.pytorch.atenoperatorr  r`  z: z  Input %s: %s %srD   rX  c                    r[  r   r\  r4   r]  r   r   r   
  r^  r_  c                    ra  r   r	  r  rb  r   r   r   
  r6   rJ   r0  r   r   r  r   r   )r   Zsparse_tensor_typeNr   r   z  {}: sequence of {} {}z  z: sequence of r<  z  Sympy Data: )rW   rm   re   rZ   ra   rY  rb   rX   ro   rZ  r\   ZLessZGreaterZLessOrEqualZGreaterOrEqualrd   rc   c                    r[  r   r\  r4   r]  r   r   r   G  r^  c                        g | ]}t |t    qS r   r	  r  rF  rj  r   r   r   R  r  r[   c                    rx  r   r	  r  ry  r   r   r   e  r  c                 S   s8   g | ]\}}|d krt || r|| nt|| qS r  )r2   r   )r	   r  r5   r   r   r   r   h  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: )NrN  r  r  r~  r  r  r   r  r.   r!   r   r   r+   r   r"   r   rS  r   r  r   r  r*  r   r   r=   r  r/   r$  ri  r%  r   rg  rE   r'  r  r
  rK   rL  rD  rp  rf  r   r)  r  Z	UNDEFINEDrF   r   r  r  bytesr  r   r   r  r8  r(  r)   r=  r9  r   formatr  r  rl  r   r  rG  rQ  ri  r  r  r   r   rI  r  r   r"  r8   )r   Zstart_sympy_datar5   r  Z
input_dimsZi_dimr   r  Zs_mergeZprereq_for_noderq  Zsorted_nodesZold_sorted_nodes_lenZknown_aten_opr-   r
   Zaten_op_namer   rk  rl  rn  Zout_typeZout_type_kindZseq_cls_typeZout_type_undefinedZshapesZdim_idxZis_unknown_opr@  Z	out_dtypero  r   )r%   rr  rF  r   rc  rj  r   ru  r   r|  v
  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  rg  r   r)  r%  )r   rg  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)rH   r  r  rV   r,  r   r|  r}  r/   
save_modelr  rD  )r+  r   r   r   r  Z
onnx_opsetr  Zall_shapes_inferredr   r   r   rj    s   

z#SymbolicShapeInference.infer_shapes)rD   )F)TT)FF)r   r   r  )Tr*   )r|  FFr   )__name__
__module____qualname__r  r  r  r,  r:  rD  rG  rH  rI  rM  rQ  rR  rU  rp  r  r  r  r  r   r  r  r  r  r9  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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rH  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rc  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  ri  rl  r|  r}  staticmethodrj  r   r   r   r   rV   }   s   
 -	g8%

D	)
>!;"!	!42#	 0	#-
L
/	  ;rV   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_argumentr3   
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locationZsize_thresholdZconvert_attributezDone!r*   )1r  loggingnumpyr;   r/   r=   r   r   r   	packagingr   parse__version__	getLoggerr  r  r   r   r!   r)   r,   r.   r1   r8   r2   rC   rH   rP   rR   rU   rV   r  r8  infor  rg  rj  loadr   r   r   r  Zout_mpr~  r  r  Zexternal_data_locationZexternal_data_size_thresholdsaver   r   r   r   <module>   s   




                      _6



