U
    e»{j[˜  ã                   @   sb  d Z ddlZddlZddlmZ ddlZddlZddl	m
Z ddlmZmZ ddlmZmZ ddlmZmZmZmZ ddlmZ dd	lmZ d
d„ Zdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZdd„ Z dd„ Z!dd„ Z"G dd„ deƒZ#G dd„ de#ƒZ$G dd„ de$ƒZ%d d!„ Z&d"d#„ Z'G d$d%„ d%ƒZ(G d&d'„ d'ƒZ)G d(d)„ d)ƒZ*d*d+„ Z+d,d-„ Z,dS ).z
Tests models.parameters
é    N)Úunits)ÚfittingÚmodels)ÚFittableModelÚModel)ÚInputParameterErrorÚ	ParameterÚ_tofloatÚparam_repr_oneline)Úget_pkg_data_filenameé   )Úirafutilc                 C   s   | S ©N© )Úvalr   r   úe/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/tests/test_parameters.pyÚsetter1   s    r   c                 C   s   |  | ¡ | |j S r   )Údo_somethingÚp)r   Úmodelr   r   r   Úsetter2    s    
r   c                       sL   e Zd ZdZdZeded�Zeded�Z	dd„ Z
‡ fdd„Zdd	„ Z‡  ZS )
ÚSetterModelé   r   )ÚdefaultÚsetterc                 C   s   d S r   r   )ÚselfÚvr   r   r   r   ,   s    zSetterModel.do_somethingc                    s    || _ tƒ  ¡  || _|| _d S r   )r   ÚsuperÚ__init__ÚxcÚyc)r   r   r    r   ©Ú	__class__r   r   r   /   s    
zSetterModel.__init__c                 C   s   || d || d  S )Nr   r   )r   ÚxÚyr   r    r   r   r   Úevaluate5   s    zSetterModel.evaluate)Ú__name__Ú
__module__Ú__qualname__Zn_inputsZ	n_outputsr   r   r   r   r    r   r   r%   Ú__classcell__r   r   r!   r   r   %   s   r   c                       s8   e 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
    c                    s   t ƒ jf ||dœ|—Ž d S )N©ÚcoeffÚe)r   r   )r   r,   r-   Úkwargsr!   r   r   r   A   s    zTParModel.__init__c                 C   s   d S r   r   r+   r   r   r   r%   D   s    zTParModel.evaluate)r&   r'   r(   Ú__doc__r   r,   r-   r   Ústaticmethodr%   r)   r   r   r!   r   r*   9   s   r*   c                   @   s$   e Zd Zeddd�Zedd„ ƒZdS )Ú	MockModelÚalphaé*   ©Únamer   c                  G   s   d S r   r   )Úargsr   r   r   r%   L   s    zMockModel.evaluateN)r&   r'   r(   r   r2   r0   r%   r   r   r   r   r1   I   s   r1   c               	   C   s”  t dddgƒ} t| tjƒst‚| t dddg¡k ¡ s:t‚t dd„ | D ƒ¡sRt‚t t dddg¡ƒ} t| tjƒsvt‚| t dddg¡k ¡ s’t‚t dd„ | D ƒ¡sªt‚d}tjt	|d�� t d	ƒ W 5 Q R X t dt
j ƒdt
j ksìt‚t t d¡ƒ} t| tƒ�s
t‚| dk�st‚t dƒ} t| tƒ�s0t‚| dk�s>t‚t d
ƒ} t| tƒ�sVt‚| dk�sdt‚t t d¡ƒ} t| tƒ�s‚t‚| dk�s�t‚t t d¡ƒ} t| tƒ�s®t‚| dk�s¼t‚t t d¡ƒ} t| tƒ�sÚt‚| dk�sèt‚t t d¡ƒ} t| tƒ�st‚| dk�st‚d}tjt	|d�� t dƒ W 5 Q R X tjt	|d�� t dƒ W 5 Q R X G dd„ dƒ}d}tjt	|d�� t |ƒ W 5 Q R X d S )Nr   r   é   c                 S   s   g | ]}t |tƒ‘qS r   ©Ú
isinstanceÚfloat©Ú.0r   r   r   r   Ú
<listcomp>V   s     z!test__tofloat.<locals>.<listcomp>c                 S   s   g | ]}t |tƒ‘qS r   r8   r;   r   r   r   r=   Z   s     z/Parameter of .* could not be converted to float©ÚmatchÚtestç      @z7Expected parameter to be of numerical type, not booleanTFc                   @   s   e Zd ZdS )ztest__tofloat.<locals>.ValueN)r&   r'   r(   r   r   r   r   ÚValueƒ   s   rB   z2Don't know how to convert parameter of .* to float)r	   r9   ÚnpZndarrayÚAssertionErrorÚarrayÚallÚpytestÚraisesr   ÚuÚmZ
asanyarrayr:   Zfloat32Úfloat64Zint32Zint64)ÚvalueÚMESSAGErB   r   r   r   Útest__tofloatQ   sT    rN   c               	   C   sà   t ddd�} | jdkst‚t t¡� d| _W 5 Q R X | jdksDt‚d| _| jdksXt‚| jdksft‚dd„ | _d| _| jdks„t‚| jd	ks’t‚d
| _| jd
ks¦t‚d	| _| jd	ksºt‚| j	d	ksÈt‚d| _	| j	dksÜt‚d	S )z8Test if getting / setting of Parameter properties works.r2   r   ©r   ÚbetaFTc                 S   s   dS )Nr   r   )Ú_r   r   r   Ú<lambda>›   ó    z+test_parameter_properties.<locals>.<lambda>Nr3   é)   )
r   r5   rD   rG   rH   ÚAttributeErrorÚfixedÚtiedÚminÚmax)r   r   r   r   Útest_parameter_properties‹   s&    
rZ   c                  C   sð   t ddd�} d}d}| | || ks(t‚||  || ks<t‚| | || ksPt‚||  || ksdt‚| | || ksxt‚||  || ksŒt‚| dk s˜t‚| dks¤t‚| | ks°t‚| | ks¼t‚| | ksÈt‚|  | ksØt‚t| ƒt|ƒksìt‚dS )	z0Test if the parameter arithmetic operators work.r2   r3   rO   g      E@r7   é-   rT   N)r   rD   Úabs)ZparÚnumr   r   r   r   Útest_parameter_operators«   s     r^   c                   @   s(   e Zd Zedd�Zedd�Zdd„ ZdS )ÚM1ç      ð?rO   ç      @c                   C   s   d S r   r   r   r   r   r   r%   È   s    zM1.evaluateN)r&   r'   r(   r   Úm1aÚm1br%   r   r   r   r   r_   Ä   s   

