U
    e»{j&Ë  ã                   @   s*  d dl Zd dlZd dlmZ d dlZd dlZd dlm	Z
 d dlmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ ed
dddgƒZedddddgƒZeddddgƒZejjdd„ ƒZejjdd„ ƒZ ejjdd„ ƒZ!G dd„ dƒZ"G dd„ dƒZ#G dd„ dƒZ$G dd „ d ƒZ%G d!d"„ d"ƒZ&G d#d$„ d$ƒZ'ejj(e)ej*j+d%ƒ d&d'�G d(d)„ d)ƒƒZ,G d*d+„ d+ƒZ-G d,d-„ d-ƒZ.G d.d/„ d/ƒZ/e�r&d d0l0m1Z2 e2j3e2j4e2j5e2j6e2j7e2j8e2j9e2j:e2j;e2j<e2j=e2j>e2j?e2j@e2jAe2jBe2jCe2jDe2jEfZFeGe2jHej	ƒ�reFe2jHe2jIf7 ZFd1d2„ ZJG d3d4„ d4ƒZKdS )5é    N)Ú
namedtuple)Úufunc)Úassert_allcloseÚassert_array_equal)Úunits)Úquantity_helper)ÚUfuncHelpers©Úhelper_sqrt)Ú	HAS_SCIPYÚtestcaseÚfÚq_inÚq_outÚtestexcÚexcÚmsgÚtestwarnÚwfilterc                 C   s\   | j | jŽ }t|tƒs|fn|}t|| jƒD ]*\}}|j|jksDt‚t|j	|j	dd� q,d S )NgVçž¯Ò<)Zatol)
r   r   Ú
isinstanceÚtupleÚzipr   ÚunitÚAssertionErrorr   Úvalue)ÚtcÚresultsÚresultÚexpected© r   úg/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/units/tests/test_quantity_ufuncs.pyÚtest_testcase   s
    r!   c              	   C   sH   t  | j¡�}| j| jŽ  W 5 Q R X | jd k	rD| j|jjd ksDt‚d S )Nr   )	ÚpytestÚraisesr   r   r   r   r   Úargsr   )Úter   r   r   r    Útest_testexc#   s    
r&   c              	   C   s0   t  ¡ � t  | j¡ | j| jŽ  W 5 Q R X d S ©N)ÚwarningsÚcatch_warningsÚfilterwarningsr   r   r   )Útwr   r   r    Útest_testwarn+   s    
r,   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zejjdd„ ƒZ	d	S )
ÚTestUfuncHelpersc                 C   sl   dd„ t jjj ¡ D ƒ}tjttj 	¡ ƒB }|| tƒ ks>t
‚dd„ tj ¡ D ƒ}|| | tƒ ksht
‚dS )zTest that we cover all ufunc'sc                 S   s   h | ]}t |tjƒr|’qS r   ©r   Únpr   ©Ú.0r   r   r   r    Ú	<setcomp>:   s   þz1TestUfuncHelpers.test_coverage.<locals>.<setcomp>c                 S   s   h | ]}t |tjƒr|’qS r   r.   r0   r   r   r    r2   F   s   þN)r/   ÚcoreÚumathÚ__dict__ÚvaluesÚqhÚUNSUPPORTED_UFUNCSÚsetÚUFUNC_HELPERSÚkeysr   Ú
erfa_ufunc)ÚselfZall_np_ufuncsZall_q_ufuncsZall_erfa_ufuncsr   r   r    Útest_coverage7   s    þþzTestUfuncHelpers.test_coveragec                 C   s   dt jjkst‚d S )Nzscipy.special)r7   r:   Úmodulesr   ©r=   r   r   r    Útest_scipy_registeredM   s    z&TestUfuncHelpers.test_scipy_registeredc                 C   s„   t jtjkst‚t jtjks t‚d tjt j< t jtjks<t‚t jtjksLt‚tjt j tjt j< t jtjkspt‚t jtjks€t‚d S r'   )r/   Úaddr7   r:   r   r8   Úsubtractr@   r   r   r    Útest_removal_additionQ   s    z&TestUfuncHelpers.test_removal_additionc              	      s”   dd„ ‰ ‡ fdd„}d}t jj|d��d‰tdƒD ]T}tƒ ‰ˆ dd	g|¡ ‡ ‡‡fd
d„t|ƒD ƒ}dd„ |D ƒ}|tg| ks0t‚q0W 5 Q R X d S )Nc                  _   s   t j| |ŽS r'   )r/   Úsqrt)r$   Úkwargsr   r   r    Údummy_ufunc]   s    z8TestUfuncHelpers.test_thread_safety.<locals>.dummy_ufuncc                      s   ˆ t iS r'   r	   r   )rG   r   r    Úregister`   s    z5TestUfuncHelpers.test_thread_safety.<locals>.registeré   )Úmax_workersi'  z(astropy.units.tests.test_quantity_ufuncsrG   c                    s    g | ]}ˆ  ‡ ‡fd d„¡‘qS )c                      s   ˆˆ  S r'   r   r   )rG   Úhelpersr   r    Ú<lambda>m   ó    z@TestUfuncHelpers.test_thread_safety.<locals>.<listcomp>.<lambda>)Zsubmit)r1   Úi©rG   ÚexecutorrK   r   r    Ú
<listcomp>l   s   ÿz7TestUfuncHelpers.test_thread_safety.<locals>.<listcomp>c                 S   s   g | ]}|  ¡ ‘qS r   )r   )r1   Úfuturer   r   r    rQ   p   s     )Ú
concurrentÚfuturesZThreadPoolExecutorÚranger   Zregister_moduler
   r   )r=   Zfast_thread_switchingrH   ÚworkersÚprT   r6   r   rO   r    Útest_thread_safety[   s     ýþz#TestUfuncHelpers.test_thread_safetyN)
Ú__name__Ú
__module__Ú__qualname__r>   rA   rD   r"   ÚmarkZslowrX   r   r   r   r    r-   2   s
   
r-   c                   @   s  e Zd ZdZej deej	de
j fde
j fd�eej	e dejd ejd g¡e
j fe dd	e d¡ d	g¡e
j fd�eeje 	de
j ¡fe d¡e
j fd�eeje 	e dejd ejd g¡e
j ¡fe dejd ejd g¡e
j fd�eejejd
 e
j fde
j fd�eeje dejd ejd g¡e
j fe d	d	e d¡ dg¡e
j fd�eeje ejd
 e
j ¡fejd
 e
j fd�eeje e dejd ejd g¡e
j ¡fe dejd ejd g¡e
j fd�eejejd
 e
j fe d
¡e
j fd�eeje ddddg¡e
j fe dd	ddg¡e
j fd�eeje ejd
 e
j ¡fejd
 e
j fd�eeje e ddddg¡e
j ¡fe e ddddg¡e
j ¡fd�eeje ddddg¡e
j de
j fe e ddddg¡d¡e
j fd�eeje ddg¡e
j de
j   e
j¡d	fe e ddg¡d d	¡e
j fd�eejde
j feje
j fd�eejde
j feje
j fd�eejd
e
j fd
e
j fd�eejd
e
j fd
e
j fd�eejde
j fde
j fd�eejde
j fde
j fd�eejeje
j fde
j fd�eejeje
j fde
j fd�f¡dd„ ƒZej de ejd
e
j fe!dd�e ejd
e
j fe!dd�e ejd
e
j e!dd�e ejd
e
j e!dd�e ej	d
e
j fe!dd�e ejd
e
j fe!dd�e ejd
e
j" fe!dd�e ejd
e
j" fe!dd�e eje dddg¡e
j# fe!d d�e eje dddg¡e
j# fe!d!d�e eje dddg¡e
j# d	e
j" fe
j$d"d�e eje dddg¡e
j# d	fe
j$d#d�f¡d$d%„ ƒZ%ej d&e&ejd'e
j' d(e
j(  fd)d*�f¡d+d,„ ƒZ)dS )-ÚTestQuantityTrigonometricFuncsz&
    Test trigonometric functions
    r   ç      >@ç      à?)r   r   r   ç        ç      @ç       @ç      ð?ç      @g     €F@g     à`@ç     €f@ç      ð¿ç      $@ç     €Q@g      T@g     @Ÿ@g      N@c                 C   s   t |ƒS r'   )r!   )r=   r   r   r   r    Útest_testcasesy   s    Vz-TestQuantityTrigonometricFuncs.test_testcasesr%   N)r   r   r   r   z<Can only apply 'sin' function to quantities with angle unitsz<Can only apply 'arcsin' function to dimensionless quantitiesz<Can only apply 'cos' function to quantities with angle unitsz<Can only apply 'arccos' function to dimensionless quantitiesé   é   é   z<Can only apply 'tan' function to quantities with angle unitsz<Can only apply 'arctan' function to dimensionless quantitiesúcompatible dimensionsz'dimensionless quantities when other argc                 C   s   t |ƒS r'   )r&   )r=   r%   r   r   r    Útest_testexcsÑ   s    :z,TestQuantityTrigonometricFuncs.test_testexcsr+   ç      ;@é   Úerror)r   r   r   c                 C   s   t |ƒS r'   )r,   )r=   r+   r   r   r    Útest_testwarns  s    z-TestQuantityTrigonometricFuncs.test_testwarns)*rY   rZ   r[   Ú__doc__r"   r\   Úparametrizer   r/   ÚsinÚuÚdegreeÚdimensionless_unscaledÚarrayÚpiÚradianrE   ÚoneÚarcsinÚradiansÚcosZarccosÚtanZarctanÚarctan2ÚmÚkmÚtoZdeg2radZrad2degÚdegreesri   r   Ú	TypeErrorÚsÚNÚ
UnitsErrorrn   r   ZpcZkpcrr   r   r   r   r    r]   t   s&  

