U
    e»{jM4  ã                   @   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mZ d dlmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d d	lmZ ejj e d
d�dd„ ƒZ!ejj e d
d�G dd„ dƒƒZ"ejj e d
d�dd„ ƒZ#ejj e d
d�dd„ ƒZ$ejj e d
d�ej %ddddg¡dd„ ƒƒZ&ejj e d
d�ej %ddddg¡dd„ ƒƒZ'ejj e d
d�ej %deeeeeeeeej(ej)ej*ej+ej,ej-ej.ej/g¡dd„ ƒƒZ0dS )é    N)ÚStringIO)Úunits)ÚcoreÚflrw)Ú_z_at_scalar_valueÚ
z_at_value)ÚWMAP1ÚWMAP3ÚWMAP5ÚWMAP7ÚWMAP9ÚPlanck13ÚPlanck15ÚPlanck18)Úallclose)Ú	HAS_SCIPY)ÚAstropyUserWarningztest requires scipy)Úreasonc               
   C   s„  t } tt| jdtj ƒddd�s$t‚tt| jdtj ƒddd�sDt‚tt| jdtj	 ƒddd�sdt‚tt| j
d	tj ƒd
dd�s„t‚tt| j
dtj dd�ddd�s¨t‚tt| jdtj dd�ddd�sÌt‚tt| jdtj dd�ddd�sðt‚t tj¡�6 tjtdd�� t| jdtj dd� W 5 Q R X W 5 Q R X t tj¡�6 tjtdd�� t| jdtj dd� W 5 Q R X W 5 Q R X d S )Né   g&‘ùWÁ•	@ç�íµ ÷Æ°>©Zrtolé   g�¢ÎÜCré?é.   gÊ²bãºÜÿ?g     ˆÃ@gÔ=º*³åõ?g9Ë{ˆ…	:@g»½×Ùß|Û=)Úztolé   g•Ö&è.>éÜ  )Úzmaxç,úáÍå?ç      @)ÚzminçÔ­è ùT@úfval is not bracketed©Úmatchç      à?ç      @)r   r   r   ÚageÚuÚGyrÚAssertionErrorZlookback_timeZdistmodÚmagZluminosity_distanceÚMpcÚGpcÚangular_diameter_distanceÚpytestÚraisesr   ÚCosmologyErrorÚwarnsr   )Úcosmo© r3   úg/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/cosmology/funcs/tests/test_funcs.pyÚtest_z_at_value_scalar   s<         ÿ
ý
ý
ý
*r5   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTest_ZatValuec                 C   s
   t | _d S ©N)r   r2   ©Úselfr3   r3   r4   Úsetup_classH   s    zTest_ZatValue.setup_classc                 C   sš   t t| jjddgtj ƒddgdd�s*t‚t t| jjdtj dd	gdd
gd�ddgdd�s^t‚t t| jjdtj dd	ggdd
gd�ddggdd�s–t‚dS )zTest broadcast of arguments.r   r   çYcœBÀ•	@gNÕÇ£Ó2è?r   r   r   r   r   é   ©r   r   r   r    N)	r   r   r2   r&   r'   r(   r)   r-   r+   r8   r3   r3   r4   Útest_broadcast_argumentsK   s2    ý
üø
üøz&Test_ZatValue.test_broadcast_argumentsc              	   C   s  t t| jjdtj dd�ddd�s&t‚t t| jjdtj ddgd�ddd�sPt‚tjt	d	d
��& t| jjdtj ddddgd� W 5 Q R X tjt
dd
��( t| jjdtj t ddg¡d� W 5 Q R X tjddgdddggtd�}t t| jjdtj |d�ddgdd��st‚dS )z#`bracket` has special requirements.r   N)Úbracketr;   r   r   r   r<   Úsequencer"   é   Údtyper   )rB   )r   r   r2   r&   r'   r(   r)   r.   r/   Ú
ValueErrorÚ	TypeErrorÚnpÚarrayÚobject)r9   r?   r3   r3   r4   Útest_broadcast_bracketl   s(    ý
ý
*,ýz$Test_ZatValue.test_broadcast_bracketc              	   C   sB   t jtdd��* t| jjdtj dddgddgd	� W 5 Q R X d
S )zShapes mismatch as expectedÚ	broadcastr"   r   r   r   çš™™™™™¹?r   r<   r=   N)r.   r/   rC   r   r2   r-   r'   r+   r8   r3   r3   r4   Útest_bad_broadcastŒ   s    üz Test_ZatValue.test_bad_broadcastc                 C   sL   t | jjdtj ddd�}t|tjƒs*t‚|jt	j
ks:t‚|jdksHt‚dS )z#Test scalar input returns a scalar.r   r   r   r=   r3   N)r   r2   r-   r'   r+   Ú
isinstanceZQuantityr)   rB   rE   Zfloat64Úshape)r9   Úzr3   r3   r4   Útest_scalar_input_to_output–   s       ÿz)Test_ZatValue.test_scalar_input_to_outputN)Ú__name__Ú
__module__Ú__qualname__r:   r>   rH   rK   rO   r3   r3   r3   r4   r6   F   s
   ! 
r6   c               	   C   sF   t jtdddgd�} tjtjdd�� | tjdtj	 ƒ W 5 Q R X dS )	zÉTest that numpy vectorize fails on Quantities.

    If this test starts failing then numpy vectorize can be used instead of
    the home-brewed vectorization. Please submit a PR making the change.
    ÚfuncÚmethodÚverbose)Úexcludedzdimensionless quantitiesr"   é
   N)