r_   c                   @   s   e Zd Zedd�ZdS )ÚM2ç      &@rO   N)r&   r'   r(   r   Úm2cr   r   r   r   rd   Ì   s   rd   c                   @   s   e Zd Zedd�ZdS )ÚM3ç      4@rO   N)r&   r'   r(   r   Úm3dr   r   r   r   rg   Ð   s   rg   c                  C   sh   t ƒ } | jdkst‚| jdks"t‚| jdks0t‚| jdks>t‚dD ]}|| jksBt‚qB| jdksdt‚d S )Nr`   ra   re   rh   )rb   rc   rf   ri   )rg   rb   rD   rc   rf   ri   Ú__dict__Zparam_names)ÚmodÚkeyr   r   r   Útest_parameter_inheritanceÔ   s    rm   c                  C   s¨   t ƒ } | jd d tddƒks"t‚| jd d tddƒks>t‚| jd d tddƒksZt‚| jd	 d tdd
ƒksvt‚|  ¡  | jtjddddgtjd�k 	¡ s¤t‚d S )Nrb   Úslicer   r   rc   r   rf   r7   ri   é   r`   ra   re   é   )Údtype)
rg   Z_param_metricsrn   rD   Z_parameters_to_arrayÚ_parametersrC   rE   rK   rF   )rk   r   r   r   Útest_param_metricß   s    rs   c                   @   s$  e 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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'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Z d=d>„ Z!d?d@„ Z"dAdB„ Z#dCdD„ Z$dEdF„ Z%dGS )HÚTestParametersc                 C   s¢   t dƒ}t|ƒ}| ¡ }| d¡}| ¡  t |d ¡}|j| _t	|j
d ƒ}t |d ¡| _tjdddd�| _t ¡ | _|j| _|j| _t |j|jg¡| _d	S )
zê
        Unit tests for parameters

        Read an iraf database file created by onedspec.identify.  Use the
        information to create a 1D Chebyshev model and perform the same fit.

        Create also a gaussian model.
        zdata/idcompspec.fitsÚbeginr   Úorderr   r7   ro   )ÚmeanÚstddevN)r   ÚopenÚreadÚsplitÚcloser   ZIdentifyRecordr,   ZicoeffÚintÚfieldsr   ZChebyshev1Dr   Ú
Gaussian1DÚgmodelr   ZLinearLSQFitterÚlinear_fitterr#   Úzr$   rC   rE   Úyy)r   Z	test_fileÚfÚlinesZreclistÚrecordrv   r   r   r   Úsetup_classê   s    	

zTestParameters.setup_classc                 C   s4   dddddg| j _| j jdddddgk ¡ s0t‚d	S )
z'Tests updating parameters using a list.é   é(   é2   é<   éF   g      >@g      D@g      I@N©r   Ú
parametersrF   rD   ©r   r   r   r   Útest_set_parameters_as_list  s    z*TestParameters.test_set_parameters_as_listc                 C   s:   t  dddddg¡| j_| jjdddd	d
gk ¡ s6t‚dS )z)Tests updating parameters using an array.r7   ro   é   é   é   rA   g      @ra   g      @g      @N)rC   rE   r   rŽ   rF   rD   r�   r   r   r   Útest_set_parameters_as_array  s    z+TestParameters.test_set_parameters_as_arrayc                 C   s*   d| j _| j jdddddgk ¡ s&t‚dS )z(Tests updating parameters using a tuple.)r   r   r7   ro   r‘   r   r   r7   ro   r‘   Nr�   r�   r   r   r   Útest_set_as_tuple  s    z TestParameters.test_set_as_tuplec                 C   s<   dddddg| j _d| j _| j jdddddgk ¡ s8t‚dS )z{
        Tests updating the parameters attribute when a model's
        parameter (in this case coeff) is updated.
        r   ç        r“   N)r   rŽ   Úc0rF   rD   r�   r   r   r   Útest_set_model_attr_seq  s    z&TestParameters.test_set_model_attr_seqc                 C   s&   d| j _| j jdddgk ¡ s"t‚dS )z>Update the parameter list when a model's parameter is updated.r“   r7   ro   N)r€   Ú	amplituderŽ   rF   rD   r�   r   r   r   Útest_set_model_attr_num  s    z&TestParameters.test_set_model_attr_numc                 C   s\   dddddg| j _| j j}d|d< || j _| j jdddddgk ¡ sHt‚| j jdksXt‚d	S )
z%Update the parameters using indexing.r   r   r7   ro   r‘   ç      $@r   é
   N)r   rŽ   rF   rD   r—   )r   Ztparr   r   r   Útest_set_item$  s    zTestParameters.test_set_itemc              	   C   s0   d}t jt|d�� dddg| j_W 5 Q R X dS )zz
        Tests raising an error when attempting to reset the parameters
        using a list of a different size.
        zIInput parameter values not compatible with the model parameters array: .*r>   r   r   r7   N)rG   rH   r   r   rŽ   ©r   rM   r   r   r   Útest_wrong_size1.  s    ÿzTestParameters.test_wrong_size1c              	   C   s0   d}t jt|d�� dddg| j_W 5 Q R X dS )zš
        Tests raising an exception when attempting to update a model's
        parameter (in this case coeff) with a sequence of the wrong size.
        zOValue for parameter c0 does not match shape or size\nexpected by model .* vs .*r>   r   r   r7   N)rG   rH   r   r   r—   rž   r   r   r   Útest_wrong_size2:  s    ÿzTestParameters.test_wrong_size2c              	   C   s.   d}t jt|d�� ddg| j_W 5 Q R X dS )z‰
        Tests raising an exception when attempting to update a model's
        parameter and the new value has the wrong shape.
        zVValue for parameter amplitude does not match shape or size\nexpected by model .* vs .*r>   r   r   N)rG   rH   r   r€   r™   rž   r   r   r   Útest_wrong_shapeG  s    ÿzTestParameters.test_wrong_shapec              	   C   s<   |   | j| j| j¡}tjj|jt dddddg¡dd� dS )	z[
        Test the fitter modifies model.parameters.

        Uses an iraf example.
        g`‡NÚ²@gŸ†g±'Ç�@g¼$:PH)@g‘ˆi#6¨ü¿gÿæg+„áì?g{®Gáz„?)ZrtolN)	r�   r   r#   r$   rC   ÚtestingZassert_allcloserŽ   rE   )r   Z	new_modelr   r   r   Útest_par_against_irafT  s    ûÿ	õz$TestParameters.test_par_against_irafc                 C   s6   dddddœ}t jd|Ž}tj |jddddg¡ d S )Né   é   é   é   )r—   Úc1Úc2Úc3r7   )r7   )r   ÚPolynomial1DrC   r¢   Úassert_equalrŽ   )r   ÚdÚp1r   r   r   ÚtestPolynomial1Dj  s    zTestParameters.testPolynomial1Dc                 C   s„   t jddd�}tj |jddddddddddddg¡ tj |jdddg¡ dddg|_tj |jddddddddddddg¡ d S )Nr7   ©Ún_modelsr–   r   rœ   r›   )r   r«   rC   r¢   r¬   rŽ   Úassert_array_equalr—   ©r   r®   r   r   r   Útest_poly1d_multiple_setso  s     ÿ ÿz(TestParameters.test_poly1d_multiple_setsc                 C   sL   t jddd�}ddg|jdd…< tj |jddddddddddddg¡ dS )	z5
        Test assigning to a parameter slice
        r7   r°   rœ   Nr   r›   r–   r   )r   r«   r—   rC   r¢   r¬   rŽ   r³   r   r   r   Útest_par_slicingz  s     ÿzTestParameters.test_par_slicingc                 C   s:   t jdd�}d|_tj |jddddddddddg
