U
    #c^                     @   sb   d dl Z d dlZd dlZd dlmZmZmZmZ d dlm	Z	m
Z
mZmZ dd ZG dd dZdS )    N)uint16float16float32float64)assert_assert_equal_OLD_PROMOTIONIS_WASMc              
   O   s`   z||| W n> t k
rL } z tt|| dkd|   W 5 d }~X Y nX tdd|   d S )Nr   z%Did not raise floating point %s errorF)FloatingPointErrorr   strfind)Zstrmatchcallableargskwargsexc r   >/tmp/pip-unpacked-wheel-b2rbor69/numpy/core/tests/test_half.pyassert_raises_fpe	   s    r   c                   @   sZ  e Zd Zdd Zdd Zejdddgdd	 Zejdddgd
d Z	ejddddgejddddgejde
je
jge
 dd Zejdddge
je
jdfe
je
jdfgdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Ze
 d*d+ Zejje d,kd-d.ejjed/d.d0d1 Zd2d3 Z dS )4TestHalfc              	   C   s   t jdtd| _t| j_t j| jtd| _t j| jt	d| _
t t jdddtdt jdddtdf| _t| j_t j| jtd| _t j| jt	d| _| jdd | _| jdd | _| jdd | _d S )	Ni   dtype   i  r   i|     )nparanger   all_f16r   r   arrayr   all_f32r   all_f64Zconcatenate	nonan_f16Z	nonan_f32Z	nonan_f64
finite_f16
finite_f32
finite_f64)selfr   r   r   setup_method   s    zTestHalf.setup_methodc                 C   s   t j| jtd}t| jjtd|jtd t j| jtd}t| jjtd|jtd t j| j	t j
d}t j|td}t| j	jtd|jtd t dd}t j|td}t j|td}t|| dS )z[Checks that all 16-bit values survive conversion
           to/from 32-bit and 64-bit floatr   i i  N)r   r   r   r   r   r   viewr   r   r    Z
longdoubler   int)r$   bZa_ldZi_intZi_f16jr   r   r   test_half_conversions(   s"    


zTestHalf.test_half_conversions	string_dtSUc                 C   sd   t | d}t t j||ks&tt |t j|ks<tt jdt jd|}|j|ks`td S )NZ32   r   )r   r   Zpromote_typesr   AssertionErroronesastype)r$   r+   expected_dtZarrr   r   r   test_half_conversion_to_stringF   s
    z'TestHalf.test_half_conversion_to_stringc                 C   s2   t jd|d}|t jt jdt jdks.td S )Nz3.1416r   gH.!	@)r   r   r1   r   r/   )r$   r+   stringr   r   r    test_half_conversion_from_stringP   s    z)TestHalf.test_half_conversion_from_stringoffsetNupdownshiftfloat_tc           
      C   s  t t t jjt j}t jd|d t jd}|t j|}|dkrrd|d d |dd   dd   }n:|dkrd|d d |dd   d d  }n|dd }|dkrt ||t j	}n|dkrt ||t j	 }|t jt j}|dd 
 }|dkr"|dkr"d}	n|dkr<|dkr<d}	nd}	|d krn|dd d t jd	  |	7  < n|t jd	  |	7  < t|| d S )
