U
    <c>                     @   s  d dl Z d dlZd dlmZmZ d dlZd dlmZ d dl	m
Z
mZmZmZmZ d dlmZmZmZ dddd	d
ddddddddddddgZe jejddZejejdddZededddejdHejdd dZed!eddejejdd"dZejejejje e!eejjeejj f d#d$d%Z"ed&edd'd(ejejdd)dZ#ed*edd'd(ejejdd+dZ$ed,ejejdd-dZ%ed.ejejdd/dZ&ed0ejejdd1dZ'ed2ejejdd3d
Z(ed4eddddd5ejejdd6dZ)ed7ejejdd8d	Z*ed9eddd(ejejejjejje!d:d;dZ+ed<eddd(ejejejjejje!d:d=dZ,ed>ejejdd?dZ-ed@ejejddAdZ.edBejejddCdZ/edDedd5ddejejddEdZ0edFedddddejdIejddGdZ1dS )J    N)OptionalTuple)_onnx)_type_utilserrorssymbolic_helpersymbolic_opset9utils)	_beartype	jit_utilsregistrationargmaxargmin binary_cross_entropy_with_logitscelucross_entropy_lossdropouteinsumgelenative_dropoutnll_loss
nll_loss2dnll_loss_ndouterpow	tensordotunfold   )Zopsetgc                    sh   |st dt|d rP fdd|D } jd jd	|d|itjjdS  jd
|d|iS d S )NzEinsum inputs are empty.r   c                    s    g | ]} j d |tjjdqS )CastZto_i)op_C_onnxTensorProtoDataTypeZINT64).0tensorr    ?/tmp/pip-unpacked-wheel-gikjz4vx/torch/onnx/symbolic_opset12.py
<listcomp>3   s   z"_einsum_helper.<locals>.<listcomp>r!   EinsumZ
equation_sr"   )r+   )r+   )RuntimeErrorr   Z_is_boolr#   r$   r%   BOOL)r    equationtensorsr(   r   r)   _einsum_helper-   s    
r0   zaten::einsumsvisc                 C   s   t |}t| ||S N)r   Z_unpack_listr0   )r    r.   Ztensor_listpathr/   r(   r(   r)   r   @   s    
zaten::outerc                 C   sL   |   |   kr<| jd|tj|    d}t| d||gS )Nr!   r"   zi,j->ij)type
scalarTyper#   r   ZJitScalarType	from_nameZ	onnx_typer0   r    inputotherr(   r(   r)   r   H   s    
)r    r:   ptrainreturnc                 C   sf   t |d |s|d fS | jdt|d}| jdtj|tjdd}| jd|||dd\}}||fS )Nr   ConstantZvalue_tZdtypeZDropout   )outputs)r   Zcheck_training_moder#   torchr'   bool)r    r:   r<   r=   trmaskr(   r(   r)   &_dropout_returns_masked_input_and_maskX   s    rI   zaten::dropoutfbc                 C   s   t | |||\}}|S r4   rI   )r    r:   r<   r=   Zmasked_r(   r(   r)   r   g   s    zaten::native_dropoutc                 C   s   t | |||S r4   rL   )r    r:   r<   r=   r(   r(   r)   r   o   s    zaten::nll_lossc                 C   sf   t |d}dddg}|| }t |d}|  rL| jd||||d}n| jd|||||d}|S )Ni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)   r   v   s*    
	zaten::nll_loss2dc                 C   s   t | |||||S r4   r   r    rV   rW   rX   rY   rZ   r(   r(   r)   r      s    zaten::nll_loss_ndc                 C   s   t | |||||S r4   r\   r]   r(   r(   r)   r      s    zaten::cross_entropy_lossc           	      C   s   t |d}dddg}|| }t |d}|d k	rF|dkrFtd|t |d}|  rt| jd||||d	}n| jd|||||d	}|S )
NrN   rO   rP   rQ   rJ   g        z2Unsupported: ONNX does not support label_smoothingZSoftmaxCrossEntropyLossrR   )r   rS   r   SymbolicValueErrorrT   rU   r#   )	r    rV   rW   rX   rY   rZ   Zlabel_smoothingr[   Zcelossr(   r(   r)   r      s6    
 	z&aten::binary_cross_entropy_with_logitsrN   c                 C   sF  | 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@   rN   r   Z
