o
    e                    @   s   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Zd dl	m
Z
 dddZdd Zdd	 Zd
d Zdd Zdd Zg dfddZdd Zdd Zdd ZG dd dZdS )    N)helpernumpy_helpershape_inference)versionc                    s*    fdd| j D }|rt|d S |S )Nc                    s   g | ]	}|j  kr|qS  name).0attr	attr_namer   UD:\Projects\ConvertPro\env\Lib\site-packages\x2paddle/decoder/onnx_shape_inference.py
<listcomp>       z!get_attribute.<locals>.<listcomp>r   )	attributer   Zget_attribute_value)noder   default_valuefoundr   r   r   get_attribute   s   r   c                 C   s&   t | dtkrt| | dS d S )Nvalue)type
WhichOneofstrgetattrdimr   r   r   get_dim_from_type_proto"   s   r   c                 C   s   dd | j jjD S )Nc                 S      g | ]}t |qS r   )r   r	   dr   r   r   r   (   s    z-get_shape_from_type_proto.<locals>.<listcomp>)tensor_typeshaper   )Z
type_protor   r   r   get_shape_from_type_proto'   s   r"   c                 C   s   dd | D S )Nc                 S   s0   g | ]}|d u r
d nt |rt|nt|qS N)
is_literalintr   r	   ir   r   r   r   .   s    "z.get_shape_from_sympy_shape.<locals>.<listcomp>r   )sympy_shaper   r   r   get_shape_from_sympy_shape-   s   r)   c                 C   s*   t | ttjtjtjfv pt| do| jS )N	is_number)	r   r%   npint64Zint32sympyIntegerhasattrr*   r   r   r   r   r$   4   s
   r$   c                 C   s*   | |k r	| | ksJ | dkr| S ||  S Nr   r   )axisrankr   r   r   handle_negative_axis9   s   r3   ) onnxzai.onnxc                 C   s6   t |tkr	|g}| jD ]}|j|v r|j  S qd S r#   )r   listZopset_importdomainr   )mpr7   Zopsetr   r   r   	get_opset>   s   


r9   c                 C   s@   t | tkrt| dksJ | d S t | tjkrt| S | S N   r   )r   r6   lenr+   ndarrayasscalarxr   r   r   	as_scalarG   s   
rA   c                 C   s<   t | tkr| S t | tjkrt| S |r| d u rd S | gS r#   )r   r6   r+   r=   )r@   	keep_noner   r   r   as_listQ   s   rC   c                 C   s4   t | tkrtd}| D ]}|| }q|S | }|S )Nr;   )r   r6   r-   r.   )r@   r   vr   r   r   sympy_reduce_product\   s   

rE   c                   @   s:  e Zd Zd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dddZdd d!Zd"d# Zd$d% Zd&d' Zd(d) Zdd+d,Zdd-d.Zd/d0 Zdd1d2Zdd3d4Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ Z dAdB Z!dCdD Z"dEdF Z#dGdH Z$dIdJ Z%dKdL Z&dMdN Z'dOdP Z(dQdR Z)dSdT Z*dUdV Z+dWdX Z,dYdZ Z-d[d\ Z.d]d^ Z/d_d` Z0dadb Z1dcdd Z2dedf Z3dgdh Z4didj Z5dkdl Z6dmdn Z7dodp Z8dqdr Z9dsdt Z:dudv Z;dwdx Z<dydz Z=d{d| Z>d}d~ Z?dd Z@i fddZAdd ZBeC					*dddZDdS )SymbolicShapeInferencec                 C   s  i d| j d| jd| jd| jd| jd| jd| jd| jd	| jd
| j	d| j d| j
d| j d| j d| jd| jd| ji d| jd| jd| jd| jd| jd| j d| j d| j d| jd| jd| jd| jd| jd| jd | jd!| jd"| j	| j| j| j| j| j| j| j | j!| j | j"| j#| j$| j | j%d#| _&d$| _'i | _(i | _)i | _*|| _+|| _,|| _-|| _.d S )%NAddZArrayFeatureExtractorZAveragePoolZCastZCategoryMapperZCompressConcatZConstantOfShapeZConvZCumSumDivExpandEqualFloorZGatherZGatherElementsZGatherNDIfLoopMatMulMatMulInteger16ZMaxPoolMaxMinMulZNonMaxSuppressionZNonZeroZOneHotZPadRangeZ
ReduceProdReshapeZResizeZRound)ScanZScatterElementsZShapeSizeSliceZSplitSplitToSequenceZSqueezeSubZTileZTopKZ	UnsqueezeWhereZZipMapT)/_infer_symbolic_compute_ops_infer_ArrayFeatureExtractor_infer_Pool_infer_Cast_infer_CategoryMapper_infer_Compress_infer_Concat_infer_ConstantOfShape_infer_Conv_pass_on_shape_and_type_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_ReduceProd_infer_Reshape_infer_Resize_infer_Scan_infer_ScatterElements_infer_Shape_infer_Size_infer_Slice_infer_Split_infer_SplitToSequence_infer_Squeeze_infer_Tile_infer_TopK_infer_Unsqueeze_infer_ZipMapdispatcher_run_suggested_merge_symbolic_dims_input_symbols_auto_merge_guess_output_rank_verbose_int_max_)selfint_max
auto_mergeguess_output_rankverboser   r   r   __init__g   s   	
 !"#
