U
    e»{jåI  ã                   @   s(  d dl Zd dlZd dlmZmZmZ d dlmZ	 d dl
mZ d dlmZmZmZ d dlmZ d dlmZ ejejejejg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d¡dd„ ƒZ#dd„ Z$dd„ Z%d d!„ Z&ej!j'e d"d#�d$d%„ ƒZ(d&d'„ Z)d(d)„ Z*d*d+„ Z+d,d-„ Z,d.d/„ Z-d0d1„ Z.d2d3„ Z/d4d5„ Z0d6d7„ Z1ej!j'e d"d#�ej! "d8e¡d9d:„ ƒƒZ2d;d<„ Z3ej! "d=ej4ej5f¡d>d?„ ƒZ6ej! "d=ej4ej5f¡d@dA„ ƒZ7dBdC„ Z8ej!j'e d"d#�ej! "d8e¡dDdE„ ƒƒZ9ej!j'e d"d#�ej! "dFdG¡dHdI„ ƒƒZ:ej!j'e d"d#�ej! "dJdK¡dLdM„ ƒƒZ;ej!j'e d"d#�ej! "d8e¡dNdO„ ƒƒZ<ej! "dPe =¡ e >¡ g¡dQdR„ ƒZ?ej! "dPe =¡ e >¡ g¡dSdT„ ƒZ@dUdV„ ZAej! "dWejBdXdYgfejCdXdYgfejDd dZgfejEd dZgfejFdXdYgfejGdXdYgfg¡d[d\„ ƒZHej!j'e d"d#�d]d^„ ƒZIdS )_é    N)Úassert_allcloseÚassert_array_equalÚassert_array_less)Úunits)ÚAngle)ÚInputParameterErrorÚfittingÚmodels)Ú	HAS_SCIPY)ÚAstropyUserWarningc                  C   s(   ddl m}  ddlm} || ks$t‚dS )zÒ
    Test that the GAUSSIAN_SIGMA_TO_FWHM constant matches the
    gaussian_sigma_to_fwhm constant in astropy.stats. We define
    it manually in astropy.modeling to avoid importing from
    astropy.stats.
    r   )ÚGAUSSIAN_SIGMA_TO_FWHM)Úgaussian_sigma_to_fwhmN)Z"astropy.modeling.functional_modelsr   Zastropy.stats.funcsr   ÚAssertionError)r   r   © r   úl/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/tests/test_functional_models.pyÚtest_sigma_constant   s    r   c                  C   sP   t jddddd�} t ddd¡}| |ƒ}d	d
ddddd
d	g}t||ddd� dS )zBRegression test for https://github.com/astropy/astropy/issues/1721çÍÌÌÌÌÌ@ç       @ç      ð?é   )Ú	amplitudeÚx_0ÚwidthÚsloper   é   é   ç        gùfzê ö?gNf8uP	@ç�íµ ÷Æ°>©ÚrtolÚatolN)r	   ZTrapezoid1DÚnpÚlinspacer   )ÚmodelZxxÚyyZyy_refr   r   r   Útest_Trapezoid1D#   s
    r%   c                  C   sT   t jdddd�} tjdd… }| |ƒ}ddd	d
dg}t||ddd� t| jdƒ d S )Nr   ç333333û?çffffff@)Ústddevr   é   g¨yÕÃÈ@g÷4/ z¤@g5‹a˜]Å@g¸°M®RC@gy–½øäY@r   r   ç¢Föç(@)r	   Z
Gaussian1Dr!   Úmgridr   Úfwhm)r#   ÚxÚgÚg_refr   r   r   Útest_Gaussian1D-   s    r0   c               	   C   sª   t jdddddtjd d�} tjdd	…dd	…f \}}| ||ƒ}d
ddddgdddddgdddddgdddddgddd d!d"gg}t||dd#d$� t| j| jgd%d&gƒ d'S )(zd
    Test rotated elliptical Gaussian2D model.
    https://github.com/astropy/astropy/pull/2038
    r   r&   gÍÌÌÌÌÌ@r'   çffffff