ReduceMean)Z
keepdims_irB   Z	ReduceSumzMbinary_cross_entropy_with_logits with reduction other than none, mean, or sum)r#   rD   r'   opset9Zsigmoidlogsubr   Z_is_nonenegaddmulrS   Z_onnx_unsupported)r    r:   rW   rX   Z
pos_weightrY   r<   Zsig_xZ	log_sig_xZsub_1_xZsub_1_yZlog_1_xoutputr(   r(   r)   r      sH      	


z
aten::celuc                 C   sd   t |d}|  dkrT| jd|tjjd}| jd||d}| jd|tjjdS | jd||dS )NrJ   Doubler!   r"   ZCelu)Zalpha_f)	r   rS   r6   r7   r#   r$   r%   FLOATZDOUBLE)r    rV   alphaoutr(   r(   r)   r     s    zaten::argmaxr    r:   ZdimZkeepdimc                 C   s   t | |||dS )NZArgMaxr   Z_argmin_argmax_helperrk   r(   r(   r)   r     s    	zaten::argminc                 C   s   t | |||dS )NZArgMinrl   rk   r(   r(   r)   r     s    	z	aten::powc                 C   s   |  d||S )NZPowr#   )r    rV   exponentr(   r(   r)   r   +  s    zaten::gec                 C   s   |  d||S )NZGreaterOrEqualrm   r9   r(   r(   r)   r   1  s    zaten::lec                 C   s   |  d||S )NZLessOrEqualrm   r9   r(   r(   r)   r   7  s    zaten::unfoldc           $   	   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 |}|d k	s$tttd|}||| g }| jdt	
dd}| jd	|tjjd
}| d||}tj| d||dd\}\}}|j}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}|d	|tjj} t||  t|| |  }!dddddg}||d  |d  |d< ||d < | jd|!|d}"t | |"dg}#|#S t ddS )NrN   r   )Zdimension_iZsize_iZstep_ir?   r   r@   r_   ZRanger!   r"   ZMinZLoop)Zn_blocksZGatherrB   ZSliceZ	Transpose)Zperm_iConcatZaxis_i      ZUnfoldzinput size not accessible)ro   ) r   rS   Z	_is_valuer`   r   Zis_caffe2_aten_fallbackatZ_get_tensor_dim_sizer#   rD   r'   Z_size_helper_get_tensor_rankAssertionErrorlistrangeappendpopr$   r%   r-   r   Zadd_op_with_blocksblockr	   Z_add_input_to_blockZ_unsqueeze_helperZ_add_output_to_blockrT   rf   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_contextrM   Z
loop_blockZblock_input_iterZcondstartsendsaxesstackZ	unsqueezeconcatZcond_outZloop_outputZ	transposeZsqueezer(   r(   r)   r   =  s    
    
      

  
  "zaten::tensordotc                    s  |d k	rt dd t |  d kr2td|t |d krPt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&   rN   )dim_count_adims_ar(   r)   r*     s   ztensordot.<locals>.<listcomp>c                    s,   g | ]$}| d k r |   n| qS r   r(   r   )dim_count_bdims_br(   r)   r*     s   c                    s   g | ]}| kr|qS r(   r(   r   )r   r(   r)   r*     s      c                    s   g | ]}| kr|qS r(   r(   r   )r   r(   r)   r*     s      ZShaper   )r   r   r   r?   rA   r@   z	ij,jk->ikprim::ListConstruct)r   )r   rz   rs   r   r^   rv   lenr`   Zpermuter#   Z_slice_helperrD   r'   longZ_reshape_from_tensorsysmaxsizer   )r    Zinput_aZinput_br   r   rj   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_brf   r(   )r   r   r   r   r)   r     s     



                    )N)N)2	functoolsr   typingr   r   rD   Ztorch._Cr   r$   Z
torch.onnxr   r   r   r   r`   r	   Ztorch.onnx._internalr
   r   r   __all__partialZonnx_symbolicZ_onnx_symbolicZbeartypeZGraphContextr0   
parse_argsr   r   Z_CValuefloatrE   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r(   r(   r)   <module>   s   	
    .+		L