2
zSymbolicShapeInference.__init__Fc           	         s  t  fdd|D sJ t|} j D ]\}}||v r(|| || qd }|D ]
}t|r7|} nq-|d u rJ|D ]}| jv rI|} nq>|d u ra|D ]}t j	| t
jkr`|} nqP|d u r jdkrttdd| t|}dd |D }||t| }|| |D ]9}||krqt|rt|rt|t|ksJ t|rt|n| j|<  j D ]\}}||kr| j|< qq|rԈ jrֈ   d S d S d S )Nc                    s*   g | ]}t |tkr| jv pt|qS r   )r   r   r   r$   r	   sr   r   r   r      s
    z?SymbolicShapeInference._add_suggested_merge.<locals>.<listcomp>r   z9Potential unsafe merge between symbolic expressions: ({}),c                 S   r   r   r<   r   r   r   r   r          )allsetr   itemsremoveaddr$   r   r   r   r-   Symbolr   printformatjoinr6   indexminr%   r   _apply_suggested_merge)	r   symbolsapplykrD   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 ]$}|jjjj	D ]}|j
| j v r:| j |j
 }t|r7t||_q||_
qqd S r#   )r   r6   out_mp_graphinput
value_infor   r    r!   r   	dim_paramr$   r%   Z	dim_value)r   graph_input_onlyr'   r   rD   r   r   r   r      s   z-SymbolicShapeInference._apply_suggested_mergeNc              	      s  t  }|| |jd |_tdd t|jjt|jj	 D  g  fdd}|jj
D ]+}|jdkrVt|d}|jd |_jjj	 |  |j n| |  q3rg| rensar~jdkr~td	 td
d D ddi |d ur| D ]8\}}ttjjjD ]*}	jjj|	 j|krjjj|	 }
jjj|	= jjjt|
j|
jjj| qqtdd jjj	D _tdd tjjjD _jtdd jjj	D  d S )Nr   c                 S      g | ]}|j qS r   r   r&   r   r   r   r      s    z6SymbolicShapeInference._preprocess.<locals>.<listcomp>c                     sV    fddD } | D ]}j jj | |jD ]} | q| q|  S )Nc                    s(   g | ]}t  fd d|jD r|qS )c                    s   g | ]}|r| v qS r   r   r&   definedr   r   r          z^SymbolicShapeInference._preprocess.<locals>._insert_ready_nodes.<locals>.<listcomp>.<listcomp>)r   r   )r	   Zpnr   r   r   r      s    zSSymbolicShapeInference._preprocess.<locals>._insert_ready_nodes.<locals>.<listcomp>)r   r   r   r   CopyFromoutputr   )Zready_nodesZrnor   Zpending_nodesr   r   r   _insert_ready_nodes   s   

z?SymbolicShapeInference._preprocess.<locals>._insert_ready_nodesConstantr   r   z2SymbolicShapeInference: orphaned nodes discarded: c                 S   s    g | ]}|j d  |jd  qS ): r   )op_typer   )r	   nr   r   r   r     s     sep
c                 S      g | ]}|j |fqS r   r   r&   r   r   r   r         c                 S   r   r   r   r&   r   r   r   r     r   c              	   S   s*   g | ]}|j t|j |jt|jfqS r   )r   r   make_tensor_value_infoZ	data_typer6   dimsr&   r   r   r   r     s
    
)r5   
ModelProtor   r   
ClearFieldr   r   r6   r   initializerr   r   r   r   r   r   appendr   r   r   ranger<   r   r   r   r    	elem_typedictinitializers_	known_vi_update)r   in_mpinput_shapesZout_mpr   Zin_ntZ
input_namer!   idxr   r   r   r   _preprocess   sj   





	z"SymbolicShapeInference._preprocessc                    s  t dd  D s[jrYt dksJ dd  D }t|dkrD|d}jdkr9td d|   |  j dd	  | S jdkrUtd
 d  d   d S d S t  fdd D rj d S fdd D t fddD rd j	v sJ d S d S )Nc                 S      g | ]}t |tkqS r   r   r   r   r   r   r   r   $  r   z9SymbolicShapeInference._merge_symbols.<locals>.<listcomp>   c                 S   r   r   r$   r   r   r   r   r   )  r   r;   r   z$dim {} has been merged with value {}Fallow_broadcastz!dim {} has been mergd with dim {}c                       g | ]}| d  kqS r   r   r   r   r   r   r   8  r   c                    s$   g | ]}| j v r j | n|qS r   )r   r   r   r   r   r   :  s    c                    r   r   r   r   )mergedr   r   r   >  r   )
r   r   r<   sumr   r   r   r   _check_merged_dimsr   )r   r   Zis_intZint_dimr   )r   r   r   r   _merge_symbols#  sB   



z%SymbolicShapeInference._merge_symbolsc                 C   s   g }t |}t |}t||}t|D ]Y}||k r!||d |  nd}||k r/||d |  nd}	|dks9||	kr<|	}
n+|	dkrC|}
n$| ||	g}
|
sg| jrY| j||	gdd ntdt| d t|	  |
g| }q|S )Nr;   Tr   zunsupported broadcast between  )r<   maxr   r   r   r   r   r   )r   Zshape1Zshape2	new_shapeZrank1Zrank2Znew_rankr'   Zdim1Zdim2new_dimr   r   r   _broadcast_shapesE  s(   
z(SymbolicShapeInference._broadcast_shapesc                 C   sB   |j | }|| jv rt| j| jS || jv sJ t| j| jS r#   )r   r   r"   r   r   r6   r   r   r   r   r   r   r   r   
_get_shape_  s
   

z!SymbolicShapeInference._get_shapec                 C   s   t | ||S r#   )r<   r   )r   r   r   r   r   r   _get_shape_rankg  s   z&SymbolicShapeInference._get_shape_rankc                 C   sf   g }|  ||D ](}t|tkr%||| jv r| j| ntj|dd qd |ks+J || q|S )NTinteger)r   r   r   r   r   r-   r   )r   r   r   r(   r   r   r   r   _get_sympy_shapej  s   z'SymbolicShapeInference._get_sympy_shapec                 C   sF   |j | }|| jv s|| jv sJ || jv r| j| S t| j| S r#   )r   sympy_data_r   r   to_arrayr   r   r   r   
_get_valuev  s   

z!SymbolicShapeInference._get_valuec                 C   s@   |t |jkr	d S |j| }|| jv s|| jv r| ||S d S r#   )r<   r   r   r   r   r   r   r   r   _try_get_value}  s   
z%SymbolicShapeInference._try_get_valuec                 C   sn   t |D ]0\}}t|s4t|tks4t|}|| jv r&| j| j|  ||< qt|| jvr4|| jt|< qd S r#   )	enumerater$   r   r   r   r   )r   new_sympy_shaper'   r   Zstr_dimr   r   r   _update_computed_dims  s   

z,SymbolicShapeInference._update_computed_dimsc                    s   |j dv }|s:|j dkrtj ntj t|gdfdd|jD  fdd|jD }jj	| t
j_tt|jD ]}|j| }jjj }|s[|	jjj|  |j|< qAd S )N)rV   rN   rY   tmpc                    s   g | ]	}|r j | qS r   r   r&   r   r   r   r     r   zBSymbolicShapeInference._onnx_infer_single_node.<locals>.<listcomp>c                    s   g | ]
} |t jjd qS r#   )r5   TensorProto	UNDEFINEDr&   )make_value_info_funcr   r   r     s    )r   r   make_sequence_value_infor   
make_graphr   r   tmp_mp_r   r   r   infer_shapesr   r<   r   r   r   r   )r   r   Z
skip_infer	tmp_graphi_or   vir   )r   r   r   _onnx_infer_single_node  s&   

"
z.SymbolicShapeInference._onnx_infer_single_nodeTc                    s@   j dkrtd|j|jd |j tdd t|jt|j	 D t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 }d}| j |jfdd|jjjD   j |_|jr| j j }|js|  |r|d |j	|jjj	d t |j	  |d |j|jjj |d |j!|jjj! |d |j|jjj dd |jjjD }t fdd|D }i }	|D ]}
|
|j"v sJ |j"|
 |	|
< q j"#|	 |S )Nr   z6Inferencing subgraph of node {} with output({}...): {}r   c                 S   r   r   r   r&   r   r   r   r     s    z?SymbolicShapeInference._onnx_infer_subgraph.<locals>.<listcomp>c                    s   g | ]}| vr|qS r   r   )r	   r   )subgraph_inputsr   r   r     s
    r   c                    s   g | ]} j | qS r   r   r&   r   r   r   r     r   c                 S   s    g | ]}t |jtjjd qS r#   )r   r   r   r5   r   r   r&   r   r   r   r     s    c                    s   g | ]	}|j  v r|qS r   r   r&   )subgraph_implicit_inputr   r   r     s
    
Fc                    s$   g | ]}|j  vr|j vr|qS r   r   r&   )r   r   r   r   r     s    r   r   r   r   c                 S   s   g | ]}t |jqS r   )r"   r   )r	   r   r   r   r   r     s    c                    s4   g | ]}|r|D ]}t |tkr| jvr|qqS r   )r   r   r   )r	   r   r   r   r   r   r     s    )$r   r   r   r   r   r   r   r6   r   r   r   keysr   r   r   extendr   r   r   r   rF   r   r   r   r   r   copyr   _infer_implr   _update_output_from_vir   r<   r   r   r   )r   r   subgraphuse_node_inputr   symbolic_shape_inferenceall_shapes_inferredZsubgraph_shapesZsubgraph_new_symbolic_dimsZnew_dimsr   r   )r   r   r   r   _onnx_infer_subgraph  s   





z+SymbolicShapeInference._onnx_infer_subgraphc           	         s4   fddt t jD }tdd |D rVt|D ]9\}}t|tjkr(qt|jdkr2d }nt|jdkrAt	t
|}nt|jdksJJ dd |D }|||< qdd |D }t|}|dkr|rt|D ],\}}|d u rtqkt|tkrt||k r|| ||< qkt||ksJ qk|g| ||< qk|S )Nc                       g | ]}  |qS r   )r   r&   r   r   r   r   r     r   z:SymbolicShapeInference._get_int_values.<locals>.<listcomp>c                 S      g | ]}|d uqS r#   r   r	   rD   r   r   r   r     r   r;   r   c                 S   r   r   r%   )r	   vvr   r   r   r     r   c                 S   s$   g | ]}t |tkrt|nd qS r   )r   r6   r<   r  r   r   r   r        $ )r   r<   r   r   r   r   r+   r=   r!   r%   r>   r   r6   )	r   r   	broadcastvaluesr'   rD   new_vZ
values_lenmax_lenr   r	  r   _get_int_values  s0   
z&SymbolicShapeInference._get_int_valuesc                    s   t |jdks	J | j|dd}tdd |D rEdd |D }t|}|r9 fddt| D | j|jd < d S  || j|jd < d S d S )	Nr;   T)r  c                 S   r
  r#   r   r  r   r   r   r     r   zASymbolicShapeInference._compute_on_sympy_data.<locals>.<listcomp>c                 S   r   r   )r   r6   r  r   r   r   r     r   c                    s   g | ]} |qS r   r   )r	   vsop_funcr   r   r     r   r   )r<   r   r  r   anyzipr   )r   r   r  r  Zis_listrC   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J | |dd  d S )Nr;   rU   c                 S   s   | d S r0   r   r?   r   r   r   <lambda>!  s    z<SymbolicShapeInference._pass_on_sympy_data.<locals>.<lambda>)r<   r   r   r  r   r   r   r   r   _pass_on_sympy_data  s   z*SymbolicShapeInference._pass_on_sympy_datac              
   C   sH   | j |jd  }|t|jd | j |jd  jjj| 	|d d S r0   )
r   r   r   r   r   r   r   r    r   r   )r   r   r   r   r   r   re   #  s   
z.SymbolicShapeInference._pass_on_shape_and_typec                 C   sZ   d ||}|| jv r!| j| }t|rtt|}|S |}|S tj|dd| j|< |S )Nz{}_d{}Tr   )r   r   r$   r-   r.   r%   r   r   )r   prefixr   r   rD   r   r   r   _new_symbolic_dim*  s   

z(SymbolicShapeInference._new_symbolic_dimr   c                 C   s(   |  d|jt| jjj|||S )Nz	{}{}_o{}_)r  r   r   r6   r   r   r   r   )r   r   out_idxr   r   r   r   _new_symbolic_dim_from_output3  s
   z4SymbolicShapeInference._new_symbolic_dim_from_outputc                    s    fddt |D S )Nc                    s   g | ]	}  |qS r   )r   r&   r   r  r   r   r   r   9  s    z>SymbolicShapeInference._new_symbolic_shape.<locals>.<listcomp>)r   )r   r2   r   r  r   r!  r   _new_symbolic_shape8  s   z*SymbolicShapeInference._new_symbolic_shapec                 C   s  |  |d}t|jdkr'|  |d}t|d }|| d  }|d |d< nd }t|d}t|}t||d ks<J dd || d  D }t|szt| j|jd  j}t|dkrzt|t|ksgJ dd || d  D || d < |S t|ddg| }t|d	dg| }	d
d t	||D }
t|d}|d u rdgd|  }t|dd
d}|dkr|dkrzdd t	|| d  |	D }dd t	|
|	|D }W n< ty   dd t	|
|	D }Y n*w |dkrg }n"dg| }nt|d| ksJ dd t	|d | ||d  D }t|dd}t|D ];}|| |  }t|dkr0|||  }|rAt||
|  |	|  }n
||
|  |	|  }|d || | < q|S )Nr   r;   r   kernel_shapec                 S   s   g | ]}t | qS r   r   r&   r   r   r   r   M  r   zCSymbolicShapeInference._compute_conv_pool_shape.<locals>.<listcomp>c                 S      g | ]}t |qS r   r-   r.   r   r   r   r   r   T  r   	dilationsstridesc                 S   s    g | ]\}}|d  | d  qS r;   r   )r	   r   r   r   r   r   r   Y  s    padsauto_pads   NOTSETzutf-8ZVALIDNOTSETc                 S   s   g | ]
\}}t ||qS r   )r-   Modr	   r   r   r   r   r   r   b  s    
c                 S   s0   g | ]\}}}t d |d kr|| n|| qS r   r   )r	   r   r   rr   r   r   r   f  s    c                 S   s   g | ]\}}t d || qS r   r.  )r	   r   r   r   r   r   r   l  s    c                 S   s   g | ]\}}|| qS r   r   )r	   p1p2r   r   r   r   v  r   	ceil_mode)r   r<   r   r   r  r"   r   r   r   r  decode	TypeErrorr   r-   ceiling)r   r   r(   ZW_shaper2   r#  Zis_symbolic_dimsr!   r&  r'  Zeffective_kernel_shaper)  r*  ZresidualZ
total_padsr2  r'   Zeffective_input_sizeZstrided_kernel_positionsr   r   r   _compute_conv_pool_shape>  s   
"


$

z/SymbolicShapeInference._compute_conv_pool_shapec                    s>   |r	dd  D  t  fdd D s| j dd d S d S )Nc                 S   s$   g | ]}t |rt|d ks|qS r(  )r$   r%   r   r   r   r   r     r  z=SymbolicShapeInference._check_merged_dims.<locals>.<listcomp>c                    r   r   r   r   r   r   r   r     r   Tr   )r   r   )r   r   r   r   r   r   r     s
   z)SymbolicShapeInference._check_merged_dimsc                 C   s6  |  |d}|  |d}t|}t|}d}d}|dkr |dks"J |dkr-|dkr-g }	n;|dkr?d}|d | |d g }	n)|dkrLd}|d | }	nd}d}| |d d |d d |d g |d g }	| j|| || gdd |d u r| j|jd  jjj}| j|j	d  }
|

t|j	d ||	 d S )Nr   r;   Fr   )r   r<   r   r   r   r   r   r    r   r   r   r   r   )r   r   Zoutput_dtypeZ	lhs_shapeZ	rhs_shapeZlhs_rankZrhs_rankZlhs_reduce_dimZrhs_reduce_dimr   r   r   r   r   _compute_matmul_shape  sR   

z,SymbolicShapeInference._compute_matmul_shapec              	   C   sd   |  |d}|  |d}| j|jd  }|t|jd | j|jd  jjj	|d d |  d S Nr   r;   r8  
r   r   r   r   r   r   r   r   r    r   )r   r   
data_shapeindices_shaper   r   r   r   r]     s   z3SymbolicShapeInference._infer_ArrayFeatureExtractorc              
      sh   dd dd dd dd  fdd fdddd d	d d
d d	}|j |v s)J  |||j   d S )Nc                 S   s   | d | d  S Nr   r;   r   lr   r   r   r        zDSymbolicShapeInference._infer_symbolic_compute_ops.<locals>.<lambda>c                 S   s   | d | d  S r>  r   r?  r   r   r   r    rA  c                 S   s   | d | d kS r>  r   r?  r   r   r   r    rA  c                 S   s   t | d S r0   )r-   floorr?  r   r   r   r    s    c                    sd   t | d rt| d  j k r| d S t | d r(t| d  j k r(| d S t| d | d S r>  )r$   r%   r   r-   rQ   r?  r   r   r   r    s   d c                    s`   t | d rt| d  jkr| d S t | d r&t| d  jkr&| d S t| d | d S r>  )r$   r%   r   r-   rR   r?  r   r   r   r    s   ` c                 S   s   | d | d  S r>  r   r?  r   r   r   r    rA  c                 S   s   | d | d  S r>  r   r?  r   r   r   r    rA  c                 S   s   | d r| d S | d S )Nr   r;   r   r   r?  r   r   r   r    r   )	rG   rI   rK   rL   rQ   rR   rS   rZ   r[   )r   r  )r   r   funcsr   r   r   r\     s   

z2SymbolicShapeInference._infer_symbolic_compute_opsc                 C      |  | d S r#   r  r  r   r   r   r_        z"SymbolicShapeInference._infer_Castc              
   C   sj   | j |jd  jjj}|tjjkrtjj}ntjj}| j |j	d  }|
t|j	d || |d d S r0   )r   r   r   r    r   r5   r   STRINGINT64r   r   r   r   r   )r   r   Z
input_typeoutput_typer   r   r   r   r`     s   