ý" ýý("ý
ý" ýý("ýýýýý ÿý( ý    °þU

ü
ü
ü
üüüüüÑþ9
"þr]   c                
   @   s\  e Zd ZdZdd„ Zdd„ Zejje	e
eddƒejƒ dd	�d
d„ ƒZej dejejf¡dd„ ƒZej dejejf¡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 dejf¡d#d$„ ƒZej dejf¡d%d&„ ƒZd'd(„ Zd)d*„ Z d+d,„ Z!d-d.„ Z"d/d0„ Z#d1d2„ Z$d3d4„ Z%d5d6„ Z&d7d8„ Z'd9d:„ Z(d;d<„ Z)d=d>„ Z*ej dej+ej,ej-ej.ej/ej0ej1f¡d?d@„ ƒZ2ej dej+ej,ej-ej.ej/ej0ej1f¡dAdB„ ƒZ3ej dej+ej,ej-ej.ej/ej0ej1f¡dCdD„ ƒZ4dEdF„ Z5dGdH„ Z6dIdJ„ Z7dKdL„ Z8dMdN„ Z9ej dej:ej;f¡dOdP„ ƒZ<ej dej:ej;f¡dQdR„ ƒZ=dS )SÚTestQuantityMathFuncsz+
    Test other mathematical functions
    c                 C   sp   t  dtj dtj ¡dtj tj ks,t‚t  dtj d¡dtj ksLt‚t  ddtj ¡dtj kslt‚d S )Nra   rb   ç       @)r/   Úmultiplyrv   r‚   r‡   r   r@   r   r   r    Útest_multiply_scalar  s    , z*TestQuantityMathFuncs.test_multiply_scalarc                 C   sF   t  t  t  d¡tj dtj ¡t  ddd¡tj tj k¡sBt‚d S )Nrd   rb   r   ç      @)r/   ÚallrŒ   Úarangerv   r‚   r‡   r   r@   r   r   r    Útest_multiply_array  s
    ÿÿz)TestQuantityMathFuncs.test_multiply_arrayÚmatmulNznp.matmul is not yet a gufunc©Úreasonc              	   C   sÚ   t  d¡tj }t  ||¡}|dtjd  ks2t‚t  d¡tj }t  dddgdddgdddggdddgdddgdddggdddgdddgdddggg¡tj }t  ||¡}t  	|t  |j