@g      @©Úx_stddevÚy_stddevÚthetar   r)   gÙÀëm'@g7öô*•ì@g%Ðšþp€@gUÅ¯³|@g;ý^€
@gÎòD)„z@g½)öájÞ@gG9ŽÉ@g?ÿ=xe	@g<%R`"
@g<N°ƒs@g)'ñ^@góãq¹@g]­,4¬@gS½ÊRZ
@gÊ.¤I@g¾¿ƒ—Ç›@gT�Å§!¾@g`Ü7­@g–ƒò¡¸!@gÉÌ`ç'@gCv½¸}¬@g¯Î’V@gêm;†*@gõâÝôÛÅ@r   r   r*   g; âkh@N)r	   Ú
Gaussian2Dr!   Úpir+   r   Zx_fwhmZy_fwhm)r#   Úyr-   r.   r/   r   r   r   Útest_Gaussian2D6   s*         ÿ
û
 ÿr9   c               	   C   sæ   ddgddgg} t jddd| d�}tjdd	…dd	…f \}}|||ƒ}d
ddddgdddddgdddddgdddddgdddddgg}t||ddd� dddgdddgdddgg} d}tjt|d�� t jddd| d� W 5 Q R X d S )!z}
    Test rotated elliptical Gaussian2D model when cov_matrix is input.
    https://github.com/astropy/astropy/pull/2199
    ç     €H@ç      0Àç      "@g      1@r   ç      @©Ú
cov_matrixr   r)   g&â­óo@gî·Ñ[—]@g-1H4¸@g•»ÏñÑ "@gf‹œl Æ$@grÛ!rª!@gãé®O­¢%@g‹µK]*=)@gðû!e,@g>…Žã¨®-@gk¹u/Þ^+@gß.^ b¾.@gÄ…�ÊEr0@gÈ€G¯Â0@g§.V E0@r   r   g…ëQ¸	@iðÿÿÿé   zCovariance matrix must be 2x2©ÚmatchN)r	   r6   r!   r+   r   ÚpytestÚraisesÚ
ValueError)r?   r#   r8   r-   r.   r/   ÚMESSAGEr   r   r   Útest_Gaussian2DCovarianceN   s    
ûrG   c                  C   s¦   d} d\}}d\}}t ddƒ}t| ||||d�}tj|jd�}|d|  |d|  f}||Ž }	tjf d	d
i|—Ž}
tjf d	|ji|—Ž}|
|Ž }||	Ž }t||ƒ d S )Né*   )r   r   )é   r   é
   Údeg)r   Úx_meanÚy_meanr3   r4   ©ZanglerI   r5   r   )r   Údictr	   Ú
Rotation2DÚdegreer6   Úradianr   )r   rL   rM   r3   r4   r5   ZparsÚrotationÚpoint1Úpoint2Úg1Úg2Zvalue1Zvalue2r   r   r   Útest_Gaussian2DRotationh   s&    
ûrX   c               	   C   sð   d} d}d}ddgddgg}t  ¡  t j| ||d� t jd ||d� t j| d |d� t j| |d d� t j|d� d	}tjt|d
�� t jd|d� W 5 Q R X tjt|d
�� t jd|d� W 5 Q R X tjt|d
�� t jd|d� W 5 Q R X d S )Nr'   r1   rJ   r:   r;   r<   r2   r>   z3Cannot specify both cov_matrix and x/y_stddev/thetarA   r   )r3   r?   )r4   r?   )r5   r?   )r	   r6   rC   rD   r   )r3   r4   r5   r?   rF   r   r   r   Útest_Gaussian2D_invalid_inputs~   s"    rY   c                  C   sˆ   t ddƒ} tjddddd| d�}tjd }tjddddd|d�}|jj d	¡j|jjks\t	‚|j
|j
kslt	‚|d
dƒ|d
dƒks„t	‚d S ©NéZ   rK   é   é   é   r)   ©r5   r   rR   ç�Âõ(\[ƒ@çªñÒMbP?@)r   r	   r6   r!   r7   r5   ÚquantityÚtoÚvaluer   Úbounding_box©r5   Zmodel1Ztheta2Zmodel2r   r   r   Útest_Gaussian2D_theta•   s    

rg   Úgamma)rJ   iöÿÿÿc                 C   sN   d}| ddœ}t jf |Ž}t jf |Ž}t|j|jg|ƒ td|j|jgƒ d S )Ngê/7ÑRA@ç      à?)rh   Úalphar   )r	   ZMoffat1DZMoffat2Dr   r,   r   )rh   ZansÚkwargsÚm1Úm2r   r   r   Útest_moffat_fwhm¢   s    
rn   c                  C   sÈ   t  d¡} | dƒdkst‚t| ddgƒddgƒ t|  | ddgƒ¡ddgƒ t jdddgd	d
�} t| dƒdƒ t| ddgdd�ddgddgdd	ggƒ t|  | ddgdd�¡ddgddgddggƒ dS )zLike ``test_ScaleModel()``.gš™™™™™Ù?r   r\   rI   gffffffö?gffffff@ç      à¿ri   r   )Ún_modelsF)Zmodel_set_axisç      ø?N)r	   ÚRedshiftScaleFactorr   r   r   Úinverse©Úmr   r   r   Útest_RedshiftScaleFactor¬   s    
( ÿrv   c                  C   s"   t  d¡} t|  | dƒ¡dƒ d S ©Ng�—nƒÀó?g-²�ï'@)r	   rr   r   rs   rt   r   r   r   Ú test_RedshiftScaleFactor_inverseÀ   s    
rx   c                  C   sP   t  d¡} d| _| jdkst‚| j}|jdks2t‚t|| ddd�dd�dƒ d S )NrI   ©r\   r)   )r   r^   r   T©Zwith_bounding_box)r	   rr   re   r   rs   r   ©r#   Zinverse_modelr   r   r   Ú-test_RedshiftScaleFactor_inverse_bounding_boxÅ   s    
 ÿr|   zrequires scipy)Úreasonc                  C   s@   t  ¡ } t d¡}d| }t ¡ }|| ||ƒ}t|jdgƒ dS )z<Test fitting RedshiftScaleFactor model with LevMarLSQFitter.rJ   g46<½@g
h"lxzû?N)r	   rr   r!   Úaranger   ÚLevMarLSQFitterr   Ú
parameters)Ú
init_modelr-   r8   ÚfitterÚfitted_modelr   r   r   Ú)test_RedshiftScaleFactor_model_levmar_fitÑ   s    
r„   c                  C   s  d} d\}}t ddƒ}t | ||dd|j¡}tjdd…dd…f \}}|||ƒ}t ||dk | k¡sjt‚|||f | ks~t‚tj|j	d	�}d
dg}	||	Ž }
t 
|	¡||g }	t 
|
¡||g }
tj| ||dddd�}tj| ||dd|jd�}||	Ž ||
Ž k�st‚dS )zTest Ellipse2D model.ç      @)r^   r^   é-   rK   é   r   r   é   rN   rI   r   r_   N)r   r	   Ú	Ellipse2DrR   r!   r+   Úallr   rP   rQ   Úarray)r   Zx0Zy0r5   Zemr8   r-   ÚerS   rT   rU   Úe1Úe2r   r   r   Útest_Ellipse2Dà   s     

r�   c                  C   sv   d} d}|d d }t jd|…d|…f \}}tj| ||||dd�||ƒ}t | |||¡||ƒ}t  ||k¡srt‚dS )z7Test that circular Ellipse2D agrees with Disk2D [3736].r…   rJ   rI   r\   r   r_   N)r!   r+   r	   r‰   ZDisk2DrŠ   r   )r   ZradiusÚsizer8   r-   ZellipseZdiskr   r   r   Útest_Ellipse2D_circularõ   s    r‘   c                  C   sˆ   t ddƒ} tjddddd| d�}tjd }tjddddd|d�}|jj d	¡j|jjks\t	‚|j
|j
kslt	‚|d
dƒ|d
dƒks„t	‚d S rZ   )r   r	   r‰   r!   r7   r5   rb   rc   rd   r   re   rf   r   r   r   Útest_Ellipse2D_theta   s    

r’   c                  C   s"   t  d¡} t|  | dƒ¡dƒ d S rw   )r	   ÚScaler   rs   rt   r   r   r   Útest_Scale_inverse  s    
r”   c                  C   sR   t  d¡} d| _| jdkst‚| j}|jdks2t‚|| ddd�dd�dksNt‚d S ©NrI   ry   )rI   rJ   r   Trz   ç      @)r	   r“   re   r   rs   r{   r   r   r   Útest_Scale_inverse_bounding_box  s    
ÿr—   c                  C   s"   t  d¡} t|  | dƒ¡dƒ d S rw   )r	   ÚMultiplyr   rs   rt   r   r   r   Útest_Multiply_inverse  s    
r™   c                  C   sR   t  d¡} d| _| jdkst‚| j}|jdks2t‚|| ddd�dd�dksNt‚d S r•   )r	   r˜   re   r   rs   r{   r   r   r   Ú"test_Multiply_inverse_bounding_box#  s    
ÿrš   c                  C   s"   t  d¡} t|  | dƒ¡dƒ d S rw   )r	   ÚShiftr   rs   rt   r   r   r   Útest_Shift_inverse/  s    
rœ   c                  C   sR   t  d¡} d| _| jdkst‚| j}|jdks2t‚|| ddd�dd�dksNt‚d S )NrJ   ry   )é   r^   r   Trz   r–   )r	   r›   re   r   rs   r{   r   r   r   Útest_Shift_inverse_bounding_box4  s    
ÿrž   r‚   c              	   C   s\   | ƒ } t  ¡ }t d¡}|d }tjtdd�� | |||ƒ}W 5 Q R X t|jdgdd� dS )z<Test fitting Shift model with LevMarLSQFitter (issue #6103).rJ   çš™™™™™¹?zModel is linear in parametersrA   çVçž¯Ò<©r    N)	r	   r›   r!   r~   rC   Zwarnsr   r   r€   )r‚   r�   r-   r8   rƒ   r   r   r   Útest_Shift_model_levmar_fit@  s    
r¢   c                  C   s^   t jddgdd�} t d¡}t |d |d g¡}t ¡ }|| ||ƒ}t|jddgdd	� d
S )z1Test linear fitting of Shift model (issue #6103).r   rI   )Úoffsetrp   rJ   rŸ   gš™™™™™É?gš™™™™™É¿r    r¡   N)	r	   r›   r!   r~   r‹   r   ÚLinearLSQFitterr   r€   )r�   r-   r$   r‚   rƒ   r   r   r   Útest_Shift_model_set_linear_fitQ  s    
r¥   ÚModelc                 C   s^   | ddgdd�}t  dd¡}t  d| d| g¡}t ¡ }||||ƒ}t|jddgdd	� d
S )z+Test linear fitting of Scale model (#6103).r   rI   )Úfactorrp   éýÿÿÿr‡   gffffffò?g¸…ëQ¸î?r    r¡   N)r!   r~   r‹   r   r¤   r   r€   )r¦   r�   r-   r$   r‚   rƒ   r   r   r   Útest_Scale_model_set_linear_fit_  s    r©   c                 C   sV   | dt j d�}dt j dt j dœ}|jf |Ž}t ddd¡}t||ƒd| ƒ d S )	Nr   )r§   r   r‡   )r-   r8   éÿÿÿÿr\   éd   )Úuru   Zwithout_units_for_datar!   r"   r   )r¦   ru   rk   Zmnur-   r   r   r   Ú'test_Scale_model_evaluate_without_unitsn  s
    r­   c               	   C   s  t jdddd�} | jjdks t‚| jjdks0t‚| jjdks@t‚| jjdksPt‚| jjdks`t‚t jddddd�} | jjdks‚t‚| jjdks’t‚| jjdks¢t‚| jjdks²t‚| jjdksÂt‚t jddddd�} | jjdksät‚| jjdksôt‚| jjdk�st‚| jjdk�st‚| jjdk�s*t‚d}t	j