z,SymbolicShapeInference._infer_CategoryMapperc                 C   s   |  |d}| |}t|d}|d kr|g}n|}||t|t|< | j|jd  }|t	|jd | j|j
d  jjj| d S )Nr   r1   )r   r   r   r3   r<   r   r   r   r   r   r   r   r    r   )r   r   input_shapeZcompress_lenr1   output_shaper   r   r   r   ra     s$   

z&SymbolicShapeInference._infer_Compressc                    s  t fddjD rV}tdd |D rVdtdks#J g jjd < ttjD ]#}|| }t	|t
krJjjd  | q2jjd  | q2d}ttdt|}tdtjD ]}|}|r|| ||  ||< qn| tt|D ]>  |krq fddttjD tfddD rq}	t	|	tkr|	rÈj|	 nd | < q|	| < qjjd  }
|
tjd jjd  j	jjt| d S )	Nc                    s   g | ]}| j v qS r   )r   r&   r   r   r   r     r   z8SymbolicShapeInference._infer_Concat.<locals>.<listcomp>c                 S   r
  r#   r   r  r   r   r   r     r   r   r1   r;   c                    s(   g | ]} |r |  qS r   r   )r	   i_idx)r   r   r   r   r   r     s    
c                    r   r   r   r   r   r   r   r     r   )r  r   r  r   r   r   r   r   r<   r   r6   r   r   r   r3   r   r   r   r   r   r   r   r   r    r   r)   )r   r   r  r'   r   r(   r1   rM  rJ  r   r   r   )r   r   r   r   r   rb     sN   