Nr   r   r   r7         ?r   r8      .)r   r   Zfinfomaxr&   r   r   r1   	nextafterinfcopyZint16r   )
r$   r:   r9   r6   Zmax_patternZf16s_patternsZ
f16s_floatZres_patternsZcmp_patternsZshift_patternr   r   r   test_half_conversion_roundingU   s.    &&	
$z&TestHalf.test_half_conversion_roundinguint_tbits   4   c           	      C   s   t dt j|}|dks$t||d }|t jdksDtt|D ]8}|||d|> B }||}|t j|ksLtqLd S )Nr         p>r<   r   )r   r   r&   r   r1   r/   range)	r$   r:   rB   rC   Zsmallest_valueZrounded_to_zeroiZlarger_patternZlarger_valuer   r   r   (test_half_conversion_denormal_round_even   s    
z1TestHalf.test_half_conversion_denormal_round_evenc              	   C   s  t jddz tt | jt | j tt | jt | j tt | jt | j tt | jt | j tt 	t
dt j t
t j}t| j|k   t|| jk   t| j|k  t|| jk  t| j|k    t|| jk    t| j|k   t|| jk   t| j|k   t|| jk   t| j|k   t|| jk   W 5 Q R X d S )Nignoreall  )r   errstater   isnanr   r   isinfisfinitesignbitspacingr   r?   nanr   anyrL   )r$   rT   r   r   r   test_nans_infs   s&    
zTestHalf.test_nans_infsc                 C   sr   t ddddddddd	d
ddddt jt j g}t jddddddddddddddddgtd}t|_t|| dS ) z,Confirms a small number of known half values      ?             @g       g     ?     T?rM           ?      rF   g      pr   g       i <  i   i @  i   if.  iU5  i{  i     i   r   i      |  r   r   N)r   r   r?   r   r   r   r   r$   ar(   r   r   r   test_half_values   sH                  zTestHalf.test_half_valuesc              	   C   s   t jddddddddgtd	}d
ddddddt jg}t jdd t j|td	}W 5 Q R X t|| t j|td	}t jdd t j|td	}W 5 Q R X t|| dS )z7Checks that rounding when converting to half is correctg     `>g      `>g      P>g    ?g     ?g     ?i  i  r   rF   g        g     ?rW   rM   rJ   )ZoverN)r   r   r   r?   rN   r   r   r   )r$   rb   Zroundedr(   r   r   r   test_half_rounding   s6    	

zTestHalf.test_half_roundingc           	      C   s  | j jtd}d|d@ d?  }tj|d@ d? tjdd }|d@ d }||d	k  d
7  < d||d	k< || d|  }t| j|kd }t|dkr|d }t	| j|d| j | | j| || f  t| j
|kd }t|dkr|d }t	| j
|d| j | | j
| || f  dS )z_Take every finite float16, and check the casting functions with
           a manual conversion.r   rX   r_      r`   
   i  g      P?ir   irY   r   z,First non-equal is half value %x -> %g != %gN)r!   r&   r   r   r   Zint32nonzeror"   lenr   r#   )	r$   Za_bitsZa_sgnZa_expZa_manZa_manualZa32_failZ	bad_indexZa64_failr   r   r   test_half_correctness   s:    zTestHalf.test_half_correctnessc                 C   s$  | j ddd  }tj|td}|  |  t|| t|dd |dd k  t|dd |dd k	   t|dd |dd k  t|dd |dd k 	   tt
|dd |dd k d j|jd  tt
|dd |dd kd j|jd  dS )z'Make sure comparisons are working rightNr   r   r   r   r<   )r    r@   r   r   r   sortr   r   rL   rU   rg   sizera   r   r   r   test_half_ordering  s    
 " "0zTestHalf.test_half_orderingc              	   C   sj  t tjdtdtjdtd tjdtd}|d t |tjdtd tjddddddd	gtd}t |	 d d
ddg |
  }t |	 d d
ddg tjdddtd}tjdtd}t t||d tjdtj ddddddgtd}t | d tjdtj dtjdtjddgtd}t | d tjdtd}tdD ]}t ||| qNdS )zTest the various ArrFuncsrf   r   )   r   r   r   g#BǻrF   gT>r<   rm      r;   )   _   g)@g333333@g @g(@   N)r   r   r   r   r   zerosfillr0   r   rg   ZbyteswapZnewbyteorderdotr?   ZargmaxrT   rG   item)r$   rb   r(   rH   r   r   r   test_half_funcs2  s<    
"&zTestHalf.test_half_funcsc                 C   s  t jdtd}t jt jftd}t jt jftd}|jtd}tt 	|dd |dd |dd   tt 
|dd ||dd  tt 
|d | |d   tt 
|dd | |dd  tt 
|||d  tt 
| ||d   tt 
||| tt 
|| |d  tt 
| ||d   tt 
| | |  tt 
|||d  tt 
|||d  tt 
||| tt 
||| tt 
||| |dO }tt 	|d t 	|d  tt 	|dd |dd |dd   tt 
|d ||d   tt 
|dd ||dd  tt 
|dd | |dd  tt 
|||d   tt 
| ||d  tt 
|||d  tt 
|||d  dS )z Test np.spacing and np.nextafterr`   r   Nr   r   r   r_   )r   r   r   r   r?   r   rT   r&   r   rS   r>   )r$   rb   ZhinfZhnanZa_f16r   r   r   test_spacing_nextafterY  s:    ,"$,"$zTestHalf.test_spacing_nextafterc              	   C   s
  t jdddddgtd}t jdddddgtd}t jdd	t j t jd
