U
    e»{j££  ã                	   @   s  d Z ddlmZ ddlZddlZddlmZm	Z	 ddl
m  mZ ddlmZ ddlmZ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mZ dd
lm Z  ddl!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,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ej3ej4ej5ej6gZ7ej8j9e/ dd�ej8 :de7¡dldd„ƒƒZ;dd„ Z<dd„ Z=dd„ Z>dd„ Z?G d d!„ d!ƒZ@G d"d#„ d#ƒZAdmd&d'„ZBej8 Cd(¡ej8 Cd)¡ej8 :d*eDe1 E¡ d+d,„ d-�¡G d.d/„ d/eAƒƒƒƒZFej8 Cd(¡ej8 :d*eDe2 E¡ d0d,„ d-�¡G d1d2„ d2e@ƒƒƒZGd3d4„ ZHd5d6„ ZId7d8„ ZJd9d:„ ZKej8j9e/ dd�d;d<„ ƒZLej8j9e/ dd�d=d>„ ƒZMej8j9e/ dd�d?d@„ ƒZNdAdB„ ZOej8j9e/ dd�dCdD„ ƒZPej8j9e/ dd�dEdF„ ƒZQej8j9e/ dd�dGdH„ ƒZRej8j9e/ dd�dIdJ„ ƒZSej8j9e/ dd�dKdL„ ƒZTej8j9e/ dd�dMdN„ ƒZUej8j9e/ dd�dOdP„ ƒZVej8j9e/ dd�dQdR„ ƒZWG dSdT„ dTeƒZXG dUdV„ dVeXƒZYdWdX„ ZZdYdZ„ Z[d[d\„ Z\ej8j9e/ dd�ej8 Cd]¡ej8 Cd)¡d^d_„ ƒƒƒZ]G d`da„ daeƒZ^dbdc„ Z_ddde„ Z`G dfdg„ dgeƒZaG dhdi„ dieaƒZbdjdk„ ZcdS )nzU
Tests for model evaluation.
Compare the results of some models with other programs.
é    N)Úassert_allcloseÚassert_equal)Úunits)ÚfittingÚmodels)ÚModelBoundingBox)ÚFittableModelÚModelÚ
_ModelMeta)Ú
Gaussian2D)ÚInputParameterErrorÚ	Parameter)ÚPolynomialBase)ÚBrokenPowerLaw1DÚExponentialCutoffPowerLaw1DÚLogParabola1DÚ
PowerLaw1DÚSmoothlyBrokenPowerLaw1D)Úseparability_matrix)Úassert_quantity_allclose)ÚNumpyRNGContextÚ
minversion)Ú	HAS_SCIPYé   )Ú	models_1DÚ	models_2Dúrequires scipy©ÚreasonÚfitteré   c           
      C   sÂ   | ƒ } ddd„}ddd„}t j||d�}t ddd	¡}|ƒ }| |d
d¡ | |d
d¡ tj d¡ ||ƒtj t	|ƒ¡ d }| |||ƒ}	t 
t |	jj|	jjg¡t ||g¡ dk ¡s¾t‚d S )Nr    r   c                 S   s   |t  dt j | |  ¡ S )z 
        Model function
        é   ©ÚnpÚsinÚpi©ÚxÚ	amplitudeÚ	frequency© r*   úa/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/tests/test_models.pyÚ
sine_model2   s    z%test_custom_model.<locals>.sine_modelc                 S   sP   t  dt j | |  ¡}dt j |  | t  dt j | |  ¡ }t  ||f¡S )zv
        Jacobian of model function, e.g. derivative of the function with
        respect to the *parameters*
        r!   )r#   r$   r%   ÚcosZvstack)r'   r(   r)   ÚdaZdfr*   r*   r+   Ú
sine_deriv8   s    *z%test_custom_model.<locals>.sine_deriv)Ú	fit_derivr   é2   g      @ç       @ç      à?gü©ñÒMbP?)r    r   )r    r   )r   Úcustom_modelr#   ÚlinspaceÚevaluater0   ÚrandomÚseedÚrandÚlenÚallÚarrayr(   Úvaluer)   ÚAssertionError)
r   r(   r)   r,   r/   Ú	SineModelr'   Ú	sin_modelÚdataÚmodelr*   r*   r+   Útest_custom_model-   s$    

	ÿüÿrC   c                  C   s<   t jddd„ƒ} | ddd�}|jdks*t‚|jdks8t‚d S )	Nr    r   c                 S   s   |t  dt j | |  ¡ S ©zModel functionr!   r"   r&   r*   r*   r+   r?   V   s    z)test_custom_model_init.<locals>.SineModelr2   r3   )r(   r)   )r    r   )r   r4   r(   r>   r)   ©r?   r@   r*   r*   r+   Útest_custom_model_initU   s
    rF   c                  C   sV   t jddd„ƒ} | ƒ }| jjdks&t‚| jjdks6t‚|jdksDt‚|jdksRt‚d S )Nr    r   c                 S   s   |t  dt j | |  ¡ S rD   r"   r&   r*   r*   r+   r?   b   s    z-test_custom_model_defaults.<locals>.SineModel)r    r   )r   r4   r(   Údefaultr>   r)   rE   r*   r*   r+   Útest_custom_model_defaultsa   s    rH   c                  C   sn   t ƒ } t ddd¡}| ¡ }t | |dƒ| |d| ƒ ¡ ¡ dksFt‚d|_d|_| ||ƒ}|jdksjt‚d S )Ng      ð¿r   gš™™™™™É?r   )é
   r   )r   rI   )rI   rI   )r   r#   ÚarangeÚcopyÚabsÚsumr>   Úshape)Úgr'   ÚyÚresultr*   r*   r+   Útest_inconsistent_input_shapesp   s    *
