U
    e»{jŸ™  ã                   @   sú  d 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mZ ddlmZ ddlmZ ejdgfejdgfejdgfejdgfejdgfgZejdgfejd	dgfejd	dgfgZejejejejgZG d
d„ dƒZ G dd„ dƒZ!G dd„ dƒZ"G dd„ de
ƒZ#G dd„ dƒZ$G dd„ dƒZ%G dd„ deƒZ&G dd„ dƒZ'e (d¡dd	d	ggdd	d	ggdœe (d¡d	d	gdgd	d	gdgdœe )d¡dd	d	ggdd	d	ggdœe )d¡dd	d	ggd	d	gdgdœej)ddd�dd	d	gdgd	d	gdgdœe )d¡dd	d	ggdd	d	gdgdœe )d ¡dd	d	ggdd	d	gd	d	ggdœejd	d	d!�dd	d	ggd	d	gdœejd	d	d!�dd	gd	dœe *d	d	dd	d"¡dd	d	ggd#d#gdœe *d	d	dd	d"¡dd	gd$dœejd	d	d!�ejd	dd!�@ d	d	d	d	gd%dœejd	d	d!�ejd	dd!�@ d	d	d	d	gd	d	ggd	ddgfdœej+ ,¡ e -e .dd	d&¡g¡j/e 0d¡ge -d'd'gd'd(gd'd)gd'd*gd'd+gg¡dœgZ1ej2 3d,e1¡d-d.„ ƒZ4d/d0„ Z5G d1d2„ d2eƒZ6d3d4„ Z7d5d6„ Z8d7d8„ Z9ej2 3d,e *¡ e d	¡e :¡ e ;¡ ej<e =d9¡d:�g¡ej2j>e d;d<�d=d>„ ƒƒZ?ej2 3d,e @¡ e d	¡ejAe =d?¡d:�g¡ej2j>e d;d<�d@dA„ ƒƒZBej2 3d,e *¡ e d	¡B e @¡ e d	¡@ e *¡ e d	¡ e *¡ e d	¡ e *¡ e d	¡ e (d¡e d	¡B e )dB¡e d	¡B g¡dCdD„ ƒZCej2 3d,e (d¡e )d¡e )dB¡g¡dEdF„ ƒZDdS )GzD
This module tests fitting and model evaluation with various inputs
é    N)Úassert_allclose)ÚfittingÚmodels)ÚFittable1DModelÚFittableModelÚModel)Ú	Parameter)Ú	HAS_SCIPYé   é   c                   @   sD   e Zd ZdZdd„ Zej de¡dd„ ƒZ	ej de
¡dd„ ƒZd	S )
ÚTestInputTypezˆ
    This class tests that models accept numbers, lists and arrays.

    Add new models to one of the lists above to test for this.
    c                 C   sN   d| _ d| _t ddd¡| _t ddd¡| _tjd d…d d…f \| _| _d S )Ng333333@gÍÌÌÌÌÌ@r   é
   çš™™™™™¹?é   )	ÚxÚyÚnpÚarangeÚx1Úy1ÚmgridÚy2Úx2©Úself© r   ú`/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/tests/test_input.pyÚsetup_class,   s
    zTestInputType.setup_class)ÚmodelÚparamsc                 C   s*   ||Ž }|| j ƒ || jƒ || jƒ d S ©N)r   r   r   ©r   r   r   Úmr   r   r   Útest_input1D3   s    

zTestInputType.test_input1Dc                 C   s6   ||Ž }|| j | jƒ || j| jƒ || j| jƒ d S r    )r   r   r   r   r   r   r!   r   r   r   Útest_input2D:   s    zTestInputType.test_input2DN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚpytestÚmarkÚparametrizeÚmodel1d_paramsr#   Úmodel2d_paramsr$   r   r   r   r   r   %   s   
r   c                   @   sð   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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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 )ÚTestFittingz/Test various input options to fitting routines.c                 C   s.   t  d¡| _t jd d…d d…f \| _| _d S )Nr   ©r   r   r   r   r   r   r   r   r   r   r   E   s    zTestFitting.setup_classc                 C   s^   t  ddddg¡}t d¡}ddddg|_|| jƒ}t ¡ }||| j|ƒ}t|j|dd� dS )z1 set 1D x, 1psetr   r   é   çH¯¼šò×z>©ZatolN)	r   Úarrayr   ÚPolynomial1DÚ
parametersr   r   ÚLinearLSQFitterr   )r   ÚexpectedÚp1r   Úpfitr   r   r   r   Útest_linear_fitter_1setI   s    

z#TestFitting.test_linear_fitter_1setc                 C   s¶   t  ddgddgddgddgg¡}tjddd�}ddddddd	d	g|_i }td
ƒD ]}||g||j| < qRtjdddi|—Ž}|| jdd�}t 	¡ }||| j|ƒ}t
|j|dd� dS )z%1 set 1D x, 2 sets 1D y, 2 param_setsr   r   r
   r0   ©Ún_modelsç        ç      ð?ç       @g      @é   Úmodel_set_axisF©rA   r1   r2   N)r0   )r   r3   r   r4   r5   ÚrangeÚparam_namesr   r   r6   r   Ú
param_sets©r   r7   r8   r   Úir   r9   r   r   r   r   Útest_linear_fitter_NsetT   s    "z#TestFitting.test_linear_fitter_Nsetc                 C   sb   t  ddddgg¡j}t d¡}ddddg|_|| jƒ}t ¡ }||| j|ƒ}t	|j
|d	d
� dS )z71 pset, 1 set 1D x, 1 set 1D y, Chebyshev 1D polynomialgÿÿÿÿ¦@gÿÿÿÿŸ‚°@g    Cš@góÿÿÿÿq@r0   r   r   r
   ç{®Gáz„?r2   N)r   r3   ÚTr   ÚChebyshev1Dr5   r   r   r6   r   rE   )r   r7   Zch1r   r9   r   r   r   r   Útest_linear_fitter_1dchebc   s    üÿÿ


z%TestFitting.test_linear_fitter_1dchebc                 C   sb   t  ddddgg¡j}t d¡}ddddg|_|| jƒ}t ¡ }||| j|ƒ}t	|j
|d	d
� dS )zH
        1 pset, 1 set 1D x, 1 set 1D y, Legendre 1D polynomial
        g    ž@g   €éª@g    m�@gùÿÿÿÿÇv@r0   r   r
   r@   çê-�™—q=r2   N)r   r3   rJ   r   Ú
Legendre1Dr5   r   r   r6   r   rE   )r   r7   Zleg1r   r9   r   r   r   r   Útest_linear_fitter_1dlegendw   s    üÿÿ


z'TestFitting.test_linear_fitter_1dlegendc                 C   s€   t  d¡}ddddddg|_ddddddg}|| j| jƒ}t ¡ }||| j| j|ƒ}t|j|dd� t|| j| jƒ|dd� d S )	Nr
   r   r   r0   r@   é   rM   r2   )r   ÚPolynomial2Dr5   r   r   r   r6   r   )r   Úp2r7   Úzr9   r   r   r   r   Útest_linear_fitter_1set2d�   s    
z%TestFitting.test_linear_fitter_1set2dc              	   C   sZ   d}t jt|d��> t d¡}|| jƒ}tjddd�}t ¡ }||| j|ƒ W 5 Q R X dS )z
        A ValueError is raised if a 1 data set (1d x, 1d y) is fit
        with a model with multiple parameter sets.
        zHNumber of data sets .* is expected to equal the number of parameter sets©ÚmatchrP   r
   r;   N)r)   ÚraisesÚ
ValueErrorr   r4   r   r   r6   )r   ÚMESSAGEr8   r   r9   r   r   r   Útest_wrong_numpset—   s    ÿ

zTestFitting.test_wrong_numpsetc              	   C   s¬   t  ddgddgddgddgddgddgg¡}tjddd�}i }tdƒD ]}d|g||j| < qHtjdd	di|—Ž}|| jd
d�}t ¡ }||| j|ƒ}t	|j
|dd� dS )z;A case of 1 set of x and multiple sets of y and parameters.r   r   r
   r0   r@   rP   r;   é   rA   FrB   r1   r2   N)rP   )r   r3   r   r4   rC   rD   r   r   r6   r   rE   rF   r   r   r   Útest_wrong_pset§   s$    úÿ
zTestFitting.test_wrong_psetúrequires scipy©ÚreasonÚfitterc                 C   sD   |ƒ }t jdddd�}|| jƒ}||| j|ƒ}t|jdddgƒ dS )z.1 set 1D x, 1 set 1D y, 1 pset NonLinearFitterr   r0   çš™™™™™É?)ÚmeanÚstddevN)r   Ú
Gaussian1Dr   r   r5   )r   r`   Úg1r   r   r   r   r   Útest_nonlinear_lsqt_1set_1d¾   s
    