|j
¡|j |j k¡sÖt‚d S )Nrd   ç      @rk   rl   rc   r`   )r/   r�   rv   r‚   r’   r   Úeyery   r‡   r�   r   r   )r=   ÚqÚrÚq1Úq2Úr2r   r   r    Útest_matmul%  s.    þþþúÿ
öz!TestQuantityMathFuncs.test_matmulÚfunctionc                 C   s|   |dt j dt j ƒ|ddƒt j t j ks0t‚|dt j dƒ|ddƒt j ksTt‚|ddt j ƒ|ddƒt j ksxt‚d S ©Nra   rb   )rv   r‚   r‡   r   ©r=   r�   r   r   r    Útest_divide_scalar=  s    0$z(TestQuantityMathFuncs.test_divide_scalarc                 C   sF   t  |t  d¡tj dtj ƒ|t  d¡dƒtj tj k¡sBt‚d S )Nrd   rb   )r/   r�   r�   rv   r‚   r‡   r   rŸ   r   r   r    Útest_divide_arrayC  s
    ÿÿz'TestQuantityMathFuncs.test_divide_arrayc              	   C   s¾  t  dt j ¡}t dddg¡t j }t dddg¡| }|| }|| }t|jddd	gƒ |jt jkslt	‚t|jd
ddgƒ |j|jksŽt	‚t 
||¡}t ||¡}t ||k¡s¸t	‚t ||k¡sÊt	‚t||ƒ\}}	t ||k¡sêt	‚t |	|k¡süt	‚t t¡� t|t jƒ W 5 Q R X t t¡� |t j  W 5 Q R X t t¡� |t j  W 5 Q R X t ||¡\}
}t |
|k¡�s‚t	‚t ||k¡�s–t	‚t t¡� t |t j¡ W 5 Q R X d S )Ng¦
F%uš?rc   rb   rd   ra   r•   g      *@g      3@g      7@gUÁ¨¤N@ƒ?g¨5Í;NÑ±?gÓMbX9´?)rv   ZUnitr‚   r/   ry   r   r   r   rx   r   Zfloor_divideÚ	remainderr�   Údivmodr"   r#   r†   rƒ   )r=   ZinchZdividendÚdivisorZquotientr¢   Z	quotient2Z
remainder2Z	quotient3Z
remainder3Z	quotient4Z
remainder4r   r   r    Ú&test_floor_divide_remainder_and_divmodJ  s6    z<TestQuantityMathFuncs.test_floor_divide_remainder_and_divmodc                 C   s&   t  dtj ¡dtjd  ks"t‚d S )Nra   rb   r_   )r/   rE   rv   r‚   r   r@   r   r   r    Útest_sqrt_scalark  s    z&TestQuantityMathFuncs.test_sqrt_scalarc              	   C   sD   t  t  t  dddg¡tj ¡t  dddg¡tjd  k¡s@t‚d S )Nrc   ra   ç      "@rb   rd   r_   )r/   r�   rE   ry   rv   r‚   r   r@   r   r   r    Útest_sqrt_arrayn  s
    ÿÿz%TestQuantityMathFuncs.test_sqrt_arrayc                 C   s&   t  dtj ¡dtjd  ks"t‚d S )Nra   ç      0@rk   )r/   Úsquarerv   r‚   r   r@   r   r   r    Útest_square_scalart  s    z(TestQuantityMathFuncs.test_square_scalarc              	   C   sD   t  t  t  dddg¡tj ¡t  dddg¡tjd  k¡s@t‚d S )Nrc   rb   rd   ra   r§   rk   )r/   r�   rª   ry   rv   r‚   r   r@   r   r   r    Útest_square_arrayw  s
    ÿÿz'TestQuantityMathFuncs.test_square_arrayc                 C   s"   t  dtj ¡dtj kst‚d S )Nra   ç      Ð?)r/   Ú
reciprocalrv   r‚   r   r@   r   r   r    Útest_reciprocal_scalar}  s    z,TestQuantityMathFuncs.test_reciprocal_scalarc              	   C   s@   t  t  t  dddg¡tj ¡t  dddg¡tj k¡s<t‚d S )Nrc   rb   ra   r_   r­   )r/   r�   r®   ry   rv   r‚   r   r@   r   r   r    Útest_reciprocal_array€  s
    ÿÿz+TestQuantityMathFuncs.test_reciprocal_arrayc                 C   sj   t  dtj d¡dtj ks t‚t  dtj dtj ¡dtj ksFt‚t  dtj d¡dtj ksft‚d S )Nr`   r_   é   r­   rb   rc   )	r/   Ú	heavisiderv   r‚   rx   r   r‡   ÚpercentÚJr@   r   r   r    Útest_heaviside_scalar†  s      ÿz+TestQuantityMathFuncs.test_heaviside_scalarc                 C   sb   t  ddddg¡}t  ddddg¡tj }t  t  |tj |tj ¡ddddgtj k¡s^t‚d S )Nrf   r`   rc   g      è?r­   r   )r/   ry   rv   rx   r�   r²   r‚   r   )r=   r6   Zhalfwayr   r   r    Útest_heaviside_array�  s    ÿÿz*TestQuantityMathFuncs.test_heaviside_arrayc                 C   s$   |dt jd  ƒdt j ks t‚d S )Nr‹   rl   rb   )rv   r‚   r   rŸ   r   r   r    Útest_cbrt_scalar•  s    z&TestQuantityMathFuncs.test_cbrt_scalarc                 C   s>   t  dddg¡}t  ||tjd  ƒ||ƒtj k¡s:t‚d S )Nrc   r‹   g      P@rl   )r/   ry   r�   rv   r‚   r   )r=   r�   r6   r   r   r    Útest_cbrt_array™  s    z%TestQuantityMathFuncs.test_cbrt_arrayc                 C   sr   t  dtj d¡dtjd  ks$t‚t  ddtj tj ¡t dtj¡ksNt‚t  dtj d¡dtj ksnt‚d S )Nra   rb   r©   rk   g      i@r`   rc   )r/   Úpowerrv   r‚   r   ÚcmÚQuantityrx   r@   r   r   r    Útest_power_scalar   s    $ ÿ
z'TestQuantityMathFuncs.test_power_scalarc              	   C   sr   t  t  t  dddg¡tj d¡t  dddg¡tjd  k¡sBt‚t  t  t  d¡tj d¡dtj k¡snt‚d S ©	Nrc   rb   rd   r‹   ro   rl   ra   r`   )	r/   r�   r¹   ry   rv   r‚   r   r�   rx   r@   r   r   r    Útest_power_array¨  s    ÿÿ ÿz&TestQuantityMathFuncs.test_power_arrayc              	   C   sr   t  t  t  dddg¡tj d¡t  dddg¡tjd  k¡sBt‚t  t  t  d¡tj d¡dtj k¡snt‚d S r½   )	r/   r�   Zfloat_powerry   rv   r‚   r   r�   rx   r@   r   r   r    Útest_float_power_array²  s    ÿÿ ÿz,TestQuantityMathFuncs.test_float_power_arrayc              	   C   s0   t  t¡� t dtj ddg¡ W 5 Q R X d S rž   ©r"   r#   Ú
ValueErrorr/   r¹   rv   r‚   r@   r   r   r    Útest_power_array_array¼  s    z,TestQuantityMathFuncs.test_power_array_arrayc              	   C   s4   t  t¡�  t ddgtj ddg¡ W 5 Q R X d S )Nrb   ra   rÀ   r@   r   r   r    Útest_power_array_array2À  s    z-TestQuantityMathFuncs.test_power_array_array2c                 C   s  ddgt j t j }ddg}t ||¡}t |j|j| k¡sBt‚|jt jksRt‚ddgt j t j	 }t
ttjtjjt jfD ]B}t |||ƒ¡}t |j| d¡| k¡s®t‚|jt jks|t‚q||d }t |j|jd k¡sât‚|j|jd ksöt‚t ||ddg k¡�st‚d S )Nrb   ra   rj   rk   )rv   r‚   r/   r¹   r�   r   r   r   rx   rº   Úlistr   ry   Úmar»   Úto_value)r=   r—   ZpowersÚresrš   ÚclsZres2Zres3r   r   r    Útest_power_array_array3Ä  s    z-TestQuantityMathFuncs.test_power_array_array3c              	   C   s0   t jtdd�� t ddtj ¡ W 5 Q R X d S )Nz"raise something to a dimensionless©Úmatchrd   ra   )r"   r#   r†   r/   r¹   rv   r‚   r@   r   r   r    Útest_power_invalidÙ  s    z(TestQuantityMathFuncs.test_power_invalidc                 C   s�   t  dtj d¡dtj ks t‚t  dtj dtj ¡dtj ksFt‚t  dtj d¡dtj ksft‚t  dtj dtj ¡dtj ksŒt‚d S )Nrl   rc   rd   rf   ç      À)r/   Úcopysignrv   r‚   r   r‡   r@   r   r   r    Útest_copysign_scalarÝ  s     & z*TestQuantityMathFuncs.test_copysign_scalarc              
   C   s*  t  t  t  dddg¡tj d¡t  dddg¡ tj k¡s@t‚t  t  t  dddg¡tj dtj ¡t  dddg¡ tj k¡s†t‚t  t  t  dddg¡tj t  dddg¡tj ¡t  dddg¡tj k¡sÖt‚t  t  dddg¡dtj ¡}t  |t  dddg¡k¡�st‚t|tj	ƒ�r&t‚d S )	Nrc   rb   rd   rf   g       Àg      ÀrÍ   éýÿÿÿ)