¡ d S )Nr7   )Zdegreer‘   r   )r   ÚPolynomial2DÚc0_0rC   r¢   r¬   rŽ   )r   Úp2r   r   r   Útest_poly2d„  s    zTestParameters.test_poly2dc                 C   sb   ddgddgddgddgddgddgdœ}t jd|Ž}tj |jddddddddddddg¡ d S )Nr   r7   r   ro   r‘   )r·   Zc1_0Zc2_0Zc0_1Zc0_2Zc1_1)r   )r   r¶   rC   r¢   r¬   rŽ   )r   Úkwr¸   r   r   r   Útest_poly2d_multiple_sets‰  s    úz(TestParameters.test_poly2d_multiple_setsc                 C   s2   t  d¡}d|_|jdkst‚|jjdks.t‚d S ©Nr   r7   )r   ZShiftÚoffsetrD   rL   )r   Zsh1r   r   r   Útest_shift_model_parameters1d•  s    
z,TestParameters.test_shift_model_parameters1dc                 C   sJ   t  ddg¡}ddg|_t |jddgk¡s0t‚tj |jjddg¡ d S r¼   )	r   ZScaleÚfactorrC   rF   rD   r¢   r²   rL   )r   Zsc1r   r   r   Útest_scale_model_parametersnd›  s    
z,TestParameters.test_scale_model_parametersndc              	   C   s–  t dd�}|jdkst‚t ddd�}|jdks2t‚d}tjt|d�� t dddd	� W 5 Q R X tjt|d�� t dddd
� W 5 Q R X tjt|d�� t ddddd� W 5 Q R X t dddddgd�}|jd  krÜ|jksân t‚d}tjt| d¡d�� d|_W 5 Q R X tjt| d¡d�� d|_W 5 Q R X d|_|jd  k�rT|jk�sZn t‚dt	j
 dt	j
 f|_|jd  k�rŒ|jk�s’n t‚d S )N©r   r   )Úboundsr   r   )rX   rY   z=bounds may not be specified simultaneously with min or max .*r>   r@   )rÂ   rX   r5   )rÂ   rY   r5   )rÂ   rX   rY   r5   r7   ro   r4   )NNz'{} value must be a number or a QuantityZMin)r@   NZMax)Nr@   )r   rÂ   rD   rG   rH   Ú