z'TestFitting.test_nonlinear_lsqt_1set_1dc              	   C   sb   |ƒ }d}t jt|d��@ tjddgddgddgd	d
�}|| jdd�}||| j|ƒ}W 5 Q R X dS )z51 set 1D x, 1 set 1D y, 2 param_sets, NonLinearFitterz6Non-linear fitters can only fit one data set at a timerU   gffffff$@r   r0   gš™™™™™	@gq=
×£pÍ?ra   r
   )rb   rc   r<   FrB   N)r)   rW   rX   r   rd   r   )r   r`   rY   re   r   Ú_r   r   r   Útest_nonlinear_lsqt_Nset_1dÉ   s       ÿz'TestFitting.test_nonlinear_lsqt_Nset_1dc                 C   sX   |ƒ }t jddddddd�}|| j| jƒ}||| j| j|ƒ}t|jddddddgƒ dS )	z.1 set 2d x, 1set 2D y, 1 pset, NonLinearFitterr   r0   r@   ç333333Ó?ra   r   )Zx_meanZy_meanÚx_stddevÚy_stddevÚthetaN)r   Ú
Gaussian2Dr   r   r   r5   )r   r`   Úg2rS   r   r   r   r   Útest_nonlinear_lsqt_1set_2d×   s         ÿz'TestFitting.test_nonlinear_lsqt_1set_2dc              
   C   s€   |ƒ }d}t jt|d��^ tjddgddgddgddgddgddgd	d