r/   r�   rÎ   ry   rv   r‡   r   r‚   r   r»   ©r=   r—   r   r   r    Útest_copysign_arrayã  s*    ÿÿ"ÿÿ ÿýÿ z)TestQuantityMathFuncs.test_copysign_arrayc                 C   s$   t  dtj d¡dtj ks t‚d S )Nra   rk   r©   )r/   Úldexprv   r‚   r   r@   r   r   r    Útest_ldexp_scalar÷  s    z'TestQuantityMathFuncs.test_ldexp_scalarc              	   C   sH   t  t  t  dddg¡tj dddg¡t  dddg¡tj k¡sDt‚d S )	Nrc   rb   rd   rl   rk   rj   r‹   rŽ   )r/   r�   rÓ   ry   rv   r‚   r   r@   r   r   r    Útest_ldexp_arrayú  s
    "ÿÿz&TestQuantityMathFuncs.test_ldexp_arrayc              	   C   s\   t  t¡� t dtj d¡ W 5 Q R X t  t¡�  t dtjdtjtd�¡ W 5 Q R X d S )Nrd   ra   é   ©Údtype)	r"   r#   r†   r/   rÓ   rv   r‚   r»   Úintr@   r   r   r    Útest_ldexp_invalid   s    z(TestQuantityMathFuncs.test_ldexp_invalidc                 C   s>   |dt j dt j  ƒ}|jt jks(t‚|j|dƒks:t‚d S )Nrd   rŽ   r_   ©rv   r‚   r   rx   r   r   ©r=   r�   r—   r   r   r    Útest_exp_scalar  s    z%TestQuantityMathFuncs.test_exp_scalarc              	   C   s¬   |t  dddg¡tj dtj  ƒ}|jtjks4t‚t  |j|t  dddg¡ƒk¡sXt‚|t  dddg¡tj dtj	  ƒ}|jtjksŒt‚t
|j|t  ddd	g¡ƒƒ d S )
Nrb   rd   rŽ   çUUUUUUÕ?r_   rc   ç«ªªªªª@@ç      I@ç      Y@)r/   ry   rv   r‚   r   rx   r   r�   r   rº   r   ©r=   r�   r—   rš   r   r   r    Útest_exp_array  s    $$$z$TestQuantityMathFuncs.test_exp_arrayc              	   C   s<   t jtd|j› d�d�� |dtj tj ƒ W 5 Q R X d S )NúCan only apply 'ú&' function to dimensionless quantitiesrÊ   rd   )r"   r#   r†   rY   rv   r‚   r‡   rŸ   r   r   r    Útest_exp_invalid_units  s
    ýz,TestQuantityMathFuncs.test_exp_invalid_unitsc                 C   s:   t  dtj dtj  ¡}|dtj dtj fks6t‚d S )Nr§   g     À‚@r_   rc   )r/   Úmodfrv   r‚   rº   rx   r   rÑ   r   r   r    Útest_modf_scalar)  s    z&TestQuantityMathFuncs.test_modf_scalarc                 C   s–   t  d¡tj dtj  }t  |¡}t  | tj¡¡}|d jtjksJt	‚|d jtjks^t	‚t
|d j|d kƒsxt	‚t
|d j|d kƒs’t	‚d S )Nrg   g     @@r   rj   )r/   r�   rv   r‚   rº   rç   rÆ   rx   r   r   r�   r   )r=   Úvr—   Únr   r   r    Útest_modf_array-  s    
z%TestQuantityMathFuncs.test_modf_arrayc                 C   s:   t  dtj dtj  ¡}|t  d¡t  d¡fks6t‚d S )Nrd   rŽ   r_   r`   )r/   Úfrexprv   r‚   ry   r   rÑ   r   r   r    Útest_frexp_scalar6  s    z'TestQuantityMathFuncs.test_frexp_scalarc                 C   sV   t  t  dddg¡tj dtj  ¡}tdd„ t|d |d dd	d
gƒD ƒƒsRt‚d S )Nrb   rd   rŽ   c                 s   s&   | ]\}}}||ft  |¡kV  qd S r'   )r/   rì   )r1   Z_q0Z_q1Z_dr   r   r    Ú	<genexpr><  s   ÿz9TestQuantityMathFuncs.test_frexp_array.<locals>.<genexpr>r   rj   rÞ   r_   rc   )r/   rì   ry   rv   r‚   r�   r   r   rÑ   r   r   r    Útest_frexp_array:  s    &þz&TestQuantityMathFuncs.test_frexp_arrayc              	   C   st   t jtdd�� t dtj tj ¡ W 5 Q R X t jtdd��, t t dddg¡tj dtj	  ¡ W 5 Q R X d S )NzDCan only apply 'frexp' function to unscaled dimensionless quantitiesrÊ   rd   rb   rŽ   )
r"   r#   r†   r/   rì   rv   r‚   r‡   ry   rº   r@   r   r   r    Útest_frexp_invalid_unitsA  s    ý ýz.TestQuantityMathFuncs.test_frexp_invalid_unitsc                 C   sX   |t  dddg¡tj dtj  dƒ}|jtjks6t‚t|j	|t  dddg¡dƒƒ d S )Nrb   rd   rŽ   rc   rß   rà   rá   )
r/   ry   rv   r‚   rº   r   rx   r   r   r   rÜ   r   r   r    Útest_dimensionless_twoarg_arrayT  s    & ÿz5TestQuantityMathFuncs.test_dimensionless_twoarg_arrayc              	   C   sJ   t jtd|j› d�d��( |dtj tj dtj tj ƒ W 5 Q R X d S ©Nrä   rå   rÊ   rc   rd   )r"   r#   r†   rY   rv   rƒ   r‡   r‚   rŸ   r   r   r    Ú'test_dimensionless_twoarg_invalid_units\  s
    ýz=TestQuantityMathFuncs.test_dimensionless_twoarg_invalid_units)>rY   rZ   r[   rs   r�   r‘   r"   r\   Úskipifr   Úgetattrr/   r   rœ   rt   ÚdivideZtrue_divider    r¡   r¥   r¦   r¨   r«   r¬   r¯   r°   rµ   r¶   Úcbrtr·   r¸   r¼   r¾   r¿   rÂ   rÃ   rÉ   rÌ   rÏ   rÒ   rÔ   rÕ   rÚ   ÚexpÚexpm1Úexp2ÚlogÚlog2Úlog10Úlog1prÝ   rã   ræ   rè   rë   rí   rï   rð   Z	logaddexpZ
logaddexp2rñ   ró   r   r   r   r    rŠ     sz   þ


!



 ÿ
 ÿ
	 ÿ
	
rŠ   c                   @   sŠ  e Zd Zej dejejej	ej
ejejejejejejg
¡dd„ ƒZej dejej
ejejejejg¡dd„ ƒZej dejejejejejejejejejg	¡dd„ ƒZej dejejejejejejejejejg	¡dd	„ ƒZej d
ejdfejdfejdfejdfejdfejdfejejfejejfejejfg	¡dd„ ƒZej dejejejejejejejejejg	¡dd„ ƒZ dS )ÚTestInvariantUfuncsr   c                 C   sJ   dt j }||ƒ}t|t jƒs"t‚|j|jks2t‚|j||jƒksFt‚d S )NçÍÌÌÌÌÌ@)rv   r‚   r   r»   r   r   r   ©r=   r   Zq_iÚq_or   r   r    Útest_invariant_scalari  s
    
z)TestInvariantUfuncs.test_invariant_scalarc                 C   sb   t  dddg¡tj tj }||ƒ}t|tjƒs4t‚|j|jksDt‚t  	|j
||j
ƒk¡s^t‚d S ©Nçffffff
ÀçÍÌÌÌÌÌ @çffffff$@)r/   ry   rv   Úkgr‡   r   r»   r   r   r�   r   r  r   r   r    Útest_invariant_array  s
    z(TestInvariantUfuncs.test_invariant_arrayc                 C   s^   dt j }dt j }|||ƒ}t|t jƒs.t‚|j|jks>t‚t|j||j| 	|j¡ƒƒ d S )Nr   çÍÌÌÌÌÌ"@)
rv   r‚   rƒ   r   r»   r   r   r   r   rÆ   ©r=   r   Úq_i1Úq_i2r  r   r   r    Útest_invariant_twoarg_scalar‰  s    


z0TestInvariantUfuncs.test_invariant_twoarg_scalarc                 C   s‚   t  dddg¡tj tj }t  dddg¡tj tj }|||ƒ}t|tjƒsRt	‚|j
|j
ksbt	‚t|j||j| |j
¡ƒƒ d S )Nr  r  r  rg   ç      Àç    €„.A)r/   ry   rv   r  r‡   ÚgÚusr   r»   r   r   r   r   rÆ   r  r   r   r    Útest_invariant_twoarg_arrayŸ  s    
z/TestInvariantUfuncs.test_invariant_twoarg_array)r   Ú	arbitraryr`   c                 C   s^   t  dddg¡tj tj }|||ƒ}t|tjƒs6t‚|j|jksFt‚t	|j
||j
|ƒƒ d S r  )r/   ry   rv   r  r‡   r   r»   r   r   r   r   )r=   r   r  r  r  r   r   r    Ú#test_invariant_twoarg_one_arbitraryµ  s
    
