U
    T?h                 	   @   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sbt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$r.e"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!j0d*d+ ne1e+e!j$ e"d, 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   X/var/www/html/venv/lib/python3.8/site-packages/onnxruntime/tools/symbolic_shape_infer.py
<listcomp>   s     
 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k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kst|dkS )Nr   )tensor_typesequence_typer   )r   AssertionError)
type_protocls_typer   r   r   is_sequence   s    
r!   c                 C   s4   t | rt| jdr,dd | jjjD S d S d S )Nshapec                 S   s   g | ]}t |qS r   )r   r	   dr   r   r   r   '   s     z-get_shape_from_type_proto.<locals>.<listcomp>)r!   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 d S N)r!   r   	elem_typer   r&   r   r   r   get_elem_type_from_type_proto,   s    r*   c                 C   sX   | j d}|d krd S t| j rJ| j jjddkrDt| j jjS d S n
t| j S d 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    r/   c                 C   s   dd | D S )Nc                 S   s0   g | ](}|d krd nt |r$t|nt|qS r(   )
is_literalintr   r	   ir   r   r   r   G   s     z.get_shape_from_sympy_shape.<locals>.<listcomp>r   )sympy_shaper   r   r   get_shape_from_sympy_shapeF   s    r5   c                 C   s*   t | ttjtjtjfkp(t| do(| jS )N	is_number)	r   r1   npint64Zint32sympyIntegerhasattrr6   r   r   r   r   r0   J   s    r0   c                 C   s*   | |k r| | kst | dkr"| S ||  S Nr   )r   )axisrankr   r   r   handle_negative_axisN   s    r?   c                 C   sD   |pdddg}t |tkr |g}| jD ]}|j|kr&|j  S q&d S )N r-   zai.onnx)r   listZopset_importdomainr   )mprB   Zopsetr   r   r   	get_opsetS   s    

rD   c                 C   sB   t | tkr$t| dkst| d S t | tjkr:|  S | S d S N   r   )r   rA   lenr   r7   ndarrayitemxr   r   r   	as_scalar^   s    rL   c                 C   s@   t | tkr| S t | tjkr&t| S |r6| d kr6d S | gS d S r(   )r   rA   r7   rH   )rK   	keep_noner   r   r   as_listh   s    rN   c                 C   s2   t | tkr*td}| D ]}|| }qn| }|S NrF   )r   rA   r9   r:   )rK   r   vr   r   r   sympy_reduce_products   s    
rQ   c                   @   s  e Zd ZdddZdddZdd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dd d!Zdd"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zdd-d.Zdd/d0Zdd1d2Zdd3d4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 ZtdddZudd Zvdd ZwdddZxdd ZyezdddZ{d5S (  SymbolicShapeInferencer@   c              e   C   s$  | j | j| j| j| j| j| j| j| j| j	| j
| j| j| j | j| j| j | j | j| j| j| j| j| j| j| j| j| j| j | j| j| j | j| j | j| j| j| j| j| j| j| j| j| j| j| j| j | j!| j"| j#| j$| j%| j&| j&| j&| j'| j(| j)| j | j*| j+| j,| j-| j | j.| j | j/| j0| j1| j2| j3| j4| j5| j6| j7| j8| j9| j:| j;| j<| j=| j>| j?| j@| jA| jB| jC| jD| jE| jF| j6| jG| jH| jI| jJ| j=| jK| jL| jL| jMdd| _N| j| jO| jP| jQ| jR| jR| jS| jT| jU| jQ| jQ| j,| jV| jW| jW| jW| jWd| _Xd| _Yi | _Zi | _[i | _\|| _]|| _^|| __|| _`d| _a|| _bd S )N)dAddZArrayFeatureExtractorZAveragePoolZBatchNormalizationZCastZCategoryMapperZCompressConcatZConcatFromSequenceConstantZConstantOfShapeZConvZCumSumDivZEinsumExpandEqualFloorZGatherZGatherElementsZGatherNDZIdentityZ	AllReduceIfLoopMatMulMatMulInteger16ZMaxPoolMaxZMemcpyFromHostZMemcpyToHostMinZMoEMulZNonMaxSuppressionZNonZeroZOneHotZPadRangeZ
ReciprocalZ	ReduceSumZ
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EmbedLayerNormalizationFastGeluZGatedRelativePositionBiasGeluGemmFastGeluZ
GemmFloat8	GroupNormGroupQueryAttentionLayerNormalizationLongformerAttentionZMatMulNBitsMultiHeadAttentionNhwcConvPackedAttentionZPackedMultiHeadAttentionPagedAttentionPythonOpQuantizeLinear	QuickGeluRelativePositionBiasRemovePaddingRestorePaddingRotaryEmbeddingSimplifiedLayerNormalizationSkipGroupNormSkipLayerNormalization SkipSimplifiedLayerNormalizationSparseAttention)Z	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   )c_infer_symbolic_compute_ops_infer_ArrayFeatureExtractor_infer_Pool_infer_BatchNormalization_infer_Cast_infer_CategoryMapper_infer_Compress_infer_Concat_infer_ConcatFromSequence_infer_Constant_infer_ConstantOfShape_infer_Conv_pass_on_shape_and_type_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_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_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_QuantizeLinear_infer_RelativePositionBias_infer_RemovePadding_infer_RestorePadding_infer_RotaryEmbedding_infer_SkipGroupNorm_infer_SkipLayerNormalization_infer_SparseAttention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   hzSymbolicShapeInference.__init__Fc           	         s  t  fdd|D stt|} j D ]$\}}||kr,|| || q,d }|D ]}t|rZ|} qpqZ|d kr|D ]}| jkr||} qq||d kr|D ] }t	 j
| tjkr|} qq|d kr jdkrtdd| t|}dd |D }||t| }|| |D ]}||kr0qt|rZt|rZt|t|ksZtt|rlt|n| j|<  j D ]\}}||kr| j|< qq|r jr   d S )Nc                    s*   g | ]"}t |tkr| jkp$t|qS r   )r   r   r   r0   r	   sr   r   r   r     s     z?SymbolicShapeInference._add_suggested_merge.<locals>.<listcomp>r   z9Potential unsafe merge between symbolic expressions: (%s),c                 S   s   g | ]}t |qS r   rG   r   r   r   r   r   !  s     )allr   setr   itemsremoveaddr0   r   r   r   r9   Symbolr   loggerwarningjoinrA   indexr   r1   r   _apply_suggested_merge)	r   symbolsapplykrP   Zmap_tor   Zsymbols_listZlensr   r   r   _add_suggested_merge  sN    






z+SymbolicShapeInference._add_suggested_mergec                 C   s|   | j s
d S t| jjj|rg nt| jjj D ]H}|jjjj	D ]6}|j
| j kr>| j |j
 }t|rnt||_q>||_
q>q.d S r(   )r   rA   out_mp_graphinput
value_infor   r   r"   r   	dim_paramr0   r1   	dim_value)r   graph_input_onlyr3   r$   rP   r   r   r   r  1  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   s   i | ]}|j |qS r   r   r2   r   r   r   
<dictcomp>@  s      z6SymbolicShapeInference._preprocess.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r   r   r2   r   r   r   r  A  s      c                 S   s   i | ]}|j |qS r   r   r2   r   r   r   r  B  s      c              	   S   s(   i | ] }|j t|j |jt|jqS r   )r   r   make_tensor_value_infoZ	data_typerA   dimsr2   r   r   r   r  D  s    )r-   
ModelProtor
  CopyFromrA   r  r  graph_inputs_initializerinitializers_	known_vi_update)r   in_mpr   r   r   _preprocess=  s    
z"SymbolicShapeInference._preprocessc                    sR  t dd  D sjrtt }dd |D }t|dksBtt|dkr|d}jdkrt	d|d | ||d d    d||   j
|dd	 || S jdkrt	d|dd   d
|d    d S nd S t  fdd D r d S fdd D t fddD rJd jksBtd S d S d S )Nc                 S   s   g | ]}t |tkqS r   r   r   r#   r   r   r   r   K  s     z9SymbolicShapeInference._merge_symbols.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   r0   r#   r   r   r   r   N  s     rF   r   zdim z has been merged with value Fallow_broadcastz has been merged with dim c                    s   g | ]}| d  kqS r   r   r#   r  r   r   r   ^  s     c                    s   g | ]} j ||qS r   )r   getr#   r   r   r   r   `  s     c                    s   g | ]}| d  kqS r!  r   r#   )mergedr   r   r   a  s     )r   r   rA   r   sumr   r  r   r  debug_check_merged_dimsr   )r   r  Zunique_dimsZis_intZint_dimr   )r  r$  r   r   _merge_symbolsJ  s0    