�}|| j ¡ | j ¡ ƒ}||| j| j|ƒ}W 5 Q R X dS )z41 set 2d x, 1set 2D y, 2 param_sets, NonLinearFitterúTInput argument .* does not have the correct dimensions in .* for a model set with .*rU   r   r0   r@   ri   ra   r   r
   )rj   rk   rl   r<   N)r)   rW   rX   r   rm   r   Úflattenr   )r   r`   rY   rn   rS   rg   r   r   r   Útest_nonlinear_lsqt_Nset_2dä   s    ÿù	z'TestFitting.test_nonlinear_lsqt_Nset_2dN)r%   r&   r'   r(   r   r:   rH   rL   rO   rT   rZ   r\   r)   r*   Úskipifr	   r+   Úfittersrf   rh   ro   rr   r   r   r   r   r.   B   s*   
	r.   c                   @   sX   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d„ ZdS )ÚTestEvaluationzs
    Test various input options to model evaluation

    TestFitting actually covers evaluation of polynomials
    c                 C   s.   t  d¡| _t jd d…d d…f \| _| _d S )Né   r   r/   r   r   r   r   r     s    zTestEvaluation.setup_classc                 C   sh   t jddgddgddgdd�}|| jdd�}t |dd	d	…f |d
d	d	…f   ¡ t g ¡k¡sdt‚d	S )zY
        This case covers:
            N param sets , 1 set 1D x --> N 1D y data
        r   r0   ra   r
   r;   FrB   r   Nr   )r   rd   r   r   ÚallZnonzeror3   ÚAssertionError)r   re   r   r   r   r   Útest_non_linear_NYset  s    z$TestEvaluation.test_non_linear_NYsetc                 C   sb   t jddgddgddgdd�}t | j| jg¡}||ƒ}t|dd…df |dd…df d	d
� dS )zU
        This case covers: N param sets , N sets 1D x --> N N sets 1D y data
        r   r0   ra   r
   r;   Nr   r   rM   r2   )r   rd   r   r3   r   r   )r   re   Úxxr   r   r   r   Útest_non_linear_NXYset  s    z%TestEvaluation.test_non_linear_NXYsetc                 C   s&   t  d¡}|| jƒ}|jdks"t‚dS )z 1 data set, 1 pset, Polynomial1Dr@   )rv   N)r   r4   r   Úshaperx   ©r   r8   r   r   r   r   Útest_p1_1set_1pset  s    

z!TestEvaluation.test_p1_1set_1psetc                 C   sb   t jddd�}|t | j| jg¡jdd�}|jdks8t‚t|ddd…f |d	dd…f d
d� dS )z'N data sets, N param_sets, Polynomial1Dr@   r
   r;   éÿÿÿÿrB   )rv   r
   r   Nr   rM   r2   )	r   r4   r   r3   r   rJ   r|   rx   r   r}   r   r   r   Útest_p1_nset_npset"  s    z!TestEvaluation.test_p1_nset_npsetc                 C   s*   t  d¡}|| j| jƒ}|jdks&t‚dS )z#1 pset, 1 2D data set, Polynomial2DrP   )r   r   N)r   rQ   r   r   r|   rx   )r   rR   rS   r   r   r   Útest_p2_1set_1pset*  s    
z!TestEvaluation.test_p2_1set_1psetc                 C   sN   t jddd�}t | j| jg¡}t | j| jg¡}|||ƒ}|jdksJt‚dS )z$N param_sets, N 2D data sets, Poly2drP   r
   r;   )r
   r   r   N)r   rQ   r   r3   r   r   r|   rx   )r   rR   rz   ÚyyrS   r   r   r   Útest_p2_nset_npset1  s
    
z!TestEvaluation.test_p2_nset_npsetc                 C   sz   t  | j| jg¡j}d|d< d|d< d|d< tjdddgd	d
gdd�}||dd�}t|j|jƒ ||dd�}t||ƒ dS )zˆ
        Test model set with negative model_set_axis.

        In this case model_set_axis=-1 is identical to model_set_axis=1.
        éd   )r   r   ©r   r   éc   )r
   r   rP   r   r
   r0   r@   )Zc0Úc1r<   r   rB   N)r   r3   r   rJ   r   r4   r   r|   )r   rz   r8   r‚   Zyy1r   r   r   Útest_nset_domain:  s    zTestEvaluation.test_nset_domainc                 C   sP   t  ddgddgg¡}tjddd|d�}t jd d…d d…f \}}|||ƒ d S )Nr>   gš™™™™™é?r0   g      @g      @)Z
cov_matrixr   )r   r3   r   rm   r   )r   ZcovÚgr   r   r   r   r   Útest_evaluate_gauss2dK  s    z$TestEvaluation.test_evaluate_gauss2dN)r%   r&   r'   r(   r   ry   r{   r~   r€   r�   rƒ   rˆ   rŠ   r   r   r   r   ru   ü   s   

	ru   c                   @   s$   e Zd Zeƒ Zeƒ Zedd„ ƒZdS )Ú
TModel_1_1c                 C   s   | | | S r    r   )r   r8   rR   r   r   r   ÚevaluateV  s    zTModel_1_1.evaluateN)r%   r&   r'   r   r8   rR   ÚstaticmethodrŒ   r   r   r   r   r‹   R  s   r‹   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 )Ú&TestSingleInputSingleOutputSingleModelaŒ  
    A suite of tests to check various cases of parameter and input combinations
    on models with n_input = n_output = 1 on a toy model with n_models=1.

    Many of these tests mirror test cases in
    ``astropy.modeling.tests.test_parameters.TestParameterInitialization``,
    except that this tests how different parameter arrangements interact with
    different types of model inputs.
    c                 C   sB   t ddƒ}|dƒ}t|tƒs t‚t |¡dks2t‚|dks>t‚dS )úO
        Scalar parameters with a scalar input should return a scalar.
        r   r   r„   r   éo   N)r‹   Ú
isinstanceÚfloatrx   r   Úndim©r   Útr   r   r   r   Ú#test_scalar_parameters_scalar_inputf  s
    
zJTestSingleInputSingleOutputSingleModel.test_scalar_parameters_scalar_inputc                 C   s^   t ddƒ}|t d¡d ƒ}t|tjƒs,t‚t |¡dks>t‚t |dddd	d
gk¡sZt‚dS )ú�
        Scalar parameters should broadcast with an array input to result in an
        array output of the same shape as the input.
        r   r   rP   r„   ©rP   é   r�   éÓ   é7  é›  N)r‹   r   r   r‘   Úndarrayrx   r|   rw   r”   r   r   r   Ú%test_scalar_parameters_1d_array_inputq  s
    
zLTestSingleInputSingleOutputSingleModel.test_scalar_parameters_1d_array_inputc                 C   sl   t ddƒ}|t d¡ dd¡d ƒ}t|tjƒs4t‚t |¡dksFt‚t |dd	d
gdddggk¡sht‚dS )r—   r   r   r[   r
   r0   r„   ©r
   r0   r™   r�   rš   r›   rœ   éÿ  N©	r‹   r   r   Úreshaper‘   r�   rx   r|   rw   r”   r   r   r   Ú%test_scalar_parameters_2d_array_input}  s
    
zLTestSingleInputSingleOutputSingleModel.test_scalar_parameters_2d_array_inputc                 C   s†   t ddƒ}|t d¡ ddd¡d ƒ}t|tjƒs6t‚t |¡dksHt‚t |dd	gd
dgddggddgddgddgggk¡s‚t‚dS )r—   r   r   é   r
   r0   r„   ©r
   r0   r
   r™   r�   rš   r›   rœ   r    éc  éÇ  é+  é�  éó  éW  Nr¡   r”   r   r   r   Ú%test_scalar_parameters_3d_array_input‰  s    
þÿÿzLTestSingleInputSingleOutputSingleModel.test_scalar_parameters_3d_array_inputc                 C   sV   t ddgddgƒ}|dƒ}t|tjƒs*t‚t |¡dks<t‚t |ddgk¡sRt‚d	S )
úÃ
        Array parameters should all be broadcastable with each other, and with
        a scalar input the output should be broadcast to the maximum dimensions
        of the parameters.
        r   r
   r   rv   r„   ©r
   r�   éz   N)r‹   r‘   r   r�   rx   r|   rw   r”   r   r   r   Ú%test_1d_array_parameters_scalar_input›  s
    zLTestSingleInputSingleOutputSingleModel.test_1d_array_parameters_scalar_inputc              	   C   s¶   t ddgddgƒ}|ddgƒ}t |¡dks0t‚t |dd	gk¡sFt‚|dgdggƒ}t |¡d
ksht‚t |ddgdd	ggk¡s†t‚d}tjt|d�� |dddgƒ W 5 Q R X dS )úe
        When given an array input it must be broadcastable with all the
        parameters.
        r   r
   r   rv   r„   éÈ   r®   r�   éÞ   ©r
   r
   r¯   rš   zWself input argument 'x' of shape .* cannot be broadcast with parameter 'p1' of shape .*rU   é,  N©r‹   r   r|   rx   rw   r)   rW   rX   ©r   r•   r   r   rY   r   r   r   Ú'test_1d_array_parameters_1d_array_input¨  s    ÿzNTestSingleInputSingleOutputSingleModel.test_1d_array_parameters_1d_array_inputc              	   C   s$  t ddgddggddgddggƒ}|d	d
gddggƒ}t |¡dksHt‚t |ddgddggk¡sft‚|d	ggd
gggdggdggggƒ}t |¡dksœt‚t |ddgddggddgddgggddgddggddgddggggk¡sêt‚d}tjt|d �� |d	d
dgdd!d"ggƒ W 5 Q R X d#S )$r±   r   r
   r0   r@   r   rv   é   é(   r„   r²   rµ   é�  r´   r�   r³   éM  é¼  ©r
   r
   r
   r
   r¯   é…   é�   rš   éé   éô   r›   éB  éX  rœ   é¦  é±  úTself input argument .* of shape .* cannot be broadcast with parameter .* of shape .*rU   éô  éX  Nr¶   r·   r   r   r   Ú'test_2d_array_parameters_2d_array_input¿  s"    "$þÿÿ	ÿzNTestSingleInputSingleOutputSingleModel.test_2d_array_parameters_2d_array_inputc              	   C   s4  t dddgdddggddd	gd
ddgggdddgƒ}|dddgƒ}t |¡dksTt‚t|dddgdddggdddgdddgggƒ |dgggdgggdggggƒ}t |¡d ks´t‚t|dd!d"gdd#d$ggdd%d&gdd'd(gggd)dd*gd+dd,ggd-dd.gd/dd0gggd1d2dgd3d4dggd5d6dgd7d8dggggƒ d9S ):r±   rI   ç{®Gáz”?ç¸…ëQ¸ž?ç{®Gáz¤?çš™™™™™©?ç¸…ëQ¸®?çìQ¸…ë±?ç{®Gáz´?ç
×£p=
·?r   ç)\�Âõ(¼?ç¸…ëQ¸¾?r   r
   r0   r   rv   r¹   ©r
   r
   r0   ç…ëQ¸&@ç…ëQ¸6@ç¤p=
×ƒ@@ç®Gáz&@çÍÌÌÌÌ6@çHáz®‡@@ç¤p=
×#&@ç®Gáz6@çìQ¸…‹@@ç333333&@ç\�Âõ(6@ç�Âõ(\�@@©r0   r
   r
   r0   ç
×£p=
(@ç�Âõ(\*@çš™™™™(@ç…ëQ¸*@ç)\�Âõ((@ç®Gáz.*@ç¸…ëQ8(@ç=
×£p=*@çÃõ(\�5@çHáz®7@ç
×£p=
5@ç�Âõ(\7@çR¸…ë5@ç×£p=
7@çš™™™™5@ç…ëQ¸7@çÃõ(\�?@çÃõ(\�@@ç
×£p=
?@çfffff@@çR¸…ë?@ç
×£p=
@@çš™™™™?@ç®Gáz@@N)r‹   r   r|   rx   r   ©r   r•   r   r   r   r   r   Ú*test_mixed_array_parameters_1d_array_inputÝ  s:    þûþþ þþþ÷þzQTestSingleInputSingleOutputSingleModel.test_mixed_array_parameters_1d_array_inputN©r%   r&   r'   r(   r–   rž   r£   r¬   r°   r¸   rÊ   rü   r   r   r   r   rŽ   [  s   
rŽ   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 )Ú#TestSingleInputSingleOutputTwoModela  
    A suite of tests to check various cases of parameter and input combinations
    on models with n_input = n_output = 1 on a toy model with n_models=2.

    Many of these tests mirror test cases in
    ``astropy.modeling.tests.test_parameters.TestParameterInitialization``,
    except that this tests how different parameter arrangements interact with
    different types of model inputs.

    With n_models=2 all outputs should have a first dimension of size 2 (unless
    defined with model_set_axis != 0).
    c                 C   sJ   t ddgddgdd�}|dƒ}t |¡dks0t‚t |dd	gk¡sFt‚d
S )z‚
        Scalar parameters with a scalar input should return a 1-D array with
        size equal to the number of models.
        r   r
   r   rv   r;   r„   r®   r�   r¯   N©r‹   r   r|   rx   rw   r”   r   r   r   r–     s    zGTestSingleInputSingleOutputTwoModel.test_scalar_parameters_scalar_inputc              	   C   s  t ddgddgdd�}d}tjt|d�� |t d¡d	 ƒ W 5 Q R X |d	d
gƒ}t |¡dksdt‚t |ddgk¡szt‚|d	d
gdd�}t |¡dksœt‚t |ddgddggk¡sºt‚|d	d
dgdd�}t |¡dksÞt‚t |dddgdddggk¡�st‚dS )ú¹
        The dimension of the input should match the number of models unless
        model_set_axis=False is given, in which case the input is copied across
        all models.
        r   r
   r   rv   r;   rp   rU   rP   r„   r²   r®   r�   r³   FrB   r´   rš   r¯   rµ   rŸ   r›   rÃ   N)	r‹   r)   rW   rX   r   r   r|   rx   rw   )r   r•   rY   r   r   Úy3r   r   r   rž   $  s    ÿzITestSingleInputSingleOutputTwoModel.test_scalar_parameters_1d_array_inputc                 C   sÎ   t ddgddgdd�}|t d¡ dd¡d ƒ}t |¡d	ksBt‚t |d
ddgdddggk¡sdt‚|t d¡ dd¡d dd�}t |¡dks”t‚t |d
ddgdddggdddgdddgggk¡sÊt‚dS )r   r   r
   r   rv   r;   r[   r0   r„   rŸ   r™   r�   rš   rÃ   rÅ   i
  FrB   rÕ   r›   rœ   r    é   r¯   r³   N)r‹   r   r   r¢   r|   rx   rw   rû   r   r   r   r£   C  s    "*ÿzITestSingleInputSingleOutputTwoModel.test_scalar_parameters_2d_array_inputc                 C   sÈ   t ddgddgdd�}t d¡ ddd¡d }||ƒ}t |¡d	ksHt‚t |d
dgddgddggddgddgddgggk¡s‚t‚||dd�}t |¡dks t‚t |t |d
 |d g¡k¡sÄt‚dS )r   r   r
   r   rv   r;   r¤   r0   r„   r¥   r™   r�   rš   r›   rœ   r    in  iÒ  i6  iš  iþ  ib  FrB   )r
   r
   r0   r
   r  N)r‹   r   r   r¢   r|   rx   rw   r3   )r   r•   Údatar   r   r   r   r   r¬   V  s    þÿÿzITestSingleInputSingleOutputTwoModel.test_scalar_parameters_3d_array_inputc                 C   sn   t dddgdddggddd	gd
ddggdd�}|dƒ}t |¡dksHt‚t |dddgdddggk¡sjt‚dS )r­   r   r
   r0   r@   rP   r[   r   rv   r¹   rº   é2   é<   r;   r„   rŸ   r�   r¯   r¿   rÀ   é›   é¦   Nrÿ   r”   r   r   r   r°   n  s    .zITestSingleInputSingleOutputTwoModel.test_1d_array_parameters_scalar_inputc              	   C   s  t dddgdddggddd	gd
ddggdd�}d}tjt|d�� |dddgƒ}W 5 Q R X |ddgƒ}t |¡dksxt‚t |dddgdddggk¡sšt‚d}tjt|d�� |ddgdd�}W 5 Q R X |dddgdd�}t |¡dksìt‚t |dddgddd ggk¡�st‚d!S )"zç
        When the input is an array, if model_set_axis=False then it must
        broadcast with the shapes of the parameters (excluding the
        model_set_axis).

        Otherwise all dimensions must be broadcastable.
        r   r
   r0   r@   rP   r[   r   rv   r¹   rº   r  r  r;   rp   rU   r„   r²   rµ   rŸ   r�   r¯   r¿   rÂ   éÿ   i
  úUModel input argument .* of shape .* cannot be broadcast with parameter .* of shape .*FrB   r³   r¼   rÀ   in  N)r‹   r)   rW   rX   r   r|   rx   rw   )r   r•   rY   r   r   r   r   r   r¸   {  s    	.ÿ"ÿzKTestSingleInputSingleOutputTwoModel.test_1d_array_parameters_1d_array_inputc              	   C   s<  t ddgddggddgddgggd	d
gddggddgddgggdd�}|ddgddggƒ}t |¡dkslt‚t |ddgddggddgddgggk¡sšt‚d}tjt|d �� |dddgdd!d"ggƒ}W 5 Q R X |ddgddggd!d"gd#d$gggƒ}t |¡dk�st‚t |ddgd%d&ggd'd(gd)d*gggk¡�s8t‚d S )+Nr   r
   r0   r@   rP   r[   é   r   r   rv   r¹   rº   r  r  éF   éP   r;   r„   r²   rµ   r»   )r
   r
   r
   r�   r³   r¿   rÂ   ic  iÒ  iy  iè  r	  rU   rÈ   rÉ   i¼  i   r¼   r½   i+  iš  i	  ix  r¶   )r   r•   r   rY   r   r   r   r   rÊ   �  s6    ýþÿÿ	ÿ"$þÿÿzKTestSingleInputSingleOutputTwoModel.test_2d_array_parameters_2d_array_inputc              	   C   sÄ   t dddgdddggddd	gd
ddgggdddgdddggdd�}d}tjt|d�� |dddgƒ}W 5 Q R X |dddgdd�}t |¡dks’t‚t|dddgdd d!ggd"d#d$gd%d&d'gggƒ d S )(NrI   rË   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   r   rÓ   rÔ   r   r
   r0   r@   rP   r[   r;   rp   rU   r   rv   r¹   FrB   rÕ   rÖ   r×   rØ   rÙ   rÚ   rÛ   g¤p=
×#,@g®Gáz9@gìQ¸…B@g333333,@g\�Âõ(9@g�Âõ(\B@)r‹   r)   rW   rX   r   r|   rx   r   )r   r•   rY   r   r   r   r   rü   ¾  s&    þú
ÿþþzNTestSingleInputSingleOutputTwoModel.test_mixed_array_parameters_1d_array_inputNrý   r   r   r   r   rþ   
  s   "!rþ   c                   @   s2   e Zd ZdZdZeƒ Zeƒ Zeƒ Ze	dd„ ƒZ
dS )Ú
TModel_1_2r   r
   c                 C   s   | | | | | | | fS r    r   )r   r8   rR   Úp3r   r   r   rŒ   â  s    zTModel_1_2.evaluateN)r%   r&   r'   Ún_inputsÚ	n_outputsr   r8   rR   r  r�   rŒ   r   r   r   r   r  Ú  s   r  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 )Ú&TestSingleInputDoubleOutputSingleModela  
    A suite of tests to check various cases of parameter and input combinations
    on models with n_input = 1 but n_output = 2 on a toy model with n_models=1.

    As of writing there are not enough controls to adjust how outputs from such
    a model should be formatted (currently the shapes of outputs are assumed to
    be directly associated with the shapes of corresponding inputs when
    n_inputs == n_outputs).  For now, the approach taken for cases like this is
    to assume all outputs should have the same format.
    c                 C   sv   t dddƒ}|dƒ\}}t|tƒs&t‚t|tƒs4t‚t |¡t |¡  krTdksZn t‚|dksft‚|dksrt‚dS )	r�   r   r   éè  r„   r   r�   r«   N)r  r‘   r’   rx   r   r“   ©r   r•   r   rS   r   r   r   r–   ó  s    &zJTestSingleInputDoubleOutputSingleModel.test_scalar_parameters_scalar_inputc                 C   sž   t dddƒ}|t d¡d ƒ\}}t|tjƒs2t‚t|tjƒsBt‚t |¡t |¡  krbdkshn t‚t |ddd	d
dgk¡s„t‚t ||d k¡sšt‚dS )r—   r   r   r  rP   r„   r˜   r™   r�   rš   r›   rœ   N)r  r   r   r‘   r�   rx   r|   rw   r  r   r   r   rž      s    &zLTestSingleInputDoubleOutputSingleModel.test_scalar_parameters_1d_array_inputc                 C   s¬   t dddƒ}|t d¡ dd¡d ƒ\}}t|tjƒs:t‚t|tjƒsJt‚t |¡t |¡  krjdkspn t‚t |d	d
dgdddggk¡s’t‚t ||d k¡s¨t‚dS )r—   r   r   r  r[   r
   r0   r„   rŸ   r™   r�   rš   r›   rœ   r    N©	r  r   r   r¢   r‘   r�   rx   r|   rw   r  r   r   r   r£     s    &"zLTestSingleInputDoubleOutputSingleModel.test_scalar_parameters_2d_array_inputc                 C   sÆ   t dddƒ}|t d¡ ddd¡d ƒ\}}t|tjƒs<t‚t|tjƒsLt‚t |¡t |¡  krldksrn t‚t |d	d
gddgddggddgddgddgggk¡s¬t‚t ||d k¡sÂt‚dS )r—   r   r   r  r¤   r
   r0   r„   r¥   r™   r�   rš   r›   rœ   r    r¦   r§   r¨   r©   rª   r«   Nr  r  r   r   r   r¬     s     &þÿÿzLTestSingleInputDoubleOutputSingleModel.test_scalar_parameters_3d_array_inputc                 C   sš   t ddgddgddgƒ}|dƒ\}}t|tjƒs4t‚t|tjƒsDt‚t |¡t |¡  krddksjn t‚t |d	d
gk¡s€t‚t |ddgk¡s–t‚dS )r­   r   r
   r   rv   r  éÐ  r„   r®   r�   r¯   r«   éJ  N)r  r‘   r   r�   rx   r|   rw   r  r   r   r   r°   0  s    &zLTestSingleInputDoubleOutputSingleModel.test_1d_array_parameters_scalar_inputc           	   	   C   s$  t ddgddgddgƒ}|ddgƒ\}}t |¡t |¡  krHd	ksNn t‚t |d
dgk¡sdt‚t |ddgk¡szt‚|dgdggƒ\}}t |¡t |¡  kr®dks´n t‚t |d
dgddggk¡sÒt‚t |ddgddggk¡sðt‚d}tjt|d�� |dddgƒ\}}W 5 Q R X dS )r±   r   r
   r   rv   r  r  r„   r²   r®   r�   r³   r«   é®  r´   r¯   rš   r  é»  rÇ   rU   rµ   N©r  r   r|   rx   rw   r)   rW   rX   ©	r   r•   r   Úz1r   Úz2rY   r  Zz3r   r   r   r¸   ?  s    &&ÿzNTestSingleInputDoubleOutputSingleModel.test_1d_array_parameters_1d_array_inputc           	   	   C   sÖ  t ddgddggddgddggd	d
gddggƒ}|ddgddggƒ\}}t |¡t |¡  krhdksnn t‚t |ddgddggk¡sŒt‚t |ddgddggk¡sªt‚|dggdgggdggdggggƒ\}}t |¡t |¡  kròdksøn t‚t |ddgddggddgdd gggd!d"gdd#ggd$d%gd&dggggk¡�sHt‚t |dd'gd(d)ggd*dgd+d,gggd-d.gdd/ggd0d1gd2dggggk¡�s˜t‚d3}tjt|d4��" |dddgdd5d6ggƒ\}}W 5 Q R X d7S )8r±   r   r
   r0   r@   r   rv   r¹   rº   r  r  i¸  i   r„   r²   rµ   r»   r´   r�   r³   r¼   r½   r«   r  i  i\  r¾   r¯   r¿   rÀ   rš   rÁ   rÂ   r›   rÃ   rÄ   rœ   rÅ   rÆ   r  i=  i0  r  i¡  i”  i  i	  iø  iƒ  iv	  ii  rÇ   rU   rÈ   rÉ   Nr  r  r   r   r   rÊ   X  s:      ÿ&(&þÿÿ
þÿÿ
	ÿzNTestSingleInputDoubleOutputSingleModel.test_2d_array_parameters_2d_array_inputc              	   C   s  t dddgdddggddd	gd
ddgggdddgdddgƒ}|dddgƒ\}}t |¡t |¡  krndkstn t‚t|dddgdddggdddgd d!d"gggƒ t|d#d$d%gd&d'd(ggd)d*d+gd,d-d.gggƒ |dgggdgggdggggƒ\}}t |¡t |¡  k�rd/k�sn t‚t|dd0d1gdd2d3ggdd4d5gd d6d7gggd8dd9gd:dd;ggd<dd=gd>d!d?gggd@dAdgdBdCdggdDdEdgdFdGd"ggggƒ t|d#dHdIgd&dJdKggd)dLdMgd,dNdOgggdPd$dQgdRd'dSggdTd*dUgdVd-dWgggdXdYd%gdZd[d(ggd\d]d+gd^d_d.ggggƒ d`S )ar±   rI   rË   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   r   rÓ   rÔ   r   r
   r0   r„   r²   rµ   r   rv   r¹   rÕ   rÖ   r×   rØ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   gq=
