o
    1ήc]                     @   sZ   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
 dd ZG dd dZdS )    N)uint16float16float32float64)assert_assert_equalc              
   O   sh   z	||i | W n! t y* } ztt|| dkd|   W Y d }~d S d }~ww tdd|   d S )Nr   z%Did not raise floating point %s errorF)FloatingPointErrorr   strfind)strmatchcallableargskwargsexc r   A/tmp/pip-target-vg8gfxp4/lib/python/numpy/core/tests/test_half.pyassert_raises_fpe	   s   r   c                   @   s4  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g dejdg dejde
je
jgdd Zejg d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d'd( Zejje d)kd*d+d,d- Zd.d/ Zd0S )1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_f64concatenate	nonan_f16	nonan_f32	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    
longdoubler   int)r&   ba_ldi_int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J t |t j|ksJ t jdt jd|}|j|ks0J d S )N32   r   )r   r   promote_typesr   onesastype)r&   r1   expected_dt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J d S )Nz3.1416r   gH.!	@)r   r   r8   r   )r&   r1   stringr   r   r    test_half_conversion_from_stringP   s   $z)TestHalf.test_half_conversion_from_stringoffset)N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r9d|d d |dd   dd   }n|dkrPd|d d |dd   d d  }n|dd }|dkrct ||d}n|dkrot ||d	}|t jt j}|dd 	 }|dkr|dkrd}	n|dkr|dkrd}	nd}	|d u r|dd d
 t j
d  |	7  < n|t j
d  |	7  < t|| d S )Nr   r   r   r?         ?r   r@   gd~QJgd~Q   .)r   r   finfomaxr(   r   r   r8   	nextaftercopyint16r   )
r&   rB   rA   r>   max_patternf16s_patterns
f16s_floatres_patternscmp_patternsshift_patternr   r   r   test_half_conversion_roundingU   s.   &&	$z&TestHalf.test_half_conversion_rounding)rB   uint_tbits   4   c           	      C   s   t dt j|}|dksJ ||d }|t jdks"J t|D ]}|||d|> B }||}|t j|ksBJ q&d S )Nr         p>rD   r   )r   r   r(   r   r8   range)	r&   rB   rQ   rR   smallest_valuerounded_to_zeroilarger_patternlarger_valuer   r   r   (test_half_conversion_denormal_round_even   s   
z1TestHalf.test_half_conversion_denormal_round_evenc                 C   s  t jdd 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 d    d S 1 sw   Y  d S )Nignoreall  )r   errstater   isnanr   r   isinfisfinitesignbitspacingr   infnanr   anyr_   )r&   rh   r   r   r   test_nans_infs   s(   
"zTestHalf.test_nans_infsc                 C   sV   t ddddddddd	d
ddddt jt j g}t jg dtd}t|_t|| dS )z,Confirms a small number of known half values      ?             @g       g     ?     T?r`           ?      rU   g      pr   g       )i <  i   i @  i   if.  iU5  i{  i     i   r   i  r       |  r   r   N)r   r   rg   r   r   r   r   r&   ar+   r   r   r   test_half_values   s   

zTestHalf.test_half_valuesc                 C   sj   t jg dtd}dddddddt jg}t j|td}t|| t j|td}t j|td}t|| dS )	z7Checks that rounding when converting to half is correct)g     `>g      `>g      P>g    ?g     ?g     ?i  i  r   rU   g        g     ?rk   r`   N)r   r   r   rg   r   r   r   )r&   rv   roundedr+   r   r   r   test_half_rounding   s"   
	

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rc|d }t	| j|d| j | | j| || f  t| j
|kd }t|dkr|d }t	| j
|d| j | | j
| || f  dS dS )z_Take every finite float16, and check the casting functions with
           a manual conversion.r   rl   rs      rt   
   i  g      P?ir   irm   r   z,First non-equal is half value %x -> %g != %gN)r#   r(   r   r   r   int32nonzeror$   lenr   r%   )	r&   a_bitsa_sgna_expa_mana_manuala32_fail	bad_index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   rD   )r    rH   r   r   r   sortr   r   r_   ri   r}   sizeru   r   r   r   test_half_ordering  s   
 " "04zTestHalf.test_half_orderingc              	   C   sZ  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g dtd}t |	 d g d |
  }t |	 d g d 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 ||| qdS )zTest the various ArrFuncsr{   r   )   r   )r   r   r   g#Bǻr   rU   gT>r   )rD   r      rC   )   _   g)@g333333@g @g(@   r   N)r   r   r   r   r   zerosfillr7   r   r}   byteswapnewbyteorderdotrg   argmaxrh   rV   item)r&   rv   r+   rY   r   r   r   test_half_funcs/  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.nextafterrt   r   Nr   r   r   rs   )r   r   r   r   rg   r   rh   r(   r   rf   rG   )r&   rv   hinfhnana_f16r   r   r   test_spacing_nextafterV  s:   ,"$,"$zTestHalf.test_spacing_nextafterc                 C   s  t jg dtd}t jg dtd}t jddt j t jdgtd}tt ||g d tt ||g d tt ||g d	 tt 	||g d
 tt 