*
"
z%SymbolicShapeInference._merge_symbolsc                 C   s   g }t |}t |}t||}t|D ]}||k rB||d |  nd}||k r^||d |  nd}	|dksr||	krx|	}
nX|	dkr|}
nJ| ||	g}
|
s| jr| j||	gdd ntdt| d t|	  |
f|}q&|S )NrF   Tr  zunsupported broadcast between  )	rG   r   ranger(  r   r	  r  r  r   )r   shape1shape2	new_shapeZrank1Zrank2Znew_rankr3   dim1dim2new_dimr   r   r   _broadcast_shapesh  s$    
z(SymbolicShapeInference._broadcast_shapesc                 C   sH   |j | }|| jkr&| j| }t|S || jks4tt| j| jS d S r(   )r  r  r,   r  r   rA   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kr<| j| }t|S || jkrVt| j| jS d S rO   )rG   r  r  r,   r  rA   r  r3  r   r   r   _try_get_shape  s    



z%SymbolicShapeInference._try_get_shapec                 C   s   t | ||S r(   )rG   r5  )r   r   r4  r   r   r   _get_shape_rank  s    z&SymbolicShapeInference._get_shape_rankc                 C   sh   g }|  ||D ]R}t|tkrL||| jkr8| j| ntj|ddd qd |k	sXt|| q|S )NTintegerZnonnegative)r5  r   r   appendr   r9   r   r   )r   r   r4  r4   r$   r   r   r   _get_sympy_shape  s    z'SymbolicShapeInference._get_sympy_shapec                 C   sF   |j | }|| jks"|| jks"t|| jkr6| j| S t| j| S r(   )r  sympy_data_r  r   r   to_arrayr   r   r4  r   r   r   r   
_get_value  s    
z!SymbolicShapeInference._get_valuec                 C   s@   |t |jkrd S |j| }|| jks0|| jkr<| ||S d S r(   )rG   r  r<  r  r?  r>  r   r   r   _try_get_value  s    
z%SymbolicShapeInference._try_get_valuec                 C   s~   t |D ]p\}}t|st|tkrt|}|| jkr\t| j| rFq| j| j|  ||< qt|| jkr|| jt|< qd S r(   )	enumerater0   r   r   r   r   )r   new_sympy_shaper3   r1  Zstr_dimr   r   r   _update_computed_dims  s    
z,SymbolicShapeInference._update_computed_dimsc           
         s  j dk}|s0g }tjdkr@j dkr@fddjD }j dkrjd jkrjjd  }tt|jfddt	tjD }t	j d	krd
nd D ]2  fdd|D }t|dkrj
|dd qtgdfddjD dd jD |}jj| tj_t	tjD ]P}j| }	|	r>jjj }|s||jjj|  n|	|_|j|	< q>d S )N)"rZ   r[   rc   rf   rk   rm   ro   rr   rs   rt   ru   rx   ry   rq   r   r   r   r   r   r   r   r|   r}   r~   rz   rv   rw   r   r   rp   rn   r{   r   r   	   )ri   c                    s*   g | ]"}| j kr| jkr j | qS r   )r  r  r	   r   r   r   r   r     s   
 
zBSymbolicShapeInference._onnx_infer_single_node.<locals>.<listcomp>	rS   rh   r`   rV   r\   MatMulIntegerr]   rj   Sumr   c                    s   g | ]}  |qS r   r5  r2   r   r   r   r   r     s     r\   rG  r]      c                    s0   g | ](}t |  kr|t |    qS r   r   r   r$   out_rankr   r   r     s      rF   Tr  tmpc                    s   g | ]}|r j | qS r   r  r2   r   r   r   r     s      c                 S   s   g | ]}t |qS r   )r/   r2   r   r   r   r     s     )op_typerD   r
  r  outputr  rG   r'   r   r+  r'  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   rN  r   r   _onnx_infer_single_node  sF    
%


z.SymbolicShapeInference._onnx_infer_single_nodeTc                    s:   j dkr0t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rJ| j  q.|  |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#kst$|j#|
 |	|
< q j#%|	 |S )NrL  zInferencing subgraph of node z with output(r   z...): c                 S   s   h | ]
}|j qS r   r   r2   r   r   r   	<setcomp>)  s     z>SymbolicShapeInference._onnx_infer_subgraph.<locals>.<setcomp>c                    s   h | ]}| kr|qS r   r   rE  )subgraph_inputsr   r   r\  *  s      rO  c                    s   g | ]} j | qS r   rP  r2   r   r   r   r   .  s     z?SymbolicShapeInference._onnx_infer_subgraph.<locals>.<listcomp>c                 S   s   g | ]}t |jqS r   )r/   r   r2   r   r   r   r   /  s     c                    s   g | ]}|j  kr|qS r   r   r2   )subgraph_implicit_inputr   r   r   1  s     
 _)r   rF   r  rR  r  r   c                 S   s   g | ]}t |qS r   )r,   r	   rZ  r   r   r   r   O  s     c                    s4   h | ],}|r|D ]}t |tkr| jkr|qqS r   r   r   r   )r	   r   r$   r   r   r   r\  P  s        
 )&r   r  r&  r   rR  rQ  rA   r  r  r  r   rS  r   extendr
  r  rT  r  rR   r   r   r   r   r   r   r  r   copyr   _infer_implr<  _update_output_from_vi
ClearFieldrG   r  r   r   r  )r   r   subgraphuse_node_inputinc_subgraph_idrX  symbolic_shape_inferenceZsubgraph_shapesZsubgraph_new_symbolic_dimsZnew_dimsr$   r   )r   r^  r]  r   _onnx_infer_subgraph"  s\    
& 
 



z+SymbolicShapeInference._onnx_infer_subgraphc           
         sJ  dd fddt tjD }tdd |D rt|D ]x\}}t|tjk	rXq@t|jdkrld }nDt|jdkr|	  }n&t|jdkst
 fdd|D }|||< q@d	d |D }t|}	|	dkrF|rFt|D ]\\}}|d krqt|tr6t||	k r"||	 ||< nt||	ksDt
q|g|	 ||< q|S )
Nc                 S   s   |r| d dkr| S t | S rE   r1   )r   allow_float_valuesr   r   r   int_or_float[  s    zESymbolicShapeInference._get_int_or_float_values.<locals>.int_or_floatc                    s   g | ]}  |qS r   )r@  r2   rJ  r   r   r   a  s     zCSymbolicShapeInference._get_int_or_float_values.<locals>.<listcomp>c                 S   s   g | ]}|d k	qS r(   r   r	   rP   r   r   r   r   b  s     rF   r   c                    s   g | ]}| qS r   r   )r	   vv)rm  rn  r   r   r   m  s     c                 S   s"   g | ]}t |trt|nd qS r!  )
isinstancerA   rG   ro  r   r   r   r   o  s     )r+  rG   r  r   rA  r   r7   rH   r"   rI   r   r   rq  rA   )
r   r   	broadcastrm  valuesr3   rP   new_vZ
values_lenmax_lenr   )rm  rn  r   r   r   _get_int_or_float_valuesZ  s2    
z/SymbolicShapeInference._get_int_or_float_valuesc                    s   t |jdkst|jdkr.| j|ddd}n| j|dd}tdd |D rdd |D }t|}|r fd	dt| D | j|jd
 < n || j|jd
 < d S )NrF   )r`   rV   T)rr  rm  )rr  c                 S   s   g | ]}|d k	qS r(   r   ro  r   r   r   r     s     zASymbolicShapeInference._compute_on_sympy_data.<locals>.<listcomp>c                 S   s   g | ]}t |tqS r   )rq  rA   ro  r   r   r   r     s     c                    s   g | ]} |qS r   r   )r	   vsop_funcr   r   r     s     r   )	rG   rR  r   rQ  rv  r   anyzipr<  )r   r   ry  rs  Zis_listrN   r   rx  r   _compute_on_sympy_data  s    