rR   c                  C   sN  ddd	„} G d
d„ dt  | ¡ƒ}|ƒ }|j}| ¡ \}}}t |¡d \}}}	tjt|d |d d ƒt|d |d d ƒt|d |d d ƒf \}
}}tjt|d | |d | d ƒt|d | |d | d ƒt|d |	 |d |	 d ƒf \}}}||||dd�}||||
dd�}tt |¡t |¡ ƒt |¡d k �sJt	‚dS )z+Test bounding box evaluation for a 3D modelé   rI   é   r    é   r!   r   c
                 S   s@   | | | d || | d  || | d  }
|
dk |	 }|S )Nr!   r   r*   )r'   rP   ÚzÚx0Úy0Úz0ÚaÚbÚcÚampZrsqÚvalr*   r*   r+   Ú	ellipsoid€   s    0z1test_custom_model_bounding_box.<locals>.ellipsoidc                   @   s   e Zd Zedd„ ƒZdS )z3test_custom_model_bounding_box.<locals>.Ellipsoid3Dc                 S   sF   | j | j | j | j f| j| j | j| j f| j| j | j| j ffS ©N)rY   r\   rX   r[   rW   rZ   ©Úselfr*   r*   r+   Úbounding_box†   s    ýz@test_custom_model_bounding_box.<locals>.Ellipsoid3D.bounding_boxN)Ú__name__Ú
__module__Ú__qualname__Úpropertyrc   r*   r*   r*   r+   ÚEllipsoid3D…   s   rh   r   T©Úwith_bounding_boxçH¯¼šò×z>N)rS   rI   rT   r    rU   r!   r   )
r   r4   rc   r#   ÚdiffÚmgridÚslicerL   Znansumr>   )r_   rh   rB   ÚbboxZzlimÚylimÚxlimZdzÚdyÚdxZz1Úy1Úx1Zz2Úy2Úx2ÚarrÚsub_arrr*   r*   r+   Útest_custom_model_bounding_box}   s*    
	þÿ
þÿ
rz   c                   @   sˆ   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Ze	j
je dd�e	j
 de¡dd„ ƒƒZe	j
je dd�e	j
 de¡dd„ ƒƒZdS )ÚFittable2DModelTestera’  
    Test class for all two dimensional parametric models.

    Test values have to be defined in example_models.py. It currently test the
    model with different input types, evaluates the model at different
    positions and assures that it gives the correct values. And tests if the
    model works with non-linear fitters.

    This can be used as a base class for user defined model testing.
    c                 C   sf   d| _ d| _d| _d| _d| _d| _t ddd¡| _t ddd¡| _	tj
d d…d d…f \| _| _d S )	Néd   ç-Cëâ6?çš™™™™™¹?ç333333@çÍÌÌÌÌÌ@r   rI   rT   ©ÚNÚMÚ
eval_errorÚ	fit_errorr'   rP   r#   rJ   ru   rt   rm   rv   rw   ra   r*   r*   r+   Úsetup_class±   s    z!Fittable2DModelTester.setup_classc                 C   s8   t ||ƒ}|| j| jƒ || j| jƒ || j| jƒ dS ©z&Test model with different input types.N)Úcreate_modelr'   rP   ru   rt   rw   rv   ©rb   Úmodel_classÚtest_parametersrB   r*   r*   r+   Útest_input2D¼   s    
z"Fittable2DModelTester.test_input2Dc                 C   sJ   t ||ƒ}|d }|d }|d }t t |||ƒ| ¡| jk ¡sFt‚dS )z*Test model values add certain given pointsÚx_valuesÚy_valuesZz_valuesN)rˆ   r#   r;   rL   r„   r>   )rb   rŠ   r‹   rB   r'   rP   rV   r*   r*   r+   Útest_eval2DÄ   s
    