z7TestInvariantUfuncs.test_invariant_twoarg_one_arbitraryc              	   C   s>   dt j }dt j }tjt jdd�� |||ƒ W 5 Q R X d S ©Nr   r
  rm   rÊ   ©rv   r‚   r‡   r"   r#   r‰   ©r=   r   r  r  r   r   r    Ú#test_invariant_twoarg_invalid_unitsÊ  s    

z7TestInvariantUfuncs.test_invariant_twoarg_invalid_unitsN)!rY   rZ   r[   r"   r\   rt   r/   ÚabsoluteÚfabsZconjÚ	conjugateÚnegativeÚspacingZrintÚfloorÚceilZpositiver  r	  rB   rC   ÚhypotÚmaximumÚminimumZ	nextafterr¢   ÚmodÚfmodr  r  Úinfr  r  r   r   r   r    rÿ   h  s˜   öþ
 ÿ
÷þ
÷þ



÷þ
÷þrÿ   c                	   @   s¢   e Zd Zej dejejej	ej
ejejg¡dd„ ƒZej dejejej	ej
ejejg¡dd„ ƒZej dejejejejf¡dd„ ƒZej d¡d	d
„ ƒZdS )ÚTestComparisonUfuncsr   c              	   C   sH  t  dddg¡tj tj }t  dddg¡tj tj }|||ƒ}t|tjƒrRt	‚|j
tks`t	‚t  |||j| |j¡ƒk¡s‚t	‚||| dƒ}t|tjƒr t	‚|j
tks®t	‚t  ||||  tj¡dƒk¡sÒt	‚t ¡ �d tjdtd	� d
t jt jfD ]&}|||ƒ |||t  t|ƒ¡ ƒ qø||t  d
t jt jg¡ƒ W 5 Q R X d S )Nr  r  r  rg   r  r  rb   Úignore)Úcategoryr`   )r/   ry   rv   r  r‡   r  ÚMsr   r»   r   rØ   Úboolr�   r   rÆ   r   rx   r(   r)   r*   ÚRuntimeWarningr&  ÚnanÚonesÚlen)r=   r   r  r  r  Zq_o2Zarbitrary_unit_valuer   r   r    Útest_comparison_valid_unitsà  s$    
"ÿ

z0TestComparisonUfuncs.test_comparison_valid_unitsc              	   C   s>   dt j }dt j }tjt jdd�� |||ƒ W 5 Q R X d S r  r  r  r   r   r    Útest_comparison_invalid_unitsû  s    

z2TestComparisonUfuncs.test_comparison_invalid_unitsc                 C   s`   dt jt j t jddgtj }||ƒ}t|tjƒr6t‚|jt	ksDt‚t  
|||jƒk¡s\t‚d S ©Nrc   rf   r`   )r/   r&  r-  rv   r‚   r   r»   r   rØ   r+  r�   r   )r=   r   r—   Úoutr   r   r    Útest_onearg_test_ufuncs  s
    z,TestComparisonUfuncs.test_onearg_test_ufuncsú*ignore:.*invalid value encountered in signc                 C   s|   dt jt j t jddgtj }t  |¡}t|tjƒr8t‚|j	|j	ksHt‚t  
|t  |j¡kt  |¡t  |j¡@ B ¡sxt‚d S r2  )r/   r&  r-  rv   r‚   Úsignr   r»   r   rØ   r�   r   Úisnan)r=   r—   r3  r   r   r    Ú	test_sign  s
    
zTestComparisonUfuncs.test_signN)rY   rZ   r[   r"   r\   rt   r/   ÚgreaterZgreater_equalÚlessZ
less_equalÚ	not_equalÚequalr0  r1  ÚisfiniteÚisinfr7  Úsignbitr4  r*   r8  r   r   r   r    r'  ß  s   þ
þ


r'  c                   @   s<  e Zd Zej dde d¡g¡dd„ ƒZej dde d¡g¡dd„ ƒZ	ej dde d¡g¡dd	„ ƒZ
ej dde d¡g¡d
d„ ƒZej dde d¡g¡dd„ ƒZdd„ Zej dde d¡g¡dd„ ƒZdd„ Zdd„ Zej dejejf¡dd„ ƒZej dejejf¡dd„ ƒZej d¡dd„ ƒZdd„ Zd S )!ÚTestInplaceUfuncsr   rc   rg   c                 C   sŠ   |t j }|}tj||d� ||ks(t‚|jt jks8t‚|t j  t j¡}|}tj||d� ||ksht‚|jt jksxt‚t	|j
|j
ƒ d S )N©r3  )rv   Zradr/   ru   r   r   rx   r„   Údegr   r   )r=   r   r‡   ÚcheckÚs2Úcheck2r   r   r    Útest_one_argument_ufunc_inplace  s    
z1TestInplaceUfuncs.test_one_argument_ufunc_inplacec                 C   s.  |t j }|}tj||d� ||ks(t‚t |jt |¡k¡sBt‚|jt jksRt‚tj	||d� ||kslt‚t |jt 	|¡k¡s†t‚|jt jks–t‚tj
||d� ||ks°t‚t |jt 
|¡k¡sÊt‚|jt jksÚt‚tj|d |d� ||ksøt‚t |jt |d ¡k¡�st‚|jt jk�s*t‚dS )z?Check inplace works with non-quantity input and quantity outputrA  rg   N)rv   r‚   r/   r  r   r�   r   r   rx   rE   rø   r}   r{   ©r=   r   r‡   rC  r   r   r    Ú!test_one_argument_ufunc_inplace_2)  s$    
 z3TestInplaceUfuncs.test_one_argument_ufunc_inplace_2c                 C   s   d| t j t j }| ¡ }| ¡ }|}t |||¡ ||ksBt‚|jt jksRt‚| 	t j¡}|}t |||¡ ||ks|t‚|jt jksŒt‚| 	t j¡}|}	t |||¡ |	|ks¶t‚|	jt jksÆt‚| ¡ }
|
}t |
|
|¡ ||
ksìt‚|jt jksüt‚d S )Nrá   )
rv   rº   r‚   Úcopyr/   rç   r   r   rx   r„   )r=   r   ré   Zv_copyÚtmprC  Úv2rE  Zv3Úcheck3Zv4Zcheck4r   r   r    Ú*test_one_argument_two_output_ufunc_inplace?  s,    z<TestInplaceUfuncs.test_one_argument_two_output_ufunc_inplacec                 C   sœ   |t j }|}|d }||ks"t‚t |j|d k¡s:t‚|t j }||ksPt‚|jt jt j ksft‚|dt j 9 }||ks€t‚t ||t j k¡s˜t‚d S )Nrb   )rv   Úcycler   r/   r�   r   r‡   r   rG  r   r   r    Ú!test_two_argument_ufunc_inplace_1Z  s    