$z-SymbolicShapeInference._compute_on_sympy_datac                 C   s0   t |jdks|jdkst| |dd  d S )NrF   )rb   ri   rg   c                 S   s   | d S r<   r   rJ   r   r   r   <lambda>      z<SymbolicShapeInference._pass_on_sympy_data.<locals>.<lambda>)rG   r  rQ  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 r<   )	r  rR  r  r   r  r*   r  r   r5  )r   r   r+   r   r   r   r     s    
z.SymbolicShapeInference._pass_on_shape_and_typec                 C   s\   | d| }|| j kr>| j | }t|r8tt|n|}ntj|ddd}|| j|< |S )NZ_dTr8  )r   r0   r9   r:   r1   r   r   )r   r   r   r1  rP   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 )Nr_  Z_o)r  rQ  r   rA   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  r2   r   r  r   r   r   r     s     z>SymbolicShapeInference._new_symbolic_shape.<locals>.<listcomp>)r+  )r   r>   r   r  r   r  r   _new_symbolic_shape  s    z*SymbolicShapeInference._new_symbolic_shapec                 C   sJ  |  |d}t|jdkrl|  |d}t|d }|rH|| d d n|| d  }|d ||rfdnd< nd }t|d}t|}t||d kst|r|| d d n|| d  }dd |D }t|sbt| j|jd  }	t|	dkrbt|t|	ks
t|r<d	d |	| d d D || d d< n"d
d |	| d  D || d < |S t|ddg| }
t|ddg| }dd t	||
D }t|d}|d krddgd|  }t|dd
d}|dkrH|dkrHz8dd t	|| d  |D }dd t	|||D }W n* tk
rD   dd t	||D }Y nX n|dkrXg }n
dg| }n:t|d| ksztdd t	|d | ||d  D }t|dd}t|D ]}|| | |rdnd  }t|dkr|||  }|rt|||  ||  }n|||  ||  }|d || | |r<dnd < q|S )Nr   rF   rL     kernel_shapec                 S   s   g | ]}t | qS r   r  r2   r   r   r   r     s     zCSymbolicShapeInference._compute_conv_pool_shape.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   r9   r:   r#   r   r   r   r     s     c                 S   s   g | ]}t |qS r   r  r#   r   r   r   r     s     	dilationsstridesc                 S   s    g | ]\}}|d  | d  qS rF   r   )r	   r  r$   r   r   r   r     s     padsauto_pads   NOTSETutf-8ZVALIDNOTSETc                 S   s   g | ]\}}t ||qS r   )r9   Modr	   r$   r   r   r   r   r     s     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     s     	ceil_mode)r;  rG   r  r   r   rz  r,   r  rR  r{  decode	TypeErrorr+  r9   ceiling)r   r   channels_lastr4   ZW_shaper>   r  Zspatial_shapeZis_symbolic_dimsr"   r  r  Zeffective_kernel_shaper  r  ZresidualZ
total_padsr  r3   Zeffective_input_sizeZstrided_kernel_positionsr   r   r   _compute_conv_pool_shape  sl    $
$
,"




$$z/SymbolicShapeInference._compute_conv_pool_shapec                    s:   |rdd  D  t  fdd D s6| j dd d S )Nc                 S   s$   g | ]}t |rt|d ks|qS r  )r0   r1   r#   r   r   r   r     s       z=SymbolicShapeInference._check_merged_dims.<locals>.<listcomp>c                    s   g | ]}| d  kqS r!  r   r#   r"  r   r   r     s     Tr)  )r   r	  )r   r  r   r   r"  r   r'    s    z)SymbolicShapeInference._check_merged_dimsNc                 C   s4  |  |d}|  |d}t|}t|}d}d}|dkr@|dksDt|dkrZ|dkrZg }	nr|dkr~d}|d | |d g }	nN|dkrd}|d | }	n4d}d}| |d d |d d |d |d f}	| j|| || gdd |d kr| j|jd  jjj	}| j|j
d  }
|
t|j
d ||	 d S )Nr   rF   r  Fr  )r5  rG   r   r2  r'  r  r  r   r   r)   rR  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    ,
z,SymbolicShapeInference._compute_matmul_shapec              	   C   s  t |r|jjjn|j}t |r*|jjjn|j}|j|jkr|jrH|jn|j}td| dtjj	j
|j dtjj	j
|j |drtt|jj|jjD ]P\}}	|	d |	d krtj }
t |st| ||||
_|jj| |
 qn
|| 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"   r   rF   N)r!   r   r)   r   r   rQ  
ValueErrorr-   Zonnx_pbTensorProtoDataTypeNamer%   rA  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dsr1  r   r   r   _fuse_tensor_type   s"    0

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   rF   r  
r5  r  rR  r  r   r  r  r   r   r)   )r   r   
data_shapeindices_shaper+   r   r   r   r   =  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 |ksXt |||j   d S )Nc                 S   s   | d | d  S Nr   rF   r   lr   r   r   r}  K  r~  zDSymbolicShapeInference._infer_symbolic_compute_ops.<locals>.<lambda>c                 S   s:   t | d | d  tr*t| d | d  S | d | d  S r  rq  floatr1   r  r   r   r   r}  L  s    c                 S   s   | d | d kS r  r   r  r   r   r   r}  O  r~  c                 S   s   t | d S r<   )r9   floorr  r   r   r   r}  P  r~  c                    sd   t | d r(t| d  j k r(| d S t | d rPt| d  j k rP| d S t| d | d S r  )r0   r1   r   r9   r^   r  r   r   r   r}  Q  s
    

c                    s`   t | d r&t| d  jkr&| d S t | d rLt| d  jkrL| d S t| d | d S r  )r0   r1   r   r9   r_   r  r   r   r   r}  V  s
    

c                 S   s:   t | d | d  tr*t| d | d  S | d | d  S r  r  r  r   r   r   r}  [  r~  c                 S   s   | d | d  S r  r   r  r   r   r   r}  \  r~  c                 S   s   | d r| d S | d S Nr   rF   rL  r   r  r   r   r   r}  ]  r~  c                 S   s
   | d  S r<   r   r  r   r   r   r}  ^  r~  )
rS   rV   rX   rY   r^   r_   r`   rh   rj   rl   )rQ  r   r|  )r   r   funcsr   r   r   r   I  s    

z2SymbolicShapeInference._infer_symbolic_compute_opsc                 C   s   |  | d S r(   )r  r  r   r   r   r   c  s    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INT64rR  r  r   r  r5  )r   r   Z
input_typeoutput_typer+   r   r   r   r   f  s    
z,SymbolicShapeInference._infer_CategoryMapperc                 C   s   |  |d}t| |}t|d}|d kr4|g}n|}||t|t|< | j|jd  }|t	
|jd | j|jd  jjj| d S )Nr   r=   )r5  r   r  r   r?   rG   r  rR  r  r   r  r  r   r   r)   )r   r   input_shapeZcompress_lenr=   output_shaper+   r   r   r   r   o  s    
z&SymbolicShapeInference._infer_Compressc                    s  t fddjD r}tdd |D rtddksFtg jjd < tt	jD ]D}|| }t
|trjjd  | qdjjd  | qdd}ttdt	|}tdt	jD ](}|}|r|| ||  ||< qڈ| tt	|D ]  |kr,q fddtt	jD tfddD rhq}	t|	tkr|	rj|	 nd | < n|	| < qjjd  }
|
tjd jjd  jjjt| d S )	Nc                    s    g | ]}| j kp| jkqS r   )r<  r  r2   r   r   r   r     s     z8SymbolicShapeInference._infer_Concat.<locals>.<listcomp>c                 S   s   g | ]}|d k	qS r(   r   ro  r   r   r   r     s     r=   r   rF   c                    s(   g | ] } |r |  qS r   rI  )r	   i_idx)r$   r   r   r   r   r     s      c                    s   g | ]}| d  kqS r!  r   r#   r"  r   r   r     s     )rz  r  rv  r   r   r   r<  rR  r+  rG   rq  rA   rb  r:  r;  r?   rC  r(  r   r   r   r  r  r   r  r   r)   r5   )r   r   rs  r3   r   r4   r=   r  r  r$  r+   r   )r$   r  r   r   r   r     sF    



 
z$SymbolicShapeInference._infer_Concatc                 C   s   |  |d}t|drdnd}tt|dt|| }t| |d|}|}|rp|d | |g ||d   }n|||< | j|jd  }|t	
|jd | j|jd  jjjjj| d S )Nr   new_axisrF   r=   )r5  r   r?   rG   r   r  r  rR  r  r   r  r  r   r   r)   r   )r   r   	seq_shaper  r=   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   r=  r<  rR  )r   r   tr   r   r   r     s    
z&SymbolicShapeInference._infer_Constantc                 C   s   |  |d }| j|jd  }|d k	rt|tkr8|g}| | |jjjtj	j
krtdd |D rt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   g | ]}t |qS r   r  r	   rK   r   r   r   r     s     zASymbolicShapeInference._infer_ConstantOfShape.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   rl  r  r   r   r   r     s     )Zdtyper   )rv  r  rR  r   rA   rC  r   r)   r-   r  r  r   r7   Zonesr8   r   r=  r   r<  r  r5  r  r   r  r5   r   r   r4   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  rC  r  rR  r  r   r  r   r   r)   r5   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  rC  r  rR  r  r   r  r  r   r   r)   r5   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 rE   )
r  r  r   r   r)   r5  rR  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r6|jd r6| j|jd  jjj}| 	|d}| j|j
d  }|t|j
d || d S )NrL  r   )r-   r  ZUINT8rG   r  r  r   r   r)   r5  rR  r  r   r  r  r   r   r   r     s    z,SymbolicShapeInference._infer_QuantizeLinearc                 C   s\  t |d}|dd}|d}|dkr4|d | n|}d}d}d}i }|d}	|	D ]}
|
d}| ||}t|}|dkr|dkr|t|
 d	 }|d
 }td