z!Fittable2DModelTester.test_eval2Dc              	      s†  t ||ƒ}d|_|jdkst‚d|_d}tjt|d�� |j W 5 Q R X d}tjt|d�� d|_W 5 Q R X |`z
|j}W n tk
r�   Y dS X d‰ |\‰‰t ˆd ˆd	 ˆ ¡}t ˆd ˆd	 ˆ ¡}t 	‡ ‡fd
d„t
dddƒD ƒ|‡ ‡fdd„t
d	dƒD ƒf¡}t 	‡ ‡fdd„t
dddƒD ƒ|‡ ‡fdd„t
d	dƒD ƒf¡}	|||ƒ}
|||	dd�}|t |¡  }t |
|k¡�s‚t‚dS )úTest bounding box evaluation)©éûÿÿÿé   r‘   Nú,No bounding box is defined for this model .*©Úmatchú5An interval must be some sort of sequence of length 2r‘   ç{®Gáz„?r   r   c                    s   g | ]}ˆd  |ˆ   ‘qS ©r   r*   ©Ú.0Úidx©Úddxrq   r*   r+   Ú
<listcomp>î   s     z=Fittable2DModelTester.test_bounding_box2D.<locals>.<listcomp>rI   éÿÿÿÿc                    s   g | ]}ˆd  |ˆ   ‘qS ©r   r*   rš   r�   r*   r+   rŸ   ð   s     c                    s   g | ]}ˆd  |ˆ   ‘qS r™   r*   rš   ©rž   rp   r*   r+   rŸ   õ   s     c                    s   g | ]}ˆd  |ˆ   ‘qS r¡   r*   rš   r¢   r*   r+   rŸ   ÷   s     Tri   )rˆ   rc   r>   ÚpytestÚraisesÚNotImplementedErrorÚ
ValueErrorr#   rJ   ÚconcatenateÚrangeÚisnanr;   )rb   rŠ   r‹   rB   ÚMESSAGEro   ru   rt   rw   rv   Úinside_bboxÚoutside_bboxr*   )rž   rq   rp   r+   Útest_bounding_box2DÍ   sF    

ýÿýÿ
z)Fittable2DModelTester.test_bounding_box2Dc                 C   sò   |  dd¡sd S t||ƒ}|j}|\}}t |¡d \}}tjt|d |d d ƒt|d |d d ƒf \}	}
tjt|d | |d | d ƒt|d | |d | d ƒf \}}|||ƒ}||
|	ƒ}t| ¡ | ¡  ƒ| ¡ d k sît	‚d S )NÚ	bbox_peakFr!   r   r   rk   )
Úpoprˆ   rc   r#   rl   rm   rn   rL   rM   r>   )rb   rŠ   r‹   rB   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   r*   r*   r+   Útest_bounding_box2D_peak  s    
6:ÿ

z.Fittable2DModelTester.test_bounding_box2D_peakr   r   r   c                    sv  |ƒ }|d }|d }|d ‰t ||ƒ}tˆtƒrF‡fdd„|jD ƒ‰d|krˆ|d r¸t |d |d | j¡}t |d |d | j¡}n0t |d |d | j¡}t |d |d | j¡}t ||¡\}	}
tj	 
d¡ tj	 | j| j¡d	 }||	|
ƒd
ˆd  |  }|||	|
|ƒ‰ ‡ fdd„ˆ jD ƒ}dd„ |D ƒ}t dd„ tˆ|ƒD ƒ¡}t dd„ |D ƒ¡}t||| jd� dS )z3Test if the parametric model works with the fitter.Úx_limÚy_limÚ
parametersc                    s   g | ]}ˆ | ‘qS r*   r*   ©r›   Úname©r³   r*   r+   rŸ   "  s     z7Fittable2DModelTester.test_fitter2D.<locals>.<listcomp>Úlog_fitr   r   r3   r~   c                    s   g | ]}t ˆ |ƒ‘qS r*   ©Úgetattrr´   ©Ú	new_modelr*   r+   rŸ   3  s     c                 S   s   g | ]
}|j ‘qS r*   ©Úfixed©r›   Úparamr*   r*   r+   rŸ   4  s     c                 S   s   g | ]\}}|s|‘qS r*   r*   ©r›   r^   r½   r*   r*   r+   rŸ   5  s      c                 S   s   g | ]}|j s|j‘qS r*   ©r½   r=   r¾   r*   r*   r+   rŸ   6  s      ©ZatolN)rˆ   Ú
isinstanceÚdictÚparam_namesr#   Úlogspacer‚   r5   Úmeshgridr7   r8   r9   r<   Úzipr   r…   )rb   rŠ   r‹   r   r±   r²   rB   r'   rP   ÚxvÚyvÚnoiserA   Úparamsr½   ÚexpectedÚfittedr*   ©r»   r³   r+   Útest_fitter2D  s.    

z#Fittable2DModelTester.test_fitter2Dc                 C   sL  |ƒ }|d }|d }|j dks*t|tƒr.dS d|kr¨|d r¦t |d |d | j¡}t |d |d | j¡}t |d |d | jd ¡}t |d |d | jd ¡}	nht |d |d | j¡}t |d |d | j¡}t |d |d | jd ¡}t |d |d | jd ¡}	t ||¡\}
}t ||	¡\}}z4t	||dd	d
�}t	||dd	d
�}t	||dd	d
�}W n@ t
k
�r¤   t	||dd�}t	||dd�}t	||dd�}Y nX tj d¡}|d d }d| | | j| jf¡d  }||
|ƒ| }|}|||
||ƒ}|}|||
||dd�}t|||ƒ|||ƒdd� |tk�rHt|j|jdd� dS )zp
        Test the derivative of a model by fitting with an estimated and
        analytical derivative.
        r±   r²   Nr·   r   r   rI   FZderiv_initial)Úuse_constraintsÚparameter_key©rÑ   r³   r~   r3   T©Zestimate_jacobianr˜   )Úrtol)r0   Ú
issubclassr   r#   rÆ   r‚   rƒ   r5   rÇ   rˆ   ÚKeyErrorr7   Zdefault_rngr   r   r³   )rb   rŠ   r‹   r   r±   r²   r'   rP   Zx_testZy_testrÉ   rÊ   Zxv_testZyv_testÚmodel_with_derivÚmodel_no_derivrB   Zrsnr(   ÚnrA   Úfitter_with_derivÚnew_model_with_derivÚfitter_no_derivÚnew_model_no_derivr*   r*   r+   Útest_deriv_2D9  s’    üüü
  ÿ  ÿ    ÿý
  ÿz#Fittable2DModelTester.test_deriv_2DN)rd   re   rf   Ú__doc__r†   rŒ   r�   r­   r°   r£   ÚmarkÚskipifr   ÚparametrizeÚfittersrÐ   rß   r*   r*   r*   r+   r{   ¥   s   	4"r{   c                   @   s®   e Zd ZdZeeeeegZ	dd„ Z
ej d¡dd„ ƒZdd„ Zd	d
„ Zdd„ Zejje dd�ej de¡dd„ ƒƒZejje dd�ej d¡ej de¡dd„ ƒƒƒZdS )ÚFittable1DModelTestera’  
    Test class for all one dimensional parametric models.

    Test values have to be defined in example_models.py. It currently test the
    model with different input types, evaluates the model at different
    positions and assures that it gives the correct values. And tests if the
    model works with non-linear fitters.

    This can be used as a base class for user defined model testing.
    c                 C   sf   d| _ d| _d| _d| _d| _d| _t ddd¡| _t ddd¡| _	tj
d d…d d	…f \| _| _d S )
Nr|   r}   g)\�Âõ(¼?r   r€   r   rI   r~   rT   r�   ra   r*   r*   r+   r†   Ÿ  s    z!Fittable1DModelTester.setup_classúignore:.*:RuntimeWarningc                 C   s,   t ||ƒ}|| jƒ || jƒ || jƒ dS r‡   )rˆ   r'   ru   rw   r‰   r*   r*   r+   Útest_input1Dª  s    


z"Fittable1DModelTester.test_input1Dc                 C   s2   t ||ƒ}|d }|d }t||ƒ|| jd� dS )z;
        Test model values at certain given points
        r�   rŽ   rÂ   N)rˆ   r   r„   )rb   rŠ   r‹   rB   r'   rP   r*   r*   r+   Útest_eval1D³  s    
z!Fittable1DModelTester.test_eval1Dc           	   	      s  t ||ƒ}d|_d|_d}tjt|d�� |j W 5 Q R X |`d}tjt|d�� d|_W 5 Q R X z|j ¡ ‰ W n tk
r†   Y dS X d‰t ˆ d ˆ d	 ˆ¡}t ‡ ‡fd
d„t	dddƒD ƒ|‡ ‡fdd„t	d	dƒD ƒf¡}||ƒ}||dd�}|t 
|¡  }t ||k¡�st‚dS )r�   r‘   Nr”   r•   r—   r“   r˜   r   r   c                    s   g | ]}ˆ d  |ˆ  ‘qS r™   r*   rš   ©ro   rž   r*   r+   rŸ   Ù  s     z=Fittable1DModelTester.test_bounding_box1D.<locals>.<listcomp>rI   r    c                    s   g | ]}ˆ d  |ˆ  ‘qS r¡   r*   rš   ré   r*   r+   rŸ   Û  s     Tri   )rˆ   rc   r£   r¤   r¥   r¦   r#   rJ   r§   r¨   r©   r;   r>   )	rb   rŠ   r‹   rB   rª   ru   rw   r«   r¬   r*   ré   r+   Útest_bounding_box1D¼  s4    
ýÿz)Fittable1DModelTester.test_bounding_box1Dc                 C   sæ   |  dd¡sd S t||ƒ}|j}t|tjƒs8t|tjƒrBd}d}nd}d}t|tƒr\| ¡ }t 	|¡d }tj
t|d |d d |ƒ }tj
t|d | |d | d |ƒ }	||	ƒ}
||ƒ}t|
 ¡ | ¡  ƒ|
 ¡ | k sât‚d S )	Nr®   Fr˜   r~   rk   r   r!   r   )r¯   rˆ   rc   rÃ   r   Z	Lorentz1DZDrude1Dr   r#   rl   rm   rn   rL   rM   r>   )rb   rŠ   r‹   rB   ro   rÕ   rž   rs   ru   rw   rx   ry   r*   r*   r+   Útest_bounding_box1D_peakå  s"    