z$SymbolicShapeInference._infer_Concatc                 C   sL   |  |}| | | j|jd  }|t|jd |jjj	t
| d S r0   )r6  r   r   r   r   r   r   r   r    r   r)   r   r   r(   r   r   r   r   rd     s   

z"SymbolicShapeInference._infer_Convc                 C   s   |  |d }| j|jd  }|d urPt|tkr|g}| | |jjjtj	j
krOtdd |D rOtjdd |D tjdtt|dd | j|jd < n
| | |d|}|t|jd |jjjt| d S )Nr   c                 S   r   r   r   r	   r@   r   r   r   r   '  r   zASymbolicShapeInference._infer_ConstantOfShape.<locals>.<listcomp>c                 S   r   r   r  rO  r   r   r   r   )  r   )Zdtyper   )r  r   r   r   r6   r   r    r   r5   r   rH  r   r+   Zonesr,   r   r   r   r   r"  r   r   r   r   r)   rN  r   r   r   rc     s6   

z-SymbolicShapeInference._infer_ConstantOfShapec                 C   s~   |  |d}|d ur=| | | |d}| |t|}| j|jd  }|t	|jd | j|j
d  jjj| d S d S r:   )r   r   r   r   r)   r   r   r   r   r   r   r   r    r   )r   r   Zexpand_to_shaper!   r   r   r   r   r   rf   6  s    
z$SymbolicShapeInference._infer_Expandc              
      sD  |  |d}tt|ddt|}|  |d}| j|jd  }|t|jd |j	j