|d
 D ]H}|
|  }|dkr||  }||kr|||< qt|tj	k	r|||< q|d
 }qVg }ddl
m} | }|dkr||d d  }|d}|dkrdt|D ]}|||  qN|D ]}|dkrh|||  qhnt|D ]}|||  q|D ]>}|dkr|dkr||kr|| d
 ||< nd
||< q| D ]"\}}|d
kr|||  q| j|jd  jjj}| j|jd  }|t|jd || d S )Nequation    r~  s   ->r  r      ,s   ...r  rF   .   )OrderedDictrL  ,   )r   replacefindsplitr5  rG   r+  r   r9   r   collectionsr  r:  r   r  r  r   r)   rR  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"   r>   r3   letterr   rB  r  Znum_letter_occurrencesZright_equationZright_ellipsis_indexckeyr   r  r+   r   r   r   r     sf    














z$SymbolicShapeInference._infer_Einsumc                 C   s   t | |ddd}|d k	r~| | | |d}| |t|}| j|jd  }|t	
|jd | j|jd  jjj| d S )NrF   TrM   r   )rN   r@  rC  r5  r2  r5   r  rR  r  r   r  r  r   r   r)   )r   r   Zexpand_to_shaper"   r.  r+   r   r   r   r   I  s    
z$SymbolicShapeInference._infer_Expandc              
      sr  |  |d}tt|ddt|}|  |d}| j|jd  }|t|jd | j|j	d  j
jj|d | | ||d d    |j	d | jkrnt|dkrnt|dddkrn| |d}|d k	rn| j|j	d   t
 tkrFt
|tjkr,t|jdkr, fdd|D | j|jd < n t| | j|jd < n(|dks^|dks^t | j|jd < d S )Nr   r=   rF   c                    s   g | ]} t | qS r   rl  r2   datar   r   r   l  s     z8SymbolicShapeInference._infer_Gather.<locals>.<listcomp>r  )r5  r?   r   rG   r  rR  r  r   r  r  r   r   r)   r<  r@  rA   r7   rH   r"   r1   r   )r   r   r  r=   r  r+   r4  r   r  r   r   Y  s*    2
  z$SymbolicShapeInference._infer_Gatherc                 C   sL   |  |d}| j|jd  }|t|jd | j|jd  jjj	| d S rE   r  )r   r   r  r+   r   r   r   r   s  s    z,SymbolicShapeInference._infer_GatherElementsc                 C   s   |  |d}t|}|  |d}t| |d }t|r@||ksDt|d d ||d   }| j|jd  }|t|jd | j|j	d  j
jj| d S r  )r5  rG   r0   r   r  rR  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 k	rZt|dkrH|d |d  n|d |d  t|D ]\}}| j||dd}tt|jD ]}| j	|j|  }|dkr||j|  |j| |_
n| |||j|j| j |d k	r|t|dkrdndkr|j| j
|jkr|j|j| j
 | j|j
< qqbd S )Nthen_branchelse_branchr   rF   F)rh  )r   r@  rL   r  rA  rk  r+  rG   rR  r  r   r  r   r<  )	r   r   	subgraphsZcondZi_subrg  Zsubgraph_inferi_outr+   r   r   r   r     s&     z SymbolicShapeInference._infer_Ifc                 C   sb  t |d}t|jt|jks"tt|jd }t|jD ]*\}}|j}|| j|j|   ||_q:| || d}t	d|d D ]}|j
| }	t|	}
t|	jr|
rd |
kr|j|d  jjj|	jjj d}q|j|d  }t|}tt||
D ]f\}}|d |d krtj }t| ||||_|jjjj| | |	jjjj| | d}qq|r| jdkrtd|j d|j
d  d	 | j||dd
 t| |}t	t|j
D ]}| j|j
|  }||j
|d   ||krNt|jrt|j
|d  jjjj}|jjjd |jjjj}|| _|t | |j
| |_qd S )NbodyrL  FrF   Tr   zRerun Loop: (z3...), because of sequence in loop carried variables)ri  r   )!r   rG   r  r   rA  r   r  r  rk  r+  rR  r,   r!   r   r   r)   r{  r-   r  r  r   r  r  r   r"   r   r   r  r&  rf  r   rb  rA   )r   r   rg  Znum_loop_carriedr3   siZsi_nameZneed_second_inferr  soZso_shapeZsi_shaper  r  r1  Zloop_iter_dimr+   Zsubgraph_vi_dimZvi_dimr   r   r   r     sV    


 


z"SymbolicShapeInference._infer_Loopc                 C   s   |  | d S r(   r  r  r   r   r   r     s    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s4t|dkrJ|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NrF   r  Fr  )r5  r   rG   r   r'  r  r  r   r   r)   rR  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 )Nr   r  )
r   r  r  rR  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  )r7  r   r  r  rR  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|d | t|sT| |n|g ||d   }| j|j	d  }|
t|j	d | j|jd  jjj| d S )Nr   rF   r=   r  rL  )r;  r@  r   r?   rG   r5   r0   r  r  rR  r  r   r  r  r   r   r)   )r   r   r4   depthr=   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 k	rt|d| ksVtdd t||d | ||d  D }| | n| 	||}| j
|jd  jjj}| j
|jd  }|t|jd |t| d S )N
   r  rF   r   rL  c                 S   s   g | ]\}}}|| | qS r   r   )r	   r$   Zpad_upZpad_downr   r   r   r   )  s    z5SymbolicShapeInference._infer_Pad.<locals>.<listcomp>)rD   r
  r   r@  r;  rG   r   r{  rC  r  r  r  r   r   r)   rR  r  r   r  r5   )r   r   r  r4   r>   rB  Z	output_tpr+   r   r   r   r     s"    z!SymbolicShapeInference._infer_Padc              	   C   sR   |  |}| | |jD ]2}|s$q| j| }|t||jjj	t
| qd S r(   )r  rC  rR  r  r  r   r  r   r   r)   r5   )r   r   r4   rZ  r+   r   r   r   r   7  s    



z"SymbolicShapeInference._infer_Poolc                 C   sh   |  |d}|  |d}| ||}| j|jd  }| j|jd  }|t|jd |jj	j
| d S r  )r5  r2  r  r  rR  r  r   r  r   r   r)   )r   r   Zshape0r,  r.  t0r+   r   r   r   r   F  s    z-SymbolicShapeInference._infer_aten_bitwise_orc                 C   s8  |  |d}t|}| |d}| |d}| |d}|d k	rP|d k	rP|d k	sTtt||}t||}g }t|D ]\}}	|||fkrt||	 qt|| }
|| }|dkrtdt	|
|| }ntdt	|
| |}|| |j
d r4| j|j
d  }|t|j
d | j|jd  jjjt| d S Nr   rF   rL  r  )r;  rG   r@  r   r?   rA  r:  r9   r^   r_   rR  r  r  r   r  r  r   r   r)   r5   )r   r   r4   r>   offsetr/  r0  r.  r   valr,  r-  Z
diag_shaper+   r   r   r   r   N  s6    


z+SymbolicShapeInference._infer_aten_diagonalc           	      C   s   |  |d}t|}|dks t| |d}|d }|r<|nt| |d|}|d d |g }| j|jd  }|t	
|jd tjjt| d S )Nr   rF   rL  rF   r  )r;  rG   r   r@  r   r  r  rR  r  r   r  r-   r  r  r5   )	r   r   r4   r>   Znum_samplesr  Zlast_dimr  r+   r   r   r   r   p  s    z.SymbolicShapeInference._infer_aten_multinomialc              	      s     d}t|dkst fdddD |dd < | t jD ]V\}}|sZqLj| }|dkrttjj	nj j
d  jjj}|t||t| qLd S )Nr      c                    s   g | ]}  d |qS r!  r  r2   rJ  r   r   r     s     z=SymbolicShapeInference._infer_aten_pool2d.<locals>.<listcomp>rL  r  r  rF   )r;  rG   r   rC  rA  rR  r  r-   r  r  r  r   r   r)   r  r   r  r5   )r   r   r4   r3   rZ  r+   r)   r   rJ  r   r     s    

&z)SymbolicShapeInference._infer_aten_pool2dc           	      C   s`  | j |jd  }t|jdkrN|t|jd | j |jd  jjj	g  nt|jdks`t
| |d}|d k	sxt
| |d}|d kr| |d}| |r|n|d |}nH| |d}t|t|}|d | }|r|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   rF   r  rL  )r  rR  rG   r  r  r   r  r   r   r)   r   r@  r7  r  r;  r?   r5   r-   r  r  )	r   r   r+   keepdimr   r>   r  r"   Zvi1r   r   r   r     s@      
  z)SymbolicShapeInference._infer_aten_minmaxc                 C   s   |  |d}| |d}| |d}| |d}|d k	r||d k	r||d k	r||t|k sXt|| | | d ||< || nt|}| |d |}| | |jd r| j|jd  }|	t
