o
    wZh+=                     @  sH  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dRddZededdddSdRddZededddRddZdTddZed edd!d"dRd#d$Zed%edd!d"dRd&d'Zed(dRd)d*Zed+dRd,d-Zed.dRd/d0Zed1dRd2d3Z ed4eddddd5dRd6d7Z!ed8dRd9d:Z"ed;eddd"dUd>d?Z#ed@eddd"dUdAdBZ$edCdRdDdEZ%edFdRdGdHZ&edIdRdJdKZ'edLedd5dddRdMdNZ(edOeddddddSdRdPdQZ)dS )V    )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opsetgjit_utils.GraphContextc                   sl   |st dt|d r* fdd|D } jd jdg|R d|itjjdS  jdg|R d|i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tensorr    J/var/www/auris/lib/python3.10/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   r8   torch._C.Valuepfloattrainboolreturn,tuple[torch._C.Value, torch._C.Value | None]c                 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   )Zoutputs)r   Zcheck_training_moder!   torchr%   r>   )r   r8   r;   r=   trmaskr'   r'   r(   &_dropout_returns_masked_input_and_maskX   s   rI   zaten::dropoutfbc                 C  s   t | |||\}}|S r2   rI   )r   r8   r;   r=   Zmasked_r'   r'   r(   r   f   s   r   zaten::native_dropoutc                 C  s   t | |||S r2   rL   )r   r8   r;   r=   r'   r'   r(   r   m   s   r   zaten::nll_lossc                 C  sf   t |d}g d}|| }t |d}|  r&| jd||||d}|S | 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     t | |||||S r2   r   r   rW   rX   rY   rZ   r[   r'   r'   r(   r         r   zaten::nll_loss_ndc                 C  r]   r2   r^   r_   r'   r'   r(   r      r`   r   zaten::cross_entropy_lossc           	      C  s   t |d}g d}|| }t |d}|d ur"|dkr"td|t |d}|  r:| jd||||d}|S | jd|||||d}|S )NrN   rO   rJ   g        z2Unsupported: ONNX does not support label_smoothingZSoftmaxCrossEntropyLossrS   )r   rT   r   SymbolicValueErrorrU   rV   r!   )	r   rW   rX   rY   rZ   r[   Zlabel_smoothingr\   Zcelossr'   r'   r(   r      s6   	r   z&aten::binary_cross_entropy_with_logitsrN   c                 C  s<  | j dtdgd}t| |}t| |}t| ||}	t| ||}
t| |	}|d u s4t|rJt	| t
| t| ||t| |
|}nt	| t
| t| t| |||t| |
|}|d urtt|stt| ||}t|d}|dkr|S |dkr| j d|ddS |dkr| j d	|ddS td
|S )NrA      rB   rN   r   Z
ReduceMean)Z
keepdims_irD   Z	ReduceSumzMbinary_cross_entropy_with_logits with reduction other than none, mean, or sum)r!   rE   r%   opset9Zsigmoidlogsubr   Z_is_nonenegaddmulrT   Z_onnx_unsupported)r   r8   rX   rY   Z
pos_weightrZ   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 )NrJ   r   r    ZCelu)Zalpha_f)r   rT   r   r4   r5   r6   DOUBLEr!   r"   r#   FLOAT)r   rW   alphaoutr'   r'   r(   r      s   r   zaten::argmaxdimkeepdimc                 C     t | |||dS )NZArgMaxr   Z_argmin_argmax_helperr   r8   rn   ro   r'   r'   r(   r        r   zaten::argminc                 C  rp   )NZArgMinrq   rr   r'   r'   r(   r     rs   r   z	aten::powc                 C     |  d||S )NPowr!   )r   rW   exponentr'   r'   r(   r   #     r   zaten::gec                 C  rt   )NZGreaterOrEqualrv   r7   r'   r'   r(   r   (  rx   r   zaten::lec                 C  rt   )NZLessOrEqualrv   r7   r'   r'   r(   r   -  rx   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sJ 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 )NrN   rA   r   rB   rb   Ranger   r    ZMinZLoop)Zn_blocksZGatherrD   SliceZ	Transpose)Zperm_iZConcatZaxis_i)r   rb   rD         ZUnfoldzinput size not accessible)r   rT   Z	_is_valuerc   r   Z_get_tensor_dim_sizer!   rE   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_blockrU   ri   Z_squeeze_helper_unimplemented)$r   r8   	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_len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   2  st   







"r   zaten::tensordotc                   s  |d ur
t dd t |  d u rtd|t |d u r(t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                   ,   g | ]}| d k r|   n| qS r   r'   r$   rN   )dim_count_adims_ar'   r(   r)         ztensordot.<locals>.<listcomp>c                   r   r   r'   r   )dim_count_bdims_br'   r(   r)     r   c                      g | ]}| vr|qS r'   r'   r   )r   r'   r(   r)         c                   r   r'   r'   r   )r   r'   r(   r)     r   ZShaper   )r   r   r   rA   rC   rB   z	ij,jk->ikzprim::ListConstruct)r   r   r}   r   ra   r   lenrc   Zpermuter!   Z_slice_helperrE   r%   longZ_reshape_from_tensorsysmaxsizer   )r   Zinput_aZinput_br   r   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'   )r   r   r   r   r(   r   }  s   



r   )r   r   r2   )
r   r   r8   r:   r;   r<   r=   r>   r?   r@   )r   r   r8   r:   rn   r:   ro   r>   )*
__future__r   	functoolsr   rE   Ztorch._Cr   r"   Z
torch.onnxr   r   r   r   rc   r   Ztorch.onnx._internalr	   r
   __all__partialZonnx_symbolicZ_onnx_symbolicr.   
parse_argsr   r   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r'   r'   r'   r(   <module>   sl   


 .+		I