U
    e»{j«K  ã                   @   sÖ  d Z ddlZddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZ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 e d	¡Ze eed
 g¡Ze d¡ d¡ZdZG dd„ deƒZ ej! "deeeeg¡dd„ ƒZ#ej! "deeeeg¡dd„ ƒZ$ej! "deeeeg¡dd„ ƒZ%ej! "deeeg¡dd„ ƒZ&dd„ Z'dd„ Z(dd„ Z)ej! "deeeeg¡dd „ ƒZ*d!d"„ Z+d#d$„ Z,d%d&„ Z-d'd(„ Z.d)d*„ Z/d+d,„ Z0d-d.„ Z1d/d0„ Z2d1d2„ Z3d3d4„ Z4d5d6„ Z5G d7d8„ d8ƒZ6dS )9zO
This module tests model set evaluation and fitting for some common use cases.
é    N)Úassert_allclose)ÚModel)ÚLinearLSQFitter)
ÚChebyshev1DÚChebyshev2DÚ	Hermite1DÚ	Hermite2DÚ
Legendre1DÚ
Legendre2DÚLinear1DÚPlanar2DÚPolynomial1DÚPolynomial2D)Ú	Parameter)ÚNumpyRNGContexté   é
   é   )é   r   é   i7  c                       s@   e Zd ZdZdZdZeƒ Zeƒ Z‡ fdd„Z	e
dd„ ƒZ‡  ZS )Ú	TParModelz2
    A toy model to test parameters machinery
    é   )Úxc                    s   t ƒ jf ||dœ|—Ž d S )N)ÚcoeffÚe)ÚsuperÚ__init__)Úselfr   r   Úkwargs©Ú	__class__© úe/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/tests/test_model_sets.pyr   .   s    zTParModel.__init__c                 C   s   | | | S )Nr!   )r   r   r   r!   r!   r"   Úevaluate1   s    zTParModel.evaluate)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Zn_inputsÚoutputsr   r   r   r   Ústaticmethodr#   Ú__classcell__r!   r!   r   r"   r   #   s   r   Úmodel_classc           
   	   C   s�  d}d}ddgg}ddgg}| dddd�}| dddd�}| d||||d�}d}t jt|d�� |tƒ W 5 Q R X |tdd	�}	|	j| |ksŽt‚t|	d
d
…df |tƒƒ t|	d
d
…df |tƒƒ |tdd	�}	|	j| |ksàt‚t|	d
d
…dd
d
…f |tƒƒ t|	d
d
…dd
d
…f |tƒƒ |tdd	�}	|	j| |k�s@t‚t|	d
d
…dd
d
…d
d
…f |tƒƒ t|	d
d
…dd
d
…d
d
…f |tƒƒ d
S )zm
    Test that a model initialized with model_set_axis=1
    can be evaluated with model_set_axis=False.
    r   r   r   ©Úc0Úc1©r-   r.   Ún_modelsÚmodel_set_axisú?For model_set_axis=1, all inputs must be at least 2-dimensional©ÚmatchF©r1   Nr   )	ÚpytestÚraisesÚ
ValueErrorr   ÚshapeÚAssertionErrorr   ÚxxÚxxx)
r+   r0   Z
model_axisr-   r.   Út1Út2Úp1ÚMESSAGEÚyr!   r!   r"   Útest_model1d_axis_16   s,    

  &rB   c              	   C   s"  | ddddgggdddgggddd�}| dddd�}| dddd�}| dddd�}d	}t jt|d
�� |tƒ W 5 Q R X t jt|d
�� |tƒ W 5 Q R X |tdd�}|jdks²t‚t|dd…dd…df  ¡ |tƒƒ t|dd…dd…df  ¡ |tƒƒ t|dd…dd…df  ¡ |tƒƒ dS )úm
    Test that a model initialized with model_set_axis=2
    can be evaluated with model_set_axis=False.
    r   r   r   r   é   é   r/   r,   z?For model_set_axis=2, all inputs must be at least 3-dimensionalr3   Fr5   ©r   r   r   Nr   )	r6   r7   r8   r   r;   r9   r:   r   Úflatten)r+   r?   r=   r>   Út3r@   rA   r!   r!   r"   Útest_model1d_axis_2\   s(        ÿ$$rI   c              	   C   sp  | dddd�}ddg|_ ddg|_| dddd�}| dddd�}d}tjt|d�� |tƒ W 5 Q R X |tƒ}t|ƒdks|t‚t	|d |td ƒƒ t	|d |td ƒƒ |td	d