|jd | j|jd  jjjt| d S r  )r;  r@  rG   r   r:  r  rC  rR  r  r  r   r  r  r   r   r)   r5   )r   r   r4   	dimensionsizestepr>   r+   r   r   r   r     s(    

z)SymbolicShapeInference._infer_aten_unfoldc                 C   s   d }|j d sg }n| |d}| |d}|d k	r| |d}|d k	rlt|t|}|rdd||< q||= n t|}| |r|n|d |}| | t|}|jd r|d k	r| j	|jd  }|
t|jd tjj| d S NrF   rL  r   )r  r@  r;  r?   rG   r  rC  r5   rR  r  r  r   r  r-   r  r  )r   r   r.  r   r  r4   r>   r+   r   r   r   r     s&    


z)SymbolicShapeInference._infer_aten_argmaxc                 C   s   |  | | |d}|d k	r2t|dkr2|d nd }| |d}| j|jd  jjj}dD ]t}|j	| r\| j|j	|  }|
t|j	| ||d k	r|nt| ||d|d k	rt|nt| ||dg q\d S )Nr      r  rF   )_propagate_shape_and_typer5  rG   r@  r  r  r   r   r)   rR  r  r   r  r   r  rL   )r   r   r  r  groupr  r3   r+   r   r   r   r     s&    
 

z-SymbolicShapeInference._infer_aten_group_normc                    s   d }  d}|d k	rr|d d } d}|d k	rL|dd |D 7 }n&t|}| fddtd|D 7 } jd r|d k	rĈj jd  jjj	}j jd  }|
t jd || d S )Nr   rL  rF   c                 S   s&   g | ]}t |tjkr| n|qS r   )r   r7   r8   rI   )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  r2   rJ  r   r   r      s     )r5  r@  rG   r+  rR  r  r  r   r   r)   r  r   r  )r   r   r.  r  Zoutput_sizer>   r  r+   r   rJ  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)rF   rL  r  r  rF   input_indexoutput_indexr  rG   rR  )r   r   r3   r   r   r   r     s    
z0SymbolicShapeInference._infer_BatchNormalizationc                 C   s   | j |jd  }| |}tdd |D rnt|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   s   g | ]}|d k	qS r(   r   r2   r   r   r   r     s     z7SymbolicShapeInference._infer_Range.<locals>.<listcomp>rF   rL  )r  rR  rv  r   rL   r9   r^   r  r  rC  r  r   r  r  r   r   r)   r5   )r   r   r+   
input_datastartlimitdeltarB  r   r   r   r     s     

z#SymbolicShapeInference._infer_Rangec                    s   t |dd}t| jdkrt|jdkr| |d}| j|jd  }|d kr|sXt|	t
|jd | j|jd  jjjt| | |d| n| |d g } fdd|D }t D ]*\}}||kr|r|d q|| q|	t
|jd | j|jd  jjj| d S )NkeepdimsrF      r   c                    s   g | ]}t |t qS r   r?   rG   r	   ar"   r   r   r   4  s     z;SymbolicShapeInference._infer_ReduceSum.<locals>.<listcomp>)r   rD   r
  rG   r  r@  r  rR  r   r  r   r  r   r   r)   r5   r  r7  r5  rA  r:  )r   r   	keep_dimsaxesr+   r  r3   r$   r   r  r   r   "  s8     z'SymbolicShapeInference._infer_ReduceSumc                 C   sV   t |d}t |dd}|dkrR|dgkrR| |d }|d k	rRt|| j|jd < d S )Nr  r  rF   r   )r   rv  rQ   r<  rR  )r   r   r  r   r  r   r   r   r   C  s    
z(SymbolicShapeInference._infer_ReduceProdc                 C   s   |  |d}|  |d}|d ks(|d k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   r  r  r   r   r)   rR  r  r   r  )r   r   Zseq_lenZreal_seq_len	num_headsr.  r  r+   r   r   r   r   K  s    z2SymbolicShapeInference._infer_RelativePositionBiasc                 C   s  |  |d}| j|jd  }|d kr| |d}t|dks@t|d }t|sTt|t	|jd |j
jjt| || n| |d}d}|D ]}|| }qg }	d}
d}t|D ]r\}}t
|tjkr|	| n0|dkr|	||  |||  }n
|	| |dkr|}
q|dkr|| }q|	ddk sBtd|	kr\|| }||	|
< | |	 |t	|jd |j
jjt|	 | | d S )NrF   r   r  rL  )r@  r  rR  r5  rG   r   r0   r  r   r  r   r   r)   r5   r  r;  rA  r9   r   r:  countrC  r  )r   r   shape_valuer+   Zshape_shapeZ
shape_rankinput_sympy_shapetotalr$   rB  Zdeferred_dim_idxZnon_deferred_sizer3   r1  r   r   r   r   X  sZ    






z%SymbolicShapeInference._infer_Reshapec                 C   s  | j |jd  }| |d}t| jdkr| |d}|d k	rdd t||D }| | |t	
|jd | j |jd  jjjt| n$| |d}| |d}| |d}|d k	rdd |D }| | n|d k	rpt|}t|d	d
kr0t|d| kstt|d | }	t||d  }
ndg| }	dg| }
t|}dd t||	|
|D }| | n| | |d|}|t	
|jd | j |jd  jjjt| d S )Nr   r  rF   c                 S   s$   g | ]\}}t t || qS r   r9   simplifyr  r  r   r   r   r     s     z8SymbolicShapeInference._infer_Resize.<locals>.<listcomp>rL  r  c                 S   s   g | ]}t t |qS r   r  r   r   r   r   r     s     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  rR  r;  rD   r
  r@  r{  rC  r  r   r  r  r   r   r)   r5   rG   r   r   rA   r  r7  )r   r   r+   r  scalesrB  Zroisizesr>   Z	roi_startZroi_endr   r   r   r     sR    



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sft|jd t j }t|D ]T\}}|j}|j j|   |kr|jj	j
j}	|	|	||    ||_q | t j }
t  ddg|
 }tj jd  j|d  }	t jD ]\}}j| }|krt|j| j}t||  t|d	 }|d | |	g ||d   }|t||j| jj	j| n||j|  ||_q,d S )
Nr  num_scan_inputsscan_input_axesr   c              	      s&   g | ]\}}t | | qS r   )r?   r7  )r	   r3   Zaxr   Znum_scan_statesr   r   r   r     s   z6SymbolicShapeInference._infer_Scan.<locals>.<listcomp>scan_output_axesr  rF   )r   rG   r  rA  r   r   r  r  r   r   r"   r   r   rk  rR  r'   r?   r   r  r)   )r   r   rg  r  r  r]  r3   r  Zsubgraph_nameZscan_input_dimZnum_scan_outputsr  rZ  r+   r"   r1  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 r<   r  )r   r   r  r+   r   r   r   r     s    z-SymbolicShapeInference._infer_ScatterElementsc                 C   sx   |  |d}| j|jd  }|d k	rtt|D ]F\}}|d k	r>q,tj }t| |d||_	|j
jjj| | q,d S r<   )r5  r  rR  rA  r-   r  r  r   r  r  r   r   r"   r   r  )r   r   r  r+   r  r$   r1  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  rR  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<   )r;  r<  rR  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<   )r;  rQ   r<  rR  r  r  r   r  r-   r  r  )r   r   r4   r   r   r   r     s
    z"SymbolicShapeInference._infer_Sizec                    sr  dd   fddfdd}t jdkrrt|d}t|d	}t|d
}|sbttt|}dgt| }nt|ddd}t|ddd}|d}|d}|d kr|d kr|d ksttt|d k	r|n|}|d kr |d kr|d ks dgt|d k	r|n| }t|dd}t|dd}|d}|d ksX|d kr|d krtt|D ]}	|d|||< qnn&t
|}|D ]}	|d|||< qnt||||D ]\}}	}
}||
|| }
t|
r|
jkr|| }
n|
j kr |	dkrdnd}
nbt|| rZ|
dk rJtd|
||  }
t|
|| }
n(|
dkr|
dkr~t|
|| n|
}
nxt|| rt|
|| }
nXz|
|| s|| }
W n: tk
r   td|
 d||  d || }