z3TestInplaceUfuncs.test_two_argument_ufunc_inplace_1c              	   C   s   |t j }|}tj|||d� ||ks*t‚|jt jks:t‚t t j	¡� |dt j
 7 }W 5 Q R X ||kslt‚|jt jks|t‚tjdt j ||d� ||ksžt‚|jt jks®t‚tjdt j ||d� ||ksÐt‚|jt jksàt‚tjdt j ||d� ||k�st‚|jt jt j k�st‚d S )NrA  rc   rb   )rv   rN  r/   r�   r   r   r{   r"   r#   r‰   r‚   rB  rB   rŒ   r‡   rG  r   r   r    Ú!test_two_argument_ufunc_inplace_2h  s$    
z3TestInplaceUfuncs.test_two_argument_ufunc_inplace_2c                 C   sÆ   t  dddg¡tj }t jt  dddg¡t  dddg¡d |d� t  |jt  dddg¡k¡sbt‚|jtjksrt‚t j	t  dddg¡t  dddg¡d |d� t
|jt  	dd¡ƒ |jtjksÂt‚d S )Nrc   rb   rd   rA  rŽ   r§   )r/   ry   rv   rx   rB   r�   r   r   r   r�   r   r{   ©r=   r‡   r   r   r    Ú!test_two_argument_ufunc_inplace_3}  s    , ,z3TestInplaceUfuncs.test_two_argument_ufunc_inplace_3c                 C   s8  |t j }dt j }| ¡ }| ¡ }tj||||fd�}|d |krP|d |ksTt‚|jt jksdt‚|j|jkstt‚| ¡ }tj||||fd�}|d |kr¨|d |ks¬t‚|jt jks¼t‚|j|jksÌt‚| ¡ }	| ¡ }
tj|	||	|
fd�}|d |	k�r|d |
k�st‚|	jt jk�s"t‚|
j|jk�s4t‚d S )Nrh   rA  r   rj   )	rv   r‚   rº   rI  r/   r£   r   r   rx   )r=   r   ré   r¤   Zv1rJ  rC  rK  rE  Zv3aZv3brL  r   r   r    Ú*test_two_argument_two_output_ufunc_inplace†  s&    

 z<TestInplaceUfuncs.test_two_argument_two_output_ufunc_inplacec                 C   s„   t  d¡tj }| ¡ }|d d d… }|dtj 7 }t  |d d d… |d d d… k¡sZt‚t  |dd d… |dd d… k¡s€t‚d S )Nrg   rk   rc   rj   )r/   r�   rv   r‚   rI  rº   r�   r   )r=   r‡   Zs_copyrD  r   r   r    Ú&test_ufunc_inplace_non_contiguous_dataœ  s    &z8TestInplaceUfuncs.test_ufunc_inplace_non_contiguous_datac              	   C   s6  t jddddgt jtjd�}|t d¡9 }|jt jks:t‚|jtjksJt‚t jddddgt jtjd�}|dt j 7 }|jt jks„t‚|jtjks”t‚t jddddgt jtj	d�}|t jdt jtj
d�7 }|jt jksØt‚|jtj	ksèt‚t jddddgt jtj	d�}t t¡� |t jdt jtj
d�7 }W 5 Q R X dS )	zˆCheck that inplace operations check properly for casting.

        First two tests that check that float32 is kept close #3976.
        rj   rk   rl   rÖ   r×   é
   g      4@N)rv   r»   r‚   r/   Zfloat32r   r   rØ   rƒ   Zint32Zint64r"   r#   r†   Úmm)r=   Za1Za2Úa3Za4r   r   r    Ú%test_ufunc_inplace_non_standard_dtype¥  s    z7TestInplaceUfuncs.test_ufunc_inplace_non_standard_dtyper   c                 C   s¼   t  dddg¡tj tj }t  dddg¡tj tj }t  |jt	¡}||j
| |j¡|d� t  |jt	¡}||||d�}||ks†t‚t|ƒt jks˜t‚|jt	ks¦t‚t  ||k¡s¸t‚d S )Nr  r  r  rg   r  r  rA  )r/   ry   rv   r  r‡   r  r*  ÚemptyÚshaper+  r   rÆ   r   r   ÚtypeÚndarrayrØ   r�   )r=   r   r  r  rC  r   r  r   r   r    Útest_comparison_ufuncs_inplace»  s    z0TestInplaceUfuncs.test_comparison_ufuncs_inplacec                 C   sœ   dt jt j t jddgtj }t  |jt¡}||j|d� t  |jt¡}|||d�}||ks`t	‚t
|ƒt jksrt	‚|jtks€t	‚t  |||jƒk¡s˜t	‚d S ©Nrc   rf   r`   rA  )r/   r&  r-  rv   r‚   rY  rZ  r+  r   r   r[  r\  rØ   r�   )r=   r   r—   rC  r   r3  r   r   r    Útest_onearg_test_ufuncs_inplaceÉ  s    z1TestInplaceUfuncs.test_onearg_test_ufuncs_inplacer5  c                 C   s¾   dt jt j t jddgtj }t  |j|j¡}t j|j	|d� t  |j|j¡}t j||d�}||ksht
‚t|ƒt jkszt
‚|j|jksŠt
‚t  |t  |j	¡kt  |¡t  |j	¡@ B ¡sºt
‚d S r^  )r/   r&  r-  rv   r‚   rY  rZ  rØ   r6  r   r   r[  r\  r�   r7  )r=   r—   rC  r   r3  r   r   r    Útest_sign_inplace×  s    z#TestInplaceUfuncs.test_sign_inplacec                 C   sJ   t  d¡}t ddgtj¡}|dd…  |7  < t|t  dddg¡ƒ dS )	zRegression test for gh-13911.rd   g      )@g      9@Nrk   g      À?g      ô?rb   )r/   r�   rv   r»   r³   r   ry   )r=   Úar—   r   r   r    Ú%test_ndarray_inplace_op_with_quantityå  s    
z7TestInplaceUfuncs.test_ndarray_inplace_op_with_quantityN)rY   rZ   r[   r"   r\   rt   r/   r�   rF  rH  rM  rO  rP  rR  rS  rT  rX  r<  r9  r]  r=  r?  r_  r*   r`  rb  r   r   r   r    r@    s,   




	
	



r@  Úclipzno clip ufunc availabler“   c                   @   sP   e Zd Z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S )ÚTestClipzŸTest the clip ufunc.

    In numpy, this is hidden behind a function that does not backwards
    compatibility checks.  We explicitly test the ufunc here.
    c                 C   s   t jjj| _d S r'   )r/   r3   r4   rc  r@   r   r   r    Úsetup_method÷  s    zTestClip.setup_methodc                 C   s€   t  dd¡tj }dtj }dtj }|  |||¡}|j|jksDt‚|  |j	| 
|j¡| 
|j¡¡|j }t  ||k¡s|t‚d S )Nrf   rg   é}   çºI+‡v?)r/   r�   rv   r‚   rº   rƒ   rc  r   r   r   rÆ   r�   )r=   r—   Úq_minÚq_maxr   r   r   r   r    Útest_clip_simpleú  s    