ValueErrorZ_boundsÚ	TypeErrorÚformatrI   rJ   ©r   ÚparamrM   r   r   r   Útest_bounds¡  s,    
"zTestParameters.test_boundsc              	   C   sÒ   t ddddgd�}|jdddgk ¡ s*t‚d}tjt|d�� d|tddƒ< W 5 Q R X d	}tjt|d�� t 	d
g¡|d< W 5 Q R X dd
g|tddƒ< |jdd
dgk ¡ s®t‚d|d< |jdd
dgk ¡ sÎt‚d S )Nr@   r   r   r7   r4   z<Slice assignment outside the parameter dimensions for 'test'r>   r   z?Input dimension 3 invalid for 'test' parameter with dimension 1r‘   ro   r’   )
r   rL   rF   rD   rG   rH   r   rn   rC   rE   rÆ   r   r   r   Útest_modify_valueÄ  s    z TestParameters.test_modify_valuec              	   C   sæ   t ddddgd�}|jd ks t‚d}tjt|d�� | tj¡ W 5 Q R X | tjd¡ |jtjksht‚d	}tjt|d�� | tj	d¡ W 5 Q R X d|_
| tj	d¡ |jtj	ks¸t‚d
}tjt|d�� | tj¡ W 5 Q R X d S )Nr@   r   r   r7   r4   z.Cannot attach units to parameters that were .*r>   Tz>This parameter does not support the magnitude units such as .*z@Cannot change the unit attribute directly, instead change the .*)r   ÚunitrD   rG   rH   rÃ   Z	_set_unitrI   rJ   ZABmagZ_magZ_unitÚKrÆ   r   r   r   Útest__set_unitÙ  s     zTestParameters.test__set_unitc                 C   s|   t ddddgd�}|jd ks t‚|jd ks.t‚t ddddgtjd�}|jtjksTt‚|jt dddg¡tj k ¡ sxt‚d S )Nr@   r   r   r7   r4   )r5   r   rÊ   )	r   rÊ   rD   ZquantityrI   rJ   rC   rE   rF   ©r   rÇ   r   r   r   Útest_quantityõ  s    zTestParameters.test_quantityc              	   C   s  t dddddgd�}|jdks"t‚d}tjt|d	�� d
|_W 5 Q R X d|_|jdksZt‚|jddgddggk ¡ sxt‚t ddd�}|jdks’t‚d}tjt|d	�� d
|_W 5 Q R X d|_t dt 	dg¡d�}|jdksÞt‚tjt|d	�� d
|_W 5 Q R X d|_d S )Nr@   r   r   r7   ro   r4   )ro   z,cannot reshape array of size 4 into shape .*r>   )r‘   ©r   r   r   z-Cannot assign this shape to a scalar quantity)r   )
r   ÚshaperD   rG   rH   rÃ   rL   rF   rC   rE   rÆ   r   r   r   Ú
test_shapeþ  s&    zTestParameters.test_shapec                 C   s\   t dddddgd�}|jdks"t‚t ddgd�}|jdks>t‚t ddd�}|jdksXt‚d S ©Nr@   r   r   r7   ro   r4   )r   ÚsizerD   rÍ   r   r   r   Ú	test_size  s    zTestParameters.test_sizec                 C   sX   t dddddgd�}|jd ks"t‚|jd ks0t‚d|_|jd  krN|jksTn t‚d S )Nr@   r   r   r7   ro   r4   r‘   )r   ZstdrD   Z_stdrÍ   r   r   r   Útest_std&  s
    zTestParameters.test_stdc              	   C   sz   t dddddgd�}|jdks"t‚|jdks0t‚d}tjt|d	�� d|_W 5 Q R X d
|_|jd
ksht‚|jd
ksvt‚d S )Nr@   r   r   r7   ro   r4   FzValue must be booleanr>   T)r   rV   rD   Z_fixedrG   rH   rÃ   rÆ   r   r   r   Ú
test_fixed.  s    zTestParameters.test_fixedc              	   C   sÌ   t dddddgd�}|jdks"t‚|jdks0t‚d}tjt|d	�� t ¡ |_W 5 Q R X d |_|jd kslt‚|jd kszt‚d|_|jdksŽt‚|jdksœt‚t 	¡ }||_|j|  krÂ|jksÈn t‚d S )
Nr@   r   r   r7   ro   r4   Fz/Tied must be a callable or set to False or Noner>   )
r   rW   rD   Z_tiedrG   rH   rÄ   ÚmkÚNonCallableMagicMockÚ	MagicMock)r   rÇ   rM   rW   r   r   r   Ú	test_tied=  s    zTestParameters.test_tiedc              	   C   sr   t dddddgd�}|jd ks"t‚t ¡ }| |¡ |j|ksBt‚d}tjt|d�� | t 	¡ ¡ W 5 Q R X d S )	Nr@   r   r   r7   ro   r4   z*This decorator method expects a callable.*r>   )
r   Ú
_validatorrD   r×   rÙ   Ú	validatorrG   rH   rÃ   rØ   )r   rÇ   ZvalidrM   r   r   r   Útest_validatorV  s    
zTestParameters.test_validatorc                 C   s´   t dddddgd�}|jd ks"t‚|jd ks0t‚| t ¡ ¡ t ¡ }| |¡ |j|ks^t‚| t ¡ ¡ |jg kszt‚t ¡ |_	t ¡ }| |¡ |jt 
|j	|¡gks°t‚d S rÒ   )r   rÛ   rD   r   Úvalidater×   rÙ   rÜ   Úcall_args_listÚ_modelÚcall)r   rÇ   rÜ   rL   r   r   r   Útest_validateb  s    