Y nX ||	|| }	t|| r6t|	r6tdt|	|| }	t|
|	 | |dkrRdnd | ||< q| j|jd  }|t|jd |jjjt
| |jd j krn|dgkrn|d k	rnt|dkrn|d k	rnt|dkrn|d k	rnt|dkrnj |jd  }t|tksHt|t!j"krnt|j#dkrn||d |d |d  j |jd < d S )Nc                    sn   t  tjstd   fddtt jD }t|dkrh|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   )rq  argsr9   r_   )r	   r4  )exprr   r   r     s      zLSymbolicShapeInference._infer_Slice.<locals>.flatten_min.<locals>.<listcomp>rF   r   c                    sr   t  j}t| tjs2td d|  t| jdksVtd|  | j|  |< tj| S )Nz#Expected a sympy.Min() at position z, got rL  z5Expected a sympy.Min() with exactly 2 arguments, got )rA   r  rq  r9   r_   r   rG   rS   )Zarg_idxZreplacedr  Zmin_posr   r   replace_min_with_arg  s    
 zVSymbolicShapeInference._infer_Slice.<locals>.flatten_min.<locals>.replace_min_with_arg)rq  r9   rS   r   r+  rG   r  )r  Zmin_positionsr  r   r  r   flatten_min  s    z8SymbolicShapeInference._infer_Slice.<locals>.flatten_minc                    s   zt | |kW S  tk
r"   Y nX zt || kW S  tk
rF   Y nX zt |  | kW S  tk
rn   Y nX zt | |  kW S  tk
r   Y nX zt ||  dkW S  tk
r   tdd  ||  D  Y S X d S )Nr   c                 s   s   | ]}t |d kV  qdS )r   N)boolr#   r   r   r   	<genexpr>=  s     zJSymbolicShapeInference._infer_Slice.<locals>.less_equal.<locals>.<genexpr>)r  r  r   )rK   y)r  r   r   
less_equal(  s(    z7SymbolicShapeInference._infer_Slice.<locals>.less_equalc                    s^   z2 d| s0t | r&| j kr&| W S ||  W S W n& tk
rX   td|  d Y nX | S )z/normalizes a negative index to be in [0, bound)r   zCannot determine if z < 0)r0   r   r  r  r  )r  bound)r  r   r   r   handle_negative_index?  s    
zBSymbolicShapeInference._infer_Slice.<locals>.handle_negative_indexrD  r  startsendsrF   Tr  rL  r  r  r   r  zUnable to determine if z <= z, treat as equal)$rD   r
  r   rA   r+  rG   rN   r@  r;  r  r5   r{  r0   r   r   r   r9   r_   	Exceptionr  r  r  rC  r  rR  r  r   r  r   r   r)   r  r<  r7   arrayr"   )r   r   r  r  r  r  ZstepsrB  r3   r   er  r+   Zinput_sympy_datar   )r  r  r   r   r   	  s    







0





z#SymbolicShapeInference._infer_Slicec                 C   s   | j |jd  }| j |jd  jjj}t|dd }|d k	r>|}||jj_|jjjt	
  t|jdkr| |d}| j |jd  }|t|j|| d S )Nr   r  rF   )r  rR  r  r   r   r)   r   r"   r  r-   r  rG   r5  r   r  r   )r   r   r+   r)   Zspecified_output_typer  r   r   r   r     s    
z5SymbolicShapeInference._infer_SoftmaxCrossEntropyLossc           
      C   s8  |  |d}tt|ddt|}t| j}|dk rTt|d}| |dd ksrtn| |d}t|dd ksrt|d krt|j}|| t	
| g| }| | ndd |D }tt|D ]p}| j|j|  }	|	||j| | j|jd  jjjt|d | || g ||d d    |	| j|	j< qd S )Nr   r=   r  r  rF   c                 S   s   g | ]}t |qS r   r  r   r   r   r   r     s     z>SymbolicShapeInference._infer_Split_Common.<locals>.<listcomp>)r;  r?   r   rG   rD   r
  r@  r   rR  r9   r:   rC  r+  r  r  r  r   r   r)   r5   r   )
r   r   Zmake_value_info_funcr  r=   op_setr  Znum_outputsrY  r+   r   r   r   _infer_Split_Common  s.    


(z*SymbolicShapeInference._infer_Split_Commonc                 C   s   |  |tj d S r(   )r"  r   r  r  r   r   r   r     s    z#SymbolicShapeInference._infer_Splitc                 C   s   |  |tj d S r(   )r"  r   Zmake_sequence_value_infor  r   r   r   r     s    z-SymbolicShapeInference._infer_SplitToSequencec                    s  |  |d t| j}|dk r>t|d}| |dd ks\tn| |d}t|dd ks\t|d krdd  D }| jdkrdd  D }t|dkrt	d|j
 d	|j d
|  n fdd|D }g }tt D ]}||kr| |  qڈ | dkst | tkst| jdkrt | tkrt	d|j
 d	|j d |  d| d	 q| j|jd  }|t|jd | j|jd  jjj| | | d S )Nr   r  r  rF   c                 S   s   g | ]}|d kr|qS r  r   r   r   r   r   r     s      z9SymbolicShapeInference._infer_Squeeze.<locals>.<listcomp>c                 S   s   g | ]}t |tkr|qS r   )r   r1   r   r   r   r   r     s      z+Symbolic dimensions in input shape of op: 'z	' node: 'z;'. Assuming the following dimensions are never equal to 1: c                    s   g | ]}t |t qS r   r  r  r  r   r   r     s     z'. Assuming the dimension 'z' at index z of the input to be equal to 1.)r5  rD   r
  r   r@  r   r   rG   r  r&  rQ  r   r+  r:  r   r1   r  rR  r  r   r  r  r   r)   r  )r   r   r!  r  r  Zsymbolic_dimensionsr3   r+   r   r#  r   r     sD    


$$z%SymbolicShapeInference._infer_Squeezec           	      C   s   |  |d}g }|d k	rX| |d}t|D ]\}}|||  }|| q,| | n| | |d|}| j|jd  }|	t
|jd |jjjt| d S rE   )r@  r;  rA  r:  rC  r  r7  r  rR  r  r   r  r   r   r)   r5   )	r   r   Zrepeats_valuerB  r  r3   r$   r1  r+   r   r   r   r     s"    z"SymbolicShapeInference._infer_Tilec           	      C   s   |  |d}tt|dd|}| |d}t| jdkrDt|d}n| |d }|d krf| |}nt|}t	|t
tfkr|||< n&| |d}|||< | | t|}tt|jD ]4}| j|j|  }|t|j| |j	jj| qd S )Nr   r=   r  rD  r  rF   )r7  r?   r   r5  rD   r
  rv  r  rL   r   r1   r   r;  rC  r5   r+  rG   rR  r  r  r   r  r   r)   )	r   r   r>   r=   r.  r  rB  rY  r+   r   r   r   r     s(    
z"SymbolicShapeInference._infer_TopKc                 C   s~   |j d | jkrz| |d}t|dtttt|}| j|j d  }tj	t
|j| t|d  | j|jd < d S )Nr   perm)r  )r  r<  r5  r   reversedrA   r+  rG   r7   Z	transposer  ZreshapetupleflattentolistrR  )r   r   r  r$  r  r   r   r   r   <  s    $z'SymbolicShapeInference._infer_Transposec           	         s  |  |d}t| j}|dk r>t|d}| |dd ks\tn| |d}t|dd ks\tt|t|   fdd|D }d}g }t D ].}||kr|d q|||  |d7 }q| j	|j
d  }|t|j
d | j	|jd  jjj| | | d S )Nr   r  r  rF   c                    s   g | ]}t | qS r   )r?   r  Zoutput_rankr   r   r   R  s     z;SymbolicShapeInference._infer_Unsqueeze.<locals>.<listcomp>)r5  rD   r
  r   r@  r   rG   r+  r:  r  rR  r  r   r  r  r   r   r)   r  )	r   r   r  r!  r  Z
input_axisr  r3   r+   r   r)  r   r   E  s2    


z'SymbolicShapeInference._infer_Unsqueezec                 C   s   d }t |dd k	rtjj}nt |dd k	r2tjj}|d k	s>t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  r   r.   rR  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   h  s    
z$SymbolicShapeInference._infer_ZipMapc                 C   s  |  |d}|  |d}| |d}|d k	r<t|dks<t|d k	rL|d n|d }|r~t|dkr~t|d}|d k	rt|dkstt|d |d< nt|trt|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rf|jd rf|  |dng }|
r,t|
dkr,|rt|dkr|d	 |
d< nd|	rt|	dkrt|	d trt|
d tr|	d |
d  |
d< n|
d  d
|	d  |
d< | j|jd  }|t|j||
 nRt|d}|	d | }d|	d ||	d |g}| j|jd  }|t|j|| d S )Nr   rF   rL  r  qkv_hidden_sizesr     r  r  +r  )r5  r6  rG   r   r   r1   rq  r  r  r   r   r)   rR  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   w  sD    