�}t|ƒdksÄt‚t	|d |tƒƒ t	|d |tƒƒ |td	d
�}t|ƒdk�st‚t	|d |tƒƒ t	|d |tƒƒ |t
d	d
�}t	|d |t
ƒƒ t	|d |t
ƒƒ t|ƒdk�slt‚dS )zm
    Test that a model initialized with model_set_axis=0
    can be evaluated with model_set_axis=False.
    r   r   r   ©r0   r1   r   r,   ú=Input argument 'x' does not have the correct dimensions in .*r3   Fr5   N)r-   r.   r6   r7   r8   r   r;   Úlenr:   r   r<   )r+   r?   r=   r>   r@   rA   r!   r!   r"   Útest_model1d_axis_0y   s0    

rM   c              
   C   s  | dddddgggdddgggdddgggdddgggddd	�}| ddddddd
�}| ddddddd
�}| ddddddd
�}|j jdksŒt‚|ttdd�}|jdks¨t‚t|dd…dd…df  ¡ |ttƒƒ t|dd…dd…df  ¡ |ttƒƒ t|dd…dd…df  ¡ |ttƒƒ dS )rC   r   r   r   r   r   é   é   é   )Úc0_0Úc0_1Úc1_0Úc1_1r0   r1   )rQ   rR   rS   rT   ©r   r   r   Fr5   rF   N)rQ   r9   r:   r   r   rG   )r+   Úp2r=   r>   rH   rA   r!   r!   r"   Útest_model2d_axis_2Ÿ   s&    ø
&&rW   c               	   C   sÜ   t dddgddgddd�} t dddd�}t dddd�}d}tjt|d	�� | tƒ W 5 Q R X tjt|d	�� | tƒ W 5 Q R X tj}| |ƒ}t|d d …d
f ||d d …d
f ƒƒ t|d d …df ||d d …df ƒƒ d S )Nr   r   r   r   éÿÿÿÿr/   r,   rK   r3   r   )r   r6   r7   r8   r   r;   ÚTr   )r?   r=   r>   r@   ZxxtrA   r!   r!   r"   Útest_negative_axis¼   s    &rZ   c                  C   sÈ  t dddd�} | jjdkst‚| jjdks.t‚t dddd�}|jjdksLt‚|jjdks\t‚t dddgddgddd	�}|jjd
ks†t‚|jjd
ks–t‚ddg}ddg}t ddgddgg¡}t ddgddgg¡}t||g||gddd�}|jjdksút‚|j	jdk�st‚t||gg||ggddd�}|jjdk�s:t‚|j	jdk�sLt‚t||g||gddd�}|jjdk�svt‚|j	jdk�sˆt‚t||gddgddd�}|jjdk�s²t‚|j	jd
k�sÄt‚d S )Nr   r   r   rJ   rU   ©r   r   r   rX   r/   )r   r   rD   rE   é(   é2   é<   éF   éP   )r   r   r   )r   r   )r   r   r   r   )r   r   r   r   )r   r0   r1   )
r   r-   r9   r:   r.   ÚnpÚarrayr   r   r   )rV   r?   Úe1Úe2Za1Za2Útr!   r!   r"   Útest_shapesÎ   s2    rf   c               	   C   sl  t ddgddgdd�} tdddgddgdd�}t| tƒ|tƒƒ t| tdd�|tdd�ƒ d	}tjt|d
�� | tƒ W 5 Q R X t ddggddggddd�} tdddggddggddd�}t| tjƒ|tjƒƒ t| tdd�|tdd�ƒ tjt|d
�� | tƒ W 5 Q R X t	ddgddgddgdd�} | ttƒ}|j
dk�sBt‚d}tjt|d
�� | tƒ W 5 Q R X dS )zHTests evaluation of Linear1D and Planar2D with different model_set_axis.r   r   r   r   ©ÚslopeÚ	interceptr0   )r-   r.   r0   Fr5   rK   r3   ©rh   ri   r0   r1   r/   ©Zslope_xZslope_yri   r0   )r   r   z+Missing input arguments - expected 2, got 1N)r   r   r   r;   r   r6   r7   r8   rY   r   r9   r:   )ÚmodelÚpr@   rA   r!   r!   r"   Ú	test_evalò   s&    
rn   c                 C   sö   | dddd�}t  dt d td g¡}t  |dd¡j}tƒ }||t|ƒ}|tdd�}| d|jd d |jd d |jd	�}| d|jd d |jd d |jd	�}t	|d
d
…df |tƒƒ t	|d
d
…df |tƒƒ | dddd�}||t|jƒ}d
S )z
    Issue #7159
    r   r   rJ   r   r   rX   Fr5   )r-   r.   ÚdomainN)