gtd}tt ||dd
dddg tt ||ddddd	g tt ||ddddd
g tt 	||dddddg tt 
||dddddg tt ||dddddg tt ||dddddg tt ||dddddg tt ||dddddg tt ||dddddg tt ||dddddg tt ||dddddg tt ||dddddg tt |dddddg tt |dddddg tt |dddddg tt |dddddg tt |dddddg tt ||dddddg tt ||dddddg t ||}tt |d  d|d< t|ddddd
g tt ||dddddg t ||}tt |d  d|d< t|dd	t j ddg tt ||dddddg tt ||ddddd
g tt ||dddddg tt ||dd	t j ddg tt ||dddddg tt ||dddddg tt  ||dddddgdddddgf tt !|dddddg tt "|dddddg tt #|dddddg tt $|| tt %|dddddg tt &|ddd	ddg tt '|| tt (|d	ddddg tt )|dddddg|f tt *|dddddgdddddgf tt +|dddddgdddddg dS ) zTest the various ufuncsr   r   r<   rr   r   rq   rm   r.   r   rn         g     ?g     T?FT   	   g      g      ?rZ   g      ?r;   g      ?rf   @      N),r   r   r   r?   rT   r   addsubtractmultiplydivideequal	not_equalZlessZ
less_equalZgreaterZgreater_equallogical_and
logical_orlogical_xorZlogical_notrO   rP   rQ   rR   copysignmaximumr   ZminimumZfmaxZfminZfloor_divide	remainderdivmodZsquareZ
reciprocalZ	ones_like	conjugateabsolutenegativeZpositivesignmodffrexpldexp)r$   rb   r(   cxr   r   r   test_half_ufuncs  sd     *(zTestHalf.test_half_ufuncsc                 C   s  t jdtd}t jdtd}td}td}t |djtksBtt |djtksXtt ||jtksnt|rvtnt}t ||j|kstt ||jtkstt ||jtkst|rtnt}t |dj|kstt |dj|kstt ||jsttt ||js$ttt ||js<ttt ||jsTttt ||jtksltt ||jtkst|rtnt}t ||j|kstt ||jtkstdS )z9Test that half gets coerced properly with the other typesr   r   r   r<   rY   N)r   r   r   r   powerr   r/   r   )r$   Zweak_promotionZa16Za32Zb16Zb32r2   r   r   r   test_half_coercion  s.    zTestHalf.test_half_coercionZarmv5telzSee gh-413.)reasonz!fp exceptions don't work in wasm.c              	   C   s  t jdd t jdtd}t jdtd}td}td}tdd	d
 || tddd
 || tddd
 || tddd
 || tddd
 || tddd
 || tddd
 || tddd
 || tddd
 tdtd tddd
 tdtd tddd
 tdtd tddd
 tdtd tddd
 tdtd tdd d
 || tdd!d
 || tdd"d
 || tdd#d
 || tdd$d
 || tdd%d
 || tdd&d
 || tdd'd
 || tdd(d
 td)td* tdd+d
 td,td* tdt jtd)tt j tdt jtd,tt j  tdt jtd) td-t jtt jtt j td-t jtt j td-t jtt j	 td.td/  td0td  tdtd1  t td, t td)tt j  t td,tt j t tt jtd2 t tt j td2 t td2tt j	 t tt j	td2 tdtd1  tdtd1  tdtd  td3td  W 5 Q R X d S )4NraiserK   )-C6?r   )     @r   r   Z	underflowc                 S   s   | | S Nr   rb   r(   r   r   r   <lambda>      z(TestHalf.test_half_fpe.<locals>.<lambda>c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   r\   i   c                 S   s   | | S r   r   r   r   r   r   r     r   r]   c                 S   s   | | S r   r   r   r   r   r   r     r   g     ?r<   c                 S   s   | | S r   r   r   r   r   r   r     r   g     c                 S   s   | | S r   r   r   r   r   r   r      r   g     ?rr   Zoverflowc                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r   	  r   c                 S   s   | | S r   r   r   r   r   r   r   
  r   c                 S   s   | | S r   r   r   r   r   r   r     r   c                 S   s   | | S r   r   r   r   r   r   r     r   rM      c                 S   s   | | S r   r   r   r   r   r   r     r   r[   invalidi      g       ?r^   r   g     )
r   rN   r   r   r   r>   r?   rS   r   rT   )r$   Zsx16Zbx16Zsy16Zby16r   r   r   test_half_fpe  s    
 
 
 
 
 
 
 zTestHalf.test_half_fpec                 C   sP   G dd d}t jdtd}| }|j|_t |}t|jtk t|| dS )z5Test that half is compatible with __array_interface__c                   @   s   e Zd ZdS )z1TestHalf.test_half_array_interface.<locals>.DummyN)__name__
__module____qualname__r   r   r   r   Dummy+  s   r   r   r   N)r   r0   r   Z__array_interface__r   r   r   r   )r$   r   rb   r(   r   r   r   r   test_half_array_interface)  s    
z"TestHalf.test_half_array_interface)!r   r   r   r%   r*   pytestmarkZparametrizer3   r5   r   r   r   Z_no_nep50_warningrA   Zuint32Zuint64rI   rV   rc   rd   ri   rl   rw   rx   r   r   Zskipifplatformmachiner	   r   r   r   r   r   r   r      sF   
	
5
$'-@
Ar   )r   r   Znumpyr   r   r   r   r   Znumpy.testingr   r   r   r	   r   r   r   r   r   r   <module>   s   
