o
    h:                     @   s  d 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 ddlmZmZ ejejddZdZeD ]Zed	e e
e q4ed
e
dddgdede
dddgdede
dddgdede
dddgdede
dddgdede
dddgddd Zeddejfd d!Zdejfd"d#Zdejfd$d%Zdejfd&d'Zed(dejfd)d*Zed+dejfd,d-Zed.dejfd/d0Zed1dejfd2d3Z ed4dejfd5d6Z!ed7dejfd8d9Z"ed:e
#d;d;d;d<d<dejfd=d>Z$ed?dejfd@dAZ%dejdBe&fdCdDZ'edEe
#d;dFd;d;d;d;	G	dcdejfdHdIZ(edJe
#d;dFd;d;d;d;	G	dcdejfdKdLZ)edMe
#d;dFd;d;d;dddejfdNdOZ*edPe
#d;dFd;d;d;d;	G	dcdejfdQdRZ+edSe
#d;dFd;d;d;dddejfdTdUZ,edVe
#d;dFd;d;d;d;	G	dcdejfdWdXZ-edY	GdddejfdZd[Z.ed\e
#d;d]dFd;d;d;d;	G	dcdejfd^d_Z/ed`dejfdadbZ0dS )ea  
Note [ONNX operators that are added/updated from opset 8 to opset 9]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
New operators:
    Compress
    ConstantOfShape
    EyeLike
    MaxUnpool
    OneHot
    Sinh
    Cosh
    Asinh
    Acosh
    Atanh
    Shrink
    IsNaN
    Sign
    Erf
    Scatter
    Where
    NonZero
    TfIdfVectorizer
    MeanVarianceNormalization

Updated operators:
    BatchNormalization: removed spatial attribute.
    Greater, Less, Constant, MatMul, PRelu, Gemm, Flatten: more data types{integers} supported.
    Cast: more data types{string} supported.
    Upsample: moved scales from attribute to input.
    Scan
    N)_onnx)_type_utilserrorssymbolic_helpersymbolic_opset9)	jit_utilsregistration   )opset)nonzerowherescatterscatter_adderfsignisnangatherarangemasked_fill
index_fill
index_copyrepeat_interleaveanyallzaten::zaten::upsample_nearest1dupsample_nearest1d   nearest)decoratezaten::upsample_nearest2dupsample_nearest2d   zaten::upsample_nearest3dupsample_nearest3d   zaten::upsample_linear1dupsample_linear1dlinearzaten::upsample_bilinear2dupsample_bilinear2dzaten::upsample_trilinear3dupsample_trilinear3dc                    s    fdd}|S )Nc                    s   t | |\}}t  t |}|rt d S t dt r-t dS |d u r? fddtdD }| jd |dS )	Nalign_corners == Trueisz%torch._C.Value (output_size) indexingc                    sD   g | ]}|d k r
dnt  |   t    |    qS )         ?)floattypesizes).0i)diminputoutput_size n/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/torch/onnx/symbolic_opset8.py
<listcomp>l   s    z5_interpolate.<locals>.symbolic_fn.<locals>.<listcomp>r   Upsamplemode_sscales_f)	r   _get_interpolate_attributes_interpolate_warning_maybe_get_scalar_unimplemented_maybe_get_const	_is_valuerangeop)gr0   r1   argsscalesalign_cornersr/   interpolate_modename)r0   r1   r3   symbolic_fn^   s"   


z!_interpolate.<locals>.symbolic_fnr2   )rG   r/   rF   rH   r2   rE   r3   _interpolateE   s   rI   zaten::__interpolaterA   c           	      C   s   t |d}t |s|rt ddS t |s#t |r#t ddS t |s3t |r3t ddS t | |||||\}}| jd|||dS )Nbinterpolater&   zdynamic scales in opset 8zdynamic size in opset 8r5   r6   )r   r=   _is_noner<   r>    _interpolate_get_scales_and_moder@   )	rA   r0   sizescale_factormoderD   recompute_scale_factor	antialiasrC   r2   r2   r3   __interpolatex   s   rS   c                    s   t jjt jjt jjh}d }t j|d t jj}|t jjkr8|}||vr4| }t fdd|D }n	d| S t	
d |f| S )Nr   c                 3   s$    | ]} j d |tjjdV  qdS )Castto_iN)r@   _C_onnxTensorProtoDataTypeFLOAT)r-   argrA   r2   r3   	<genexpr>   s
    