&z.Fittable1DModelTester.test_bounding_box1D_peakr   r   r   c                    sP  t ddƒ }|tjkr0|tjkr0|r0tjdd� |ƒ }|d }|d ‰t||ƒ}tˆt	ƒrn‡fdd„|j
D ƒ‰d	|kr˜|d	 r°t |d
 |d | j¡}nt |d
 |d | j¡}tj d
¡ d}d|tj t|ƒ¡  ||ƒ }	||||	ƒ‰ ‡ fdd„ˆ j
D ƒ}
dd„ |
D ƒ}t dd„ tˆ|ƒD ƒ¡}t dd„ |
D ƒ¡}t||| jd� dS )zE
        Test if the parametric model works with the fitter.
        Zscipyz1.6z4TRF fitter fails for BrokenPowerLaw1D in scipy < 1.6r   r±   r³   c                    s   g | ]}ˆ | ‘qS r*   r*   r´   r¶   r*   r+   rŸ     s     z7Fittable1DModelTester.test_fitter1D.<locals>.<listcomp>r·   r   r   r˜   c                    s   g | ]}t ˆ |ƒ‘qS r*   r¸   r´   rº   r*   r+   rŸ   $  s     c                 S   s   g | ]
}|j ‘qS r*   r¼   r¾   r*   r*   r+   rŸ   %  s     c                 S   s   g | ]\}}|s|‘qS r*   r*   rÀ   r*   r*   r+   rŸ   &  s      c                 S   s   g | ]}|j s|j‘qS r*   rÁ   r¾   r*   r*   r+   rŸ   '  s      rÂ   N)r   r   r   r   ÚTRFLSQFitterr£   Zxfailrˆ   rÃ   rÄ   rÅ   r#   rÆ   r‚   r5   r7   r8   Zrandnr:   r<   rÈ   r   r…   )rb   rŠ   r‹   r   ZSCIPY_LT_1_6r±   rB   r'   Zrelative_noise_amplituderA   rÌ   r½   rÍ   rÎ   r*   rÏ   r+   Útest_fitter1Dÿ  s6    ÿþý

 z#Fittable1DModelTester.test_fitter1Dc              f   C   sÆ  |ƒ }|| j krdS |d }|jdks0t|tƒr4dS d|kr^|d rvt |d |d | j¡}nt |d |d | j¡}|d }t||dd�}t||dd�}t 	d	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdlgd¡}	dm|d  |	dn  }
||ƒ|
 }|}||||ƒ}|}||||dodp�}t
|j|jdqdr� dS )szk
        Test the derivative of a model by comparing results with an estimated
        derivative.
        Nr±   r·   r   r   r³   FrÓ   ç8¿‚°*Íã?çx�Ì­”îâ?çWq‘pì?çIª¥oˆì?çd