$ÿzTestClip.test_clip_simplec                 C   s<  t  dd¡tj }dtj }|  |t j |¡}|  |jt j | |j	¡¡|j	 }t  
||k¡sbt‚|  ||t j¡}|  |j| |j	¡t j¡|j	 }t  
||k¡s¤t‚|  |t  |j¡|¡}|  |jd| |j	¡¡|j	 }t  
||k¡sêt‚|  |t  |j¡t  |jt j¡¡}	|  |jdt j¡|j	 }
t  
|	|
k¡�s8t‚d S )Nrf   rg   rg  r   )r/   r�   rv   r‚   rƒ   rc  r&  r   rÆ   r   r�   r   ZzerosrZ  Úfull)r=   r—   ZqlimZresult1Z	expected1Zresult2Z	expected2Zresult3Z	expected3Zresult4Z	expected4r   r   r    Útest_clip_unitless_parts  s    
" "z!TestClip.test_clip_unitless_partsc                 C   sZ   t  dd¡tj }|  |dtj d¡}|  |dd¡}|jtjksDt‚t  ||k¡sVt‚d S ©Nrf   rg   éÈ   r•   rb   )	r/   r�   rv   rx   rc  r³   r   r   r�   )r=   r—   r   r   r   r   r    Útest_clip_dimensionless  s
    z TestClip.test_clip_dimensionlessc                 C   s`   t  dd¡}|  |dtj dtj ¡}t|tjƒs6t‚|  |dd¡tj }t  	||k¡s\t‚d S rm  )
r/   r�   rc  rv   r³   rx   r   r»   r   r�   )r=   ra  r   r   r   r   r    Útest_clip_ndarray  s
    zTestClip.test_clip_ndarrayc                 C   s€   t  dd¡tj }dtj }dtj }|  |j| |j	¡| |j	¡¡|j	 }| j||||d�}||ksjt
‚t  ||k¡s|t
‚d S )Nrf   rg   rf  rg  rA  )r/   r�   rv   r‚   rº   rƒ   rc  r   rÆ   r   r   r�   )r=   r—   rh  ri  r   r   r   r   r    Útest_clip_quantity_inplace&  s    

$ÿz#TestClip.test_clip_quantity_inplacec                 C   s€   t  dd¡}t  |¡tj }|  |dd¡tj }| j|dtj dtj |d�}||ksZt‚|j	tjksjt‚t  
||k¡s|t‚d S )Nrf   rg   rb   r•   rn  rA  )r/   r�   Z
zeros_likerv   r‚   rc  rx   r³   r   r   r�   )r=   ra  r—   r   r   r   r   r    Ú&test_clip_ndarray_dimensionless_output1  s    z/TestClip.test_clip_ndarray_dimensionless_outputc              	   C   s¼   t  dd¡tj }t tj¡� |  |ddtj ¡ W 5 Q R X t tj¡� |  |j	ddtj ¡ W 5 Q R X t tj¡� |  |dd¡ W 5 Q R X t tj¡� |  |dd¡ W 5 Q R X d S )Nrf   rg   r   rj   éÿÿÿÿr`   rc   )
r/   r�   rv   r‚   r"   r#   r‰   rc  r‡   r   rÑ   r   r   r    Útest_clip_errors:  s     zTestClip.test_clip_errorsN)rY   rZ   r[   rs   re  rj  rl  ro  rp  rq  rr  rt  r   r   r   r    rd  í  s   	rd  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestUfuncAtzåTest that 'at' method for ufuncs (calculates in-place at given indices)

    For Quantities, since calculations are in-place, it makes sense only
    if the result is still a quantity, and if the unit does not have to change
    c           	   
   C   s(  t  d¡tj }t  ddg¡}|j ¡ }t j ||¡ t j ||¡ t  	|j|k¡sXt
‚|jtjksht
‚t t¡� t j ||¡ W 5 Q R X t tj¡� t j ||¡ W 5 Q R X t  d¡tj }|j ¡ }t j ||¡ t j ||¡ t  	|j|k¡süt
‚|jtjk�st
‚t  d¡tj }|j ¡ }t j ||¡ t j ||¡ t  	|j|k¡�sZt
‚|jtjk�slt
‚t  d¡tj }t tj¡� t j ||¡ W 5 Q R X |j ¡ }t t ¡ ¡�d t j ||¡ t j ||¡ t|j|ƒ t  d¡tj }t tj¡� t j ||¡ W 5 Q R X W 5 Q R X d S )Nrg   rj   rk   )r/   r�   rv   r‚   ry   r   rI  r  Úatr�   r   r   r"   r#   r†   r=  r‰   rª   rx   rû   r{   ru   Zadd_enabled_equivalenciesZdimensionless_anglesr   rw   )	r=   r—   rN   ZqvÚdZdvra  ÚavÚadr   r   r    Útest_one_argument_ufunc_atM  sD    



z&TestUfuncAt.test_one_argument_ufunc_atc              	   C   sŠ  t  d¡tj }t  ddg¡}|j ¡ }t j ||dtj	 ¡ t j ||d¡ t  
|j|k¡sbt‚|jtjksrt‚t tj¡� t j ||dtj ¡ W 5 Q R X t tj¡� t j ||dtj ¡ W 5 Q R X t  d¡tj }|j ¡ }t j ||dtj ¡ t j ||d¡ t  
|j|k¡�s$t‚t  d¡tj }t j ||d¡ t  
|j|k¡�sZt‚t t¡� t j ||dtj	 ¡ W 5 Q R X d S )Nrg   rj   rk   rc   g     @�@rb   )r/   r�   rv   r‚   ry   r   rI  rB   rv  rƒ   r�   r   r   r"   r#   r‰   r‡   rŒ   rx   r†   r9  )r=   r‡   rN   rC  r   r   r    Útest_two_argument_ufunc_at  s*    
  
z&TestUfuncAt.test_two_argument_ufunc_atN)rY   rZ   r[   rs   rz  r{  r   r   r   r    ru  F  s   2ru  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú!TestUfuncReduceReduceatAccumulatez�Test 'reduce', 'reduceat' and 'accumulate' methods for ufuncs

    For Quantities, it makes sense only if the unit does not have to change
    c              	   C   sŽ   t  d¡tj }t  ddddg¡}t t¡� t j 	|¡ W 5 Q R X t t¡� t j 
|¡ W 5 Q R X t t¡� t j ||¡ W 5 Q R X d S ©Nrg   r   é   rj   é   )r/   r�   rv   r{   ry   r"   r#   rÁ   ru   ÚreduceÚ
accumulateÚreduceat)r=   r‡   rN   r   r   r    Ú)test_one_argument_ufunc_reduce_accumulate¤  s    zKTestUfuncReduceReduceatAccumulate.test_one_argument_ufunc_reduce_accumulatec              	   C   s�  t  d¡tj }t  ddddg¡}|j ¡ }t j |¡}t j |¡}|j|ksRt	‚|j
tjksbt	‚t j |¡}t j |¡}t  |j|k¡sŽt	‚|j
tjksžt	‚t j ||¡}t j ||¡}	t  |j|	k¡sÎt	‚|j
tjksÞt	‚t t¡� t j |¡ W 5 Q R X t t¡� t j |¡ W 5 Q R X t t¡� t j ||¡ W 5 Q R X t tj¡� t j |¡ W 5 Q R X t tj¡� t j |¡ W 5 Q R X t tj¡� t j ||¡ W 5 Q R X t  d¡tj }|j ¡ }t j |¡}
t j |¡}|
j|k�söt	‚|
j
tjk�st	‚t j |¡}t j |¡}t  |j|k¡�s6t	‚|j
tjk�sHt	‚t j ||¡}t j ||¡}t  |j|k¡�szt	‚|j
tjk�sŒt	‚d S r}  )r/   r�   rv   r‚   ry   r   rI  rB   r€  r   r   r�  r�   r‚  r"   r#   r†   r9  r‰   rŒ   rx   )r=   r‡   rN   rC  Zs_add_reduceZcheck_add_reduceZs_add_accumulateZcheck_add_accumulateZs_add_reduceatZcheck_add_reduceatZs_multiply_reduceZcheck_multiply_reduceZs_multiply_accumulateZcheck_multiply_accumulateZs_multiply_reduceatZcheck_multiply_reduceatr   r   r    Ú)test_two_argument_ufunc_reduce_accumulate¯  sR    