t|d	�� t jdddd
d� W 5 Q R X t jddddd�} | jjdk�s~t‚| jjdk�s�t‚| jjdk�s¢t‚| jjdk�s´t‚| jjdk�sÆt‚t jdddddd�} | jjdk�sìt‚| jjdk�sþt‚| jjdk�st‚| jjdk�s"t‚| jjdk�s4t‚t	j
t|d	�� t jdddddd� W 5 Q R X t jdddddd�} | jjdk�sˆt‚| jjdk�sšt‚| jjdk�s¬t‚| jjdk�s¾t‚| jjdk�sÐt‚t jdddddd�} | jjdk�söt‚| jjdk�st‚| jjdk�st‚| jjdk�s,t‚| jjdk�s>t‚t	j
t|d	�� t jdddddd� W 5 Q R X t jddddddd�} | jjdk�s”t‚| jjdk�s¦t‚| jjdk�s¸t‚| jjdk�sÊt‚| jjdk�sÜt‚d}t	j
t|d	�� t jddddddd� W 5 Q R X d S )Nr\   )r   r   Úy_0r   )r   r   r®   Úr_inr‡   )r   r   r®   Úr_outé   z%r_in=.* and width=.* must both be >=0rA   ri   r�   )r   r   r®   r   rI   r)   )r   r   r®   r¯   r°   r   )r   r   r®   r°   r¯   )r   r   r®   r¯   r   é   )r   r   r®   r°   r   r   )r   r   r®   r¯   r°   r   zWidth must be r_out - r_in)r	   ZRing2Dr   rd   r   r   r®   r¯   r   rC   rD   r   )ru   rF   r   r   r   Útest_Ring2D_routy  st    r³   c              	   C   sŠ   | ƒ } t jddddd�}tjdddd�}||ƒ}t jddddd�}| |||ƒ}t|j|jƒ d	}tjt|d
�� t jdd� W 5 Q R X d S )Nro   r   ç      @)Úamplitude_Lr   Úfwhm_LÚfwhm_Gg      Àé(   )Únumg      ð¿z6Not a valid method for Voigt1D Faddeeva function: testrA   Útest)Úmethod)	r	   ÚVoigt1Dr!   r"   r   Ú
param_setsrC   rD   rE   )r‚   ÚvoiÚxarrÚyarrZvoi_initZvoi_fitrF   r   r   r   Útest_Voigt1DÉ  s    rÁ   Ú	algorithm)Ú	humlicek2Úwofzc                 C   s\   ddl m} tjdtj ddd| d�}| dkr4d	}nd
}t||tj tjƒd d|d� dS )z*Test integral of normalized Voigt profile.r   )Úquadr   r   r   rq   )rµ   r   r¶   r·   r»   rÄ   g›+¡†›„=g:Œ0âŽyE>r¡   N)Zscipy.integraterÅ   r	   r¼   r!   r7   r   Úinf)rÂ   rÅ   r¾   r    r   r   r   Útest_Voigt1D_normÛ  s        ÿrÇ   Údoppler)gü©ñÒMbP?ç{®Gáz„?rŸ   ri   r   r=   r´   rJ   c              	   C   sÂ   t  ddd¡}tjdt j d| dd�}||ƒ}|j|ddt j d| d	�}tjdt j d| d
d�}||ƒ}|j|ddt j d| d	�}t||dddt  | ¡   d� t||dddd|    d� dS )z\
    Verify accuracy of Voigt profile in Humlicek approximation to Faddeeva.cc (SciPy).
    iìÿÿÿé   i� r   r   rÄ   )rµ   r¶   r·   r»   r   )r   rµ   r¶   r·   rÃ   gH¯¼šò×z>rI   r\   )r   g•Ö&è.>rˆ   r   N)r!   r"   r	   r¼   r7   Z	fit_derivr   Úsqrt)rÈ   r-   Zvoi_wZvf_wZdvda_wZvoi_hZvf_hZdvda_hr   r   r   Útest_Voigt1D_hum2ë  s>       ÿ    ÿ   ÿ    ÿ rÌ   c                 C   sf   | ƒ } t jdddd�}t ddd¡}||ƒ}t jdddd�}| |||ƒ}t|j|jƒ t|jdƒ d S )Nr\   rI   )r   Zr_coreZr_tiderŸ   rJ   gzŸPDÓ?)r	   ZKingProjectedAnalytic1Dr!   r"   r   r½   Zconcentration)r‚   Úkmr¿   rÀ   Zkm_initZkm_fitr   r   r   Ú test_KingProjectedAnalytic1D_fit  s    rÎ   r#   c                 C   s&   t  ddd¡}t||  | |ƒ¡ƒ d S )NrŸ   g      $@éÈ   )r!   r"   r   rs   )r#   r¿   r   r   r   Ú$test_ExponentialAndLogarithmic1D_fit  s    rÐ   c              	   C   s(   d}t jt|d�� d| _W 5 Q R X d S )Nz!0 is not an allowed value for taurA   r   )rC   rD   rE   Útau)r#   rF   r   r   r   Ú&test_ExponentialAndLogarithmic_set_tau  s    rÒ   c                  C   s4   t jddd�} | j}|jdks"t‚|jdks0t‚d S )Nr   iôÿÿÿ)r   Ú	interceptç      Ð?r   )r	   ZLinear1Drs   r   r   rÓ   )r#   rs   r   r   r   Útest_Linear1D_inverse#  s    rÕ   Útrigg      Ð¿rÔ   ri   c                 C   sX   | d ƒ }| d \}}t  ||d¡}t| ||ƒ¡|dd� t|| |¡ƒ|dd� d S )Nr   r\   rÉ   g»½×Ùß|Û=r¡   )r!   r~   r   rs   )rÖ   ZmdlÚlowerÚupperr-   r   r   r   Útest_trig_inverse+  s
    