ra   rb   r   ÚrollaxisrY   r   r-   r.   ro   r   )r+   rm   rA   ÚfÚfitZmodel_yÚm1Úm2r!   r!   r"   Útest_linearlsqfitter  s    &&ru   c            
   	   C   s|  t ƒ } tdddd�}tjd d…d d…f \}}t t || dd|  d|  g¡dd¡}| ||||ƒ}|||d	d
�}|j|jks†t‚tdddgddgddd�}|t	ƒ}|t	j
dd
�}t|d |d d …df ƒ t|d |d d …df ƒ tdddggddggddd�}|t	j
ƒ}|t	dd
�}t|d d …df |d ƒ t|d d …df |d ƒ d}	tjt|	d�� |tƒ W 5 Q R X d S )Nr   r   rJ   rN   çš™™™™™¹?çš™™™™™É?r   r   Fr5   r/   r2   r3   )r   r   ra   Úmgridrp   rb   r9   r:   r   r;   rY   r   r6   r7   r8   r   )
ÚfitterZ	model_setÚy2Úx2Úzrl   ÚresZy0Úy1r@   r!   r!   r"   Útest_model_set_axis_outputs.  s(    ,
r   c                  C   s’   t ƒ } tddgddgdd�}|tƒ}| |t|ƒ tddggddggddd�}| |t|jƒ tddgddgddgdd�}|ttƒ}| |tt|ƒ dS )	z1Test fitting model sets of Linear1D and Planar2D.r   r   r   r   rg   rj   rk   N)r   r   r;   r   rY   r   )ry   rl   rA   r!   r!   r"   Útest_fitting_shapesK  s    
r€   c               	   C   s>   d} t jt| d��" tdddd�tdddd�B  W 5 Q R X d S )Nz=model_set_axis must be False or 0 and consistent for operandsr3   r   r   rJ   r   )r6   r7   r8   r   )r@   r!   r!   r"   Útest_compound_model_sets[  s    ÿÿr�   c               	   C   sš   t dddgdd�} t d¡}| |dd�}tƒ }d}tjt|d�� || |d d	… |ƒ W 5 Q R X tjt|d��" || ||d d …d d	…f ƒ W 5 Q R X d S )
Nr   r   ©Údegreer-   r0   r   Fr5   z"x and y should have the same shaper3   rN   )r   ra   Úaranger   r6   r7   r8   )Ú
init_modelr   rA   ry   r@   r!   r!   r"   Ú test_linear_fit_model_set_errorsd  s    
r†   c               
   C   sò   t dddgdd�} t d¡}| |dd�}|jdks6t‚ttƒ� |tjjdd	|jd
� }W 5 Q R X t	ƒ }t 
d¡}d|ddg< || |||d�}t||dd�|dd� tjtdd��6 tjtdd�� || ||t d¡d�}W 5 Q R X W 5 Q R X dS )ú-Tests fitting multiple models simultaneously.r   r   r‚   r   Fr5   ©r   r   r   ç{®Gáz„?©ÚsizerX   ©Úweightsrv   ©Zrtolú$Found NaNs in the coefficient matrixr3   ú$invalid value encountered in.*divideN)r   ra   r„   r9   r:   r   Ú_RANDOM_SEEDÚrandomÚnormalr   Úonesr   r6   r7   r8   ÚwarnsÚRuntimeWarningZzeros)r…   r   Ú
y_expectedrA   ry   r�   Úfitted_modelr!   r!   r"   Ú'test_linear_fit_model_set_common_weightr  s"    

