a
    h+=                     @  s  d dl mZ d dlZd dl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 g dZejejddZd	d
ddZededdddNd	d
ddZededdd	d
ddZd	dddddddZededddd	d
d d!Zed"edddd	d
d#d$Zed%d	d
d&d'Zed(d	d
d)d*Zed+d	d
d,d-Zed.d	d
d/d0Z ed1eddddd2d	d
d3d4Z!ed5d	d
d6d7Z"ed8edddd	dddd9d:d;Z#ed<edddd	dddd9d=d>Z$ed?d	d
d@dAZ%edBd	d
dCdDZ&edEd	d
dFdGZ'edHedd2ddd	d
dIdJZ(edKeddddddOd	d
dLdMZ)dS )P    )annotationsN)_onnx)_type_utilserrorssymbolic_helpersymbolic_opset9utils)	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opsetzjit_utils.GraphContextgc                   sp   |st dt|d rT fdd|D } jd jdg|R d|itjjdS  jdg|R 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    I/var/www/auris/lib/python3.9/site-packages/torch/onnx/symbolic_opset12.py
<listcomp>5   s   z"_einsum_helper.<locals>.<listcomp>r   ZEinsumZ
equation_sr    )RuntimeErrorr   Z_is_boolr!   r"   r#   BOOL)r   equationtensorsr&   r   r'   _einsum_helper0   s    
r-   zaten::einsumsvisc                 C  s   t |}t| ||S N)r   Z_unpack_listr-   )r   r+   Ztensor_listpathr,   r&   r&   r'   r   B   s    
r   zaten::outerc                 C  sJ   t j|t jjt j|kr:| jd|t j| d}t| d||gS )Nr   r    zi,j->ij)r   JitScalarType
from_value	UNDEFINEDr!   Z	onnx_typer-   r   inputotherr&   r&   r'   r   I   s    
r   ztorch._C.Valuefloatboolz,tuple[torch._C.Value, torch._C.Value | None])r   r7   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%   r:   )r   r7   r;   r<   trmaskr&   r&   r'   &_dropout_returns_masked_input_and_maskX   s    rG   zaten::dropoutfbc                 C  s   t | |||\}}|S r1   rG   )r   r7   r;   r<   Zmasked_r&   r&   r'   r   f   s    r   zaten::native_dropoutc                 C  s   t | |||S r1   rJ   )r   r7   r;   r<   r&   r&   r'   r   m   s    r   zaten::nll_lossc                 C  sd   t |d}g d}|| }t |d}|  rJ| 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   s   s*    	r   zaten::nll_loss2dc                 C  s   t | |||||S r1   r   r   rU   rV   rW   rX   rY   r&   r&   r'   r      s    r   zaten::nll_loss_ndc                 C  s   t | |||||S r1   r[   r\   r&   r&   r'   r      s    r   zaten::cross_entropy_lossc           	      C  s   t |d}g d}|| }t |d}|d urD|dkrDtd|t |d}|  rr| jd||||d}n| jd|||||d}|S )NrL   rM   rH   g        z2Unsupported: ONNX does not support label_smoothingZSoftmaxCrossEntropyLossrQ   )r   rR   r   SymbolicValueErrorrS   rT   r!   )	r   rU   rV   rW   rX   rY   Zlabel_smoothingrZ   Zcelossr&   r&   r'   r      s4    	r   z&aten::binary_cross_entropy_with_logitsrL   c                 C  sF  | j dtdgd}t| |}t| |}t| ||}	t| ||}
t| |	}|d u sht|rt	| t
| t| ||t| |
|}n4t	| t
| t| t| |||t| |
|}|d u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?   rL   r   Z
ReduceMean)Z
keepdims_irA   Z	ReduceSumzMbinary_cross_entropy_with_logits with reduction other than none, mean, or sum)r!   rC   r%   opset9Zsigmoidlogsubr   Z_is_nonenegaddmulrR   Z_onnx_unsupported)r   r7   rV   rW   Z
pos_weightrX   r;   Zsig_xZ	log_sig_xZsub_1_xZsub_1_yZlog_1_xoutputr&   r&   r'   r      sD    	


r   z
aten::celuc                 C  sn   t |d}tj|tjjtjjkr^| jd|tj	j
d}| jd||d}| jd|tj	jdS | jd||dS )NrH   r   r    ZCelu)Zalpha_f)r   rR   r   r3   r4   r5   ZDOUBLEr!   r"   r#   FLOAT)r   rU   alphaoutr&   r&   r'   r      s    r   zaten::argmaxr   r7   ZdimZkeepdimc                 C  s   t | |||dS )NZArgMaxr   Z_argmin_argmax_helperri   r&   r&   r'   r     s    r   zaten::argminc                 C  s   t | |||dS )NZArgMinrj   ri   r&   r&   r'   r     s    r   z	aten::powc                 C  s   |  d||S )NPowr!   )r   rU   exponentr&   r&   r'   r   #  s    r   zaten::gec                 C  s   |  d||S )NZGreaterOrEqualrl   r6   r&   r&   r'   r   (  s    r   zaten::lec                 C  s   |  d||S )NZLessOrEqualrl   r6   r&   r&   r'   r   -  s    r   zaten::unfoldc           $   	   C  s  t |d}t |d}t |s>t |s>t| ||||S t ||}|d u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 usJ 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g|R ddi}|d|tjj} t||  t|| |  }!g d}||d  |d  |d< ||d < | jd|!|d}"t | |"dg}#|#S t ddS )NrL   r>   r   r?   r^   Ranger   r    ZMinZLoop)Zn_blocksZGatherrA   SliceZ	Transpose)Zperm_iZConcatZaxis_i)r   r^   rA         ZUnfoldzinput size not accessible)r   rR   Z	_is_valuer_   r   Z_get_tensor_dim_sizer!   rC   r%   Z_size_helper_get_tensor_ranklistrangeappendpopr"   r#   r*   r	   Zadd_op_with_blocksblockr   Z_add_input_to_blockZ_unsqueeze_helperZ_add_output_to_blockrS   re   Z_squeeze_helper_unimplemented)$r   r7   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_contextrK   Z
loop_blockZblock_input_iterZcondstartsendsaxesstackZ	unsqueezeconcatZcond_outZloop_outputZ	transposeZsqueezer&   r&   r'   r   2  st    







"r   zaten::tensordotc                   s  |d urt dd t |  d u r2td|t |d u 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R  }||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$   rL   )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 | ]}| vr|qS r&   r&   r   )r   r&   r'   r(         c                   s   g | ]}| vr|qS r&   r&   r   )r   r&   r'   r(     r   ZShaper   )r   r}   r~   r>   r@   r?   z	ij,jk->ikzprim::ListConstruct)r   rx   rr   r   r]   rt   lenr_   Zpermuter!   Z_slice_helperrC   r%   longZ_reshape_from_tensorsysmaxsizer   )r   Zinput_aZinput_br   r   rh   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_bre   r&   )r   r   r   r   r'   r   }  s    



r   )N)N)*
__future__r   	functoolsr   rC   Ztorch._Cr   r"   Z
torch.onnxr   r   r   r   r_   r   Ztorch.onnx._internalr	   r
   __all__partialZonnx_symbolicZ_onnx_symbolicr-   
parse_argsr   r   rG   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   <module>   sj   
 .+		I