U
    d6                     @   s$  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ dd Ze	ddd	d
 Z
e	dddd Ze	ddddd Zdd Zdd Zdd Zdd Ze	ddddddd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Ze	ddddd'd( Ze	ddd)d)dd,d*d+ZdS )-    N)symbolic_helper)symbolic_opset9)utilsc                    sp   |st d|d   dkrX fdd|D } jd jd
|d|itjd d	S  jd|d|iS d S )NzEinsum inputs are empty.r   ZBoolc                    s"   g | ]} j d |tjd dqS )CastZLongZto_i)opr   cast_pytorch_to_onnx).0tensorg ?/tmp/pip-unpacked-wheel-ua33x9lu/torch/onnx/symbolic_opset12.py
<listcomp>   s   z!einsum_helper.<locals>.<listcomp>r   EinsumZ
equation_sr   )r   )r   )RuntimeErrortype
scalarTyper   r   r   )r   equationtensorsr   r   r   einsum_helper   s    
r   svc                 C   s   t |}t| ||S N)r   Z_unpack_listr   )r   r   Ztensor_listr   r   r   r   einsum!   s    
r   c                 C   sF   |   |   kr6| jd|tj|    d}t| d||gS )Nr   r   zi,j->ij)r   r   r   r   r   r   r   inputotherr   r   r   outer'   s    r   fic                 C   sb   t |d |s|S td | jdt|d}| jdtdd}| jd|||dd\}}|S )	NdropoutzDropout is a training op and should not be exported in inference mode. For inference, make sure to call eval() on the model and to export it with param training=False.ConstantZvalue_tTZDropout   )outputs)r   Zcheck_training_modewarningswarnr   torchr
   )r   r   pZtraintr_r   r   r   r!   3   s    r!   c                 C   sf   t |d}dddg}|| }t |d}|  rL| jd||||d}n| jd|||||d}|S )Nr    nonemeansumZNegativeLogLikelihoodLossZreduction_sZignore_index_i)r   _maybe_get_constnode
mustBeNoner   )r   selftargetweight	reductionignore_indexreduction_valsZnlllossr   r   r   nll_lossC   s*    
	r:   c                 C   s   t | |||||S r   r:   r   r4   r5   r6   r7   r8   r   r   r   
nll_loss2dc   s    r=   c                 C   s   t | |||||S r   r;   r<   r   r   r   nll_loss_ndg   s    r>   c           	      C   s   t |d}dddg}|| }t |d}|dkr:tdt |d}|  rh| jd||||d	}n| jd|||||d	}|S )
Nr    r-   r.   r/   r   g        z2Unsupported: ONNX does not support label_smoothingZSoftmaxCrossEntropyLossr0   )r   r1   r   r2   r3   r   )	r   r4   r5   r6   r7   r8   Zlabel_smoothingr9   Zcelossr   r   r   cross_entropy_lossk   s0    
	r?   c                 C   sD  | j dtdgd}t| |}t| |}t| ||}	t| ||}
t| |	}|d ksht|rt	| t
| t| ||t| |
|}n4t	| t
| t| t| |||t| |
|}|d k	rt|st| ||}t|d}|dkr|S |dkr| j d|ddS |dkr6| j d	|ddS td
S d S )Nr"      r#   r    r   Z
ReduceMean)
keepdims_ir$   Z	ReduceSumzMbinary_cross_entropy_with_logits with reduction other than none, mean, or sum)r   r(   r
   opset9Zsigmoidlogsubr   _is_nonenegaddmulr1   Z_onnx_unsupported)r   r   r5   r6   Z
pos_weightr7   r)   Zsig_xZ	log_sig_xZsub_1_xZsub_1_yZlog_1_xoutputr   r   r    binary_cross_entropy_with_logits   sF      	


rJ   c                 C   sh   t |d}|  dkrX| jd|t jd d}| jd||d}| jd|t jd dS | jd||dS )Nr   Doubler   ZFloatr   ZCelu)Zalpha_f)r   r1   r   r   r   r   )r   r4   alphaoutr   r   r   celu   s    rN   c              	   C   sn   t |r>t | || jdtdgd}| jd|ddddS t |d}t |d}| jd|||ddS d S )	Nr"   r#   ZArgMaxr   Faxis_irA   Zselect_last_index_ir    r   rE   Z_reshape_helperr   r(   r
   Z
