a
    d:                     @   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 qhd
d Z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ededddgddd Zed ejd!d"d#Zejd!d$d%Zejd!d&d'Zejd!d(d)Zed*ejd!d+d,Zed-ejd!d.d/Zed0ejd!d1d2Zed3ejd!d4d5Z ed6ejd!d7d8Z!ed9ejd!d:d;Z"ed<e
#d=d=d=d>d>ejd!d?d@Z$edAejd!dBdCZ%eje&dDdEdFZ'edGe
#d=dHd=d=d=d=deejd!dJdKZ(edLe
#d=dHd=d=d=d=dfejd!dMdNZ)edOe
#d=dHd=d=d=dgejd!dPdQZ*edRe
#d=dHd=d=d=d=dhejd!dSdTZ+edUe
#d=dHd=d=d=diejd!dVdWZ,edXe
#d=dHd=d=d=d=djejd!dYdZZ-ed[dkejd!d\d]Z.ed^e
#d=d_dHd=d=d=d=dlejd!d`daZ/edbejd!dcddZ0dS )ma  
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::c                     s    fdd}|S )z_Returns a decorator that calls the decorated (higher-order) function with the given parameters.c                    s   |  i S N )fnargskwargsr   c/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/torch/onnx/symbolic_opset8.py_applyF   s    z_apply_params.<locals>._applyr   )r   r   r   r   r   r   _apply_paramsC   s    r   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 |}|r8t d S t dt rZt 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_sizer   r   
<listcomp>s   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'   r   scalesalign_cornersr%   interpolate_modename)r&   r'   r   symbolic_fne   s"    