j|d | | ||d d    |jd | jv rdt|ddksOJ | |d}| j|jd   t	 tkrt	|tjkrt|jdkr fdd|D | j|jd < d S  t| | j|jd < d S |dksJ  | j|jd < d S d S )Nr   r1   r;   c                    s   g | ]} t | qS r   r  r&   datar   r   r   U  r   z8SymbolicShapeInference._infer_Gather.<locals>.<listcomp>)r   r3   r   r<   r   r   r   r   r   r   r    r   r   r   r   r6   r+   r=   r!   r%   )r   r   r<  r1   r=  r   r   r   rP  r   rg   C  s>   
z$SymbolicShapeInference._infer_Gatherc                 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   rh   \     z,SymbolicShapeInference._infer_GatherElementsc           	      C   s   |  |d}t|}|  |d}t|}|d }t|r ||ks"J |d d ||d   }| j|jd  }|t|jd | j|jd  j	j
j| d S r:  )r   r<   r$   r   r   r   r   r   r   r   r    r   )	r   r   r<  Z	data_rankr=  Zindices_rankZlast_index_dimensionr   r   r   r   r   ri   c  s$   z&SymbolicShapeInference._infer_GatherNDc           	      C   s@  t |dt |dg}| |d}|d ur+|dkr"|d |d  n	|d |d  t|D ]n\}}| j||dd}tt|jD ]Z}| j|j|  }|dkr_||j|  |j| |_	nt
dd t|jjjj|j| jjjjD sxJ |d ur||dkrdndkr|j| j	|jv r|j|j| j	 | j|j	< qBq/d S )	NZthen_branchZelse_branchr   r;   F)r  c                 S   s   g | ]\}}||kqS r   r   )r	   Zd1Zd2r   r   r   r     s    z4SymbolicShapeInference._infer_If.<locals>.<listcomp>)r   r   r   r   r  r   r<   r   r   r   r   r  r   r    r!   r   r   )	r   r   Z	subgraphsZcondZi_subr  Zsubgraph_inferZi_outr   r   r   r   rj   q  sL   
z SymbolicShapeInference._infer_Ifc                 C   s  t |d}t|jt|jksJ t|jD ]\}}|j}|| j|j|   ||_q| || | |}t|jd }t	t|j
D ]C}| j|j
|  }||j
|d   ||kr|j
|d  jjjj}	|jjjd |jjjj}
||
 _|
