U
    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   J/tmp/pip-unpacked-wheel-socb9apf/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dd6d7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ۄ Zmddd݄Zndd߄ Zodd ZpdddZqdd ZresdddZtd5S )SymbolicShapeInferencer@   c              ]   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/| j0| j1| j2| j3| j4| j5| j6| j7| j8| j9| j:| j;| j<| j=| j>| j?| j@| jA| j5| jB| jC| jD| jE| j;| jF| jFd\| _G| j| jH| jI| jJ| jK| jK| jL| jM| jN| jJ| jJ| j,| jO| jP| jP| jPd| _Qd| _Ri | _Si | _Ti | _U|| _V|| _W|| _X|| _Yd| _Z|| _[d S )N)\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MinMulZNonMaxSuppressionZNonZeroZOneHotZPadZRangeZ
ReciprocalZ	ReduceSumZ
ReduceProdReshapeZResizeZRoundScanZScatterElementsZ
SequenceAtZSequenceInsertZShapeSizeZSliceZSoftmaxCrossEntropyLossZSoftmaxCrossEntropyLossInternalZ!NegativeLogLikelihoodLossInternalZSplitSplitToSequenceSqueezeSubZTileZTopKZ	Transpose	UnsqueezeWhereZipMapNeg	AttentionBiasAddBiasGeluBiasSplitGeluZDecoderMaskedMultiHeadAttentionEmbedLayerNormalizationFastGeluZGatedRelativePositionBiasGeluGemmFastGelu	GroupNormZSkipGroupNormLayerNormalizationLongformerAttentionMultiHeadAttentionNhwcConvPackedAttentionZPackedMultiHeadAttentionPythonOp	QuickGeluRelativePositionBiasRemovePaddingRestorePaddingRotaryEmbeddingSimplifiedLayerNormalizationSkipLayerNormalization SkipSimplifiedLayerNormalization)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_nearest3dTr   )\_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_EmbedLayerNormalization_infer_FastGelu _infer_GatedRelativePositionBias_infer_Gelu_infer_GemmFastGelu_infer_GroupNorm_infer_SkipGroupNorm_infer_LayerNormalization_infer_LongformerAttention_infer_MultiHeadAttention_infer_NhwcConv_infer_PackedAttention_infer_PackedMultiHeadAttention_infer_PythonOp_infer_RelativePositionBias_infer_RemovePadding_infer_RestorePadding_infer_RotaryEmbedding_infer_SkipLayerNormalization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    `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r4q"t|r^t|r^t|t|ks^tt|rpt|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: ({}),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format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   (  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>7  s      z6SymbolicShapeInference._preprocess.<locals>.<dictcomp>c                 S   s   i | ]}|j |qS r   r   r2   r   r   r   r  8  s      c                 S   s   i | ]}|j |qS r   r   r2   r   r   r   r  9  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  ;  s    )r-   
ModelProtor   CopyFromrA   r   r   graph_inputs_initializerinitializers_	known_vi_update)r   in_mpr   r   r   _preprocess4  s    
z"SymbolicShapeInference._preprocessc                    sN  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   ||  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 rFd jks>td S d S d S )Nc                 S   s   g | ]}t |tkqS r   r   r   r#   r   r   r   r   B  s     z9SymbolicShapeInference._merge_symbols.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   r0   r#   r   r   r   r   E  s     rF   r   z$dim {} has been merged with value {}Fallow_broadcastzdim z has been merged with dim c                    s   g | ]}| d  kqS r   r   r#   r  r   r   r   X  s     c                    s$   g | ]}| j kr j | n|qS r   )r   r#   r   r   r   r   Z  s     c                    s   g | ]}| d  kqS r  r   r#   )mergedr   r   r   [  s     )r   r   rA   r   sumr   r   r   r   debugr   _check_merged_dimsr   )r   r  Zunique_dimsZis_intZint_dimr   )r  r  r   r   _merge_symbolsA  s6    


"
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_shapesb  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  r$  r   r   r   _try_get_shape  s    



z%SymbolicShapeInference._try_get_shapec                 C   s   t | ||S r(   )rG   r&  )r   r   r%  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)r&  r   r   appendr   r9   r   r   )r   r   r%  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   r%  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
  r0  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   r"  Zstr_dimr   r   r   _update_computed_dims  s    
z,SymbolicShapeInference._update_computed_dimsc                    s   |j dk}|sg }t jdkr>|j dkr> fdd|jD }t|gd fdd|jD dd |jD |} jj	| t
 j _tt|jD ]J}|j| }|r jjj }|s|	 jjj|  n||_| j|< qd S )	N)rZ   r[   rb   rd   ri   rk   rm   ro   rp   rq   rr   rt   ru   r{   r|   r}   r   r   r   rx   ry   rv   rs   rn   rl   rw   rz   r~   	   )rg   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>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   r   
make_graphoutputtmp_mp_r   r  r   infer_shapesr  rG   r   r   r   r  )r   r   Z
skip_inferZinitializers	tmp_graphi_oor+   r   r   r   _onnx_infer_single_node  s0    


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 )N   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   r6  )subgraph_inputsr   r   rC    s      r7  c                    s   g | ]} j | qS r   r8  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     s     
 _)r   rF   r   r;  r   r   c                 S   s   g | ]}t |qS r   )r,   r	   r@  r   r   r   r   -  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   rC  .  s        
 )&r   r   r  r   r;  r9  rA   r	  r   r  r   r:  r   extendr   r   r<  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_idr>  symbolic_shape_inferenceZsubgraph_shapesZsubgraph_new_symbolic_dimsZnew_dimsr$   r   )r   rE  rD  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_float9  s    zESymbolicShapeInference._get_int_or_float_values.<locals>.int_or_floatc                    s   g | ]}  |qS r   )r1  r2   r   r   r   r   r   ?  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   @  s     rF   r   c                    s   g | ]}| qS r   r   )r	   vv)rT  rU  r   r   r   K  s     c                 S   s"   g | ]}t |trt|nd qS r  )
isinstancerA   rG   rW  r   r   r   r   M  s     )r  rG   r   r   r2  r   r7   rH   r"   rI   r   r   rY  rA   )
r   r   	broadcastrT  valuesr3   rP   Znew_vZ
values_lenmax_lenr   )rT  rU  r   r   r   _get_int_or_float_values8  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)rZ  rT  )rZ  c                 S   s   g | ]}|d k	qS r(   r   rW  r   r   r   r   h  s     zASymbolicShapeInference._compute_on_sympy_data.<locals>.<listcomp>c                 S   s   g | ]}t |tqS r   )rY  rA   rW  r   r   r   r   i  s     c                    s   g | ]} |qS r   r   )r	   vsop_funcr   r   r   l  s     r   )	rG   r;  r   r9  r]  r   anyzipr-  )r   r   r`  r[  Zis_listrN   r   r_  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   )ra   rg   re   c                 S   s   | d S r<   r   rJ   r   r   r   <lambda>v      z<SymbolicShapeInference._pass_on_sympy_data.<locals>.<lambda>)rG   r   r9  r   rc  r   r   r   r   r   _pass_on_sympy_datap  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  r;  r  r   r  r*   r   r   r&  )r   r   r+   r   r   r   r   x  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_dTr)  )r   r0   r9   r:   r1   r   r   )r   r   r   r"  rP   Znew_symbolic_dimr   r   r   _new_symbolic_dim  s    