”ÉHÝ?çÃ•7°êæè?ç,†£’Ñ?ç:\i!àï?çÊ,)uHá?ç
üú„`3á?çà=´Mù©Ù?ç}°Î)¯’æ?çÚwŠ�îÙ?ç”X Sfî?ç=éLóñ}Ÿ?çSØûCiÁ?çþjÿ=µ?ç7o{ýÛ?ç¬!íVÎ?çäx²Yýêç?çšd?æ^Ûä?çóER=_æ?ç2LaYÅ?çSVºX¤ì?ç(ã­-¡Ü?çðJÔÍ„â?çzJsÐÊÂà?çCà«Ê|ä?çL÷|ÅQÖ?çh²=‚4ÆÐ?ç.
âì1³?çx¥ÄöÆ?çÇóP�ê?ç*œ•gšï?çØkö¬þ¼?çÙc}^Lnä?çg×ZëÍ`ç?ç³Nè7DCì?çˆý–çÞà?çäg�«Få?çg:¿ç?ç¯›BYî?çðÑ”|pæ?ç<Ú›ŒèæÒ?ç]2qí\è?ç„µ” }Ôè?ç®£ä´«×?çÑ²jçf¥ì?çø˜¼¿I,Õ?çx¥¸ìŽë?çcùëüx›è?çEË.Ö?¡ã?çãò5ÏÜ?çþI¶™Žií?çµE¡~z è?çýËb Wà?çéÜöÚ¿¦?çÿžqDkcâ?ç+×¡» Ô?çÝÜõÃaÚ?ç<àW8‹�Ë?ç2aMÈ{“ ?ç@(÷T¥?çžßÅ5eç?ç×R¼¡Ûç?çÎ‰=´�µä?çæh#ùÒè?ç°QŒø«ä?çnné$�Å?çqÀSmÜß?ç{L¹ë:á?ç6/Ú%¢æï?çTÉ¾3óGÎ?çÚ¦ü”ø¥?çÒ]LÏÂÝ?çýcçŽzßÖ?ç®zeƒqÍ?çGÝÖ/;á?çÇÕÈ®´ìæ?ç�ã çÃ1ê?çåJ¹Ò�­ç?çö��YY´?ç!f£1b8è?çô}£ã‹òÀ?çR'Á—™ß?ç*Š®QfÊ?çcŠIêÊˆ—?çê]›Î\á?çÔR/®§Ìå?ç™}�Í÷Ö?çÞêÖ¾Â:×?ç‰©_¯ÑŽå?çCŒ|8âÒ?çÊ¡êü€Lå?çœÂkþ÷í?çÖ‹Fãõ…×?çzôLP?_í?çÑÚ|–Kè?ç´O®Æ%ß?çþQŠakÝ?r~   r3   TrÔ   g333333Ã?rÂ   )Ú_non_finite_modelsr0   rÖ   r   r#   rÆ   r‚   r5   rˆ   r<   r   r³   )rb   rŠ   r‹   r   r±   r'   r³   rØ   rÙ   Úrsn_rand_1234567890rÚ   rA   rÛ   rÜ   rÝ   rÞ   r*   r*   r+   Útest_deriv_1D*  s   
  ÿ  ÿ                                                                                ìÿ   ÿ  ÿz#Fittable1DModelTester.test_deriv_1DN)rd   re   rf   rà   r   r   r   r   r   rR  r†   r£   rá   Úfilterwarningsrç   rè   rê   rë   râ   r   rã   rä   rí   rT  r*   r*   r*   r+   rå   ‰  s(   û

	))
rå   Tr³   c                 C   sb   i }t | tƒr| f || ŽS t | tƒr^d|kr<ts<t d¡ |rPd|krP|d }| || |ŽS dS )zCreate instance of model class.Zrequires_scipyzSciPy not foundÚconstraintsN)rÖ   r   r   r   r£   Úskip)rŠ   r‹   rÑ   rÒ   rV  r*   r*   r+   rˆ   v  s    


rˆ   z&ignore:Model is linear in parameters.*z$ignore:The fit may be unsuccessful.*)rŠ   r‹   c                 C   s   t | d ƒS ©Nr   ©Ústr©r'   r*   r*   r+   Ú<lambda>‹  ó    r\  )Úkeyc                   @   s   e Zd ZdS )ÚTestFittable1DModelsN©rd   re   rf   r*   r*   r*   r+   r_  ‡  s   r_  c                 C   s   t | d ƒS rX  rY  r[  r*   r*   r+   r\  ”  r]  c                   @   s   e Zd ZdS )ÚTestFittable2DModelsNr`  r*   r*   r*   r+   ra  ‘  s   ra  c                  C   sz   t  d¡} | dƒdkst‚t| ddgƒddgƒ t jddgdd�} t| dƒddgƒ t| ddgdd	�ddgdd
ggƒ d S )Né*   r   r   r!   é+   é,   ©Zn_modelsF©Zmodel_set_axisé-   )r   ÚShiftr>   r   ©Úmr*   r*   r+   Útest_ShiftModelš  s    
rk  c                  C   sz   t  d¡} | dƒdkst‚t| ddgƒddgƒ t jddgdd�} t| dƒddgƒ t| ddgdd	�ddgdd
ggƒ d S )Nrb  r   r   r!   éT   rc  re  Frf  éV   )r   ÚScaler>   r   ri  r*   r*   r+   Útest_ScaleModel¦  s    
ro  c                  C   s@   t jddddd�} t ddd¡}| |ƒ}|d | ¡ ks<t‚d	S )
z‰
    Currently just tests that the model peaks at its origin.
    Regression test for https://github.com/astropy/astropy/issues/3942
    r“   rI   r3   çÍÌÌÌÌÌì?©Zx_0Úamplitude_LÚfwhm_LÚfwhm_Gr   r˜   iô  N)r   ÚVoigt1Dr#   rJ   Úmaxr>   )rj  r'   rP   r*   r*   r+   Útest_voigt_model²  s    rw  c                  C   s"   t  ddd¡} t| ƒdkst‚d S )Nç      ø?ç      @ç      @z1<Gaussian1D(amplitude=1.5, mean=2.5, stddev=3.5)>)r   Ú
Gaussian1DÚreprr>   ri  r*   r*   r+   Útest_model_instance_repr¾  s    r}  c               	   C   s¢  t  dd¡} dddddg}t d¡}|| |d	�}d
ddddg}dddddg}t||ƒ|ƒ ||d�}t||ƒ|ƒ d
dddddg}d}tjt|d�� ||ƒ W 5 Q R X ||ddd�}t||ƒddddddgƒ |tj	 }|tj
 }|| tj	 |tj
 d	�}t||ƒ|ƒ t|| tj	¡ƒ|ƒ |jdtj	 dtj	 fk�s@t‚|dddgdddgtj
 ddtjtjtj tj   d �}t|t  d¡ƒd!dddd!gtj
 ƒ dS )"z
    Test Tabular1D model.
    r   r“   ç      ð?rI   r!   rg  éýÿÿÿr   ©ÚpointsÚlookup_tableç        çffffffæ?çffffffö?çÍÌÌÌÌÌ @ç333333@g333333@g333333@g333333@gÍÌÌÌÌÌü?©r‚  gffffff@ú7One of the requested xi is out of bounds in dimension 0r•   FN)r‚  Úbounds_errorÚ
