U
    q±Ëh]_  ã                   @  sª   d dl mZ d dlZd dlmZ d dlZd dlZd dlZd dl	Zd dlm
Z
mZ dddœdd	„Zdddœd
d„Zdddœdd„ZG dd„ dejƒZedkr¦ejdd dS )é    )ÚannotationsN)ÚAny)ÚhelperÚnumpy_helperÚintr   )ÚivalÚreturnc                 C  sh   | dkrt  t j¡S | d? }| |d>  }|d@ }|d@ }t|d d ƒd|d   }|r^| }t  |¡S )	NiÀ  é   é   éÿ   ç      €?é   ç       @é   )ÚnpÚfloat32ÚnanÚfloat)r   ÚexpoÚprecÚsignÚpoweÚfval© r   ú?/tmp/pip-unpacked-wheel-xnis5xre/onnx/test/numpy_helper_test.pyÚbfloat16_to_float32   s    r   c                 C  sÔ   | dk s| dkrt | › dƒ‚| dkr4t tj ¡S | dkrHt tj¡S | d@ dkr^t d¡S | d@ }| dM } | d? }| d@ }|d@ }|dkrœ|d	8 }d}n|d8 }d
}t|d | ƒd|  }|rÊ| }t |¡S )Nr   r   ú is not a float8.r   é€   é   r	   é   é   r   é   r   )Ú
ValueErrorr   r   r   r   ©r   r   r   Zmantr   Úfractionr   r   r   r   Úfloat8e4m3_to_float32   s,    
r%   c                 C  sþ   | dk s| dkrt | › dƒ‚| dkr4t tj ¡S | dkrHt tj¡S | dkr^t tj¡ S | dkrrt tj¡S | d@ dkrˆt d¡S | d	@ }| dM } | d
? }| d@ }|d@ }|dkrÆ|d8 }d}n|d8 }d}t|d | ƒd|  }|rô| }t |¡S )Nr   r   r   )r   éþ   éý   )r   é~   é}   éü   é|   r   r   é   r   é   é   r   r   é   r   )r"   r   r   r   Úinfr   r#   r   r   r   Úfloat8e5m2_to_float32:   s4    
r1   c                   @  s,  e Zd Zdddœdd„Zdddœdd„Zddœd	d
„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd „Zej d!d"d#d$ejfejfg¡d%d&„ ƒZd'd(„ Zej d)d*d+d,d-d.d/d0d1d2d3g¡d4d5„ ƒZd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdDdE„ Z dFdG„ Z!dHdI„ Z"dJdK„ Z#dLdM„ Z$dNdO„ Z%dPdQ„ Z&dRdS„ Z'dTdU„ Z(dVdW„ Z)dXdY„ Z*dZd[„ Z+d\d]„ Z,d^d_„ Z-d`da„ Z.dbdc„ Z/dsdedfdgœdhdi„Z0ej djdk„ e1e2j3ƒD ƒ¡dldm„ ƒZ4dndo„ Z5dpdq„ Z6drS )tÚTestNumpyHelperz	np.numberÚNone)Údtyper   c                 C  sJ   t j dd¡ |¡}t |d¡}|  |jd¡ t |¡}t j	 
||¡ d S )Né   é%   Útest)r   ÚrandomZrandÚastyper   Ú
from_arrayÚassertEqualÚnameÚto_arrayÚtestingÚassert_equal©Úselfr4   ÚaÚ
tensor_defÚ	a_recoverr   r   r   Ú_test_numpy_helper_float_typeZ   s
    
z-TestNumpyHelper._test_numpy_helper_float_typec                 C  sZ   t jjt  |¡jt  |¡j|dd}t |d¡}|  |j	d¡ t 
|¡}t j ||¡ d S )N©r5   r6   )r4   Úsizer7   )r   r8   ÚrandintZiinfoÚminÚmaxr   r:   r;   r<   r=   r>   r?   r@   r   r   r   Ú_test_numpy_helper_int_typea   s    
 
  ÿ