z(SymbolicShapeInference._new_symbolic_dimr   c              	   C   s,   |  d|j| jt| jjj|||S )Nz{}{}_{}_o{}_)	rh  r   r9  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   rj  r2   r   ri  r   r   r   r     s     z>SymbolicShapeInference._new_symbolic_shape.<locals>.<listcomp>)r  )r   r>   r   ri  r   rl  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   rB     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   rq  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   Z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  rz  )r	   r   r   r   r   r   r     s    c                 S   s   g | ]\}}|| qS r   r   )r	   p1p2r   r   r   r     s     	ceil_mode)r,  rG   r   r   r   ra  r,   r  r;  rb  decode	TypeErrorr  r9   ceiling)r   r   channels_lastr4   ZW_shaper>   rp  Zspatial_shapeZis_symbolic_dimsr"   rr  rs  Zeffective_kernel_shaperu  rv  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 rt  )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   rn  Fr  )r&  rG   r   r#  r  r  r   r   r   r)   r;  r  r   r  )r   r   output_dtypeZ	lhs_shapeZ	rhs_shapeZ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   r9  
ValueErrorr-   Zonnx_pbTensorProtoDataTypeNamer%   r2  rb  r"   r   TensorShapeProto	Dimensionr   rj  r   r  )r   r   ri  Zdst_typeZsrc_typeZdst_tensor_typeZsrc_tensor_typeZnode_iddiZdsr"  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   rn  
r&  r  r;  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   rd  .  re  zDSymbolicShapeInference._infer_symbolic_compute_ops.<locals>.<lambda>c                 S   s:   t | d | d  tr*t| d | d  S | d | d  S r  rY  floatr1   r  r   r   r   rd  /  s    c                 S   s   | d | d kS r  r   r  r   r   r   rd  2  re  c                 S   s   t | d S r<   )r9   floorr  r   r   r   rd  3  re  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   rd  4  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   rd  7  s
    

