U
    9%eA?                     @  sL  d dl mZ 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ddddZededd d!ejdNddd"dZed#ed d ejddd$dZejdd%d&d'd(d)d*d+Zed,ed d-d.ejddd/dZ ed0ed d-d.ejddd1dZ!ed2ejddd3dZ"ed4ejddd5dZ#ed6ejddd7dZ$ed8ejddd9dZ%ed:ed d d d d;ejddd<d	Z&ed=ejddd>d
Z'ed?ed d d.ejdd%d%d'd@dAdZ(edBed d d.ejdd%d%d'd@dCdZ)edDejdddEdZ*edFejdddGdZ+edHejdddIdZ,edJed d;d d ejdddKdZ-edLed d d!d!d ejdOdddMdZ.dS )P    )annotationsN)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opsetzjit_utils.GraphContext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     Z/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torch/onnx/symbolic_opset12.py
<listcomp>5   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    
r1   zaten::einsumsvisc                 C  s   t |}t| ||S N)r   Z_unpack_listr1   )r!   r/   Ztensor_listpathr0   r)   r)   r*   r   B   s    
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_typer1   r!   inputotherr)   r)   r*   r   J   s     
ztorch._C.Valuefloatboolz/Tuple[torch._C.Value, Optional[torch._C.Value]])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(   r>   )r!   r;   r?   r@   trmaskr)   r)   r*   &_dropout_returns_masked_input_and_maskZ   s    rK   zaten::dropoutfbc                 C  s   t | |||\}}|S r5   rK   )r!   r;   r?   r@   Zmasked_r)   r)   r*   r   i   s    zaten::native_dropoutc                 C  s   t | |||S r5   rN   )r!   r;   r?   r@   r)   r)   r*   r   q   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   x   s*    
	zaten::nll_loss2dc                 C  s   t | |||||S r5   r   r!   rX   rY   rZ   r[   r\   r)   r)   r*   r      s    zaten::nll_loss_ndc                 C  s   t | |||||S r5   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 )
NrP   rQ   rR   rS   rL   g        z2Unsupported: ONNX does not support label_smoothingZSoftmaxCrossEntropyLossrT   )r   rU   r   SymbolicValueErrorrV   rW   r$   )	r!   rX   rY   rZ   r[   r\   Zlabel_smoothingr]   Zcelossr)   r)   r*   r      s6    
 	z&aten::binary_cross_entropy_with_logitsrP   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 )NrB      rC   rP   r   Z
ReduceMean)Z
keepdims_irE   Z	ReduceSumzMbinary_cross_entropy_with_logits with reduction other than none, mean, or sum)r$   rG   r(   opset9Zsigmoidlogsubr   Z_is_nonenegaddmulrU   Z_onnx_unsupported)r!   r;   rY   rZ   Z
pos_weightr[   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  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 )NrL   r"   r#   ZCelu)Zalpha_f)r   rU   r   r7   r8   r9   DOUBLEr$   r%   r&   FLOAT)r!   rX   alphaoutr)   r)   r*   r     s    zaten::argmaxr!   r;   dimZkeepdimc                 C  s   t | |||dS )NZArgMaxr   Z_argmin_argmax_helperrm   r)   r)   r*   r     s    	zaten::argminc                 C  s   t | |||dS )NZArgMinro   rm   r)   r)   r*   r   $  s    	z	aten::powc                 C  s   |  d||S )NPowr$   )r!   rX   exponentr)   r)   r*   r   0  s    zaten::gec                 C  s   |  d||S )NZGreaterOrEqualrq   r:   r)   r)   r*   r   6  s    zaten::lec                 C  s   |  d||S )NZLessOrEqualrq   r:   r)   r)   r*   r   <  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 )NrP   r   )Zdimension_iZsize_iZstep_irB   r   rC   ra   Ranger"   r#   ZMinZLoop)Zn_blocksZGatherrE   SliceZ	Transpose)Zperm_iConcatZaxis_i      ZUnfoldzinput size not accessible)ru   ) r   rU   Z	_is_valuerb   r   Zis_caffe2_aten_fallbackatZ_get_tensor_dim_sizer$   rG   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_blockrV   rh   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_contextrO   Z
loop_blockZblock_input_iterZcondstartsendsaxesstackZ	unsqueezeconcatZcond_outZloop_outputZ	transposeZsqueezer)   r)   r*   r   B  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'   rP   )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   rB   rD   rC   z	ij,jk->ikprim::ListConstruct)r   )r   r   ry   r   r`   r|   lenrb   Zpermuter$   Z_slice_helperrG   r(   longZ_reshape_from_tensorsysmaxsizer   )r!   Zinput_aZinput_br   r   rl   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_brh   r)   )r   r   r   r   r*   r     s     



                    )N)N)/
__future__r   	functoolsr   typingr   r   rG   Ztorch._Cr   r%   Z
torch.onnxr   r   r   r	   rb   r
   Ztorch.onnx._internalr   r   r   __all__partialZonnx_symbolicZ_onnx_symbolicZbeartyper1   
parse_argsr   r   rK   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r)   r)   r)   r*   <module>   s   	
 .+		L