z+TestNumpyHelper._test_numpy_helper_int_type)r   c                 C  s   |   tj¡ d S ©N©rE   r   r   ©rA   r   r   r   Ú
test_floatj   s    zTestNumpyHelper.test_floatc                 C  s   |   tj¡ d S rL   )rK   r   Zuint8rN   r   r   r   Ú
test_uint8m   s    zTestNumpyHelper.test_uint8c                 C  s   |   tj¡ d S rL   )rK   r   Zint8rN   r   r   r   Ú	test_int8p   s    zTestNumpyHelper.test_int8c                 C  s   |   tj¡ d S rL   )rK   r   Zuint16rN   r   r   r   Útest_uint16s   s    zTestNumpyHelper.test_uint16c                 C  s   |   tj¡ d S rL   )rK   r   Zint16rN   r   r   r   Ú
test_int16v   s    zTestNumpyHelper.test_int16c                 C  s   |   tj¡ d S rL   )rK   r   Zint32rN   r   r   r   Ú
test_int32y   s    zTestNumpyHelper.test_int32c                 C  s   |   tj¡ d S rL   )rK   r   Zint64rN   r   r   r   Ú
test_int64|   s    zTestNumpyHelper.test_int64c                 C  sN   t  ddddg¡ t¡}t |d¡}|  |jd¡ t |¡}t j	 
||¡ d S )NZAmyZBillyZCindyZDavidr7   )r   Úarrayr9   Úobjectr   r:   r;   r<   r=   r>   r?   ©rA   rB   rC   rD   r   r   r   Útest_string   s
    
zTestNumpyHelper.test_stringc                 C  sL   t jjddd t¡}t |d¡}|  |jd¡ t 	|¡}t j
 ||¡ d S )Nr,   rF   )rG   r7   )r   r8   rH   r9   Úboolr   r:   r;   r<   r=   r>   r?   rX   r   r   r   Ú	test_bool†   s
    
zTestNumpyHelper.test_boolc                 C  s   |   tj¡ d S rL   rM   rN   r   r   r   Útest_float16   s    zTestNumpyHelper.test_float16c                 C  s   |   tj¡ d S rL   )rE   r   Z	complex64rN   r   r   r   Útest_complex64   s    zTestNumpyHelper.test_complex64c                 C  s   |   tj¡ d S rL   )rE   r   Z
complex128rN   r   r   r   Útest_complex128“   s    zTestNumpyHelper.test_complex128)r   )gAíþÿŸ¹?)i ü )gØq @ë>c                 C  s„   t  |¡}t |¡}t|tƒs"t‚t t  	|g¡¡d }t|ƒ}t  
|¡rht  
|¡sXt‚t  
|¡s€t‚n|  ||¡ |  ||¡ d S )Nr   )r   r   r   Zfloat32_to_bfloat16Ú
isinstancer   ÚAssertionErrorr   r   rV   Úisnanr;   )rA   ÚfÚf32Zbf16Úf32_1Úf32_2r   r   r   Útest_bfloat16_to_float32–   s    


z(TestNumpyHelper.test_bfloat16_to_float32c                 C  s,  |   t tddƒ¡d¡ |   t tddƒ¡d¡ |   t tddƒ¡d¡ |   t tddƒ¡d	¡ d
dddddddddddddd	tjfD ] }| j|dŠ t |¡}t 	|¡}t
|tƒsºt‚t t |g¡¡d
 }t|ƒ}t |¡rt |¡sòt‚t |¡st‚n|   ||¡ |   ||¡ W 5 Q R X q†d S )NÚ1111110r,   éÀ  Z1000g      ?Ú1ç      `?Z111g      Œ?r   r   éÿÿÿÿg      à?g      à¿g      º?g      º¿r   éþÿÿÿéýÿÿÿ©rb   )r;   r   r%   r   r   r   ÚsubTestr   r   Úfloat32_to_float8e4m3r_   r`   rV   ra   ©rA   rb   rc   Úf8rd   re   r   r   r   Útest_float8e4m3_to_float32­   sF     ÿð