×£À[@gq=
×£Àk@g®GázÐt@gÃõ(\�Â[@gš™™™™Ák@g)\�ÂõÐt@g®GázÄ[@gÃõ(\�Âk@g=
×£pÑt@gfffffÆ[@gìQ¸…Ãk@gR¸…ëÑt@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ú   gq=
×£€j@g®Gáz�s@gš™™™™�j@g)\�Âõ�s@gÃõ(\�‚j@g=
×£p‘s@gìQ¸…ƒj@gR¸…ë‘s@gq=
×£@^@g®Gáz0t@gÃõ(\�B^@g)\�Âõ0t@g®GázD^@g=
×£p1t@gfffffF^@gR¸…ë1t@g¸…ëQ``@gq=
×£ m@gáz®Ga`@gš™™™™m@g
×£p=b`@gÃõ(\�m@g33333c`@gìQ¸…m@N)r  r   r|   rx   r   )r   r•   r   r  r   r  r   r   r   rü   €  sb    þú	&þþþþ$*þþþ÷þþþþ÷þzQTestSingleInputDoubleOutputSingleModel.test_mixed_array_parameters_1d_array_inputNrý   r   r   r   r   r  ç  s   (r  )r   ÚinputsÚoutputs)r   r   r…   r0   )r  )r   r   r   )r   r   r   )Zc0_0g333333ó?gà#¬×>nÛ?gQ¯ŠÓ>nÛ?©r   r
   rP   r=   g      Ð?g      à?g      è?r>   r   c                 C   sV   | d | d Ž }t  |¡r*t|| d ƒ n(tt|ƒƒD ]}t|| | d | ƒ q6d S )Nr   r  r  )r   Zisscalarr   rC   Úlen)r   ÚresultrG   r   r   r   Útest_mixed_inputü  s
    
r"  c                  C   sœ   G dd„ dt ƒ} | dƒ}|ddgdƒ}ddgddgdg}t||ƒD ]\}}t||ƒ qB| dƒ}|dddgƒ}ddddgg}t||ƒD ]\}}t||ƒ q„d S )Nc                       s6   e Zd ZdZdZdZeƒ Zdd„ Z‡ fdd„Z	‡  Z
S )ztest_more_outputs.<locals>.MFr
   r0   c                 S   s   || || || fS r    r   )r   r   r   Úar   r   r   rŒ     s    z%test_more_outputs.<locals>.M.evaluatec                    sV   t ƒ j||Ž\}}| j|| jžŽ }dd„ |D ƒ}dd„ |D ƒ}| jt|ƒff|ž|ŽS )Nc                 S   s   g | ]
}|j ‘qS r   )r|   )Ú.0Úoutr   r   r   Ú
<listcomp>  s     z9test_more_outputs.<locals>.M.__call__.<locals>.<listcomp>c                 S   s   g | ]}|d krdn|‘qS )©r   r   r   )r$  r|   r   r   r   r&    s     )ÚsuperZprepare_inputsrŒ   r5   Zprepare_outputsÚtuple)r   ÚargsÚkwargsr  rg   r  Zoutput_shapes©Ú	__class__r   r   Ú__call__  s
    z%test_more_outputs.<locals>.M.__call__)r%   r&   r'   Zstandard_broadcastingr  r  r   r#  rŒ   r.  Ú__classcell__r   r   r,  r   ÚM  s   r0  r   r>   r=   r?   )r   Úzipr   )r0  Úcr!  r7   ÚrÚer   r   r   Útest_more_outputs  s    r5  c                   @   s(   e Zd ZdZdZdZdZedd„ ƒZdS )ÚTInputFormatterz6
    A toy model to test input/output formatting.
    r
   ©r   r   c                 C   s   | |fS r    r   r7  r   r   r   rŒ   /  s    zTInputFormatter.evaluateN)	r%   r&   r'   r(   r  r  r  r�   rŒ   r   r   r   r   r6  &  s   r6  c                  C   s    t ƒ } | ddƒ}|dkst‚d S )Nr   r
   r  )r6  rx   ©r   r!  r   r   r   Útest_format_input_scalars4  s    
r9  c                  C   s>   t ƒ } | ddgddgƒ}t|t ddg¡t ddg¡fƒ d S ©Nr   r
   )r6  r   r   r3   r8  r   r   r   Útest_format_input_arrays:  s    r;  c                  C   s@   t ƒ } t ddgg¡jt ddgg¡jf}| |Ž }t||ƒ d S r:  )r6  r   r3   rJ   r   )r   Úinputr!  r   r   r   Ú#test_format_input_arrays_transposed@  s    $r=  )r@   rP   )Zlookup_tabler]   r^   c              	   C   sæ   | ddƒ}t || ddd�ƒ t || ddd�ƒ d| _t || ddd�ƒ t || ddd�ƒ t || ddƒƒ d}tjt|d�� | ddd	ƒ W 5 Q R X tjt|d�� | ddd
d	d� W 5 Q R X d}tjt|d�� | dƒ W 5 Q R X dS )úW
    Test calling a model with positional, keywrd and a mixture of both arguments.
    r   r
   r7  )r   ©r3  r•   ©r•   z-Too many input arguments - expected 2, got .*rU   r0   r¤   ©r•   r3  ú+Missing input arguments - expected 2, got 1N©r   r  r)   rW   rX   ©r   Ú
positionalrY   r   r   r   Útest_call_keyword_args_1G  s    
rF  r˜   c              	   C   sª   | dƒ}t || dd�ƒ d| _t || dd�ƒ d}tjt|d�� | dddƒ W 5 Q R X tjt|d�� | ddddd	� W 5 Q R X d
}tjt|d�� | ƒ  W 5 Q R X dS )r>  r   )r   )r3  ú.Too many input arguments - expected .*, got .*rU   r
   r0   r¤   rA  z+Missing input arguments - expected 1, got 0NrC  rD  r   r   r   Útest_call_keyword_args_2k  s    rH  r'  c              	   C   s°   | ddƒ}d| _ t|| ddd�ƒ t|| ddd�ƒ d}tjt|d�� | dddƒ W 5 Q R X tjt|d�� | ddddd	� W 5 Q R X d
}tjt|d�� | ƒ  W 5 Q R X dS )r>  r   r
   r?  r@  rG  rU   r0   r¤   rA  z+Missing input arguments - expected 2, got 0N)r  r   r)   rW   rX   rD  r   r   r   Útest_call_keyword_args_3Š  s    
rI  c              	   C   sî   | ddƒ}t || ddd�ƒ t || ddd�ƒ |  ¡ } d| _t || ddd�ƒ t || ddd�ƒ t || ddƒƒ d}tjt|d�� | ddd	ƒ W 5 Q R X tjt|d�� | ddd
d	d� W 5 Q R X d}tjt|d�� | dƒ W 5 Q R X dS )r>  r   r
   )Zx0r   )r   r?  r@  rG  rU   r0   r¤   rA  rB  N)r   Úcopyr  r)   rW   rX   rD  r   r   r   Útest_call_keyword_mappings¬  s     
rK  )Er(   Únumpyr   r)   Znumpy.testingr   Zastropy.modelingr   r   Zastropy.modeling.corer   r   r   Zastropy.modeling.parametersr   Z"astropy.utils.compat.optional_depsr	   r4   rN   rK   ZShiftZScaler,   rQ   Z
Legendre2DZChebyshev2Dr-   ZLevMarLSQFitterZTRFLSQFitterZLMLSQFitterZDogBoxLSQFitterrt   r   r.   ru   r‹   rŽ   rþ   r  r  ZIdentityÚMappingrm   ÚmathZMultiplyUfuncr3   ZlinspacerJ   r   Zbroadcast_modelsr*   r+   r"  r5  r6  r9  r;  r=  Z
Rotation2DZPix2Sky_TANZ	Tabular2DZonesrs   rF  rd   Z	Tabular1DrH  rI  rK  r   r   r   r   Ú<module>   sô   




û	
ýü ;V	 0 Q c    
ý
ý
ý 
ýý
ý
ý  ÿýÖ4
	 ûþ
ýþùþ
ýþ