c                 S   s:   t | d | d  tr*t| d | d  S | d | d  S r  r  r  r   r   r   rd  :  re  c                 S   s   | d | d  S r  r   r  r   r   r   rd  ;  re  c                 S   s   | d r| d S | d S Nr   rF   rB  r   r  r   r   r   rd  <  re  c                 S   s
   | d  S r<   r   r  r   r   r   rd  =  re  )
rS   rV   rX   rY   r^   r_   r`   rf   rh   rj   )r9  r   rc  )r   r   funcsr   r   r   r   ,  s    

z2SymbolicShapeInference._infer_symbolic_compute_opsc                 C   s   |  | d S r(   )rg  rf  r   r   r   r   B  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INT64r;  r  r   r  r&  )r   r   Z
input_typeoutput_typer+   r   r   r   r   E  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=   )r&  r   rj  r   r?   rG   r  r;  r  r   r  r   r   r   r)   )r   r   input_shapeZcompress_lenr=   output_shaper+   r   r   r   r   N  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   c  s     z8SymbolicShapeInference._infer_Concat.<locals>.<listcomp>c                 S   s   g | ]}|d k	qS r(   r   rW  r   r   r   r   e  s     r=   r   rF   c                    s(   g | ] } |r |  qS r   r&  )r	   i_idx)r$   r   r   r   r   r   z  s      c                    s   g | ]}| d  kqS r  r   r#   r  r   r   r   {  s     )ra  r   r]  r   r   r   r-  r;  r  rG   rY  rA   rI  r+  r,  r?   r4  r  r   r   r   r  r  r   r  r   r)   r5   )r   r   r[  r3   r   r4   r=   r  r  r  r+   r   )r$   r  r   r   r   r   b  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=   )r&  r   r?   rG   r   rj  r  r;  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-  r;  )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   rS  r  r   r   r   r     s     )Zdtyper   )r]  r  r;  r   rA   r4  r   r)   r-   r  r  r   r7   Zonesr8   r   r.  r   r-  rm  r&  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  r4  r  r;  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  r4  r  r;  r  r   r  r   r   r   r)   r5   r  r   r   r   r     s    
z&SymbolicShapeInference._infer_NhwcConvc                 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    re  s   ->rn  r      ,s   ...ro  rF   .   )OrderedDictrB  ,   )r   replacefindsplitr&  rG   r  r   r9   r   collectionsr  r+  r   r  r   r   r)   r;  r  r   r  )r   r   r  Z	mid_indexZleft_equationZnum_operandsZnum_ellipsisZnum_ellipsis_indicesZletter_to_dimZtermsZtermZellipsis_indexr"   r>   r3   letterr   r3  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   r1  r4  r&  r#  r5   r  r;  r  r   r  r   r   r   r)   )r   r   Zexpand_to_shaper"   r  r+   r   r   r   r     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   rS  r2   datar   r   r   4  s     z8SymbolicShapeInference._infer_Gather.<locals>.<listcomp>rn  )r&  r?   r   rG   r  r;  r  r   r  r   r   r   r)   r-  r1  rA   r7   rH   r"   r1   r   )r   r   r  r=   r  r+   r%  r   r  r   r   !  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    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  )r&  rG   r0   r   r  r;  r  r   r  r   r   r   r)   )r   r   r  Z	data_rankr  Zlast_index_dimensionr  r+   r   r   r   r   F  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)rO  )r   r1  rL   r  r2  rR  r  rG   r;  r  r   r  r   r-  )	r   r   	subgraphsZcondZi_subrN  Zsubgraph_inferi_outr+   r   r   r   r   W  s&     z SymbolicShapeInference._infer_Ifc                 C   s\  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|j
d  | j||dd t| |}t	t|j
D ]}| j|j
|  }||j
|d   ||krHt|jrt|j
|d  jjjj}|jjjd	 |jjjj}|| _| t!| |j
| |_qd S )
NbodyrB  FrF   Tr   zDRerun Loop: {}({}...), because of sequence in loop carried variables)rP  r   )"r   rG   r   r   r2  r   r  r  rR  r  r;  r,   r!   r   r   r)   rb  r-   r  r  r   rj  r   r   r"   r   r   r   r  r   rM  r   rI  rA   )r   r   rN  Znum_loop_carriedr3   siZsi_nameZneed_second_inferr  soZso_shapeZsi_shaper  r  r"  Zloop_iter_dimr+   Zsubgraph_vi_dimZvi_dimr   r   r   r   s  s\    


 
 

z"SymbolicShapeInference._infer_Loopc                 C   s   |  | d S r(   r  rf  r   r   r   r     s    z$SymbolicShapeInference._infer_MatMulc                 C   s   |  |tjj d S r(   )r  r-   r  INT32rf  r   r   r   r     s    z+SymbolicShapeInference._infer_MatMulIntegerc                 C   sD   t | |}| j|jd  }|t|jd tjj	|dg d S )Nr   ro  )
r   rj  r  r;  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  )r(  r   rj  r  r;  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=   rn  rB  )r,  r1  r   r?   rG   r5   r0   rj  r  r;  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
   ru  rF   r   rB  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   r1  r,  rG   r   rb  r4  rm  r  r   r   r   r)   r;  r  r   r  r5   )r   r   ru  r4   r>   r3  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  r4  r;  r  r  r   r  r   r   r)   r5   )r   r   r4   r@  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  )r&  r#  r  r   r;  r  r   r  r   r   r)   )r   r   Zshape0r  r  t0r+   r   r   r   r     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   rB  ro  )r,  rG   r1  r   r?   r2  r+  r9   r^   r_   r;  r  r  r   r  r   r   r   r)   r5   )r   r   r4   r>   offsetr   r!  r  r   valr  r  Z
diag_shaper+   r   r   r   r     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   rB  rF   rn  )r,  rG   r   r1  r   rj  r  r;  r  r   r  r-   r  r  r5   )	r   r   r4   r>   Znum_samplesr  Zlast_dimr  r+   r   r   r   r   '  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  rk  r2   rV  r   r   r   ;  s     z=SymbolicShapeInference._infer_aten_pool2d.<locals>.<listcomp>rB  ro  r  rF   )r,  rG   r   r4  r2  r;  r  r-   r  r  r   r   r   r)   r  r   r  r5   )r   r   r4   r3   r@  r+   r)   r   rV  r   r   8  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   ro  rB  )r  r;  rG   r   r  r   r  r   r   r)   r   r1  r(  rm  r,  r?   r5   r-   r  r  )	r   r   r+   keepdimr   r>   r  r"   Zvi1r   r   r   r   D  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,  r1  rG   r   r+  rm  r4  r;  r  r  r   r  r   r   r   r)   r5   )r   r   r4   Z	dimensionsizestepr>   r+   r   r   r   r   e  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   rB  r   )r   r1  r,  r?   rG   rm  r4  r5   r;  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_typer&  rG   r1  r  r   r   r   r)   r;  r  r   r  r   rj  rL   )r   r   r  N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   rB  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   rj  r2   rV  r   r   r     s     )r&  r1  rG   r  r;  r  r   r   r   r)   r  r   r  )r   r   r  r  Zoutput_sizer>   r  r+   r   rV  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   rB  ro  r  rF   input_indexoutput_indexr  rG   r;  )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   rB  )r  r;  r]  r   rL   r9   r^   r  rj  r4  r  r   r  r   r   r   r)   r5   )r   r   r+   
input_datastartlimitdeltar3  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     s     z;SymbolicShapeInference._infer_ReduceSum.<locals>.<listcomp>)r   rD   r   rG   r   r1  r  r;  r   r  r   r  r   r   r)   r5   rm  r(  r&  r2  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   r]  rQ   r-  r;  )r   r   r  r  r  r   r   r   r     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  )r1  r,  r   r  r   r   r   r)   r;  r  r   r  )r   r   Zseq_lenZreal_seq_len	num_headsr  r  r+   r   r   r   r      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   rn  rB  )r1  r  r;  r&  rG   r   r0   r  r   r  r   r   r)   r5   rm  r,  r2  r9   r   r+  countr4  rg  )r   r   shape_valuer+   Zshape_shapeZ
shape_rankinput_sympy_shapetotalr$   r3  Zdeferred_dim_idxZnon_deferred_sizer3   r"  r   r   r   r     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  ry  r   r   r   r   G  s     z8SymbolicShapeInference._infer_Resize.<locals>.<listcomp>rB  ro  c                 S   s   g | ]}t t |qS r   r  r   r   r   r   r   U  s     Zcoordinate_transformation_modeZtf_crop_and_resizec              	   S   s0   g | ](\}}}}t t |||  | qS r   r  )r	   r$   r  endZscaler   r   r   r   a  s   
)r  r;  r,  rD   r   r1  rb  r4  r  r   r  r   r   r   r)   r5   rG   r   r   rA   rm  r(  )r   r   r+   r  Zscalesr3  ZroiZsizesr>   Z	roi_startZroi_endr   r   r   r   A  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?   r(  )r	   r3   Zaxr   Znum_scan_statesr   r   r   r   v  s   z6SymbolicShapeInference._infer_Scan.<locals>.<listcomp>scan_output_axesrn  rF   )r   rG   r   r2  r   r   r  r  r   r   r"   r   r   rR  r;  r'   r?   r   r  r)   )r   r   rN  r  r  rD  r3   r  Zsubgraph_nameZscan_input_dimZnum_scan_outputsr  r@  r+   r"   r"  r   r  r   r   q  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<   )r&  r  r;  r2  r-   r  r  r   rj  r   r   r   r"   r   r  )r   r   r  r+   r  r$   r"  r   r   r   r     s    
z(SymbolicShapeInference._infer_SequenceAtc                 C   s^   | j |jd  }| j |jd  }| j |jd  }|| |jd |_| |d|j|j d S r  )r  r   r;  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-  r;  rf  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-  r;  r  r  r   r  r-   r  r  )r   r   r4   r   r   r   r     s
    z"SymbolicShapeInference._infer_Sizec                    st  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d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sZ|d kr|d krtt|D ]}	|d|||< qpn&t
|}|D ]}	|d|||< qnt||||D ]\}}	}
}||
|| }
t|
r|
jkr || }
n|
j kr"|	dkrdnd}
nbt|| r\|
dk rLtd|
||  }
t|
|| }
n(|
dkr|
dkrt|
|| n|
}
nxt|| rt|
|| }
nXz|
|| s|| }
W n: tk
r   td|
 d||  d || }
Y nX ||	|| }	t|| r8t|	r8tdt|	|| }	t|
|	 | |dkrTdnd | ||< qĈ| j|jd  }|t|jd |jjjt
| |jd j krpdg|krp|d k	rpt|dkrp|d k	rpt|dkrp|d k	rpt|dkrpj |jd  }t|tksJt|t!j"krpt|j#dkrp||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   )rY  argsr9   r_   )r	   r%  )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 rB  z5Expected a sympy.Min() with exactly 2 arguments, got )rA   r  rY  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)rY  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_indexr5  r  startsendsrF   Tr  rB  ro  r  r   rn  zUnable to determine if z <= z, treat as equal)$rD   r   r   rA   r  rG   rN   r1  r,  rj  r5   rb  r0   r   r   r   r9   r_   	Exceptionr   r   r  r4  r  r;  r  r   r  r   r   r)   r   r-  r7   arrayr"   )r   r   r  r  r  r  Zstepsr3  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  r;  r   r   r   r)   r   r"   r  r-   r  rG   r&  r   r  r   )r   r   r+   r)   Zspecified_output_typer  r   r   r   r   Z  s    
z5SymbolicShapeInference._infer_SoftmaxCrossEntropyLossc           	      C   s   |  |d}tt|ddt|}t|d}|s^t|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< qxd S )Nr   r=   r  c                 S   s   g | ]}t |qS r   rq  r   r   r   r   r   t  s     z>SymbolicShapeInference._infer_Split_Common.<locals>.<listcomp>rF   )r,  r?   r   rG   r;  r9   r:   r4  r  r  r  r   r   r   r)   r5   r   )	r   r   Zmake_value_info_funcr  r=   r  Znum_outputsr?  r+   r   r   r   _infer_Split_Commonk  s$    

(z*SymbolicShapeInference._infer_Split_Commonc                 C   s   |  |tj d S r(   )r  r   r  rf  r   r   r   r     s    z#SymbolicShapeInference._infer_Splitc                 C   s   |  |tj d S r(   )r  r   Zmake_sequence_value_inforf  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 rt  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.)r&  rD   r   r   r1  r   r   rG   r   r  r9  r   r  r+  r   r1   r  r;  r  r   r  r   r   r)   rg  )r   r   op_setr  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   )r1  r,  r2  r+  r4  rm  r(  r  r;  r  r   r  r   r   r)   r5   )	r   r   Zrepeats_valuer3  r  r3   r$   r"  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=   rn  r5  r   rF   )r(  r?   r   r&  rD   r   r]  rj  rL   r   r1   r   r,  r4  r5   r  rG   r;  r  r  r   r  r   r)   )	r   r   r>   r=   r  r   r3  r?  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-  r&  r   reversedrA   r  rG   r7   Z	transposer  Zreshapetupleflattentolistr;  )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     s     z;SymbolicShapeInference._infer_Unsqueeze.<locals>.<listcomp>)r&  rD   r   r   r1  r   rG   r  r+  r  r;  r  r   r  r   r   r   r)   rg  )	r   r   r  r   r  Z
input_axisr  r3   r+   r   r  r   r     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.   r;  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 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   rB  ro  qkv_hidden_sizesr     r  rn  +r  )r&  r'  rG   r   r   r1   rY  r  r   r   r   r)   r;  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   #  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   ro  )r   r'  r&  rG   r   r  r   r   r   r)   r;  r  r   r  )r   r   r  Ztoken_offset_shaper  Zquery_layer_shaper  r+   r   r   r   r   P  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   rB  r  ro  )r&  r'  rG   r   r   r1   rY  r  r   r   r   r)   r;  r  r   r  )	r   r   r"   r  r  r  r  r  r+   r   r   r   r   f  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 )NrB  r   r  rF   ro  )r'  rG   r&  r   r  r   r   r   r)   r;  r  r   r  )r   r   r  r  Zshape_queryr  r+   r   r   r   r   x  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   ro  Ztoken_countrB  rF   zbatch_size + 1)r&  rG   r  r   r   r   r)   r;  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  )r&  rG   r  r   r   r   r)   r;  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  rf  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   ro  rF   rB  r	  r  *r  /r  r
  )r&  rG   r'  r  r   r   r   r)   r;  r  r   r  rY  r1   r   r   r   )r   r   query_shapeZtotal_sequence_lengthr  Z	key_shaper  Zvalue_shaper+   Z
batch_sizer  r  r  r  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   rB  rF   r	  )r&  r  r   r   r   r)   r   r;  r  r   r  rG   r'  r   )r   r   r  r  r  r+   r  r   r   r   r     s    "z=SymbolicShapeInference._infer_DecoderMaskedMultiHeadAttentionc                 C   s   |  | d S r(   r  rf  r   r   r   r   	  s    z&SymbolicShapeInference._infer_FastGeluc                 C   s   |  | d S r(   r  rf  r   r   r   r   	  s    z"SymbolicShapeInference._infer_Geluc                 C   s   |  | d S r(   r  rf  r   r   r   _infer_QuickGelu	  s    z'SymbolicShapeInference._infer_QuickGeluc                 C   s   |  | d S r(   r  rf  r   r   r   r   	  s    z*SymbolicShapeInference._infer_GemmFastGeluc                 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=   rn  r   c                 S   s   g | ]}d qS rt  r   )r	   rF  r   r   r   r   	  s     zDSymbolicShapeInference._infer_LayerNormalization.<locals>.<listcomp>rB  )r  rG   r;  r   r&  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   	  s$    



"z0SymbolicShapeInference._infer_LayerNormalizationc                 C   s   |  | d S r(   r  rf  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   rB  rF   )r&  rG   r   r  r   r   r   r)   r;  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 )Nro  r   r  rf  r   r   r   r   @	  s    
z4SymbolicShapeInference._infer_SkipLayerNormalizationc                 C   s   |  | d S r(   r  rf  r   r   r   r   H	  s    z'SymbolicShapeInference._infer_GroupNormc                 C   s.   |  |dd t|jdkr*|  |dd d S r  r  rf  r   r   r   r   K	  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  )r&  rY  r1   r  r;  r   r   r   r)   r  r   r  r   )r   r   r  Z
bias_shaper  r+   r  r   r   r   r   P	  s    z+SymbolicShapeInference._infer_BiasSplitGeluc                 C   s   |  | d S r(   r  rf  r   r   r   r   Z	  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   rB  r   r  ro  )rG   r;  r  rf  r   r   r   r   ]	  s    z-SymbolicShapeInference._infer_RotaryEmbeddingc              	   C   s  t |d}|stt |d}|s$tddlm} t |d }||}| j|jd  }|t	
|jd tjjg  |d k	rhg }g }	tt|jD ]:}
| ||
}|| | j|j|
  jjj}|	| q||||	\}}t|t|  krt|jd ksn ttt|jd D ]@}|d }| j|j|  }|t	
|j| || ||  q$nltt|jd D ]X}| j|j|d   }| || |}t|}t	
|j|d  || |}|| qzd S )Noutput_tensor_typesoutput_tensor_ranksr   )PythonOpShapeInferStore	func_namerF   )r   r   ZAonnxruntime.training.ortmodule._custom_autograd_function_exporterr  r  Zget_shape_inferr  r;  r  r   r  r-   r  r  r  rG   r   r&  r+  r   r   r)   rm  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   j	  s>    




0
z&SymbolicShapeInference._infer_PythonOpc                 C   sP   |  ||}| j|j|  jjj}| j|j|  }|t	|j| || d S r(   )
r&  r  r   r   r   r)   r;  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__TrH  )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8|||j9krdnd qj)dkrj+j d
  }t%t:|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rHj<|dd" qHt;t%j D ]x}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rjt67d+8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.8j | t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|rt67d78j)j|j j5dk	rt67d.8j | t||j
jj d_Hqj5d
k	s6jA	r6|	rt67d8j) d j  t67d9 jD ]4}|j+k	rt67j+|  nt67d:|  	q`t67d; j D ]4}|j+k	rt67j+|  nt67d:|  	qjA	r|	st67d<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>)r*  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   rC  	  s      zISymbolicShapeInference._infer_impl.<locals>.get_prereq.<locals>.<setcomp>rZ   r  r  )r[   rb   r  c                 S   s   h | ]
}|j qS r   r   r2   r   r   r   rC  	  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   r9  r   r	  r   r   r  r;  r   r   )r   namesr  gZg_prereqnr3   )
get_prereqr  r   r#  	  s(    