z*TestNumpyHelper.test_float8e4m3_to_float32)g      r?ç      p?)ç      x?ru   )góŽSt$—w?ru   )g333333s?rt   )rj   rj   )g      h?rt   )gâX·Ñ`?rj   )g333333c?rj   )g      ‚?r   )g333333S?rj   )gVbž•´ý?g      þ?c                 C  s$   t  |¡}t |¡}|  ||¡ d S rL   )r   rp   r   r%   r;   )rA   ÚvalÚexpectedrr   rc   r   r   r   Ú test_float8e4m3_to_float32_roundÓ   s    

z0TestNumpyHelper.test_float8e4m3_to_float32_roundc              
   C  sü  |   t tddƒ¡d¡ |   t tddƒ¡d¡ |   t tddƒ¡d¡ |   t tddƒ¡d	¡ |  t t td
dƒ¡¡¡ |  t t tddƒ¡¡¡ |  t t tddƒ¡¡¡ |  t t tddƒ¡¡¡ |  t t tddƒ¡¡¡ |  t t tddƒ¡¡¡ |   t tddƒ¡tj¡ |   t tddƒ¡tj ¡ dddddtjfD ]¦}| j	|dŽ t 
|¡}t |¡}t|tƒs†t‚t t |g¡¡d }t|ƒ}t |¡rÒt |¡sÀt‚t |¡sêt‚n|   ||¡ |   ||¡ W 5 Q R X qPd S )NZ1111011r,   é à  Z100g      ?Z11g      ?ri   g      ð>Z1111101rg   Z1111111Z11111101Z11111110Z11111111Z1111100Z11111100r   gö7ß  \?i P  r.   i òÿÿrn   )r;   r   r1   r   Ú
assertTruer   ra   r0   r   ro   r   r   Úfloat32_to_float8e5m2r_   r`   rV   rq   r   r   r   Útest_float8e5m2_to_float32ç   sT     ÿÿÿÿ ÿú

z*TestNumpyHelper.test_float8e5m2_to_float32c                 C  sè   t  t j¡}t |¡}t |¡}|  |d¡ t  t j¡}tj|dd}t |¡}|  t  	|¡¡ t  t j ¡}t |¡}|  |d@ d¡ t |¡}|  |d¡ t  t j ¡}tj|dd}|  |d@ d¡ t |¡}|  t  	|¡¡ d S )Nrh   F©Úsaturater   é@þÿÿ©
r   r   r0   r   rp   r   r%   r;   rz   ra   ©rA   ÚxÚtoÚbackr   r   r   Útest_float8_e4m3fn_inf  s$    





z&TestNumpyHelper.test_float8_e4m3fn_infc                 C  sä   t  t j¡}tj|dd}tj|dd}|  |d¡ t  t j¡}tj|ddd}tj|dd}|  t  	|¡¡ t  t j ¡}tj|dd}tj|dd}|  |d¡ t  t j ¡}tj|ddd}tj|dd}|  t  	|¡¡ d S )NT©Úuzéð   F©r‡   r~   éÿÿÿr€   r   r   r   r   Útest_float8_e4m3fnuz_inf*  s     z(TestNumpyHelper.test_float8_e4m3fnuz_infc                 C  sô   t  t j¡}t |¡}t |¡}|  |d¡ t  t j¡}tj|dd}t |¡}|  t  	|¡¡ t  t j ¡}t |¡}|  |d@ d¡ t |¡}|  |d¡ t  t j ¡}tj|dd}|  |d@ d¡ t |¡}|  t  	|¡¡ |  
|d¡ d S )Nry   Fr}   r   é  ÿÿr   )r   r   r0   r   r{   r   r1   r;   rz   ÚisinfZ
assertLessr   r   r   r   Útest_float8_e5m2_inf?  s&    





z$TestNumpyHelper.test_float8_e5m2_infc                 C  sô   t  t j¡}tj|ddd}tj|ddd}|  |d¡ t  t j¡}tj|dddd}tj|ddd}|  t  	|¡¡ t  t j ¡}tj|ddd}tj|ddd}|  |d¡ t  t j ¡}tj|dddd}tj|ddd}|  t  	|¡¡ d S )NT©Úfnr‡   ry   F©r   r‡   r~   rŒ   )
r   r   r0   r   r{   r   r1   r;   rz   ra   r   r   r   r   Útest_float8_e5m2fnuz_infW  s     z(TestNumpyHelper.test_float8_e5m2fnuz_infc                 C  s¼   t  d¡}t |¡}t |¡}|  |d¡ t  d¡}tj|dd}t |¡}|  t  |¡¡ t  d¡}t |¡}t |¡}|  |d¡ t  d¡}tj|dd}t |¡}|  t  |¡¡ d S )Né@B rh   Fr}   éÀ½ðÿr   ©	r   r   r   rp   r   r%   r;   rz   ra   r   r   r   r   Útest_float8_e4m3fn_out_of_rangel  s     