zTestParameters.test_validatec                 C   sD   t dddddgd�}| ¡ }||k ¡ s,t‚t|ƒt|ƒks@t‚d S rÒ   )r   ÚcopyrF   rD   Úid)r   rÇ   Z
copy_paramr   r   r   Ú	test_copyw  s    zTestParameters.test_copyc              	   C   sÜ  t dddddgd�}|jd ks"t‚|jd ks0t‚|jdks>t‚|jddddgk ¡ sXt‚t ¡ }t ¡ }||_	||_
dd	d
dg|_t ¡ }t ¡ }t ¡ }tjjt d||gd��‚}||_|j|  krÐ|jksÖn t‚|j	|ksät‚|j
|ksòt‚|jt ||¡t ||¡gk�st‚|jdd	d
dgk�s.t‚W 5 Q R X ||_	||_
d|_t ¡ }t ¡ }	t ¡ }
ddddg|	_ddddg|
_tjjt d|	|
gd��Ž}||_|j|  k�r¸|jk�s¾n t‚|j	|	k�sÎt‚|j
|
k�sÞt‚|jt ||¡t ||¡gk�st‚|jddddgk ¡ �st‚W 5 Q R X ||_	||_
d |_tjjt d|	|
gd��‚}||_|j|  k�rt|jk�szn t‚|j	|	k�sŠt‚|j
|
k�sšt‚|jt ||¡t ||¡gk�s¾t‚|jd k�sÎt‚W 5 Q R X d S )Nr@   r   r   r7   ro   r4   Fr‘   r’   r“   é   Ú_create_value_wrapper)Zside_effectTé	   rœ   r¤   r¥   )r   r   rD   rà   Ú_model_requiredÚ_valuerF   r×   rÙ   Ú_setterÚ_getterÚpatchÚobjectrß   rá   Úreturn_valuerL   Ú_default)r   rÇ   r   ÚgetterZmodel0Zsetter0Zgetter0ZmkCreateZmodel1r   Zgetter1r   r   r   Ú
test_model~  sŠ      ÿ

þ"  ÿ"

þ&  ÿ"

þzTestParameters.test_modelc                 C   sF   t dddddgd�}|j|jk ¡ s(t‚d|_d|_|jdksBt‚d S )Nr@   r   r   r7   ro   r4   T)r   Z
_raw_valuerL   rF   rD   rë   Z_internal_valuerÍ   r   r   r   Útest_raw_valueÃ  s
    zTestParameters.test_raw_valuec              	   C   sN  t dddddgd�}d}tjt|d�� | tjt ¡ ¡ W 5 Q R X | tj	t ¡ ¡tj	ks`t
‚| d t ¡ ¡d ksxt
‚d	d
„ }| |t ¡ ¡|ks˜t
‚dd„ }|jdks®t
‚| |d ¡|ksÂt
‚|jdksÐt
‚d|_t ¡ }tjjtddd��}| ||¡|jk�s
t
‚W 5 Q R X dd„ }d}tjt|d�� | |t ¡ ¡ W 5 Q R X d S )Nr@   r   r   r7   ro   r4   z1A numpy.ufunc used for Parameter getter/setter .*r>   c                 S   s   d S r   r   )Úar   r   r   Úwrapper1Ü  s    z;TestParameters.test__create_value_wrapper.<locals>.wrapper1c                 S   s   d S r   r   )rô   Úbr   r   r   Úwrapper2â  s    z;TestParameters.test__create_value_wrapper.<locals>.wrapper2FTÚpartial)Zautospecc                 S   s   d S r   r   )rô   rö   Úcr   r   r   Úwrapper3ò  s    z;TestParameters.test__create_value_wrapper.<locals>.wrapper3z-Parameter getter/setter must be a function .*)r   rG   rH   rÄ   rç   rC   Úaddr×   rÙ   ÚnegativerD   ré   rí   rî   Ú	functoolsrï   )r   rÇ   rM   rõ   r÷   r   Z	mkPartialrú   r   r   r   Útest__create_value_wrapperÎ  s*    ÿz)TestParameters.test__create_value_wrapperc                 C   s6  t ddd�}|jdkst‚t |¡s(t‚|r6ds>t‚nds>t‚t ddd�}|jdksXt‚t |¡rft‚|rtds|t‚nds|t‚t ddddd	gd�}t |jdddd	gk¡s¬t‚t |¡sºt‚|rÈdsÐt‚ndsÐt‚t dddddd	gd�}t |jddddd	gk¡�st‚t |¡�rt‚|�r(d�s2t‚n
d�s2t‚d S )
Nr@   r   r4   TFr   r   r7   ro   )r   rL   rD   rC   rF   rÍ   r   r   r   Ú	test_boolù  s0    


 zTestParameters.test_boolc                 C   s�   t ddd�}t|ƒdkst‚t dddddgd�}t|ƒdks@t‚t ddtj d�}t|ƒd	ksbt‚t dddddgtj d�}t|ƒd
ksŒt‚d S )Nr@   r   r4   z1.r   r7   ro   z[1., 2., 3., 4.]z1. mz[1., 2., 3., 4.] m)r   r
   rD   rI   rJ   rÍ   r   r   r   Útest_param_repr_oneline  s    z&TestParameters.test_param_repr_onelineN)&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   rt   é   sF   


#	
E+%rt   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestMultipleParameterSetsc                 C   sh   t  ddd¡| _t jd d…d d…f \| _| _t  | j| jg¡j| _t	j
ddgddgdd	gd
d�| _d S )Nr   rœ   gš™™™™™¹?r“   r¥   ç      @çÍÌÌÌÌÌ@çš™™™™™Ù?çffffffæ?r   )rx   r±   )rC   ZarangeÚx1Zmgridr$   r#   rE   ÚTZx11r   r   r€   r�   r   r   r   r‡   1  s       ÿz%TestMultipleParameterSets.setup_classc              	   C   sX   ddg| j _tj | j jt ddgddgddgg¡¡ t | j jddddddgk¡ d	S )
zX
        Test that a change to one parameter as a set propagates to param_sets.
        r   rœ   r`   r  r  r  r  r›   N©	r€   r™   rC   r¢   Úassert_almost_equalÚ