fill_valueg333333Àr    rU   é   é   g\ºwéÄ9©rŠ  r‹  r|   )r#   rJ   r   Útabular_modelr   r£   r¤   r¦   ÚuÚnmÚnJyr   Útorc   r>   ÚWrj  ZHz)r�  ÚvaluesÚLookupTablerB   ÚxnewZans1Zxextraprª   r*   r*   r+   Útest_tabular_interp_1dÃ  s8    



 ür˜  c                  C   sä  t  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¡}||f}t  ddddd g¡}t d!¡}||| ƒ}|||ƒ}t  dd"d#d$d%g¡}t||d&d'� t  d(¡ d)¡}t jd d*…d d+…f \}}	tj|d,�}
|
||	ƒ}t||ƒ d-}t	j
t|d.�� |d!d/�}W 5 Q R X d0}t	j
t|d.��" |d1d2gd1d3gd*d+gfd4�}W 5 Q R X d5}t	j
t|d.�� |d6d!d*gd,�}W 5 Q R X d5}t	j
t|d.��  |d6d!gd*d+gfdd7gƒ}W 5 Q R X d8}t	j
t|d.��. |d6d!gtj d*d+gfdd7gd9d:ggƒ}W 5 Q R X d;}t	j
t|d.�� ||| d<d6tj d=�}W 5 Q R X |d tj }||f}|tj }||| tj ƒ}|tj }t|||ƒ|d&tj d'� | tj¡}t|||ƒ|d&tj d'� dtj d+tj f}||f}|j|k�sàt‚d S )>Ng¢—r: §¿g%YÉ¿}º™¿gÓ3{¨†`y¿ga©.àe†�?g,Ÿåypwž?g~ˆO2 §¿g|ìb�L ¿g+º»ï”å†¿gí¤•­»šˆ?gì€�Ñ¦�™?g´8¥´åù«¿gRrwkÓ·œ¿g&2µ��©ƒ¿gIšû+;‡?g¦ü9?¤c—?g`ü¸&rû¨¿gâ·×8Qš¿g¢ôž-”
r¿gÂ©jÝa’?g”#ðÉ»•?gØïªƒ“Ÿ¢¿g{ŸªB±�¿g>jŸÐãÞY¿gÕ—Èä�?gü­ðdý“?r   r“   rƒ  r„  r…  r†  r‡  r!   g£„ìþ©¡¿gÝÆn¸ò–¿gBæoçg�|¿g>%çÄÚ“?rk   rÂ   é   )rU   r    rU   r    rˆ  zOnly n_models=1 is supportedr•   re  zMust provide a lookup tableg333333ó?çffffff@r€   )r�  z1lookup_table should be an array with 2 dimensionsr   é   z"points must all have the same unité   rT   z/fill value is in Jy but expected to be unitlessFrŽ  )r#   r<   rJ   r   r�  r   Úreshaperm   Ú	Tabular2Dr£   r¤   r¥   r¦   r�  rj  ZJyr‘  r’  r   r“  rc   r>   )Útabler�  r—  r–  rB   ZznewrQ   rZ   rP   r'   ÚtÚrrª   ro   r*   r*   r+   Útest_tabular_interp_2dí  sd    ûÿ





&$2 

r¢  c               	   C   sˆ   t  d¡ d¡} t jd d…d d…d d…f \}}}t d¡}|| d�}||||ƒ}t| |ƒ d}tjt	|d�� t d	¡ W 5 Q R X d S )
Né   )r!   rU   r    r!   rU   r    rˆ  z-Lookup table must have at least one dimensionr•   r   )
r#   rJ   r�  rm   r   r�  r   r£   r¤   r¦   )rZ   r'   rP   rV   Útabr   rQ   rª   r*   r*   r+   Útest_tabular_nd+  s    "


r¥  c               	   C   sÎ  t  d¡t  d¡@ } t  d¡| B }tdƒ� tj d¡|_W 5 Q R X d|_tj	dd…dd…f \}}|||ƒ\}}|||dd	�\}}t 
|¡  ¡ }t|| || ƒ t|| || ƒ |||dd
d�\}}|d
k ¡ }t|| || ƒ t|| || ƒ t jdddd�} d| _| dƒ| ddd	�k�s,t‚t  d¡t  d¡@ t  d¡@ }	d|	_t|	ddgddgddgdd	�tjdgtjdgtjdggƒ t  d¡t  d¡@ t  d¡@ }
d|
_t|
ddddd	�dddgƒ dS )zM
    Test the option to evaluate a model respecting
    its bunding_box.
    r!   )r   r   r   r   i‡Ö r™  ))rU   é	   )r   rT   NrI   Tri   iè  )rj   r‹  r   rš  )Zc0Úc1)r   r“   r    ))g333333@gš™™™™™@)r›  é   )r    rI   rœ  rU   r“   é   é   r    )r   ZPolynomial2DÚMappingr   r#   r7   r9   r³   rc   rm   r©   Znonzeror   ZPolynomial1Dr>   rh  rn  Únan)Úprj  r'   rP   rZ   r[   ZawÚbwÚindÚt3Ztrans3r*   r*   r+   Útest_with_bounding_box9  s6    