t|	 |j
| |_qEd S )Nbodyr   r;   r   )r   r<   r   r   r   r   r   r  r   r   r   r   r    r!   r   r   r   r   r   r6   )r   r   r  r'   sisubgraph_nameZloop_iter_dimZnum_loop_carriedr   Zsubgraph_vi_dimZvi_dimr   r   r   rk     s4   


z"SymbolicShapeInference._infer_Loopc                 C   rD  r#   )r9  r  r   r   r   rl     rF  z$SymbolicShapeInference._infer_MatMulc                 C   s   |  |tjj d S r#   )r9  r5   r   ZINT32r  r   r   r   rm     s   z+SymbolicShapeInference._infer_MatMulIntegerc                 C   s@   |  |}| j|jd  }|t|jd tjj|dg d S )Nr      )	r   r   r   r   r   r   r5   r   rH  )r   r   selectedr   r   r   r   rn     s   
z/SymbolicShapeInference._infer_NonMaxSuppressionc                 C   sR   |  |d}| |dd}| j|jd  }|t|jd |jjj	||g d S r>  )
r   r   r   r   r   r   r   r   r    r   )r   r   Z
input_rankZnz_lenr   r   r   r   ro     s   z%SymbolicShapeInference._infer_NonZeroc                 C   s   |  |d}| |d}t|dd}t|t|d }t|d | t|s*| |n|g ||d   }| j|j	d  }|
t|j	d | j|jd  jjj| d S )Nr   r;   r1   r8  r   )r   r   r   r3   r<   r)   r$   r   r   r   r   r   r   r   r   r    r   )r   r   r(   depthr1   r   r   r   r   r   rp     s&   
z$SymbolicShapeInference._infer_OneHotc           	      C   s   t | jdkrt|d}n| |d}| j|jd  }t|j}t|dks*d |v r}| 	|d}t|}|d ur[t|d| ksBJ dd t
||d | ||d  D }| | n| ||}| j|jd  jjj}|t|jd |t| d S d S )N
   r)  r;   r   r   c                 S   s   g | ]\}}}|| | qS r   r   )r	   r   Zpad_upZpad_downr   r   r   r     s    
z5SymbolicShapeInference._infer_Pad.<locals>.<listcomp>)r9   r   r   r   r   r   r"   r   r<   r   r  r   r"  r   r    r   r   r   r   r)   )	r   r   r)  r   rK  r(   r2   r   Z	output_tpr   r   r   rq     s4   

z!SymbolicShapeInference._infer_Padc              	   C   sR   |  |}| | |jD ]}|sq| j| }|t||jjj	t
| qd S r#   )r6  r   r   r   r   r   r   r   r    r   r)   )r   r   r(   r   r   r   r   r   r^     s   



z"SymbolicShapeInference._infer_Poolc           	      C   s   | j |jd  }| |}tdd |D r7t|d }t|d }t|d }tt|| | dg}n| |}| j	| g}| 
| |t|jd | j |jd  jjjt| d S )Nr   c                 S   r
  r#   r   r&   r   r   r   r     r   z7SymbolicShapeInference._infer_Range.<locals>.<listcomp>r;   r   )r   r   r  r   rA   r-   rQ   r5  r   r   r   r   r   r   r   r   r    r   r)   )	r   r   r   Z
input_datastartlimitdeltar   r   r   r   r   rr     s"   


z#SymbolicShapeInference._infer_Rangec                 C   s`   t |d}t |d}|dkr*|dgkr,| |d }|d ur.t|| j|jd < d S d S d S d S )NaxesZkeepdimsr   )r   r  rE   r   r   )r   r   r]  Z	keep_dimsrQ  r   r   r   rs     s   

z(SymbolicShapeInference._infer_ReduceProdc                 C   s  |  |d}| j|jd  }|d u rA| |d}t|dks J |d }t|s*J |t|jd |j	j
jt| || n| |d}| |d}td}|D ]}	||	 }qSg }
d}td}t|D ]7\}}	t	|	tjkrw|
|	 n|	dkr|
||  |||  }n|
|	 |	dkr|}qf|	dkr||	 }qf|
ddk sJ d|
v r|| }||
|< | |
 |t|jd |j	j
jt|
 | | d S )Nr;   r   r8  r   )r   r   r   r   r<   r$   r   r   r   r   r    r   r)   r"  r   r%   r   r-   r   r   countr   r  )r   r   Zshape_valuer   Zshape_shapeZ
shape_rankrJ  input_sympy_shapetotalr   r   Zdeferred_dim_idxZnon_deferred_sizer'   r   r   r   r   rt     s^   