param_setsrE   rF   rŽ   r�   r   r   r   Útest_change_par9  s    ýÿþ
z)TestMultipleParameterSets.test_change_parc              	   C   sX   d| j jd< tj | j jt ddgddgddgg¡¡ t | j jdd	ddddgk¡ d
S )zg
        Test that a change to one single parameter in a set propagates to
        param_sets.
        r¤   r   re   rœ   r  r  r  r  r›   Nr  r�   r   r   r   Útest_change_par2J  s    ýÿþ
z*TestMultipleParameterSets.test_change_par2c                 C   sH   ddddddg| j _tj | j jjddg¡ tj | j jjd	dg¡ d S )
Nr¦   rœ   rè   r  r  r  g      *@r›   g      "@)r€   rŽ   rC   r¢   r	  r™   rL   rw   r�   r   r   r   Útest_change_parameters\  s    z0TestMultipleParameterSets.test_change_parametersN)r&   r'   r(   r‡   r  r  r  r   r   r   r   r  0  s   r  c                   @   s0  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
ej dddddgfddgdfdddgddgfddgdddgfg¡dd„ ƒZej dddiddidddœg¡dd„ ƒZej dddiddidddœg¡d d!„ ƒZd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4S )5ÚTestParameterInitializationz³
    This suite of tests checks most if not all cases if instantiating a model
    with parameters of different shapes/sizes and with different numbers of
    parameter sets.
    c                 C   s€   t ddƒ}t|ƒdkst‚|jdks(t‚t |jdgdggk¡sDt‚t |jddgk¡s\t‚|jj	dkslt‚|j
j	dks|t‚d S )Nrœ   r   Fr   ©r*   ÚlenrD   Úmodel_set_axisrC   rF   r
  rŽ   r,   rÐ   r-   ©r   Útr   r   r   Ú#test_single_model_scalar_parametersi  s    
z?TestParameterInitialization.test_single_model_scalar_parametersc                 C   sÊ   t dddgƒ}t|ƒdkst‚|jdks,t‚t |jjtj¡sBt‚t|jƒdksTt‚t 	|jd dgk¡snt‚t 	|jd ddggk¡sŒt‚t 	|j
dddgk¡s¦t‚|jjdks¶t‚|jjdksÆt‚d S )Nrœ   r   r   Fr   r   ©r   )r*   r  rD   r  rC   Ú
issubdtyper
  rq   Úobject_rF   rŽ   r,   rÐ   r-   r  r   r   r   Ú-test_single_model_scalar_and_array_parametersr  s    zITestParameterInitialization.test_single_model_scalar_and_array_parametersc                 C   s”   t ddgddgƒ}t|ƒdks"t‚|jdks0t‚t |jddggddgggk¡sTt‚t |jddddgk¡spt‚|jj	dks€t‚|j