þr±  c                  C   s\   t  d¡} t  dddddg¡}t | |¡}|ddd	�}|dksBt‚|j|dd	�d
ksXt‚d S )Nr“   rx  ç333333@r€   rœ  é    r   Tri   r~  )r#   rJ   r<   r   Ú	Tabular1Dr>   Úinverse)r�  r•  r   rQ   r*   r*   r+   Útest_tabular_with_bounding_boxa  s    
r¶  c                  C   sp   t  d¡tj } t  d¡tj }t | |¡}|dtj dd�}|dtj ksPt‚|j|dd�dtj kslt‚d S )Nr“   r   Tri   r~  )	r#   rJ   r�  ZpixZAAr   r´  r>   rµ  )r�  Últr   rQ   r*   r*   r+   Ú$test_tabular_bounding_box_with_unitsl  s    r¸  c            	   	   C   s¸  t  d¡} t  dddddg¡}t | |¡}| d¡}t|t  d¡ƒ t | |d	d	d
… ¡}t|jjd |jd	d	d
… ƒ | d¡}t|t  d¡ƒ t  d¡} t  dddddg¡}t | |¡}t	j
tdd�� | d¡ W 5 Q R X t  d¡ dd¡}t  dd¡} | | f} tj| |d�}t	j
tdd�� | d¡ W 5 Q R X t  d¡} t  dddddg¡}t | |¡}d}t	j
t|d�� | d¡ W 5 Q R X tj| |dd	d�}| d¡}t||ƒdƒ d	S )z*Test that the Tabular1D inverse is definedr“   rx  r²  r€   rœ  r³  )r²  r€   )r~  r2   Nr    r   )rœ  r€   é   Ú r•   )r²  g      @r€  )rU   rU   r‰  r|   FrŽ  )r#   rJ   r<   r   r´  rµ  r   r�  r‚  r£   r¤   r¥   r�  rž  r¦   )	r�  r•  r   rQ   Út2Zresult2rŸ  r°  rª   r*   r*   r+   Útest_tabular1d_inversew  s:    





r¼  c               	   C   sR   t  d¡} t jdd…dd…f d }d}tjt|d�� t | |¡ W 5 Q R X d S )Nr“   r   z,Expected grid points in 2 directions, got 5.r•   )r#   rJ   rm   r£   r¤   r¦   r   rž  )r�  r·  rª   r*   r*   r+   Ú&test_tabular_grid_shape_mismatch_error¢  s
    
r½  c                  C   sx   t  d¡} t  d¡}t | |¡}t|ƒdks0t‚t  d¡ dd¡}t  dd¡} | | f} tj| |d�}t|ƒdkstt‚d S )Nr“   zG<Tabular1D(points=(array([0, 1, 2, 3, 4]),), lookup_table=[0 1 2 3 4])>r¹  r   r€  z­<Tabular2D(points=(array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4])), lookup_table=[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]])>)r#   rJ   r   r´  r|  r>   r�  rž  ©r�  r·  r   rŸ  r*   r*   r+   Útest_tabular_repr«  s    

ÿÿÿÿr¿  c                  C   sx   t  d¡} t  d¡}t | |¡}t|ƒdks0t‚t  d¡ dd¡}t  dd¡} | | f} tj| |d�}t|ƒdkstt‚d S )Nr“   z®Model: Tabular1D
N_inputs: 1
N_outputs: 1
Parameters: 
  points: (array([0, 1, 2, 3, 4]),)
  lookup_table: [0 1 2 3 4]
  method: linear
  fill_value: nan
  bounds_error: Truer¹  r   r€  a  Model: Tabular2D
N_inputs: 2
N_outputs: 1
Parameters: 
  points: (array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4]))
  lookup_table: [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
  method: linear
  fill_value: nan
  bounds_error: True)r#   rJ   r   r´  rZ  r>   r�  rž  r¾  r*   r*   r+   Útest_tabular_strÄ  s    


ÿ
ÿrÀ  c               	   C   s
  t  d¡} t  d¡d d d… }t | |¡}| dddg¡dddgk ¡ sLt‚| t  dddg¡tj	 ¡dddgk ¡ szt‚d|_
t  dddg¡t  dddg¡g}tjjtdd|d��L}| dddg¡}t|ƒD ]\}}t  || |k¡sÎt‚qÎ|jdksüt‚W 5 Q R X d S )	Nr“   r    r   r!   rU   ZinterpnT)ZautospecZreturn_value)r#   rJ   r   r´  r6   r;   r>   r<   r�  rj  Z	n_outputsÚmkÚpatchÚobjectÚtabular_modelsÚ	enumerateZ
call_count)r�  r·  r   r=   Z	mkInterpnÚoutputsÚindexÚoutputr*   r*   r+   Útest_tabular_evaluateê  s$    
".    ÿrÉ  c                  C   s$   t jt jfD ]} | jdkst‚qdS )za
    The module name must be set manually because
    these classes are created dynamically.
    zastropy.modeling.tabularN)r   r´  rž  re   r>   ©rB   r*   r*   r+   Útest_tabular_module_nameý  s    rË  c                       sP   e Zd Zedd�Zedd�Zedd�Zejejejf‡ fdd„	Zdd„ Z	‡  Z
S )	Ú
classmodelr   ©rG   r   r!   c                    s   t ƒ  |||¡ d S r`   ©ÚsuperÚ__init__)rb   Úfr'   rP   ©Ú	__class__r*   r+   rÐ    s    zclassmodel.__init__c                 C   s   d S r`   r*   ra   r*   r*   r+   r6     s    zclassmodel.evaluate)rd   re   rf   r   rÑ  r'   rP   rG   rÐ  r6   Ú__classcell__r*   r*   rÒ  r+   rÌ    s
   


rÌ  c                       s`   e Zd Zeddd�Zedd�Zedd�Zedd�Zejejejejf‡ fdd	„	Z	d
d„ Z
‡  ZS )ÚsubclassmodelrU   T)rG   r½   rI   rÍ  r™  r“   c                    s   t ƒ  |||¡ d S r`   rÎ  )rb   rÑ  r'   rP   ÚhrÒ  r*   r+   rÐ    s    zsubclassmodel.__init__c                 C   s   d S r`   r*   ra   r*   r*   r+   r6     s    zsubclassmodel.evaluate)rd   re   rf   r   rÑ  r'   rP   rÖ  rG   rÐ  r6   rÔ  r*   r*   rÒ  r+   rÕ    s   


rÕ  c                  C   sD   t ƒ } | jdkst‚| jdks"t‚| jdks0t‚| jjdks@t‚d S )N)rÑ  r'   rP   rÖ  r“   rU   T)rÕ  rÅ   r>   rÖ  rÑ  r½   )r[   r*   r*   r+   Útest_parameter_inheritance   s
    r×  c                  C   st   t  ddd¡} | jjdkst‚| jjdks.t‚t jdddd	d