zKTestUfuncReduceReduceatAccumulate.test_two_argument_ufunc_reduce_accumulateN)rY   rZ   r[   rs   rƒ  r„  r   r   r   r    r|  ž  s   r|  c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚTestUfuncOuterz{Test 'outer' methods for ufuncs

    Just a few spot checks, since it uses the same code as the regular
    ufunc call
    c              	   C   s6   t  d¡tj }t t¡� t j |¡ W 5 Q R X d S )Nrg   )	r/   r�   rv   r{   r"   r#   rÁ   ru   ÚouterrQ  r   r   r    Útest_one_argument_ufunc_outerï  s    z,TestUfuncOuter.test_one_argument_ufunc_outerc              	   C   s6  t  d¡tj }t  d¡tj }|j}|j}t j ||¡}t j ||¡}t  |j|k¡s\t	‚|j
|j
|j
 ksrt	‚t tj¡� t j ||¡ W 5 Q R X t  d¡|j
 }|j}t j ||¡}	t j ||¡}
t  |	j|
k¡sÞt	‚|	j
|j
ksît	‚t j ||¡}t j ||¡}t|ƒt jk�st	‚t  ||k¡�s2t	‚d S )Nrg   rb   )r/   r�   rv   r‚   r‡   r   rŒ   r†  r�   r   r   r"   r#   r‰   rB   r9  r[  r\  )r=   Ús1rD  Zcheck1rE  Zs12_multiply_outerZcheck12_multiply_outerZs3rL  Zs13_add_outerZcheck13_add_outerZs13_greater_outerZcheck13_greater_outerr   r   r    Útest_two_argument_ufunc_outerõ  s(    z,TestUfuncOuter.test_two_argument_ufunc_outerN)rY   rZ   r[   rs   r‡  r‰  r   r   r   r    r…  è  s   r…  )Úspecialc                   C   sd   t jtjkst‚t  dtj ¡ t jtjks0t‚tt jt	j
ƒrPt jtjks`t‚nt jtjks`t‚dS )z,Check that scipy gets loaded upon first use.rc   N)ÚspsÚerfr7   r:   r   rv   r³   r   Úerfinvr/   r   r   r   r   r    Útest_scipy_registration  s    rŽ  c                   @   s  e Zd Zej de¡dd„ ƒZej de¡dd„ ƒZej de¡dd„ ƒZ	ej de
jf¡dd	„ ƒZej de
jf¡d
d„ ƒZej de
jf¡dd„ ƒZe
je
je
je
je
je
je
je
je
je
je
je
je
je
je
jfZej de¡dd„ ƒZ ej de¡dd„ ƒZ!ej de¡dd„ ƒZ"dS )ÚTestScipySpecialUfuncsr�   c                 C   s   t  d |¡ d S r'   )rŠ   rÝ   rŸ   r   r   r    Útest_erf_scalar)  s    z&TestScipySpecialUfuncs.test_erf_scalarc                 C   s   t  d |¡ d S r'   )rŠ   rã   rŸ   r   r   r    Útest_erf_array-  s    z%TestScipySpecialUfuncs.test_erf_arrayc                 C   s   t  d |¡ d S r'   )rŠ   ræ   rŸ   r   r   r    Útest_erf_invalid_units1  s    z-TestScipySpecialUfuncs.test_erf_invalid_unitsc                 C   s   t  d |¡ d S r'   )rŠ   r·   rŸ   r   r   r    r·   5  s    z'TestScipySpecialUfuncs.test_cbrt_scalarc                 C   s   t  d |¡ d S r'   )rŠ   r¸   rŸ   r   r   r    r¸   9  s    z&TestScipySpecialUfuncs.test_cbrt_arrayc              	   C   s2  |dt j dt j dt j ƒ}t|jtjƒ |jt j	ks<t
‚|dt j dt j dt j ƒ}t|jdt j  t j	¡jƒ |jt j	ks†t
‚|dt j dt j dt j ƒ}t|jdt j  t j	¡jƒ |dt j	 dt j dt j ƒ}t|jdƒ |jt j	ksút
‚t t¡�$ |dt j dt j dt j ƒ W 5 Q R X d S )Nre   r`   r^   rd   rb   rc   )rv   rw   ZarcminZarcsecr   r   r/   rz   r   r{   r   r„   r"   r#   r†   r‚   r‡   r  )r=   r�   r™   rš   Zq3Zq4r   r   r    Útest_radian=  s    z"TestScipySpecialUfuncs.test_radianc                 C   sR   |dt j dt j  dt j dt j  ƒ}|jt jks:t‚|j|ddƒksNt‚d S )Nrb   rd   rŽ   rc   r_   rÛ   rÜ   r   r   r    Útest_jv_scalarY  s    *z%TestScipySpecialUfuncs.test_jv_scalarc              
   C   sì   |t  d¡tj dtj  t  dddg¡tj dtj  ƒ}|jtjksLt‚t  |j	|t  d¡t  dddg¡ƒk¡sxt‚|t  d¡tj dtj  t  dddg¡tj dtj
  ƒ}|jtjksÄt‚t|j	|t  d¡t  dd	d
g¡ƒƒ d S )Nrl   rc   rb   rd   rŽ   rÞ   r_   rß   rà   rá   )r/   r.  rv   r‚   ry   r   rx   r   r�   r   rº   r   râ   r   r   r    Útest_jv_array_  s"    þ ÿþþz$TestScipySpecialUfuncs.test_jv_arrayc              	   C   sD   t jtd|j› d�d��" |dtj dtj tj ƒ W 5 Q R X d S rò   )r"   r#   r†   rY   rv   r  r‚   r‡   rŸ   r   r   r    Útest_jv_invalid_unitst  s
    ýz,TestScipySpecialUfuncs.test_jv_invalid_unitsN)#rY   rZ   r[   r"   r\   rt   Úerf_like_ufuncsr�  r‘  r’  r‹  r÷   r·   r¸   r{   r“  ZjvZjnZjveZynZyvZyveÚknÚkvZkveZivZiveZhankel1Zhankel1eZhankel2Zhankel2eZjv_like_ufuncsr”  r•  r–  r   r   r   r    r�  (  sD   





            ý

r�  )LÚconcurrent.futuresrS   r(   Úcollectionsr   Únumpyr/   r"   Zerfar   r<   Znumpy.testingr   r   Zastropyr   rv   Zastropy.unitsr   r7   Z(astropy.units.quantity_helper.convertersr   Z%astropy.units.quantity_helper.helpersr
   Z"astropy.utils.compat.optional_depsr   r   r   r   r\   Úskipr!   r&   r,   r-   r]   rŠ   rÿ   r'  r@  rô   Úhasattrr3   r4   rd  ru  r|  r…  ZscipyrŠ  r‹  rŒ  ÚerfcZerfcxZerfiÚgammaZgammalnZloggammaZgammasgnÚpsiZrgammaZdigammaZwofzZdawsnZentrZexprelrù   rþ   rú   Zexp10r—  r   r�  ZerfcinvrŽ  r�  r   r   r   r    Ú<module>   s€   



B "  Uw9 V ÿVXJ)               ü