,, 
z'SymbolicShapeInference._infer_Attentionc                 C   s   t |d}| |d}|d k	r8|d ||d |d g}n<| |d}|d k	rXt|dks\t|d ||d |d g}| j|jd  jjj	}| j|j
d  }|t|j
d || d S )Nr  r  r   rF   r  )r   r6  r5  rG   r   r  r  r   r   r)   rR  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 k	r<t|dks<t|d k	rL|d n|d }|rt|dkrt|d}|d k	rt|dkstt|d |d< nt|trt|d |d< | j|jd  j	j
j}| j|jd  }|t|jd || d S )Nr   rF   rL  r+  r  )r5  r6  rG   r   r   r1   rq  r  r  r   r   r)   rR  r  r   r  )	r   r   r"   r.  r/  r0  r1  r  r+   r   r   r   r     s     

z-SymbolicShapeInference._infer_PackedAttentionc                 C   s   |  |d}|d k	r&t|dkr&|}n<| |d}|d k	rFt|dksJt|d |d |d  g}| j|jd  jjj}| j|j	d  }|
t|j	d || d S )NrL  r   r  rF   r  )r6  rG   r5  r   r  r  r   r   r)   rR  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 )Nr   r  Ztoken_countrL  rF   zbatch_size + 1)r5  rG   r  r  r   r   r)   rR  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}|rt|dkr|rt|dkr| j|jd  jjj}| j|jd  }|d |d |d g}|t	
|jd || d S r  )r5  rG   r  r  r   r   r)   rR  r  r   r  )r   r   Zshape_inputZshape_token_offsetr  r+   r  r   r   r   r     s     z,SymbolicShapeInference._infer_RestorePaddingc                 C   s   |  | d S r(   r  r  r   r   r   r     s    z&SymbolicShapeInference._infer_BiasGeluc                 C   s  |  |d}d }d }|d k	rt|dkr| |d}|}|d k	rt|dkr| |d}|d k	rzt|dkrz|d |d< |d }| j|jd  jjj}| j|jd  }|	t
|jd || nt|dkr~t|d trt|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r|d }	t|d}
d }t|dkrt|d trt|d |
 n|d  d	|
 }n|d }| |d
}|d k	r@t|d tr.t|tr.|d | }n|d  d| }|	|
||g}|d k	sZtt|jdkr|jd r|jd r| j|jd  }|	t
|j|| | j|jd  }|	t
|j|| d S )Nr   r  rF   rL  r,  r  *r  /r  r-  )r5  rG   r6  r  r  r   r   r)   rR  r  r   r  rq  r1   r   r   r   )r   r   query_shapeZtotal_sequence_lengthr  Z	key_shaper  Zvalue_shaper+   Z
batch_sizer  r3  r2  r4  r   r   r   r     sZ    
  $

(z0SymbolicShapeInference._infer_MultiHeadAttentionc                 C   s   |  |d}|d k	r|}| j|jd  jjj}|d k	s:t| j|jd  }|t	
|jd || t|jdkr|jd r|jd r| |d}|d k	r| j|jd  }|t	
|j|| | j|jd  }|t	
|j|| d S )Nr   rL  rF   r,  )r5  r  r  r   r   r)   r   rR  r  r   r  rG   r6  r   )r   r   r8  r  r  r+   r2  r   r   r   r   F	  s    "z=SymbolicShapeInference._infer_DecoderMaskedMultiHeadAttentionc                 C   s   |  | d S r(   r5  r  r   r   r   r   \	  s    z&SymbolicShapeInference._infer_FastGeluc                 C   s   |  | d S r(   r5  r  r   r   r   r   _	  s    z"SymbolicShapeInference._infer_Geluc                 C   s   |  | d S r(   r5  r  r   r   r   _infer_QuickGelub	  s    z'SymbolicShapeInference._infer_QuickGeluc                 C   s   |  | d S r(   r  r  r   r   r   r   e	  s    z*SymbolicShapeInference._infer_GemmFastGeluc                 C   s   |  | d S r(   r  r  r   r   r   r   h	  s    z(SymbolicShapeInference._infer_GemmFloat8c                 C   s  |  | t|jdkrt|d}|d kr0d}| |d}|d k	rt|}t||}|d | dd t|| D  }| j|jd  j	j
j}|tjjks|tjjkrtjj}| j|jd  }|t|jd || t|jdkr| j|jd  }|t|jd || d S )NrF   r=   r  r   c                 S   s   g | ]}d qS r  r   )r	   r_  r   r   r   r   u	  s     zDSymbolicShapeInference._infer_LayerNormalization.<locals>.<listcomp>rL  )r  rG   rR  r   r5  r?   r+  r  r  r   r   r)   r-   r  ZFLOAT16ZBFLOAT16r*  r  r   r  )r   r   r=   Zx_shaper>   Z
mean_shapeZ
mean_dtyper+   r   r   r   r   k	  s$    



"z0SymbolicShapeInference._infer_LayerNormalizationc                 C   s   |  | d S r(   r5  r  r   r   r   r   	  s    z1SymbolicShapeInference._infer_LongformerAttentionc                 C   s  |  |d}|  |d}t|dkr0t|dks4t||d f}| j|jd  jjj}| j|jd  }|	t
|jd || t|jdkr|jd r|d g}| j|jd  }|	t
|jd tjj| t|jdkr| j|jd  }|	t
|jd || d S )Nr   rL  rF   )r5  rG   r   r  r  r   r   r)   rR  r  r   r  r-   r  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 )Nr  r   r  r  r   r   r   r   	  s    
z4SymbolicShapeInference._infer_SkipLayerNormalizationc                 C   s   |  | d S r(   r5  r  r   r   r   r   	  s    z'SymbolicShapeInference._infer_GroupNormc                 C   s   |  | d S r(   r5  r  r   r   r   r   	  s    z,SymbolicShapeInference._infer_PagedAttentionc           
      C   sN  | j |jd  jjj}| |d}|d k	rv| j |jd  }|t	|j
|| | j |jd  }|t	|j
|| |jd dkr|jd dkr| |dd n|jd dkr|jd dkstt|d}t|d}| |d}|d k	rJ|d }t|trJt||d|   }	||	 |d< | j |jd  }|t	|jd || d S )Nr   r  rF   rL  r@   r  kv_num_heads)r  r  r   r   r)   r6  rR  r  r   r  r   r  r   r   r5  rq  r1   )
r   r   r  r2  r+   r  r:  r8  Zhidden_sizer3  r   r   r   r   	  s(     


z1SymbolicShapeInference._infer_GroupQueryAttentionc                 C   s   |  | d S r(   )r   r  r   r   r   r   	  s    z-SymbolicShapeInference._infer_SparseAttentionc                 C   s.   |  |dd t|jdkr*|  |dd d S r  r  r  r   r   r   r   	  s    z+SymbolicShapeInference._infer_SkipGroupNormc                 C   s   |  |d}|  |d}|r|rt|d tr|}t|d d |d< | j|jd  }| j|jd  jjj}|	t
|j|| d S r  )r5  rq  r1   r  rR  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   s   |  | d S r(   r5  r  r   r   r   r   	  s    z%SymbolicShapeInference._infer_BiasAddc                 C   s   t |jdkr| | nnt |jdkrJ| j|ddd | j|ddd n>t |jdkr| j|ddd | j|ddd | j|ddd d S )NrF   rL  r   r  r  )rG   rR  r  r  r   r   r   r   	  s    z-SymbolicShapeInference._infer_RotaryEmbeddingc              
   C   s"  t |d}|s td|j dt |d}|s@td|j dddlm} t |d }||}| j|jd  }|t	
|jd tjjg  |d k	rg }g }	tt|jD ]:}
| ||
}|| | j|j|
  jjj}|	| q||||	\}}t|t|  kr&t|jd	 ks\n td| d
t| dt| dt|jd	  d	tt|jd	 D ]@}|d	 }| j|j|  }|t	
|j| || ||  qnnltt|jd	 D ]X}| 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_namerF   z' returned z shapes and z dtypes, but expected z	 outputs.)r   r   r   Zonnxruntime.capi._pybind_stater=  r  r  rR  r  r   r  r-   r  r  r+  rG   r  r5  r:  r   r   r)   r  r5   )r   r   r;  r<  r=  r>  Zshape_infererr+   Zinput_shapesZinput_dtypesr  r"   Zinput_dtypeZoutput_shapesZoutput_dtypesr3   r  r4   r  r   r   r   r   	  sB    



..
z&SymbolicShapeInference._infer_PythonOpc                 C   sP   |  ||}| j|j|  jjj}| j|j|  }|t	|j| || d S r(   )
r5  r  r  r   r   r)   rR  r  r   r  )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|krdS || jkr*dS dS )NFZunk__Tra  )r   r  r   r   r   _is_none_dim
  s    
z#SymbolicShapeInference._is_none_dimc                 C   s    |D ]}|  |r|  S qd S r(   )r?  )r   	out_shapeoutr   r   r   _is_shape_contains_none_dim!
  s    

z2SymbolicShapeInference._is_shape_contains_none_dimc                    s
  |pi _ jjd jdd t _jjjD ]}t|}|d krLq6t	|j