j	dks�t‚d S )Nrœ   rp   r   r   Fr  r  r  r   r   r   Ú%test_single_model_1d_array_parameters~  s    $zATestParameterInitialization.test_single_model_1d_array_parametersc              	   C   s6   d}t jt|d�� tddgdddgƒ W 5 Q R X d S )NúJParameter .* of shape .* cannot be broadcast with parameter .* of shape .*r>   r   r   r7   ro   r‘   ©rG   rH   r   r*   rž   r   r   r   Ú6test_single_model_1d_array_different_length_parameters‡  s    ÿzRTestParameterInitialization.test_single_model_1d_array_different_length_parametersc                 C   s¼   t ddgddggddgddggƒ}t|ƒdks2t‚|jd	ks@t‚t |jddgddgggddgddggggk¡stt‚t |jddddddddgk¡s˜t‚|jj	d
ks¨t‚|j
j	d
ks¸t‚d S )Nrœ   rp   rˆ   r‰   r   r   r7   ro   FrÏ   r  r  r   r   r   Ú%test_single_model_2d_array_parameters�  s    "þÿÿ$zATestParameterInitialization.test_single_model_2d_array_parametersc                 C   s   t  ddgddgddgg¡}t  ddgd	d
gddgg¡}t||ƒ}t|ƒdksRt‚|jdks`t‚t  |jddgddgddgggddgd	d
gddggggk¡s t‚t  |jddddddddd	d
ddgk¡sÌt‚|j	j
dksÜt‚|jj
dksìt‚t|j|jƒ}t|ƒdk�st‚|jdk�st‚t  |jdddgdddgggdd	dgdd
dggggk¡�sZt‚t  |jdddddddd	ddd
dgk¡�sˆt‚|j	j
dk�sšt‚|jj
dk�s¬t‚d}tjt|d�� t||jƒ W 5 Q R X tjt|d�� t|j|ƒ W 5 Q R X d S )Nrœ   rp   rˆ   r‰   rŠ   r‹   r   r   r7   ro   r‘   r’   F©r7   r   ©r   r7   r  r>   )rC   rE   r*   r  rD   r  rF   r
  rŽ   r,   rÐ   r-   r  rG   rH   r   )r   r,   r-   r  Út2rM   r   r   r   Ú*test_single_model_2d_non_square_parametersŸ  sN    ýÿ
þÿÿ,þÿÿ
.ÿzFTestParameterInitialization.test_single_model_2d_non_square_parametersc                 C   sÚ   t dddgdddggddd	gƒ}t|ƒdks0t‚|jd
ks>t‚t|jƒdksPt‚t |jjtj¡sft‚t 	|jd dddgdddgggk¡s�t‚t 	|jd ddd	ggk¡s°t‚t 	|j
ddddddddd	g	k¡sÖt‚d S )Nrœ   rp   rˆ   r‰   rŠ   r‹   r   r   r7   Fr   )r*   r  rD   r  r
  rC   r  rq   r  rF   rŽ   r  r   r   r   Ú-test_single_model_2d_broadcastable_parametersÐ  s     ÿÿÿ zITestParameterInitialization.test_single_model_2d_broadcastable_parameters)r®   r¸   rÁ   r   r   r7   ro   r‘   c              	   C   s,   t jtdd�� t||dd� W 5 Q R X d S )Nz.*r>   r   r°   r  )r   r®   r¸   r   r   r   Ú*test_two_model_incorrect_scalar_parametersß  s    zFTestParameterInitialization.test_two_model_incorrect_scalar_parametersr.   r±   r  r   ©r±   r  c                 C   s”   t ddgddgf|Ž}t|ƒdks&t‚|jdks4t‚t |jddgddggk¡sTt‚t |jddddgk¡spt‚|jj	dks€t‚|j
j	dks�t‚d S )Nrœ   rp   r   r   r   r  r  ©r   r.   r  r   r   r   Ú test_two_model_scalar_parametersí  s    	 z<TestParameterInitialization.test_two_model_scalar_parametersc              	   C   sì   t ddgddgddggf|Ž}t|ƒdks.t‚|jdks<t‚t|jƒdksNt‚t |jjtj¡sdt‚t 	|jd dgdggk¡s„t‚t 	|jd ddgddggk¡s¨t‚t 	|j
ddddddgk¡sÈt‚|jjdksØt‚|jjd	ksèt‚d S )
Nrœ   rp   r   r   r7   ro   r   r  rÏ   )r*   r  rD   r  r
  rC   r  rq   r  rF   rŽ   r,   rÐ   r-   r%  r   r   r   Ú*test_two_model_scalar_and_array_parametersþ  s    	 $ zFTestParameterInitialization.test_two_model_scalar_and_array_parametersc                 C   s–  t ddgddggddgddggdd	�}t|ƒdks6t‚|jd
ksDt‚t |jddgddggddgddgggk¡stt‚t |jddddddddgk¡s˜t‚|jj	dks¨t‚|j
j	dks¸t‚t dddgdddggdddgdddggdd	�}t|ƒdksöt‚|jd
k�st‚t |jdddgdddggdddgdddgggk¡�s@t‚t |jddddddddddddgk¡�snt‚|jj	dk�s€t‚|j
j	dk�s’t‚d S )Nrœ   rp   rˆ   r‰   r   r   r7   ro   r°   r   rÏ   rŠ   r‹   r‘   r’   r  r  )r   r  r   r   r   r   Ú"test_two_model_1d_array_parameters  s4    &þÿÿ$.þÿÿ
.z>TestParameterInitialization.test_two_model_1d_array_parametersc                 C   sŠ  d}t jt|d��@ tddgddggddgd	d
gggdddgdddggdd� W 5 Q R X 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�}t|ƒdksžt‚|jdks¬t‚t|jƒdks¾t‚t 	|jj
tj¡sÔt‚t |jd ddgddggddgddgggk¡�s
t‚t |jd ddggddgggk¡�s4t‚t |jddddddddddddgk¡�sbt‚|jjdk�stt‚|jjdk�s†t‚d S )Nr  r>   r   r   r7   ro   r‘   r’   r“   ræ   rè   rœ   r¤   r¥   r¦   r§   r°   rp   rˆ   r‰   rŠ   r‹   rŒ   éP   r   ©r   r   r   rÏ   )rG   rH   r   r*   r  rD   r  r
  rC   r  rq   r  rF   rŽ   r,   rÐ   r-   )r   rM   r  r   r   r   Ú/test_two_model_mixed_dimension_array_parameters/  s,    ÿý  ÿ6*.zKTestParameterInitialization.test_two_model_mixed_dimension_array_parametersc                 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�}t|ƒd
ksVt‚|jdksdt‚t |j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‚t |jddddddddd	d
ddddddgk¡sèt‚|jj	dksøt‚|j
j	dk�s
t‚d S )Nrœ   rp   rˆ   r‰   rŠ   r‹   rŒ   r)  r   r   r7   ro   r‘   r’   r“   ræ   r°   r   r*  r  r  r   r   r   Ú"test_two_model_2d_array_parametersI  s&    ýþÿÿ(ÿz>TestParameterInitialization.test_two_model_2d_array_parametersc                 C   sŠ  t  dddgdddggdddgddd	ggg¡}t  |d
d¡}t  dddgdddgg¡}t  |d
d¡}t||ddd�}t|ƒdks„t‚|jdks’t‚t|jƒdks¤t‚t  |jj	t j
¡sºt‚t  |jd
 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  |jd ddgddgddgggk¡�s(t‚t  |jdddddddddddd	ddddddgk¡�sbt‚|jjdk�stt‚|jjdk�s†t‚d S )Nrœ   rp   rˆ   r‰   rŠ   r‹   rŒ   r)  éZ   r   r7   r   r   ro   r‘   éÿÿÿÿr$  )r   r7   r   r  )rC   rE   Zrollaxisr*   r  rD   r  r
  r  rq   r  rF   rŽ   r,   rÐ   r-   )r   r,   r-   r  r   r   r   Ú%test_two_model_nonzero_model_set_axis^  s0    .þÿÿ.&ÿÿ
zATestParameterInitialization.test_two_model_nonzero_model_set_axisc              	   C   sp   d}t jt|d��  tddgddggddd� W 5 Q R X t jt|d��  tddgddggdd	d
� W 5 Q R X d S )Nú;Inconsistent dimensions for parameter .* for 2 model sets.*r>   r   r   r7   ro   )r   r7   ro   ©r,   r-   r±   r   ©r,   r-   r  r  rž   r   r   r   Útest_wrong_number_of_paramsy  s
    $z7TestParameterInitialization.test_wrong_number_of_paramsc              	   C   sp   d}t jt|d��  tddgddggddd� W 5 Q R X t jt|d��  tddgddggddd	� W 5 Q R X d S )
Nú6All parameter values must be arrays of dimension at .*r>   r   r   r7   ro   r1  r   r2  r  rž   r   r   r   Útest_wrong_number_of_params2€  s
    $z8TestParameterInitialization.test_wrong_number_of_params2c              	   C   sB   d}t jt|d��& tt ddgddgg¡ddd� W 5 Q R X d S )	Nr4  r>   r   r   r7   ro   r   ©r  ©rG   rH   r   r*   rC   rE   rž   r   r   r   Útest_array_parameter1‡  s    z1TestParameterInitialization.test_array_parameter1c              	   C   sB   d}t jt|d��& tt ddgddgg¡ddd	� W 5 Q R X d S )
Nr0  r>   r   r   r7   ro   )r   r   r¤   r   r6  r7  rž   r   r   r   Útest_array_parameter2Œ  s    z1TestParameterInitialization.test_array_parameter2c                 C   s¨   t ddgddggddgdd�}t|ƒdks.t‚|jjd	ks>t‚|jjd
ksNt‚t |jj	tj
¡sdt‚t |jd ddgddggk¡sˆt‚t |jd ddgk¡s¤t‚dS )z†
        Test multiple parameter model with array-valued parameters of the same
        size as the number of parameter sets.
        r   r   r7   ro   r‘   r’   Fr6  rÏ   r  r   N)r*   r  rD   r,   rÐ   r-   rC   r  r
  rq   r  rF   )r   Zt4r   r   r   Útest_array_parameter4‘  s    $z1TestParameterInitialization.test_array_parameter4N)r&   r'   r(   r/   r  r  r  r  r  r!  r"  rG   ÚmarkZparametrizer#  r&  r'  r(  r+  r,  r/  r3  r5  r8  r9  r:  r   r   r   r   r  b  sV   			1

ûþ

ýþ
	ýþ
r  c               
   C   sŒ   d} t  dddgdddgg¡}t  ddddgddddgg¡}G dd„ dtƒ}d	}t | ||f¡D ]&}tjt|d
�� ||Ž  W 5 Q R X q`dS )zª
    Tests that in a model with 3 parameters that do not all mutually broadcast,
    this is determined correctly regardless of what order the parameters are
    in.
    r7   r   r   ro   r‘   r’   c                   @   s&   e Zd Zeƒ Zeƒ Zeƒ Zdd„ ZdS )z3test_non_broadcasting_parameters.<locals>.TestModelc                 W   s   d S r   r   )r   r6   r   r   r   r%   °  s    z<test_non_broadcasting_parameters.<locals>.TestModel.evaluateN)r&   r'   r(   r   r®   r¸   Zp3r%   r   r   r   r   Ú	TestModel«  s   r<  zNParameter '.*' of shape .* cannot be broadcast with parameter '.*' of shape .*r>   N)rC   rE   r   Ú	itertoolsÚpermutationsrG   rH   r   )rô   rö   rù   r<  rM   r6   r   r   r   Ú test_non_broadcasting_parameters   s    
ÿr?  c                  C   sb   t j d¡ d¡} tddt jd�}| D ]6\}}t j |||ƒ|d d |t jd  d  ¡ q&d S )Nrp   )rœ   r   r.  r7   )r   r    r   r   r   )rC   ÚrandomZrandZreshaper   Úpir¢   r	  )Zparsr   r#   r$   r   r   r   Útest_setter½  s    rB  )-r/   rý   r=  Zunittest.mockZmockr×   ÚnumpyrC   rG   Zastropyr   rI   Zastropy.modelingr   r   Zastropy.modeling.corer   r   Zastropy.modeling.parametersr   r   r	   r
   Zastropy.utils.datar   Ú r   r   r   r   r*   r1   rN   rZ   r^   r_   rd   rg   rm   rs   rt   r  r  r?  rB  r   r   r   r   Ú<module>   sF   : 
    K2  @