z/TestNumpyHelper.test_float8_e4m3fn_out_of_rangec                 C  sØ   t  d¡}tj|dd}tj|dd}|  |d¡ t  d¡}tj|ddd}tj|dd}|  t  |¡¡ t  d¡}tj|dd}tj|dd}|  |d¡ t  d¡}tj|ddd}tj|dd}|  t  |¡¡ d S )	Nr“   Tr†   rˆ   Fr‰   r”   rŠ   r•   r   r   r   r   Ú!test_float8_e4m3fnuz_out_of_range  s     



z1TestNumpyHelper.test_float8_e4m3fnuz_out_of_rangec                 C  s¼   t  d¡}t |¡}t |¡}|  |d¡ t  d¡}tj|dd}t |¡}|  t  |¡¡ t  d¡}t |¡}t |¡}|  |d¡ t  d¡}tj|dd}t |¡}|  t  |¡¡ d S )Nr“   ry   Fr}   r”   rŒ   )	r   r   r   r{   r   r1   r;   rz   r   r   r   r   r   Útest_float8_e5m2_out_of_range–  s     









z-TestNumpyHelper.test_float8_e5m2_out_of_rangec                 C  sè   t  d¡}tj|ddd}tj|ddd}|  |d¡ t  d¡}tj|dddd}tj|ddd}|  t  |¡¡ t  d¡}tj|ddd}tj|ddd}|  |d¡ t  d¡}tj|dddd}tj|ddd}|  t  |¡¡ d S )	Nr“   Tr   ry   Fr‘   r”   rŒ   )	r   r   r   r{   r   r1   r;   rz   ra   r   r   r   r   Ú!test_float8_e5m2fnuz_out_of_range«  s     



z1TestNumpyHelper.test_float8_e5m2fnuz_out_of_rangec                 C  st   t  d¡}t |¡}|  |d¡ t  |¡}|  |d¡ t  d¡}tj|dd}|  |d¡ t  |¡}|  |d¡ d S ©Nr   r   Fr}   ©r   r1   r   rp   r;   r%   r   r   r   r   Ú test_float8_e4m3fn_negative_zeroÀ  s    




z0TestNumpyHelper.test_float8_e4m3fn_negative_zeroc                 C  s‚   t  d¡}tj|dd}|  |d¡ t j|dd}|  |d¡ t  d¡}tj|ddd}t j|dd}|  |d¡ |  |d¡ d S )Nr   Tr†   r   Fr‰   r›   r   r   r   r   Ú"test_float8_e4m3fnuz_negative_zeroÍ  s    

z2TestNumpyHelper.test_float8_e4m3fnuz_negative_zeroc                 C  st   t  d¡}t |¡}|  |d¡ t  |¡}|  |d¡ t  d¡}tj|dd}|  |d¡ t  |¡}|  |d¡ d S rš   ©r   r1   r   r{   r;   r%   r   r   r   r   Útest_float8_e5m2_negative_zeroÚ  s    




z.TestNumpyHelper.test_float8_e5m2_negative_zeroc                 C  sŠ   t  d¡}tj|ddd}|  |d¡ t j|ddd}|  |d¡ t  d¡}tj|dddd}|  |d¡ t j|ddd}|  |d¡ d S )Nr   Tr   r   Fr‘   rž   r   r   r   r   Ú"test_float8_e5m2fnuz_negative_zeroç  s    