"
 ÿr™   c               
   C   sº  t dddgdd�} t d¡}| |dd�}|jdks6t‚ttƒ� |tjjdd	|jd
� }W 5 Q R X t 	|¡}d|ddg|j
dd�f< d|ddg|jdd�f< tƒ }|| |||d�}t||dd�|dd� d|d< tjtdd��0 tjtdd�� || |||d�}W 5 Q R X W 5 Q R X tjtdd��* || |tjj|t |d¡d�|d�}W 5 Q R X t t |jdd…df ¡¡�svt‚t t ||dd�d ¡¡�s˜t‚t||dd�d |d dd� dS )r‡   r   r   r‚   r   Fr5   rˆ   r   r‰   rŠ   )ZaxisrŒ   rv   rŽ   r�   r3   r�   )ÚmaskN)r   ra   r„   r9   r:   r   r‘   r’   r“   Z	ones_likeZargminZargmaxr   r   r6   r7   r8   r•   r–   Úmarb   ÚiscloseÚallÚisnanZ
param_sets)r…   r   r—   rA   r�   ry   r˜   r!   r!   r"   Ú!test_linear_fit_model_set_weights�  s:    

"
 ÿ$   ÿ$"rŸ   c               	   C   sª   t dddgdd�} t d¡}t d¡}| ||dd�}tƒ }d}tjt|d�� || |d d	… ||ƒ W 5 Q R X tjt|d��$ || |||d d …d d	…f ƒ W 5 Q R X d S )
Nr   r   )rƒ   rQ   r0   r   Fr5   z%x, y and z should have the same shaper3   rN   )r   ra   r„   r   r6   r7   r8   )r…   r   rA   r|   ry   r@   r!   r!   r"   Ú#test_linear_fit_2d_model_set_errorsµ  s    

 r    c                  C   s®   t dddgddgddddœd�} tjdd…dd…f \}}t d| d	|  d
| |  d| | d| |  g¡}tƒ }|| |||t d¡d�}t|||dd�|dd� d S ©Nr   r   ç      à¿T©rS   rR   ©rƒ   rS   rR   r0   Zfixedr   rN   ç      à?rv   rw   )rN   rN   rŒ   Fr5   ç›+¡†›„=©Zatol©r   ra   rx   rb   r   r”   r   )r…   r   rA   Úzzry   r˜   r!   r!   r"   Ú*test_linear_fit_2d_model_set_common_weightÄ  s    û:rª   c                  C   sÄ   t dddgddgddddœd�} tjdd…dd…f \}}| ¡ | ¡  }}t d| d	|  d
| |  d| | d| |  g¡}t d¡}tƒ }|| ||||d�}t|||dd�|dd� d S )Nr   r   r¢   Tr£   r¤   r   rN   r¥   rv   rw   é   rŒ   Fr5   r¦   r§   ©r   ra   rx   rG   rb   r”   r   r   ©r…   r   rA   r©   r�   ry   r˜   r!   r!   r"   Ú/test_linear_fit_flat_2d_model_set_common_weightÖ  s    û:
r®   c                  C   s¼   t dddgddgddddœd�} tjdd…dd…f \}}t d| d	|  d
| |  d| | d| |  g¡}tƒ }t d¡t d¡g}|| ||||d�}t|||dd�|dd� d S r¡   r¨   )r…   r   rA   r©   ry   r�   r˜   r!   r!   r"   Ú$test_linear_fit_2d_model_set_weightsê  s    û:r¯   c                  C   sÄ   t dddgddgddddœd�} tjdd…dd…f \}}| ¡ | ¡  }}t d| d	|  d
| |  d| | d| |  g¡}t d¡}tƒ }|| ||||d�}t|||dd�|dd� d S )Nr   r   r¢   Tr£   r¤   r   rN   r¥   rv   rw   )r   r«   rŒ   Fr5   r¦   r§   r¬   r­   r!   r!   r"   Ú)test_linear_fit_flat_2d_model_set_weightsý  s    û:
r°   c                   @   sH   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S )ÚTest1ModelSetae  
    Check that fitting a single model works with a length-1 model set axis.
    It's not clear that this was originally intended usage, but it can be
    convenient, eg. when fitting a range of image rows that may be a single
    row, and some existing scripts might rely on it working.
    Currently this does not work with FittingWithOutlierRemoval.
    c                 C   sª   t  dd¡| _t  dd| j  g¡| _t  d¡| _d| jd< d| jd	< t jdd…dd…f \| _| _	t  d