z%SymbolicShapeInference._infer_Reshapec                 C   s  | j |jd  }| |d}t| jdkrJ| |d}|d urHdd t||D }| | |t	
|jd | j |jd  jjjt| d S d S | |d}| |d}| |d}|d urmdd |D }| | nT|d urt|}t|d	d
krt|d| ksJ t|d | }	t||d  }
n
dg| }	dg| }
t|}dd t||	|
|D }| | n
| | |d|}|t	
|jd | j |jd  jjjt| d S )Nr   rY  r;   c                 S   s$   g | ]\}}t t || qS r   r-   simplifyrB  r-  r   r   r   r   I  s    z8SymbolicShapeInference._infer_Resize.<locals>.<listcomp>r   rV  c                 S   s   g | ]
}t t |qS r   ra  r   r   r   r   r   X  s    Zcoordinate_transformation_modeZtf_crop_and_resizec              	   S   s0   g | ]\}}}}t t |||  | qS r   ra  )r	   r   rZ  endscaler   r   r   r   g  s    
)r   r   r   r9   r   r   r  r   r   r   r   r   r   r    r   r)   r<   r   r6   r"  r   )r   r   r   r_  scalesr   Zroisizesr2   Z	roi_startZroi_endr   r   r   ru   C  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s3J |jd t j }t|D ]*\}}|j}|j j|   |krh|jjj	j
}	|	|	||    ||_qA | t j }
t  ddg|
 }tj jd  j|d  }	t jD ]M\}}j| }|krt|j| j}t||  t|d	 }|d | |	g ||d   }|t||j| jjj| n||j|  ||_qd S )
NrS  num_scan_inputsscan_input_axesr   c              	      s&   g | ]\}}t | | qS r   )r3   r   )r	   r'   axr   Znum_scan_statesr   r   r   r   }  s    z6SymbolicShapeInference._infer_Scan.<locals>.<listcomp>scan_output_axesr8  r;   )r   r<   r   r   r   r   r   r   r    r!   r   r   r  r   r"   r3   r   r   r   )r   r   r  rg  rh  r   r'   rT  rU  Zscan_input_dimZnum_scan_outputsrk  r   r   r!   r   r   rj  r   rv   w  sd   




