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   )Zopset)ZnonzerowhereZscatterZscatter_adderfsignisnanZgatherZarangeZmasked_fillZ
index_fillZ
index_copyZrepeat_interleaveanyallzaten::zaten::upsample_nearest1dZupsample_nearest1d   Znearest)Zdecoratezaten::upsample_nearest2dZupsample_nearest2d   zaten::upsample_nearest3dZupsample_nearest3d   zaten::upsample_linear1dZupsample_linear1dZlinearzaten::upsample_bilinear2dZupsample_bilinear2dzaten::upsample_trilinear3dZ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 `/home/www/facesmatcher.com/frenv_anti/lib/python3.10/site-packages/torch/onnx/symbolic_opset8.py
<listcomp>l   s    z5_interpolate.<locals>.symbolic_fn.<locals>.<listcomp>r   UpsampleZmode_sZscales_f)	r   Z_get_interpolate_attributesZ_interpolate_warning_maybe_get_scalar_unimplemented_maybe_get_const	_is_valuerangeop)gr   r   argsscalesalign_cornersr   interpolate_modename)r   r   r    symbolic_fn^   s"   


z!_interpolate.<locals>.symbolic_fnr   )r0   r   r/   r1   r   r.   r    _interpolateE   s   r2   zaten::__interpolater*   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bZinterpolater   zdynamic scales in opset 8zdynamic size in opset 8r"   r#   )r   r&   Z_is_noner%   r'   Z _interpolate_get_scales_and_moder)   )	r*   r   sizeZscale_factormoder-   Zrecompute_scale_factorZ	antialiasr,   r   r   r    __interpolatex   s   r6   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 }q=d| S t	
d |f| S )Nr   c                 3   s$    | ]} j d |tjjdV  qdS )CastZto_iN)r)   _C_onnxZTensorProtoDataTypeFLOAT)r   argr*   r   r    	<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   JitScalarTypeZHALFr:   DOUBLE
from_valueZ	UNDEFINEDZscalar_nametuplewarningswarn)r*   r+   Zfloating_scalar_typesold_typeZ	arg0_typer   r<   r    _try_cast_integer_to_float   s(   

rF   c                 C   s$   |d u r|S t td| | |dS )NZ_cast_F)getattropset9)r*   r   Zto_typer   r   r    _cast_to_type   s   rI   c                 C   s6   t |}t ||}t| ||\}}}| |||S r>   )r   r$   Z_if_scalar_type_asrF   r)   )r*   r   otherZop_name_r   r   r    _comparison_operator   s   
rL   zaten::gtc                 C      t | ||dS )NZGreaterrL   r*   r   rJ   r   r   r    gt      rP   zaten::ltc                 C   rM   )NZLessrN   rO   r   r   r    lt   rQ   rR   z	aten::bmmc                 C   s@   t |rt| ||\}}}t| | d|||S | d||S )NZMatMul)r   _try_get_scalar_typerF   rI   r)   )r*   selfrJ   rE   r   r   r    bmm   s   
rU   zaten::matmulc                 C   s   t | ||S r>   )rU   )r*   rT   rJ   r   r   r    matmul   s   rV   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   Z	Unsqueeze   )Zaxes_ir   ZPRelu)
r   Z_get_tensor_rankZ_get_tensor_sizesr)   listr(   Z_squeeze_helperrS   rF   rI   )r*   rT   weightZ	self_rankZweight_sizesrE   r   r   r    prelu   s   

 
rZ   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Zvalue_tGemmg        r   Zbeta_fZalpha_f)
r   rS   r   ZSymbolicValueErrorr)   torchtensorr\   rF   rI   )r*   rT   rJ   scalar_typeZzero_constantrE   r   r   r    mm   s&   
rc   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   rS   rF   rI   r)   Z_scalar)r*   rT   Zmat1Zmat2betaalpharE   r   r   r    addmm
  s,   
rh   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   rW   ZFlatten)Zaxis_ir   )
r   
_get_constr   r   rS   rF   rI   r)   rH   flatten)r*   r   ri   rj   Zstart_dim_iZ	end_dim_ir   rE   r   r   r    rl   &  s(   

rl   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 )NZConstantFillrW   )Zdtype_iZinput_as_shape_iZvalue_fr7   r8   )r   r?   r:   r\   Zis_floating_pointr)   Z	onnx_type)r*   r   r\   const_valuerb   resultr   r   r    _constant_fillC  s&   



ro   zaten::emptyr   Fc                 C      t | |||||S r>   )zeros)r*   r   r\   layoutdevice
pin_memorymemory_formatr   r   r    empty[     rv   zaten::empty_likec                 C   rp   r>   )
zeros_like)r*   r   r\   rr   rs   rt   ru   r   r   r    
empty_likei  rw   ry   zaten::zerosc                 C   rM   )Nr   ro   r*   r   r\   rr   rs   rt   r   r   r    rq   w  s   rq   zaten::zeros_likec                 C      |  d|}t| ||dS )NShaper   r)   ro   r*   r   r\   rr   rs   rt   ru   shaper   r   r    rx   ~     rx   z
aten::onesc                 C   rM   )NrW   rz   r{   r   r   r    ones  s   r   zaten::ones_likec                 C   r|   )Nr}   rW   r~   r   r   r   r    	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 )Nre   r[   rW   r]   r   r\   )r   r&   r'   rq   rH   addr)   r`   ra   rk   ro   )	r*   r   valuer\   rr   rs   rt   rm   tmpr   r   r    full  s   
 r   zaten::full_likefc           	      C   s   |  d|}t| |||S )Nr}   r~   )	r*   r   Z
fill_valuer\   rr   rs   rt   ru   r   r   r   r    	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   rW   ZTile)r   r'   r)   r`   Z
LongTensorZ_is_packed_listlenZ_unpack_listr&   ZisCompleteTensorr   r   rH   viewra   )r*   rT   ZrepeatsZrepeat_size_lenZconst_repeatsr   Z	diff_dimsr   r   r    repeat  s   

 r   )FN)F)1__doc__	functoolsrC   r`   Ztorch._Cr   r9   Z
torch.onnxr   r   r   r   rH   Ztorch.onnx._internalr   r   partialZonnx_symbolicZ_onnx_symbolicZblock_listed_operatorsZblock_listed_opZ_block_list_in_opsetZ_apply_paramsr2   ZGraphContextr6   rF   rI   rL   rP   rR   rU   rV   rZ   rc   
parse_argsrh   rl   intro   rv   ry   rq   rx   r   r   r   r   r   r   r   r   r    <module>   s    !	