rE   Z	vectorizer   r.   r/   r'   ZUnitConversionErrorr   r&   r(   )r   r3   r3   r4   Útest_z_at_value_numpyvectorize    s     ÿrX   c                 C   sH   t }tƒ }|  td|¡ t|jdtj dd�}t|j	ƒ| 
¡ ksDt‚d S )NÚstdoutr   T)rU   )r   r   ÚsetattrÚsysr   r&   r'   r(   ÚstrÚvalueÚgetvaluer)   )Zmonkeypatchr2   Zmock_stdoutZresxr3   r3   r4   Útest_z_at_value_verbose®   s
    r_   rT   ÚBrentÚGoldenÚBoundedc              
   C   sD  t }| dkrštjtdd�� t|jdtj | d�}W 5 Q R X |dkrNd}d}nd	}d
}tjtdd��, t	t|jdtj | |d�|dd�sŒt
‚W 5 Q R X �nZt	t|jdtj | dd�d	dd�sÀt
‚t	t|jdtj | dd�ddd�sæt
‚t	t|jdtj | dd�d	dd��st
‚t	t|jdtj | dd�d	dd��s6t
‚tjtdd��V t	t|jdtj | dd�d	dd��snt
‚t	t|jdtj | d
d�ddd��s–t
‚W 5 Q R X t	t|jdtj | d
dd�d	dd��sÊt
‚t	t|jdtj | ddd�ddd��sôt
‚t tj¡�: tjtdd��  t|jdtj | ddd� W 5 Q R X W 5 Q R X dS )zÕ
    Test 2 solutions for angular diameter distance by not constraining zmin, zmax,
    but setting `bracket` on the appropriate side of the turning point z.
    Setting zmin / zmax should override `bracket`.
    rb   r!   r"   r   )rT   çš™™™™™ù?r    )gÍÌÌÌÌÌì?ç      ø?g©ÏäÍå?)rc   ç       @zOption 'bracket' is ignored)rT   r?   r   r   )ç333333Ó?ç      ð?)re   r%   )rJ   rd   )rJ   rg   re   )rT   r?   r   rd   )rT   r?   r   )g333333@g      @r%   N)r   r.   r1   r   r   r-   r'   r+   ÚUserWarningr   r)   r/   r   r0   )rT   r2   rN   r?   r3   r3   r4   Útest_z_at_value_bracketedº   sà     üøüø

üø

üø
üø
üø
üø
û÷û÷ûri   c              	   C   sÎ   t }ddgddgddgdœ}| dkr4tjtdd�}ntjtd	d�}|�  t|jd
tj dd| d�}W 5 Q R X |�  t|jd
tj dd| d�}W 5 Q R X t|d||  d d�s°t	‚t|d||  d
 d�sÊt	‚dS )z¥
    Test warnings on non-converged solution when setting `maxfun` to too small iteration number -
    only 'Bounded' returns status value and specific message.
    g-Cëâ6?gü©ñÒMbP?g{®Gáz„?rJ   )r`   ra   rb   rb   z;Solver returned 1: Maximum number of function calls reachedr"   zSolver returned Noneé   r   é   )r   ÚmaxfunrT   )r   rl   rT   gÁÅŠLÃÔ?r   r   gt)®*û^ @N)
r   r.   r1   r   r   r-   r'   r,   r   r)   )rT   r2   r   ÚctxZz0Úz1r3   r3   r4   Útest_z_at_value_unconverged8  s4    þ    ÿ    ÿro   r2   c           	   	      sø   d}d}t ˆ jƒ d¡r |d7 }tjˆ tjd�}|D ]V\}}| d¡s4||krPq4||ƒ}t||ddgd	d
�}t||dd�s4td|› d�ƒ‚q4t	ˆ jt ƒrôd‰‡ ‡fdd„‡ ‡fdd„‡ ‡fdd„g}|D ]*}||ƒ}t|t||dd	d�dd�sÈt‚qÈdS )zn
    Calculate values from a known redshift, and then check that
    z_at_value returns the right answer.
    r$   )ZOkZOtotÚangular_diameter_distance_z1z2ÚcloneZis_equivalentZde_density_scaleÚwZWMAP)Znu_relative_density)Ú	predicateÚ_rf   rg   gê-�™—q=)r?   r   g•dyáýµ=r   zRound-trip testing z failedre   c                    s   ˆ   | ˆ¡S r7   )Z_comoving_distance_z1z2©rn   ©r2   Zz2r3   r4   Ú<lambda>—  ó    z+test_z_at_value_roundtrip.<locals>.<lambda>c                    s   ˆ   | ˆ¡S r7   )Z"_comoving_transverse_distance_z1z2ru   rv   r3   r4   rw   ˜  rx   c                    s   ˆ   | ˆ¡S r7   )rp   ru   rv   r3   r4   rw   ™  rx   rd   )r   r   N)
r\   ÚnameÚ
startswithÚinspectÚ
getmembersÚismethodr   r   r)   rL   )	r2   rN   ÚskipÚmethodsry   rS   ZfvalÚgotZ	func_z1z2r3   rv   r4   Útest_z_at_value_roundtripW  s(    	 ýr�   )1r{   r[   Úior   ÚnumpyrE   r.   Zastropyr   r'   Zastropy.cosmologyr   r   Zastropy.cosmology.funcsr   r   Zastropy.cosmology.realizationsr   r	   r
   r   r   r   r   r   Zastropy.unitsr   Z"astropy.utils.compat.optional_depsr   Zastropy.utils.exceptionsr   ÚmarkZskipifr5   r6   rX   r_   Zparametrizeri   ro   Z	LambdaCDMZFlatLambdaCDMZwpwaCDMZw0wzCDMZwCDMZFlatwCDMZw0waCDMZFlatw0waCDMr�   r3   r3   r3   r4   Ú<module>   s^   (

)Y

|ðþ