||g d tt ||g d tt ||g d tt ||g d tt ||g d tt ||g d tt ||g d tt ||g d tt ||g d tt |g d tt |g d tt |g d tt |g d tt |g d tt ||g d tt ||g d t ||}tt |d  d|d< t|g d tt ||g d t ||}tt |d  d|d< t|ddt j ddg tt ||g d tt ||g d tt ||g d tt ||ddt j ddg tt ||g d tt ||g d tt  ||g dg df tt !|g d  tt "|g d! tt #|g d" tt $|| tt %|g d tt &|g d# tt '|| tt (|g d$ tt )|g d%|f tt *|g d&g d'f tt +|g dg d( d)S )*zTest the various ufuncs)r   r   rD   r   rD   r   )r   r   r   r   r5   r   r   r   )r   r   r5      r   )rD   r   r   r   )r   r   rD      r   )r        ?rD   r   g     T?)FFFTF)TTTFT)FTFFT)FTFTT)TFTFF)TFTTF)FTTTT)TTTTT)TFFFF)FFTFF)TTFFT)rD   r   r   r   r5   )r   r   rD   r   r5   r5   )r   r   r   r   r   )r   r   r   r   rD   r   )r   r   r   r   r   r   )r   r   rD   r   r   )r   r   r   r   rD   )r      r   r   	   )      r   r   g      ?rn   )r   r   r   r   r   )rD   r   r   )r   r   r   r   r   )r   r   r   r   r   )r   g      ?rC   rC   g      ?)rD   r5   r   r5   rD   )r   r{   r   @      N),r   r   r   rg   rh   r   addsubtractmultiplydivideequal	not_equalless
less_equalgreatergreater_equallogical_and
logical_orlogical_xorlogical_notrb   rc   rd   re   copysignmaximumr   minimumfmaxfminfloor_divide	remainderdivmodsquare
reciprocal	ones_like	conjugateabsolutenegativepositivesignmodffrexpldexp)r&   rv   r+   cxr   r   r   test_half_ufuncs  sd    zTestHalf.test_half_ufuncsc                 C   sp  t jdtd}t jdtd}td}td}tt |djt tt |djt tt ||jt tt ||jt tt ||jt tt ||jt tt |djt tt |djt tt ||jt tt ||jt tt ||jt tt ||jt tt ||jt tt ||jt tt ||jt tt ||jt dS )z9Test that half gets coerced properly with the other typesr   r   r   rD   rm   N)r   r   r   r   r   powerr   r   )r&   a16a32b16b32r   r   r   test_half_coercion  s(   zTestHalf.test_half_coercionarmv5telzSee gh-413.)reasonc                 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 d    d S 1 sw   Y  d S )4Nraiser^   )-C6?r   )     @r   r   	underflowc                 S      | | S Nr   rv   r+   r   r   r   <lambda>      z(TestHalf.test_half_fpe.<locals>.<lambda>c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   c                 S      | | S r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   rp   i   c                 S   r   r   r   r   r   r   r   r     r   rq   c                 S   r   r   r   r   r   r   r   r     r   g     ?rD   c                 S   r   r   r   r   r   r   r   r     r   g     c                 S   r   r   r   r   r   r   r   r     r   g     ?r   overflowc                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r      r   c                 S   r   r   r   r   r   r   r   r     r   c                 S   r   r   r   r   r   r   r   r     r   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   ro   invalidi      g       ?rr   r   g     )
r   ra   r   r   r   rG   rg   rf   r   rh   )r&   sx16bx16sy16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   r7   r   __array_interface__r   r   r   r   )r&   r   rv   r+   r   r   r   r   test_half_array_interface   s   
z"TestHalf.test_half_array_interfaceN)r   r   r   r'   r0   pytestmarkparametrizer;   r=   r   r   r   rP   uint32uint64r\   rj   rw   ry   r   r   r   r   r   r   skipifplatformmachiner   r   r   r   r   r   r      s>    
	
5
$'-@
Ar   )r   r   numpyr   r   r   r   r   numpy.testingr   r   r   r   r   r   r   r   <module>   s    