z6SymbolicShapeInference._infer_impl.<locals>.get_prereqr   c                 S   s   h | ]
}|j qS r   r   r2   r   r   r   rC  	  s     z5SymbolicShapeInference._infer_impl.<locals>.<setcomp>c                    s   g | ]}|j  kqS r   r   rG  sorted_known_vir   r   r   	  s     c                    s   g | ]}|j  kqS r   r   rG  r$  r   r   r   	  s     c                    s   g | ]}|r| kqS r   r   r2   r$  r   r   r   	  s      c                    s   g | ]}|j  kqS r   r   rG  r$  r   r   r   	  s     zInvalid model with cyclic graphc                    s   g | ]}|r| j kqS r   r8  r2   r   r   r   r   
  s      F)ZConvTransposeZATenzorg.pytorch.atenoperatorrw  rB  z: z  Input {}: {} {}r@   )	rS   rf   r`   rV   r\   MatMulIntegerr]   rh   Sumc                    s   g | ]}  |qS r   r  r2   rV  r   r   r   0
  s     )r\   r'  r]   c                    s0   g | ](}t |  kr|t |    qS r   r   r   )r$   out_rankr   r   r   2
  s      rF   r  r   r   r  r~   r   )r   Zsparse_tensor_typeNr   r   z  {}: sequence of {} {}z  z: sequence of z  {}: {} {}z  Sympy Data: )rS   rf   r`   rV   r\   r'  r]   rT   rh   r(  rX   ZLessZGreaterZLessOrEqualZGreaterOrEqualr_   r^   c                    s   g | ]}  |qS r   r  r2   rV  r   r   r   
  s     c                    s    g | ]}t |t    qS r   r   r   r%  r  r   r   r   
  s     rW   c                    s    g | ]}t |t    qS r   r   r   r*  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   rn  z3Possible unknown op: {} node: {}, guessing {} shapez*Stopping at incomplete shape inference at znode inputs:znot in known_vi_ for znode outputs:z	Merging: )Or-  r   r   rM  r   r   r   r   r,   r!   r   r   r)   r   r"   r   r2  r   rh  r   r   r  r   r   r   r9   r   r-   r  r<  r  r   r;  rA   r	  ra  r   rG   r+  r  rA  r9  r   r  r  	UNDEFINEDrB   r   rY  r   bytesr  r   r   r   r  r   r
  r'   r  r  r   r  r  r  r   r   r&  r0  r  r   rb  r   r   r(  rm  r   r  r5   )r   Zstart_sympy_datar3   r  Z