z2TestNumpyHelper.test_float8_e5m2fnuz_negative_zeroc                 C  s|   t  d¡}t |¡}|  |d¡ t  |¡}|  t |¡¡ t  d¡}tj|dd}|  |d¡ t  |¡}|  t |¡¡ d S ©Nr   Fr}   ©	r   r1   r   rp   r;   r%   rz   r   ra   r   r   r   r   Útest_float8_e4m3fn_negative_nanô  s    




z/TestNumpyHelper.test_float8_e4m3fn_negative_nanc                 C  sŠ   t  d¡}tj|dd}|  |d¡ t j|dd}|  t |¡¡ t  d¡}tj|ddd}|  |d¡ t j|dd}|  t |¡¡ d S )Nr   Tr†   r   Fr‰   r¢   r   r   r   r   Ú!test_float8_e4m3fnuz_negative_nan  s    

z1TestNumpyHelper.test_float8_e4m3fnuz_negative_nanc                 C  s|   t  d¡}t |¡}|  |d¡ t  |¡}|  t |¡¡ t  d¡}tj|dd}|  |d¡ t  |¡}|  t |¡¡ d S r¡   ©	r   r1   r   r{   r;   r%   rz   r   ra   r   r   r   r   Útest_float8_e5m2_negative_nan  s    




z-TestNumpyHelper.test_float8_e5m2_negative_nanc                 C  s’   t  d¡}tj|ddd}|  |d¡ t j|ddd}|  t |¡¡ t  d¡}tj|dddd}|  |d¡ t j|ddd}|  t |¡¡ d S )Nr   Tr   r   Fr‘   r¥   r   r   r   r   Ú!test_float8_e5m2fnuz_negative_nan  s    

z1TestNumpyHelper.test_float8_e5m2fnuz_negative_nanc                 C  sn   t  t d¡t d¡dœ¡}|  |tj¡ |  t  |j	j
d ¡t d¡¡ |  t  |j	j
d ¡t d¡¡ d S )Nçš™™™™™¹?çÍÌÌÌÌÌì?©r   r   r   r   ©r   Ú	from_dictr   rV   ÚassertIsInstanceÚonnxÚMapProtor;   r=   ÚvaluesÚtensor_values©rA   Ú	map_protor   r   r   Ú,test_from_dict_values_are_np_arrays_of_float(  s     ÿ ÿz<TestNumpyHelper.test_from_dict_values_are_np_arrays_of_floatc                 C  sn   t  t d¡t d¡dœ¡}|  |tj¡ |  t  |j	j
d ¡t d¡¡ |  t  |j	j
d ¡t d¡¡ d S )Nr   é	   rª   r   r«   r²   r   r   r   Ú*test_from_dict_values_are_np_arrays_of_int2  s     ÿ ÿz:TestNumpyHelper.test_from_dict_values_are_np_arrays_of_intc                 C  s²   t  ddg¡}t  ddg¡}t ||dœ¡}|  |tj¡ t |jj	d ¡}|  
|d |d ¡ |  
|d |d ¡ t |jj	d ¡}|  
|d |d ¡ |  
|d |d ¡ d S )Nr   r,   rµ   é
   rª   r   )r   rV   r   r¬   r­   r®   r¯   r=   r°   r±   r;   )rA   Z