�} | jjdksPt‚| jjdks`t‚| j	jdkspt‚d S )Nrx  ry  rz  ú&Amplitude (peak value) of the GaussianúPosition of peak (Gaussian)r“   rI   r3   rp  rq  zThe Lorentzian amplitudez)The Lorentzian full width at half maximumz'The Gaussian full width at half maximum)
r   r{  r(   Ú_descriptionr>   Úmeanru  rr  rs  rt  rÊ  r*   r*   r+   Útest_parameter_description(  s    rÜ  c               	   C   sT   d} t jt| d�� tdd� W 5 Q R X d} t jt| d�� tdd� W 5 Q R X d S )Nzamplitude parameter must be > 0r•   r    )r(   z delta parameter must be >= 0.001r   )Údelta)r£   r¤   r   r   )rª   r*   r*   r+   Ú(test_SmoothlyBrokenPowerLaw1D_validators3  s    rÞ  ræ   c               f   C   s�  ddg} t  | d | d d¡}dddddgd	d
d
dœidœ}tt|dd�}tt|dd�}t  dddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrgd¡}ds|dt d  |d  }||ƒ| }t ¡ }||||ƒ}	t ¡ }
|
|||d
du�}t|	j|jddv� d S )wNr˜   r|   r   r   rI   éþÿÿÿr!   r3   r½   T)Zx_breakrÝ  )r³   rV  FrÓ   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
  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'  r(  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  r~   r³   rÔ   rÂ   )	r#   rÆ   rˆ   r   r<   r   ÚLevMarLSQFitterr   r³   )r±   r'   r³   rØ   rÙ   rS  rÚ   rA   rÛ   rÜ   rÝ   rÞ   r*   r*   r+   Ú'test_SmoothlyBrokenPowerLaw1D_fit_deriv=  s   þ  ÿ  ÿ                                                                                ìÿ   ÿ  ÿrá  c                       sN   e Zd Ze‡ fdd„ƒZe ddd¡Zejj	dks6t
‚ejj	dksFt
‚‡  ZS )Ú_ExtendedModelMetac                    s    t ƒ j||f|Ž}| |¡ |S r`   )rÏ  Ú__prepare__Úupdate)Úmclsrµ   ÚbasesÚkwdsÚ	namespacerÒ  r*   r+   rã  }  s    
z_ExtendedModelMeta.__prepare__rx  ry  rz  rØ  rÙ  )rd   re   rf   Úclassmethodrã  r   r{  rB   r(   rÚ  r>   rÛ  rÔ  r*   r*   rÒ  r+   râ  |  s
   râ  c                  C   s   G dd„ dt dd�} dS )zTest can pass kwargs to Modelsc                   @   s   e Zd Zdd„ ZdS )z)test_metaclass_kwargs.<locals>.ClassModelc                 S   s   d S r`   r*   ra   r*   r*   r+   r6   Ž  s    z2test_metaclass_kwargs.<locals>.ClassModel.evaluateN©rd   re   rf   r6   r*   r*   r*   r+   Ú
ClassModel�  s   rë  Úflag)rì  N)r   ©rë  r*   r*   r+   Útest_metaclass_kwargsŠ  s    rî  c                  C   s(   G dd„ dt tdd�} | jdks$t‚dS )z)Test can pass kwargs to Model subclasses.c                   @   s   e Zd Zdd„ ZdS )z,test_submetaclass_kwargs.<locals>.ClassModelc                 S   s   d S r`   r*   ra   r*   r*   r+   r6   ˜  s    z5test_submetaclass_kwargs.<locals>.ClassModel.evaluateNrê  r*   r*   r*   r+   rë  —  s   rë  rì  )Ú	metaclassrì  N)r   râ  rì  r>   rí  r*   r*   r+   Útest_submetaclass_kwargs”  s    rð  c                   @   s(   e Zd Zeƒ Zeƒ ZdZedd„ ƒZdS )ÚModelDefaultFc                 C   s   ||  | S r`   r*   )r'   ÚslopeÚ	interceptr*   r*   r+   r6   £  s    zModelDefault.evaluateN)	rd   re   rf   r   rò  ró  Z
_separableÚstaticmethodr6   r*   r*   r*   r+   rñ  ž  s
   rñ  c                   @   s   e Zd Zdd„ ZdS )ÚModelCustomc                 C   s   t  dgg¡S rX  )r#   r<   ra   r*   r*   r+   Ú_calculate_separability_matrix©  s    z*ModelCustom._calculate_separability_matrixN)rd   re   rf   rö  r*   r*   r*   r+   rõ  ¨  s   rõ  c                  C   s<   t tddd�ƒ} |  ¡ st‚t tddd�ƒ}| ¡ r8t‚d S )Nr   r!   )rò  ró  )r   rñ  r;   r>   rõ  Úany)ÚoriginalZcustomr*   r*   r+   Útest_custom_separability_matrix­  s    rù  )r    r   )Tr³   )drà   Zunittest.mockZmockrÁ  Únumpyr#   r£   Znumpy.testingr   r   Zastropy.modeling.tabularZmodelingZtabularrÄ  Zastropyr   r�  Zastropy.modelingr   r   Zastropy.modeling.bounding_boxr   Zastropy.modeling.corer   r	   r
   Zastropy.modeling.modelsr   Zastropy.modeling.parametersr   r   Zastropy.modeling.polynomialr   Zastropy.modeling.powerlawsr   r   r   r   r   Zastropy.modeling.separabler   Zastropy.tests.helperr   Zastropy.utilsr   r   Z"astropy.utils.compat.optional_depsr   Zexample_modelsr   r   rà  rì   ZLMLSQFitterZDogBoxLSQFitterrä   rá   râ   rã   rC   rF   rH   rR   rz   r{   rå   rˆ   rU  ÚsortedÚitemsr_  ra  rk  ro  rw  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+   Ú<module>   s¸   ü&( e o   ÿ


þ
þ
)
=
(




*


%

	


<


