a
    .=ic×6  ã                   @   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                    sx   |st dƒ‚|d  ¡  ¡ dkr\‡ fdd„|D ƒ}ˆ jdˆ jdg|¢R d|iŽtjd d	S ˆ jdg|¢R d|iŽS d S )
NzEinsum inputs are empty.r   ÚBoolc                    s"   g | ]}ˆ j d |tjd d‘qS )ÚCastÚLong©Zto_i)Úopr   Úcast_pytorch_to_onnx)Ú.0Útensor©Úg© úl/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/torch/onnx/symbolic_opset12.pyÚ
<listcomp>   s   ÿz!einsum_helper.<locals>.<listcomp>r   ZEinsumZ
equation_sr   )Ú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Údropoutz§Dropout 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   ÚpÚtrainÚtÚrÚ_r   r   r   r"   3   s    ÿr"   c                 C   sd   t  |d¡}g d¢}|| }t  |d¡}| ¡  ¡ rJ| 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   r7   r8   r9   r:   r;   r   r   r   Ú
nll_loss2dc   s    r@   c                 C   s   t | |||||ƒS r   r>   r?   r   r   r   Únll_loss_ndg   s    rA   c           	      C   s€   t  |d¡}g d¢}|| }t  |d¡}|dkr8tdƒ‚t  |d¡}| ¡  ¡ rf| jd||||d}n| jd|||||d}|S )Nr!   r/   r    g        z2Unsupported: ONNX does not support label_smoothingZSoftmaxCrossEntropyLossr3   )r   r4   r   r5   r6   r	   )	r   r7   r8   r9   r:   r;   Zlabel_smoothingr<   Zcelossr   r   r   Úcross_entropy_lossk   s0    ûú	rB   c                 C   sD  | j dt dg¡d}t | |¡}t | |¡}t | ||¡}	t | ||¡}
t | |	¡}|d u sht |¡r”t 	| t 
| t | ||¡t | |
|¡¡¡}n4t 	| t 
| t | t | ||¡|¡t | |
|¡¡¡}|d urèt |¡sèt | ||¡}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Úmulr4   Z_onnx_unsupported)r   r   r8   r9   Z
pos_weightr:   r*   Zsig_xZ	log_sig_xZsub_1_xZsub_1_yZlog_1_xÚoutputr   r   r   Ú binary_cross_entropy_with_logits‘   sB    ÿþýþ	


ÿrM   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   ÚFloatr   ZCelu)Zalpha_f)r   r4   r   r   r	   r
   )r   r7   ÚalphaÚoutr   r   r   Úceluº   s    rR   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_irD   Zselect_last_index_ir!   ©r   rH   Z_reshape_helperr	   r)   r   Z
_parse_arg©r   r   ÚdimZkeepdimÚ	flattenedr   r   r   ÚargmaxÅ   s    
ÿ
ÿ
ÿrZ   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#   rS   r$   ZArgMinr   FrT   r!   rV   rW   r   r   r   ÚargminÕ   s    
ÿ
ÿ
ÿr[   c                 C   s   |   d||¡S )NÚPow©r	   )r   r7   Úexponentr   r   r   Úpowå   s    r_   c                 C   s   |   d||¡S )NZGreaterOrEqualr]   r   r   r   r   Úgeé   s    r`   c                 C   s   |   d||¡S )NZLessOrEqualr]   r   r   r   r   Úleí   s    ra   c           "   	   C   sÎ  t  |d¡}t  |d¡}t  |¡s>t  |¡s>t | ||||¡S t  ¡ rZ| jd||||d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  |¡}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g|¢R ddiŽ}|jd	|d
d}t ||¡ t ||¡ | ¡  ¡ }g d¢}||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$   rC   ÚRanger   é	   r   ZMinZLoopZGatherr%   ÚSliceZ	Transpose)Zperm_iZConcatrU   )r   rC   r%   é   é   ZUnfoldzinput size not accessible)r   r4   Z	_is_valuerE   rb   Zis_caffe2_aten_fallbackÚatZ_get_tensor_dim_sizer	   r)   r   Z_size_helperÚ_get_tensor_rankÚlistÚrangeÚappendÚpopr   Z
_add_blockr5   Z_add_input_to_blockZ_unsqueeze_helperZ_add_output_to_blockrL   Z_squeeze_helperÚ_unimplemented)"r   r   Ú	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_blockZblock_input_iterZcondÚstartsÚendsÚaxesÚstackZ	unsqueezeÚconcatZcond_outZloop_outputZ	transposeZsqueezer   r   r   rb   ñ   sj    ÿ
ÿÿ


ÿ
"rb   Úisc                    s€  |d urt  dd¡ t  |¡‰ ˆ d u r.tdƒ‚t  |¡‰ˆd u 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¢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   r!   )Údim_count_aÚdims_ar   r   r   H  s   ÿztensordot.<locals>.<listcomp>c                    s,   g | ]$}ˆ| d k r ˆ| ˆ  nˆ| ‘qS r{   r   r|   )Údim_count_bÚdims_br   r   r   L  s   ÿc                    s   g | ]}|ˆ vr|‘qS r   r   r|   )r~   r   r   r   Q  ó    c                    s   g | ]}|ˆ vr|‘qS r   r   r|   )r€   r   r   r   R  r   ZShaper   )rw   ru   rv   r#   rS   )Zdtyper$   z	ij,jk->ikzprim::ListConstruct)r   rn   ri   r   rk   ÚlenrE   Zpermuter	   Z_slice_helperr)   r   ÚlongZ_reshape_from_tensorÚsysÚmaxsizer   )r   Zinput_aZinput_br~   r€   rQ   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_brL   r   )r}   r   r~   r€   r   Ú	tensordot5  s|    ÿ
ÿ
ÿ
þ
þÿþÿþÿÿþÿþr†   )N)r„   r'   r)   Z
torch.onnxr   r   rE   r   r   Ú
parse_argsr   r   r"   r=   r@   rA   rB   rM   rR   rZ   r[   r_   r`   ra   rb   r†   r   r   r   r   Ú<module>   s8   




 &
(
C