rÙ   c               	   C   s|   t ddƒ} tjdddddd| d�}tjd	 }tjdddddd|d�}|jj d
¡j|jjks`t	‚|ddƒ|ddƒksxt	‚d S )Nr[   rK   r\   r)   r   r]   ri   r_   r   rR   r`   ra   )
r   r	   ZSersic2Dr!   r7   r5   rb   rc   rd   r   rf   r   r   r   Útest_Sersic2D_theta?  s    

rÚ   )JÚnumpyr!   rC   Znumpy.testingr   r   r   Zastropyr   r¬   Zastropy.coordinatesr   Zastropy.modelingr   r   r	   Z"astropy.utils.compat.optional_depsr
   Zastropy.utils.exceptionsr   r   ZTRFLSQFitterZLMLSQFitterZDogBoxLSQFitterZfittersr   r%   r0   r9   rG   rX   rY   rg   ÚmarkZparametrizern   rv   rx   r|   Zskipifr„   r�   r‘   r’   r”   r—   r™   rš   rœ   rž   r¢   r¥   r“   r˜   r©   r­   r³   rÁ   rÇ   rÌ   rÎ   ZExponential1DZLogarithmic1DrÐ   rÒ   rÕ   ZSine1DZ	ArcSine1DZCosine1DZArcCosine1DZ	Tangent1DZArcTangent1DrÙ   rÚ   r   r   r   r   Ú<module>   s–   ü
	
	



P

úþ
	