zero_arrayZ	one_arrayr³   Z
out_tensorr   r   r   Ú+test_from_dict_values_are_np_arrays_of_ints<  s    z;TestNumpyHelper.test_from_dict_values_are_np_arrays_of_intsc              	   C  s*   |   t¡ t dddœ¡ W 5 Q R X d S )Nr¨   r©   rª   )ÚassertRaisesÚ	TypeErrorr   r¬   rN   r   r   r   Ú>test_from_dict_raises_type_error_when_values_are_not_np_arraysJ  s    zNTestNumpyHelper.test_from_dict_raises_type_error_when_values_are_not_np_arraysc              	   C  s6   |   t¡" t t d¡t d¡dœ¡ W 5 Q R X d S )Nr¨   r©   )r   gš™™™™™ñ?©r¹   rº   r   r¬   r   rV   rN   r   r   r   Ú"test_from_dict_differing_key_typesO  s    z2TestNumpyHelper.test_from_dict_differing_key_typesc              	   C  s6   |   t¡" t t d¡t d¡dœ¡ W 5 Q R X d S )Nr   r©   rª   r¼   rN   r   r   r   Ú$test_from_dict_differing_value_typesT  s    z4TestNumpyHelper.test_from_dict_differing_value_typesTr   rZ   )ÚvalueÚcheck_dtypec           	      C  s„  t  t  t jddgdg|dgdt  dtjjdg¡gt  d|dg¡g¡¡}tj 	|¡}| 
d dtjddd	d
gtjdi¡}tj|d dd}|  |j|¡ t |¡}|  |d j|j¡ |rÐ|  |d j|j¡ tj|dd}|  |j|j¡ |  |j|j¡ |  t|jƒt|jƒ¡ |  t|jƒt|jƒ¡ |  |j|j¡ |  t|jƒt|jƒ¡ |  | ¡ | ¡ ¡ |  |jt  |j¡¡ d S )NZCastÚXÚY)rƒ   r7   r/   r   r   rl   r   )r4   Úcheck)r<   )r   Z
make_modelZ
make_graphZ	make_nodeZmake_tensor_value_infor®   ÚTensorProtoÚFLOATÚ	referenceZReferenceEvaluatorÚrunr   rV   r   r   r:   r;   Z	data_typer=   Úshaper4   r<   ÚlenÚraw_dataÚlistÚtupleZdimsZSerializeToStringZnp_dtype_to_tensor_dtype)	rA   r¿   rÀ   Z
onnx_modelÚrefÚstartÚtpr„   Zagainr   r   r   Ú_to_array_from_arrayY  s2    üÿ$
z$TestNumpyHelper._to_array_from_arrayc                 C  s   g | ]
}|f‘qS r   r   )Ú.0Úattr   r   r   Ú
<listcomp>t  s     zTestNumpyHelper.<listcomp>c                 C  sP   |dkrd S |d dk s$|d dkr(d S t tj|ƒ}t|tƒsBd S |  |¡ d S )N>   ÚDEFAULTÚINT4ÚSTRINGÚUINT4Ú	UNDEFINEDÚNAME_FIELD_NUMBERr   ÚAÚZ)Úgetattrr®   rÄ   r_   r   rÐ   )rA   rÒ   r¿   r   r   r   Útest_to_array_from_arrayt  s    
z(TestNumpyHelper.test_to_array_from_arrayc                 C  s    |   tjj¡ |   tjj¡ d S rL   )rÐ   r®   rÄ   rÕ   r×   rN   r   r   r   Ú test_to_array_from_array_subtype‡  s    z0TestNumpyHelper.test_to_array_from_array_subtypec                 C  s   |   tjjd¡ d S )NF)rÐ   r®   rÄ   rÖ   rN   r   r   r   Útest_to_array_from_array_string‹  s    z/TestNumpyHelper.test_to_array_from_array_stringN)T)7Ú__name__Ú
__module__Ú__qualname__rE   rK   rO   rP   rQ   rR   rS   rT   rU   rY   r[   r\   r]   r^   ÚparameterizedÚexpandr   r   r0   rf   rs   rx   r|   r…   r‹   rŽ   r’   r–   r—   r˜   r™   rœ   r   rŸ   r    r£   r¤   r¦   r§   r´   r¶   r¸   r»   r½   r¾   rÐ   Údirr®   rÄ   rÝ   rÞ   rß   r   r   r   r   r2   Y   sˆ   	úÿ

&õÿ
,


r2   Ú__main__r,   )Ú	verbosity)Ú
__future__r   ZunittestÚtypingr   Znumpyr   rã   r®   Zonnx.referencer   r   r   r%   r1   ZTestCaser2   rà   Úmainr   r   r   r   Ú<module>   s"       :