input_dimsZi_dimr   r   Zs_mergeZprereq_for_noder"  Zsorted_nodesZold_sorted_nodes_lenZknown_aten_opr+   r
   Zaten_op_namer   Z	in_shapesZin_dimsr?  Zout_typeZout_type_kindZseq_cls_typeZout_type_undefinedZshapesZdim_idxZis_unknown_opr  Z	out_dtyper@  r   )r$   r#  r%  r   r)  r  r   r%  r   rK  	  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   r;  r   r  r  )r   r;  r   r   r   rL  
  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   rK  rL  r-   
save_modelr   r  )r  r   r   r   r   Z
onnx_opsetrQ  Zall_shapes_inferredr   r   r   r=  
  s    


z#SymbolicShapeInference.infer_shapes)r@   )F)F)TT)FF)r   r   )r   )F)T)N)r   r   )N)r-  FFr   )u__name__
__module____qualname__r   r   r   r  r  r#  r&  r'  r(  r,  r0  r1  r4  rA  rR  r]  rc  rg  r   rh  rj  rm  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   r   r   r   r  r  r  rK  rL  staticmethodr=  r   r   r   r   rR   }   s   
}
-
!	F
8
%




D

	)>="!	!40#	 0	#-
L
,
	
  J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)r6  z--auto_mergez:Automatically merge symbolic dims when confliction happens
store_trueF)r6  actiondefaultz	--int_maxzGmaximum value for integer to be treated as boundless for ops like slicer-  )r6  r   r9  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./)r6  r9  z--external_data_size_thresholdz$The size threshold for external datai   )argparseArgumentParseradd_argumentr1   
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!)N)N)2r:  loggingZnumpyr7   r-   r9   r   r   r   	packagingr   parse__version__r   	getLoggerr1  r   r   r   r!   r'   r*   r,   r/   r5   r0   r?   rD   rL   rN   rQ   rR   r?  r  infor   r;  r=  loadr   r   r   r   Zout_mpr/  r0  rA  Zexternal_data_locationZexternal_data_size_thresholdsaver   r   r   r   <module>   s   




                     "6



