U
    rh*                     @  s`   d dl m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l
mZ G dd deZdS )	    )annotationsN)TensorProto)Base)expect)make_tensorc                   @  s   e Zd ZeddddZeddddZeddddZeddd	d
ZeddddZeddddZ	eddddZ
eddddZeddddZeddddZdS )QuantizeLinearNone)returnc                  C  s   t jjddddgdgd} tddd	d
ddgtj}td}td}tddddddgtj}t| |||g|gdd d S )Nr   xy_scaley_zero_pointyinputsoutputsr         i  ii               Ztest_quantizelinearr   r   name)	onnxhelper	make_nodenparrayastypefloat32uint8r   noder
   r   r   r    r$   N/tmp/pip-unpacked-wheel-xnis5xre/onnx/backend/test/case/node/quantizelinear.pyexport   s    

zQuantizeLinear.exportc                  C  s   t jjddddgdgd} tjddgd	d
gddggddgddgddggddgddgddggggtjd}tjdddgtjd}tjdddgtjd}||dd dd |dd dd tj}t	| |||g|gd!d" d S )#Nr   r
   r   r   r   r   i^
   i   iir          i   ii@iii*Zdtyper         T         r   r   Ztest_quantizelinear_axisr   )
r   r   r   r   r   r    r!   Zreshaper   r   r"   r$   r$   r%   export_axis$   s0    
$zQuantizeLinear.export_axisc               	   C  s   t jjddddgdgd} tddd	d
dgtj}td}tdtj	dgdg}tdtj	dgdddddg}t
| |||g|gdd d S )Nr   r
   r   r   r   r                 ?       @     j@      i@r   r   r   r/         ?i  `   Ztest_quantizelinear_e4m3fnr   )r   r   r   r   r   r   r    r   r   ZFLOAT8E4M3FNr   r"   r$   r$   r%   export_e4m3fnC   s    
zQuantizeLinear.export_e4m3fnc               	   C  s   t jjddddgdgd} tddd	d
dgtj}td}tdtj	dgdg}tdtj	dgdddddg}t
| |||g|gdd d S )Nr   r
   r   r   r   r   r4   r5   r6   r7   r8   r   r   r/   r   r9   i   r:   Ztest_quantizelinear_e5m2r   )r   r   r   r   r   r   r    r   r   Z
FLOAT8E5M2r   r"   r$   r$   r%   export_e5m2W   s    
zQuantizeLinear.export_e5m2c                  C  s   t jjddddgdgd} tddd	d
ddddddddgtj}td}td}tddddddddddddgtj}t| |||g|gdd d S )Nr   r
   r   r   r   r   r4   g      `      @      333333@333333@g      @g         @     r6     i  i  i  i   i  i  r   Ztest_quantizelinear_uint16r   )	r   r   r   r   r   r   r    Zuint16r   r"   r$   r$   r%   export_uint16k   s^    

zQuantizeLinear.export_uint16c                  C  s   t jjddddgdgd} tddd	d
ddddddddddddgtj}td}td}tdddddddddddd dd dd gtj}t| |||g|gd!d" d S )#Nr   r
   r   r   r   r   r4   g     r=   r>   r?   r@   rA   rB   g    @g    g    @g    g     @g      rC   rD   r6      i     i  r   rE   i Ztest_quantizelinear_int16r   )	r   r   r   r   r   r   r    int16r   r"   r$   r$   r%   export_int16   sn    

zQuantizeLinear.export_int16c                  C  s   t jjddddgdgdd} tdd	d
dgddddgddddggtj}tjdddgtjd}tdt	j
|jt|}tdt	j
|jddddddddddddg}t| |||g|gdd  d S )!Nr   r
   r   r   r   r   r   r   axisr4         @333333@333333!@r)      	            (   r6   r=         @r-   r   r   r   r/   rH   r.      Ztest_quantizelinear_uint4r   )r   r   r   r   r   r   r    asarrayr   r   ZUINT4shape	ones_liker   r"   r$   r$   r%   export_uint4   sB    


      zQuantizeLinear.export_uint4c                  C  s   t jjddddgdgdd} tdd	d
dgddddgddddggtj}tjdddgtjd}tdt	j
|jt|}tdt	j
|jddddddddddddg}t| |||g|gd d! d S )"Nr   r
   r   r   r   r   rM   r4   rO   rP   rQ   rR   r)   rS   rT   rU   rV   rW   rX   r6   r=   rY   r-   r   r   r   r/   ir.      Ztest_quantizelinear_int4r   )r   r   r   r   r   r   r    r[   r   r   ZINT4r\   r]   r   r"   r$   r$   r%   export_int4   sB    


      zQuantizeLinear.export_int4c                    sR  t jjddddgdgddd} tjd	d
ddgddddgddddggtjdtjddgddgddggtjdtjddgddgddggtjd}j|jkstd t	 fddt
tjD stj  j   dkstj  j   }tj| d}tj|| d}t| | tj}t| |g|gdd  d S )!Nr   r
   r   r   r   r   r   )r   r   rN   
block_size      @g      (@g      I@      @r5          @rY   r4         4@      $@r-         ?rO   r=   皙@ffffff@皙@r   r   c                 3  s*   | ]"}| krj | j | kV  qd S Nr\   .0iZ
block_axisr
   r   r$   r%   	<genexpr>>  s   z;QuantizeLinear.export_blocked_asymmetric.<locals>.<genexpr>repeatsrN   Z&test_quantizelinear_blocked_asymmetricr   )r   r   r   r   r   r    r!   r\   AssertionErrorallrangelenrepeatrintr   r   )r#   r   rt   y_scale_elementwiseZy_zero_point_elementwiser   r$   rq   r%   export_blocked_asymmetric  s`    



  z(QuantizeLinear.export_blocked_asymmetricc                    s*  t jjdddgdgddtjd} tjdd	d
dgddddgddddggtjdtjddgddgddggtjdd t fddt	t
jD stj  j   dkstj  j   }tj| d}tjt| dddtj}tdtjj|}t| g|gd d! d S )"Nr   r
   r   r   r   r   )r   r   rN   rb   Zoutput_dtyperc   r_   ird   r5   re   rY   r4   rf   rg   r-   rh   rO   r=   ri   rj   rk   c                 3  s*   | ]"}| krj | j | kV  qd S rl   rm   rn   rq   r$   r%   rr   w  s   z:QuantizeLinear.export_blocked_symmetric.<locals>.<genexpr>r   rs   rJ   rE   )Za_minZa_maxZ%test_quantizelinear_blocked_symmetricr   )r   r   r   r   ZINT16r   r   r    rv   rw   rx   r\   ru   ry   Zcliprz   r   rK   r   r   )r#   rt   r{   Zy_valr   r$   rq   r%   export_blocked_symmetricU  s`    	


	  z'QuantizeLinear.export_blocked_symmetricN)__name__
__module____qualname__staticmethodr&   r3   r;   r<   rF   rL   r^   ra   r|   r}   r$   r$   r$   r%   r      s(   19=r   )
__future__r   Znumpyr   r   r   Zonnx.backend.test.case.baser   Zonnx.backend.test.case.noder   Zonnx.helperr   r   r$   r$   r$   r%   <module>   s   