z"SymbolicShapeInference._infer_Scanc                 C   sL   |  |d}| j|jd  }|t|jd | j|jd  jjj	| d S r0   r;  )r   r   r<  r   r   r   r   rw     rR  z-SymbolicShapeInference._infer_ScatterElementsc                 C   s   |  |d| j|jd < d S r0   )r   r   r   r  r   r   r   rx     s   z#SymbolicShapeInference._infer_Shapec                 C   sN   |  |d}t|| j|jd < | j|jd  t|jd tj	j
g  d S r0   )r   rE   r   r   r   r   r   r   r5   r   rH  )r   r   r(   r   r   r   ry     s   z"SymbolicShapeInference._infer_Sizec              
   C   s  t | jdkrt|d}t|d}t|d}dgt| }n`t| |ddd}t| |ddd}| |d	}| |d
}|d u rY|d u rJ|d u sYttdt|d urT|n|}|d u rr|d u re|d u srdgt|d urn|n| }t|dd}t|dd}| |d}|d u s|d u r|d u rtt|D ]}| 	|d|||< qnt
|}|D ]}| 	|d|||< qnt||||D ]\}}}	}
t|t|}t|	r|	| jkr|| }	nz|	| j kr|dkrdnd}	nkt|| r|	dk r|	||  }	t|	|| }	nR|	dkr|	dkrt|	|| n|	}	n=|| |	 }	n6t|| r-t|	|| }	n&z|	|| kr9|| }	W n tyR   td|	||  || }	Y nw t|ret|dk re|| | }|	| |
 |
dkrqdnd |
 ||< q| | | j|jd  }|t|jd |jjjt
| |jd | j v rdg|ksJ t|dksJ t|dksJ | j |jd  |d |d  | j |jd < d S d S )N	   r]  startsendsr;   T)rB   r   rV     r   r8  z/Unable to determine if {} <= {}, treat as equal)!r9   r   r   r<   rC   r   r6   r   r   r   r)   r  r3   r$   r   r   r-   rR   	Exceptionr   r   r%   r   r   r   r   r   r   r   r    r   r   r   )r   r   r]  rm  rn  Zstepsr   r'   r   er   r   r   r   r   r   rz     s   









(
z#SymbolicShapeInference._infer_Slicec           	      C   s   |  |d}tt|ddt|}t|d}|s/t|j}|| t| g| }| | ndd |D }tt|D ]8}| j	|j|  }|
||j| | j	|jd  jjjt|d | || g ||d d    || j	|j< q<d S )Nr   r1   splitc                 S   r$  r   r%  r   r   r   r   r     r   z>SymbolicShapeInference._infer_Split_Common.<locals>.<listcomp>r;   )r   r3   r   r<   r   r-   r.   r   r   r   r   r   r   r    r   r)   r   )	r   r   r   r_  r1   rr  Znum_outputsr   r   r   r   r   _infer_Split_Common  s@   


z*SymbolicShapeInference._infer_Split_Commonc                 C      |  |tj d S r#   )rs  r   r   r  r   r   r   r{        z#SymbolicShapeInference._infer_Splitc                 C   rt  r#   )rs  r   r   r  r   r   r   r|   !  ru  z-SymbolicShapeInference._infer_SplitToSequencec                 C   rD  r#   rE  r  r   r   r   r}   $  rF  z%SymbolicShapeInference._infer_Squeezec           	      C   s   |  |d}| |d}g }t|D ]\}}|||  }|| q| | | j|jd  }|t	|jd |j
jjt| d S r:   )r   r   r   r   r   r   r   r   r   r   r   r    r   r)   )	r   r   Zrepeats_valuer_  r   r'   r   r   r   r   r   r   r~   '  s   
z"SymbolicShapeInference._infer_Tilec           	      C   s   |  |d}tt|dd|}| |d}t| jdkr"t|d}n| |d }|d kr3| |}nt|}t	|t
tfv rD|||< n| |d}|||< | | t|}tt|jD ]}| j|j|  }|t|j| |j	jj| q^d S )Nr   r1   r8  rl  r   r;   )r   r3   r   r   r9   r   r  r   rA   r   r%   r   r   r   r)   r   r<   r   r   r   r   r   r    r   )	r   r   r2   r1   r   r   r   r   r   r   r   r   r   5  s6   

z"SymbolicShapeInference._infer_TopKc                 C   rD  r#   rE  r  r   r   r   r   T  rF  z'SymbolicShapeInference._infer_Unsqueezec                 C   s   d }t |dd urtjj}nt |dd urtjj}|d usJ t }|jd |_tjj|j	j
jjjj_||j	j
jj_| j|jd  }|| d S )NZclasslabels_int64sZclasslabels_stringsr   )r   r5   r   rH  rG  ZValueInfoProtor   r   FLOATr   Zsequence_typer   Zmap_typeZ
value_typer    Zkey_typer   r   )r   r   Zmap_key_typeZnew_vir   r   r   r   r   W  s   
z$SymbolicShapeInference._infer_ZipMapc              
      s  |_ jjd jdd t _jjjD ]1}|jj	j
j}tt|D ]}t|| d u r;|j||| _q'jdd t|jD  qjD ]&}|jv rjj| }|jv saJ j| j|< qNtj|ddj|< qNt _jj jjd jjjD ]tfddjD sJ  jj v rj j  njd	v rЈj!j"d
  }t|jj	j
jd
krtj#j$|jj	_%j&dkrt'jd j  t(jD ]\}}	t'd)||	|	j*v rdnd qjdv rGj!j"d
  }tt|jfddttjD }
tjdv r'dnd
 D ]  fdd|
D }t|dkrEj+|dd q+ttj"D ]}j!j"|  }|j}|,d}|dkrm|dkrmqNt|j|j	j%tj#j$k}j&dkrt'd)j"| t-|jj	j% j"| j v rt'dt-j j"|    d v s|r;j.rjjdv rfddttjD }jdv rd v r/d fdd|D }t|d
 dkr|d
 t|d
 d k sJ t|d dkr|d t|d d k sJ njdkr'0d
1dg}ng }|rfttD ]/ d ur=q2fdd|D }tdd |D sSJ 2d d t3||D  q2d_4nd!_4nd!_4j4d!krjj vr|otd
k}|rj5r6d
nd"ntd
kr7|}|t89|jj!jd
  jj	j%t:| j&d
kr|rt'd#)jj|j j&dkrt'd)j"| t-||jj	j% d_4qNj&d
ksj.r|r7t'd$j d j  t'd% jD ]
}t'j!|  q
t'd& j"D ]
}t'j!|  qj.r7|s7t'd't-j    d!S qNqd!_4dS )(Nr   T)r   c                 S   s   g | ]
}t |tkr|qS r   r   r   r   r   r   r   r  s    z6SymbolicShapeInference._infer_impl.<locals>.<listcomp>r   r   c                    s   g | ]	}|r| j v qS r   r   r&   r   r   r   r     r   )ZConvTransposer   r   r   z  Input {}: {} {}r4   )	rG   rZ   rS   rI   rO   MatMulIntegerrP   r[   Sumc                    r  r   rL  r&   r	  r   r   r     s    )rO   rw  rP   c                    s0   g | ]}t |  kr|t |    qS r   r   r   )r   out_rankr   r   r     s
    r;   r   r   r    Zsparse_tensor_typez  {}: {} {}z  Sympy Data: )
rG   rZ   rS   rI   rO   rw  rP   rH   r[   rx  c                    r  r   rL  r&   r	  r   r   r     s    
c                        g | ]}t |t    qS r   r   r   r   	out_shaper   r   r         rJ   c                    rz  r   r   r   r{  r   r   r     r}  c                 S   s   g | ]}|d kqS r   r   r   r   r   r   r     r   c                 S   s0   g | ]\}}t || r|| nt|| qS r   )r$   r   )r	   r   r'   r   r   r   r     s    Fr8  z3Possible unknown op: {} node: {}, guessing {} shapez*Stopping at incomplete shape inference at znode inputs:znode outputs:z	Merging: );r   r   r   r   r   r   r   r   r   r    r!   r   r   r<   r   r  r   r   r   r"   r   r   r-   r   r5   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r"  r   r   r)   )r   r   Zstart_sympy_datar'   Z
input_dimsZi_dimr   Zs_merger   r   Z	in_shapesZin_dimsr   Zout_typeZout_type_kindZout_type_undefinedZshapesZdim_idxZis_unknown_opr   r   r   )r   r   r   ry  r|  r   r   r  f  sh  

























wz"SymbolicShapeInference._infer_implc                 C   s2   | j jjD ]}|j| jv r|| j|j  qd S r#   )r   r   r   r   r   r   )r   r   r   r   r   r  (  s
   z-SymbolicShapeInference._update_output_from_vic           	      C   s   t tjt dksJ t| }|r|dk rtd d S t||||}d}|j| |d z&|jr9|	| }|js1|
  |sOtd t|j|_W |jjS W |jjS    td t|j|_Y |jjS )Nz1.5.0   zQ[WARNING] Symbolic shape inference only support models of onnx opset 7 and above.F)r   z
!!!!!!!!!!z-[WARNING] Incomplete symbolic shape inference)r   parser5   __version__r9   r   rF   r   r   r  r  r   r   r   r   )	r   Zfixed_input_shaper   r   r   r   Z
onnx_opsetr  r  r   r   r   r   -  sF   z#SymbolicShapeInference.infer_shapes)Fr#   )T)r   r   r   )Nr~  FFr   )E__name__
__module____qualname__r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  re   r  r   r"  r6  r   r9  r]   r\   r_   r`   ra   rb   rd   rc   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   r^   rr   rs   rt   ru   rv   rw   rx   ry   rz   rs  r{   r|   r}   r~   r   r   r   r  r  staticmethodr   r   r   r   r   rF   f   s    
<
1
B"

J
	

J
#	+	#	04+S CrF   r#   )argparsenumpyr+   r5   sysr   r   r   r-   	packagingr   r   r   r"   r)   r$   r3   r9   rA   rC   rE   rF   r   r   r   r   <module>   s$   
	