_parse_argr   r   ZdimZkeepdimZ	flattenedr   r   r   argmax   s,    
          rT   c              	   C   sn   t |r>t | || jdtdgd}| jd|ddddS t |d}t |d}| jd|||ddS d S )	Nr"   rO   r#   ZArgMinr   FrP   r    rR   rS   r   r   r   argmin   s,    
          rU   c                 C   s   |  d||S )NZPowr   )r   r4   exponentr   r   r   pow   s    rX   c                 C   s   |  d||S )NZGreaterOrEqualrV   r   r   r   r   ge   s    rY   c                 C   s   |  d||S )NZLessOrEqualrV   r   r   r   r   le   s    rZ   c           "   	   C   s  t |d}t |d}t |s>t |s>t| ||||S t  rZ| jd||||dS t ||}|d k	r| jdt	
dd}| jdt	
|d}	| jdt	
|d d}
| d||	|}| d||
|}t | || jdt	
dd}t | || jdt	
dd}t |}ttd|}||| g }| jdt	
dd}| jd	|d
d}| d||}| d||}t| }t|}t|}|d||}|d||}|jdt	
dgd}t ||dg}t ||dg}|d||||}t ||jd||d|g}|| |jd|ddi}|jd	|d
d}t|| t|| |  }dddddg}||d  |d  |d< ||d < | jd||d} t | | dg}!|!S t ddS d S )Nr    unfold)Zdimension_iZsize_iZstep_ir"   r   r#   r@   ZRanger   	   r   ZMinZLoopZGatherr$   ZSliceZ	Transpose)Zperm_iConcatrQ         ZUnfoldzinput size not accessible)r]   )r   r1   Z	_is_valuerB   r[   Zis_caffe2_aten_fallbackatZ_get_tensor_dim_sizer   r(   r
   Z_size_helper_get_tensor_ranklistrangeappendpopr   Z
_add_blockr2   Z_add_input_to_blockZ_unsqueeze_helperZ_add_output_to_blockrI   Z_squeeze_helper_unimplemented)"r   r   Z	dimensionsizestepZ
const_sizeZ
const_stepZsizedimZ	low_startZlow_endZhi_endZlow_indicesZ
hi_indicesZlow_sizeZhi_sizendimpermZunsqueeze_listZloop_conditionZloop_lenZloopZ
loop_blockZblock_input_iterZcondstartsendsaxesstackZ	unsqueezeconcatZcond_outZloop_outputZ	transposeZsqueezer   r   r   r[      sv    
    


  
"r[   isc                    s|  |d k	rt dd t |  d kr.tdt |d krHtd fddttD fddttD fddt D }fd	dtD }t| || }t| || }	| d
|}
t j	| |
dgdgt|gd}|| jdt
jdgt
jddg}t| ||}| d
|}
t j	| |
dgdgtjgd}| jdt
jdgt
jdd|g}t| ||}| d
|	}
t j	| |
dgtgtjgd}t j	| |
dgdgtgd}|| jdt
jdgt
jddg}t| |	|}| d
|}
t j	| |
dgdgtjgd}| jdt
jdgt
jdd|g}t| |	|}t| d| jd||g }||g}t| ||S )NZ	Tensordotz-Out parameter is not supported for tensordot.zJUnsupported: ONNX export of tensordot for tensor(input_a) of unknown rank.zJUnsupported: ONNX export of tensordot for tensor(input_b) of unknown rank.c                    s,   g | ]$}| d k r |   n| qS r   r   r	   r    )dim_count_adims_ar   r   r   H  s   ztensordot.<locals>.<listcomp>c                    s,   g | ]$}| d k r |   n| qS rq   r   rr   )dim_count_bdims_br   r   r   L  s   c                    s   g | ]}| kr|qS r   r   rr   )rt   r   r   r   Q  s      c                    s   g | ]}| kr|qS r   r   rr   )rv   r   r   r   R  s      ZShaper   )rm   rk   rl   r"   rO   )Zdtyper#   z	ij,jk->ikprim::ListConstruct)rw   )r   rf   ra   r   rc   lenrB   Zpermuter   Z_slice_helperr(   r
   longZ_reshape_from_tensorsysmaxsizer   )r   Zinput_aZinput_brt   rv   rM   Zleft_dims_aZleft_dims_bZnew_input_aZnew_input_bZinput_shapeZleft_sizes_aZshape_sizesZoutput_aZslicesZleft_sizes_bZoutput_brI   r   )rs   ru   rt   rv   r   	tensordot5  s     



                    r|   )N)rz   r&   r(   Z
torch.onnxr   r   rB   r   r   
parse_argsr   r   r!   r:   r=   r>   r?   rJ   rN   rT   rU   rX   rY   rZ   r[   r|   r   r   r   r   <module>   s8   




 &
(
C