z!_interpolate.<locals>.symbolic_fnr   )r6   r%   r5   r7   r   r4   r   _interpolateL   s    r8   zaten::__interpolater1   c           	      C   s   t |d}t |s&|r&t ddS t |sFt |rFt ddS t |sft |rft 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_moder0   )	r1   r&   sizeZscale_factormoder3   Zrecompute_scale_factorZ	antialiasr2   r   r   r   __interpolate   s    r=   c                    s   t jjt jjt jjh}d }t j|d t jj}|t jjkrr|}||vrh| }t fdd|D }q|d| S n
t	
d |f| S )Nr   c                 3   s"   | ]} j d |tjjdV  qdS )CastZto_iN)r0   _C_onnxZTensorProtoDataTypeFLOAT)r#   argr9   r   r   	<genexpr>   s   z-_try_cast_integer_to_float.<locals>.<genexpr>r   zOnly 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HALFrA   ZDOUBLE
from_value	UNDEFINEDZscalar_nametuplewarningswarn)r1   r   Zfloating_scalar_typesold_typeZ	arg0_typer   r9   r   _try_cast_integer_to_float   s(    

rK   c                 C   s$   |d u r|S t td| | |dS )NZ_cast_F)getattropset9)r1   r&   Zto_typer   r   r   _cast_to_type   s    rN   c                 C   s6   t |}t ||}t| ||\}}}| |||S r   )r   r+   Z_if_scalar_type_asrK   r0   )r1   r&   otherZop_name_r   r   r   _comparison_operator   s    
rQ   zaten::gtc                 C   s   t | ||dS )NZGreaterrQ   r1   r&   rO   r   r   r   gt   s    rT   zaten::ltc                 C   s   t | ||dS )NZLessrR   rS   r   r   r   lt   s    rU   z	aten::bmmc                 C   sD   t |r2t| ||\}}}t| | d|||S | d||S d S )NZMatMul)r   _try_get_scalar_typerK   rN   r0   )r1   selfrO   rJ   r   r   r   bmm   s    
rX   zaten::matmulc                 C   s   t | ||S r   )rX   )r1   rW   rO   r   r   r   matmul   s    rY   zaten::preluc                 C   s   t |}t |}|d urD|dkrD| jd|ttd|d d}n"|dkrf|dgkrft | |dg}t |rt| ||\}}}t	| | d|||S | d||S d S )Nr   Z	Unsqueeze   )Zaxes_ir   ZPRelu)
r   Z_get_tensor_rankZ_get_tensor_sizesr0   listr/   Z_squeeze_helperrV   rK   rN   )r1   rW   ZweightZ	self_rankZweight_sizesrJ   r   r   r   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Zvalue_tGemmg        r   Zbeta_fZalpha_f)
r   rV   r   ZSymbolicValueErrorr0   torchtensorr^   rK   rN   )r1   rW   rO   scalar_typeZzero_constantrJ   r   r   r   mm   s&    
re   zaten::addmmvtc                 C   sp   t |rJt| |||\}}}}t| | jd|||t |t |d|S | jd|||t |t |dS d S )Nr`   ra   )r   rV   rK   rN   r0   Z_scalar)r1   rW   Zmat1Zmat2betaalpharJ   r   r   r   addmm  s,    
rj   zaten::flattenc                 C   s   t |dd}t |dd}|  }|dk r8|| }|dkr||d krt |r|t| |\}}t| | jd||d|S | jd||dS |dkr||d krt |rt| |\}}t| | jd||d d|S | jd||d dS t	| |||S )	Nr$   	start_dimend_dimr   rZ   ZFlatten)Zaxis_ir   )
r   
_get_constr!   r%   rV   rK   rN   r0   rM   flatten)r1   r&   rk   rl   Zstart_dim_iZ	end_dim_ir%   rJ   r   r   r   rn   -  s(    

rn   )r1   r^   c                 C   sr   |d u rt jj}n
t |}| jsV| jd|t jj d|d}| jd|| dS | jd|| d|dS d S )NZConstantFillrZ   )Zdtype_iZinput_as_shape_iZvalue_fr>   r?   )r   rD   rA   r^   Zis_floating_pointr0   Z	onnx_type)r1   r"   r^   const_valuerd   resultr   r   r   _constant_fillJ  s&    



rq   zaten::emptyr$   Fc                 C   s   t | |||||S r   )zeros)r1   r"   r^   layoutdevice
pin_memorymemory_formatr   r   r   emptyb  s    rw   zaten::empty_likec                 C   s   t | |||||S r   )
zeros_like)r1   r&   r^   rs   rt   ru   rv   r   r   r   
empty_likep  s    ry   zaten::zerosc                 C   s   t | ||dS )Nr   rq   r1   r"   r^   rs   rt   ru   r   r   r   rr   ~  s    rr   zaten::zeros_likec                 C   s   |  d|}t| ||dS )NShaper   r0   rq   r1   r&   r^   rs   rt   ru   rv   shaper   r   r   rx     s    rx   z
aten::onesc                 C   s   t | ||dS )NrZ   rz   r{   r   r   r   ones  s    r   zaten::ones_likec                 C   s   |  d|}t| ||dS )Nr|   rZ   r}   r~   r   r   r   	ones_like  s    r   z
aten::fullc           	   
   C   sf   t |d}t |rFt| ||||}t| ||| jdtddS t 	|dd}t
| |||S d S )Nrg   r]   rZ   r_   r$   r^   )r   r-   r.   rr   rM   addr0   rb   rc   rm   rq   )	r1   r"   valuer^   rs   rt   ru   ro   tmpr   r   r   full  s    
 r   zaten::full_likefc           	      C   s   |  d|}t| |||S )Nr|   r}   )	r1   r&   Z
fill_valuer^   rs   rt   ru   rv   r   r   r   r   	full_like  s    r   zaten::repeatc              
   C   s   t |s| jdt|d}t |r8tt |}nt |d}t|}|	 r|
  }|t| }|dkrt| || jdtdg| | d}| d||S )Nr]   r_   r   r   rZ   ZTile)r   r.   r0   rb   Z
LongTensorZ_is_packed_listlenZ_unpack_listr-   ZisCompleteTensorr!   r"   rM   viewrc   )r1   rW   ZrepeatsZrepeat_size_lenZconst_repeatsr"   Z	diff_dimsr   r   r   repeat  s    

 r   )FN)FN)F)FN)F)FN)F)FN)1__doc__	functoolsrH   rb   Ztorch._Cr   r@   Z
torch.onnxr   r   r   r   rM   Ztorch.onnx._internalr   r   partialZonnx_symbolicZ_onnx_symbolicZblock_listed_operatorsZblock_listed_opZ_block_list_in_opsetr   r8   ZGraphContextr=   rK   rN   rQ   rT   rU   rX   rY   r\   re   
parse_argsrj   rn   intrq   rw   ry   rr   rx   r   r   r   r   r   r   r   r   r   <module>   s    	!	           