rh|j
jjjjj}n|j
jjj}t|D ](\}}|d kr|t|j||| _q|jdd |D  q6jD ]N}|jkrj| }|jkstj| j|< qtj|dddj|< qt _jj jjd i }	fdd	jjjD ]}
|
|	|
j d
 < qTg }dd t!jjjt!jjj" D t#fddjjj D rjjj}nt$fddjjj D szt%|}jjjD ]Nj d
 krt$fdd|	j d
  D rj  |& q|t%|krt$fddjjj D st'dq|D ]t$fddjD st( d}j)j*krЈj*j)  nj)dkrj+j d
  }t%|j
jjjd
krtj,j-|j
j_nvj)dkrj.dkrj/D ]V}|jdkr0t0|j1t2rZ|j13dn|j1}|j4kr~d}j4|   qq0j5dkrt67j)d j  tjD ]*\}}t67d|||j8krdnd qj)dkr|j+j d
  }t%t9|j
fddt:t%jD }t:j)dkr<dnd
 D ]6  fd d|D }t%|d!krDj;|dd" qDt:t%j D ]}j)d#ksj)d$kr|d%krqj)d&krt%j d!kr֐qj+j |  }|j
}|<d'}|d(krj5dkr|d)kr|jj<d'}|d*krft67d+=j | tt|tj,j>?|j
jjjj nt67d,j |  d-|  nt67d,j |  d|  qt||jjtj,j-k}j5dkr*t67d,j |  dd.tj,j>?|j
jj  j | j kr*t67d/tj j |    d k	rJd ksP@sP|rjArj)d0kr@fd1dt:t%jD }j)dkrjd ks@rjd krBd nB@fd2d|D }t%|d
 dkr
|d
 t%|d
 d k stt%|d! dkr:|d! t%|d! d k sjtn*j)d3krfCd
Dd!g}ng }|rt:t%D ]d d k	rE sq|fd4d|D }t%|d
kr|Fd5d tG||D  q|d_Hnd_Hnd_HjHdk	r*j)j*k	r*|	s*|o2d kp2t%d
k}|rTjIrNJd
nd6nt%d
k	r*K|}|rj+jd
  j
jj}n
|j
jj}|tLM|j|tN| j5d
k	r |rt67d7j) d8j d9|j d: j5dk	r t67d,j |  d|d.|j
jj  d_Hqj5d
k	sDjA	rD|
rt67d;j)j t67d< jD ]4}|j+k	rt67j+|  nt67d=|  	qft67d> j D ]4}|j+k	rt67j+|  nt67d=|  	qjA
r|
st67d?tj    dS qq~d_HdS )@Nr  T)r  c                 S   s   g | ]}t |tkr|qS r   r  r#   r   r   r   r   ;
  s      z6SymbolicShapeInference._infer_impl.<locals>.<listcomp>)r9  Zpositiver  c                    s   dd | j D }g }| jdkr4t| dt| dg}n| jdkrJt| dg}|D ]}dd |jD  t }|jD ]} |j qn|jD ] }| fd	d
|D  q|| |j D ]}|j|kr|	|j qqN|S )Nc                 S   s   h | ]}|r|qS r   r   r2   r   r   r   r\  Q
  s      zISymbolicShapeInference._infer_impl.<locals>.get_prereq.<locals>.<setcomp>rZ   r  r  )r[   rc   r  c                 S   s   h | ]
}|j qS r   r   r2   r   r   r   r\  [
  s     c                    s   g | ]}| kr|qS r   r   r2   Zg_outputs_and_initializersr   r   r   `
  s      zJSymbolicShapeInference._infer_impl.<locals>.get_prereq.<locals>.<listcomp>)
r  rQ  r   r  r   r   r  rR  r   r   )r   namesr  gZg_prereqnr3   )
get_prereqrC  r   rG  P
  s(    






z6SymbolicShapeInference._infer_impl.<locals>.get_prereqr   c                 S   s   h | ]
}|j qS r   r   r2   r   r   r   r\  m
  s     z5SymbolicShapeInference._infer_impl.<locals>.<setcomp>c                    s   g | ]}|j  kqS r   r   r`  sorted_known_vir   r   r   n
  s     c                    s   g | ]}|j  kqS r   r   r`  rH  r   r   r   r
  s     c                    s   g | ]}|r| kqS r   r   r2   rH  r   r   r   v
  s      c                    s   g | ]}|j  kqS r   r   r`  rH  r   r   r   {
  s     zInvalid model with cyclic graphc                    s   g | ]}|r| j kqS r   rP  r2   r   r   r   r   
  s      F)ZConvTransposeZATenzorg.pytorch.atenoperatorr  rL  z: z  Input %s: %s %sr@   rF  c                    s   g | ]}  |qS r   rI  r2   rJ  r   r   r   
  s     rK  c                    s0   g | ](}t |  kr|t |    qS r   r   r   rM  r   r   r   
  s      rF   r  r   r   r  r   r   )r   Zsparse_tensor_typeNr   r   z  {}: sequence of {} {}z  z: sequence of r*  z  Sympy Data: )rS   rh   r`   rV   r\   rG  r]   rT   rj   rH  rX   ZLessZGreaterZLessOrEqualZGreaterOrEqualr_   r^   c                    s   g | ]}  |qS r   rI  r2   rJ  r   r   r   
  s     c                    s    g | ]}t |t    qS r   r   r   r4  r@  r   r   r     s     rW   c                    s    g | ]}t |t    qS r   r   r   rK  r   r   r     s     c                 S   s8   g | ]0\}}|d krt || r(|| n
t|| qS r!  )r0   r   )r	   r   r3   r   r   r   r     s   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: )Or<  r
  r  rf  r  r   r   r  r,   r!   r   r   r)   r   r"   r   rA  r   r  r   r  r  r   r   r   r9   r   r-   r  rT  r  r   rR  rA   r  rz  r   rG   r:  r  r[  rQ  r   r  r  Z	UNDEFINEDrB   r   rq  r   bytesr  r   r   r  r&  r  r'   r+  r'  r   formatr  r  rB  r   r  r5  r?  r?  r	  r{  r   r   r7  r  r   r  r5   )r   Zstart_sympy_datar3   r  Z
input_dimsZi_dimr   r   Zs_mergeZprereq_for_noderF  Zsorted_nodesZold_sorted_nodes_lenZknown_aten_opr+   r
   Zaten_op_namer   rV  rW  rY  Zout_typeZout_type_kindZseq_cls_typeZout_type_undefinedZshapesZdim_idxZis_unknown_opr.  Z	out_dtyperZ  r   )r$   rG  r4  r   rN  r@  r   rI  r   rd  '
  s   





&


 
$ 





*
02

 

(



z"SymbolicShapeInference._infer_implc                 C   s2   | j jjD ]"}|j| jkr
|| j|j  q
d S r(   )r
  r  rR  r   r  r  )r   rR  r   r   r   re  a  s    z-SymbolicShapeInference._update_output_from_vic                 C   sz   t | }|r|dk r"td d S t||||}d}||  |jrN| }q>|  |stt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)rD   r  r  rR   r  r   rd  re  r-   
save_modelr
  r  )r  r   r   r   r   Z
onnx_opsetrj  Zall_shapes_inferredr   r   r   rU  f  s    


z#SymbolicShapeInference.infer_shapes)r@   )F)F)TT)FF)r   r   )r   )F)T)N)r   r   )N)rN  FFr   )|__name__
__module____qualname__r   r	  r  r  r(  r2  r5  r6  r7  r;  r?  r@  rC  r[  rk  rv  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   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   r9  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r?  rB  rd  re  staticmethodrU  r   r   r   r   rR   }   s   
 
-
	b
8
%




D
	)
>;"!	!40#	 0	#-
L
/	  <rR   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)rW  z--auto_mergez:Automatically merge symbolic dims when confliction happens
store_trueF)rW  actiondefaultz	--int_maxzGmaximum value for integer to be treated as boundless for ops like slicerN  )rW  r   rZ  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./)rW  rZ  z--external_data_size_thresholdz$The size threshold for external datai   )argparseArgumentParseradd_argumentr1   
parse_args)parserr   r   r   parse_argumentsx  sf    r`  __main__zinput model: zoutput model z!Doing symbolic shape inference...TF)rP  all_tensors_to_one_filelocationZsize_thresholdZconvert_attributezDone!)N)N)2r[  loggingnumpyr7   r-   r9   r   r   r   	packagingr   parse__version__r   	getLoggerrR  r  r   r   r!   r'   r*   r,   r/   r5   r0   r?   rD   rL   rN   rQ   rR   r`  r  infor  rR  rU  loadr   r   r   r   Zout_mprP  rQ  rb  Zexternal_data_locationZexternal_data_size_thresholdsaver   r   r   r   <module>   s   




                      6