z-_try_cast_integer_to_float.<locals>.<genexpr>NzOnly floating datatype is supported for these operators: {Greater, Less, MatMul, PRelu, Gemm, Flatten}. This might cause the onnx model to be incorrect, if inputs have integer datatypes.)r   JitScalarTypeHALFrY   DOUBLE
from_value	UNDEFINEDscalar_nametuplewarningswarn)rA   rB   floating_scalar_typesold_type	arg0_typer2   r[   r3   _try_cast_integer_to_float   s(   

rj   c                 C   s$   |d u r|S t td| | |dS )N_cast_F)getattropset9)rA   r0   to_typer2   r2   r3   _cast_to_type   s   ro   c                 C   s6   t |}t ||}t| ||\}}}| |||S r]   )r   r;   _if_scalar_type_asrj   r@   )rA   r0   otherop_name_r2   r2   r3   _comparison_operator   s   
rt   zaten::gtc                 C      t | ||dS )NGreaterrt   rA   r0   rq   r2   r2   r3   gt      ry   zaten::ltc                 C   ru   )NLessrw   rx   r2   r2   r3   lt   rz   r|   z	aten::bmmc                 C   s@   t |rt| ||\}}}t| | d|||S | d||S )NMatMul)r   _try_get_scalar_typerj   ro   r@   )rA   selfrq   rh   r2   r2   r3   bmm   s   
r   zaten::matmulc                 C   s   t | ||S r]   )r   )rA   r   rq   r2   r2   r3   matmul   s   r   zaten::preluc                 C   s   t |}t |}|d ur"|dkr"| jd|ttd|d d}n|dkr3|dgkr3t | |dg}t |rLt| ||\}}}t	| | d|||S | d||S )Nr(   	Unsqueeze   )axes_ir   PRelu)
r   _get_tensor_rank_get_tensor_sizesr@   listr?   _squeeze_helperr~   rj   ro   )rA   r   weight	self_rankweight_sizesrh   r2   r2   r3   prelu   s   

 
r   zaten::mmc              
   C   s   t ||}|d u rtd|| jdtjdg| dd}t |r>t| |||\}}}}t	| | jd|||ddd	|S | jd|||ddd	S )
Nz/mm can only operate on tensors with known typesConstantr   )dtypevalue_tGemmg        r)   beta_falpha_f)
r   r~   r   SymbolicValueErrorr@   torchtensorr   rj   ro   )rA   r   rq   scalar_typezero_constantrh   r2   r2   r3   mm   s&   
r   zaten::addmmvtc                 C   sl   t |r%t| |||\}}}}t| | jd|||t |t |d|S | jd|||t |t |dS )Nr   r   )r   r~   rj   ro   r@   _scalar)rA   r   mat1mat2betaalpharh   r2   r2   r3   addmm
  s,   
r   zaten::flattenc                 C   s   t |dd}t |dd}|  }|dk r|| }|dkrF||d krFt |r>t| |\}}t| | jd||d|S | jd||dS |dkrt||d krtt |rjt| |\}}t| | jd||d d|S | jd||d dS t	| |||S )	Nr.   	start_dimend_dimr   r   Flatten)axis_ir(   )
r   
_get_constr+   r/   r~   rj   ro   r@   rm   flatten)rA   r0   r   r   start_dim_i	end_dim_ir/   rh   r2   r2   r3   r   &  s(   

r   r   c                 C   sn   |d u r	t jj}nt |}| js+| jd|t jj d|d}| jd|| dS | jd|| d|dS )NConstantFillr   )dtype_iinput_as_shape_ivalue_frT   rU   )r   r^   rY   r   is_floating_pointr@   	onnx_type)rA   r,   r   const_valuer   resultr2   r2   r3   _constant_fillC  s&   



r   zaten::emptyr.   Fc                 C      t | |||||S r]   )zeros)rA   r,   r   layoutdevice
pin_memorymemory_formatr2   r2   r3   empty[     r   zaten::empty_likec                 C   r   r]   )
zeros_like)rA   r0   r   r   r   r   r   r2   r2   r3   
empty_likei  r   r   zaten::zerosc                 C   ru   )Nr   r   rA   r,   r   r   r   r   r2   r2   r3   r   w  s   r   zaten::zeros_likec                 C      |  d|}t| ||dS )NShaper   r@   r   rA   r0   r   r   r   r   r   shaper2   r2   r3   r   ~     r   z
aten::onesc                 C   ru   )Nr   r   r   r2   r2   r3   ones  s   r   zaten::ones_likec                 C   r   )Nr   r   r   r   r2   r2   r3   	ones_like  r   r   z
aten::fullc           	   
   C   sb   t |d}t |r#t| ||||}t| ||| jdtddS t 	|dd}t
| |||S )Nr   r   r   r   r.   r   )r   r=   r>   r   rm   addr@   r   r   r   r   )	rA   r,   valuer   r   r   r   r   tmpr2   r2   r3   full  s   
 r   zaten::full_likefc           	      C   s   |  d|}t| |||S )Nr   r   )	rA   r0   
fill_valuer   r   r   r   r   r   r2   r2   r3   	full_like  s   r   zaten::repeatc              
   C   s   t |s| jdt|d}t |rtt |}n
t |d}t|}|	 rN|
  }|t| }|dkrNt| || jdtdg| | d}| d||S )Nr   r   r'   r   r   Tile)r   r>   r@   r   
LongTensor_is_packed_listlen_unpack_listr=   isCompleteTensorr+   r,   rm   viewr   )rA   r   repeatsrepeat_size_lenconst_repeatsr,   	diff_dimsr2   r2   r3   repeat  s   

 r   )FN)F)1__doc__	functoolsre   r   torch._Cr   rW   
torch.onnxr   r   r   r   rm   torch.onnx._internalr   r   partialonnx_symbolic_onnx_symbolicblock_listed_operatorsblock_listed_op_block_list_in_opset_apply_paramsrI   GraphContextrS   rj   ro   rt   ry   r|   r   r   r   r   
parse_argsr   r   intr   r   r   r   r   r   r   r   r   r   r2   r2   r2   r3   <module>   s    !	