d| j	  d| j  g¡| _
t  d¡| _d| j
d< d| jd< d S )Nr   r   r¥   ç      @)r   g      Y@)r   é   g        r³   r   rv   rw   )r   r   )r   r   r   r[   )ra   r„   Úx1rb   r~   r”   Úw1rx   rz   r{   Úz2Úw2)r   r!   r!   r"   Úsetup_class  s    

"
zTest1ModelSet.setup_classc                 C   sH   t dƒ}tƒ }||| j| j| jd�}t|jddd� t|jddd� d S )Nr   rŒ   r¥   çê-�™—q=r§   r²   )r   r   r´   r~   rµ   r   r-   r.   ©r   rl   ry   r!   r!   r"   Útest_linear_1d_common_weights&  s
    z+Test1ModelSet.test_linear_1d_common_weightsc                 C   sR   t dƒ}tƒ }||| j| j| jtjdf d�}t|jddd� t|j	ddd� d S )Nr   .rŒ   r¥   r¹   r§   r²   )
r   r   r´   r~   rµ   ra   Únewaxisr   r-   r.   rº   r!   r!   r"   Útest_linear_1d_separate_weights-  s
     z-Test1ModelSet.test_linear_1d_separate_weightsc                 C   sX   t ddd�}tƒ }||| j| jj| jdtjf d�}t|j	ddd� t|j
ddd� d S )	Nr   r5   .rŒ   r¥   r¹   r§   r²   )r   r   r´   r~   rY   rµ   ra   r¼   r   r-   r.   rº   r!   r!   r"   Ú&test_linear_1d_separate_weights_axis_14  s
    "z4Test1ModelSet.test_linear_1d_separate_weights_axis_1c                 C   s\   t dƒ}tƒ }||| j| j| j| jd�}t|jddd� t|jddd� t|j	ddd� d S )Nr   rŒ   ç      ð?r¹   r§   çš™™™™™¹¿rw   )
r   r   r{   rz   r¶   r·   r   rQ   rS   rR   rº   r!   r!   r"   Útest_linear_2d_common_weights;  s    z+Test1ModelSet.test_linear_2d_common_weightsc                 C   sf   t dƒ}tƒ }||| j| j| j| jtjdf d�}t|j	ddd� t|j
ddd� t|jddd� d S )	Nr   .rŒ   r¿   r¹   r§   rÀ   rw   )r   r   r{   rz   r¶   r·   ra   r¼   r   rQ   rS   rR   rº   r!   r!   r"   Útest_linear_2d_separate_weightsC  s        ÿz-Test1ModelSet.test_linear_2d_separate_weightsc              	   C   st   t ddd�}tƒ }||| j| jt | jdd¡| jdtjf d�}t	|j
dd	d
� t	|jdd	d
� t	|jdd	d
� d S )Nr   r   r5   r   r   .rŒ   r¿   r¹   r§   rÀ   rw   )r   r   r{   rz   ra   rp   r¶   r·   r¼   r   rQ   rS   rR   rº   r!   r!   r"   Ú&test_linear_2d_separate_weights_axis_2M  s    ûz4Test1ModelSet.test_linear_2d_separate_weights_axis_2N)r$   r%   r&   r'   r¸   r»   r½   r¾   rÁ   rÂ   rÃ   r!   r!   r!   r"   r±     s   
r±   )7r'   Únumpyra   r6   Znumpy.testingr   Zastropy.modeling.corer   Zastropy.modeling.fittingr   Zastropy.modeling.modelsr   r   r   r   r	   r
   r   r   r   r   Zastropy.modeling.parametersr   Zastropy.utilsr   r„   r   rb   r;   Zreshaper<   r‘   r   ÚmarkZparametrizerB   rI   rM   rW   rZ   rf   rn   ru   r   r€   r�   r†   r™   rŸ   r    rª   r®   r¯   r°   r±   r!   r!   r!   r"   Ú<module>   sd   0
 
ÿ
# 
ÿ
 
ÿ
#
$! 
ÿ
	(