
    IR-e                        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
 Zd Zd Z G d de          Z G d de          Z G d de          Z d Z!d Z"d Z# G d de          Z$ G d de$          Z% G d de%          Z&d Z'd Z( G d d          Z) G d  d!          Z* G d" d#          Z+d$ Z,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                     | S N vals    Flib/python3.11/site-packages/astropy/modeling/tests/test_parameters.pysetter1r          J    c                 @    |                     |            | |j        z  S r   )do_somethingp)r   models     r   setter2r       s"    	s=r   c                     | S r   r   r   s    r   getter1r   %   r   r   c                   j     e Zd ZdZdZ edee          Z ede	e          Z
d Z fdZd Z xZS )SetterModel   r   )defaultsettergetterc                     d S r   r   )selfvs     r   r   zSetterModel.do_something0       r   c                 r    || _         t                                                       || _        || _        d S r   )r   super__init__xcyc)r&   r,   r-   r   	__class__s       r   r+   zSetterModel.__init__3   s2    r   c                 $    ||z
  dz  ||z
  dz  z   S )Nr!   r   )r&   xyr,   r-   s        r   evaluatezSetterModel.evaluate9   s    B1}B1},,r   )__name__
__module____qualname__n_inputs	n_outputsr	   r   r   r,   r   r-   r   r+   r2   __classcell__r.   s   @r   r    r    )   s        HI	1WW	=	=	=B	1WW	=	=	=B      - - - - - - -r   r    c                   `     e Zd ZdZ e            Z e            Z fdZed             Z	 xZ
S )	TParModelz2
    A toy model to test parameters machinery
    c                 @     t                      j        d||d| d S )Ncoeffer   )r*   r+   )r&   r>   r?   kwargsr.   s       r   r+   zTParModel.__init__E   s-    4u44V44444r   c                     d S r   r   r=   s     r   r2   zTParModel.evaluateH       r   )r3   r4   r5   __doc__r	   r>   r?   r+   staticmethodr2   r8   r9   s   @r   r;   r;   =   su          IKKE	A5 5 5 5 5   \    r   r;   c                   >    e Zd Z edd          Zed             ZdS )	MockModelalpha*   namer"   c                      d S r   r   )argss    r   r2   zMockModel.evaluateP   rB   r   N)r3   r4   r5   r	   rG   rD   r2   r   r   r   rF   rF   M   sA        I7B///E  \  r   rF   c                     t          g d          } t          | t          j                  sJ | t          j        g d          k                                    sJ t          j        d | D                       sJ t          t          j        g d                    } t          | t          j                  sJ | t          j        g d          k                                    sJ t          j        d | D                       sJ d}t          j        t          |          5  t          d           d d d            n# 1 swxY w Y   t          dt          j
        z            dt          j
        z  k    sJ t          t          j        d                    } t          | t                    sJ | dk    sJ t          d          } t          | t                    sJ | dk    sJ t          d	          } t          | t                    sJ | dk    sJ t          t          j        d                    } t          | t                    sJ | dk    sJ t          t          j        d                    } t          | t                    sJ | dk    sJ t          t          j        d                    } t          | t                    sJ | dk    sJ t          t          j        d                    } t          | t                    sJ | dk    sJ d
}t          j        t          |          5  t          d           d d d            n# 1 swxY w Y   t          j        t          |          5  t          d           d d d            n# 1 swxY w Y    G d d          }d}t          j        t          |          5  t          |           d d d            d S # 1 swxY w Y   d S )Nr   r!      c                 8    g | ]}t          |t                    S r   
isinstancefloat.0r   s     r   
<listcomp>z!test__tofloat.<locals>.<listcomp>Z   "    ;;;c:c5));;;r   c                 8    g | ]}t          |t                    S r   rQ   rT   s     r   rV   z!test__tofloat.<locals>.<listcomp>^   rW   r   z/Parameter of .* could not be converted to floatmatchtestr   rO         @z7Expected parameter to be of numerical type, not booleanTFc                       e Zd ZdS )test__tofloat.<locals>.ValueN)r3   r4   r5   r   r   r   Valuer^      s        r   r_   z2Don't know how to convert parameter of .* to float)r
   rR   npndarrayarrayallpytestraisesr   um
asanyarrayrS   float32float64int32int64)valueMESSAGEr_   s      r   test__tofloatro   U   s   YYYEeRZ(((((RXiii(((--/////6;;U;;;<<<<<RXiii(())EeRZ(((((RXiii(((--/////6;;U;;;<<<<<@G	*'	:	:	:                 AGAC'''' R]1%%&&EeU#####A:::: QKKEeU#####A::::SMMEeU#####A::::RZ]]##EeU#####A::::RZ]]##EeU#####A::::RXa[[!!EeU#####A::::RXa[[!!EeU#####A:::: IG	*'	:	:	:                	*'	:	:	:                        DG	*'	:	:	:                   sH   &EE	E5MMM7NNNO%%O),O)c                     t          dd          } | j        dk    sJ t          j        t                    5  d| _        ddd           n# 1 swxY w Y   | j        du sJ d| _        | j        du sJ | j        du sJ d | _        d| _        | j        du sJ | j        J d	| _        | j        d	k    sJ d| _        | j        J | j        J d
| _        | j        d
k    sJ dS )z8Test if getting / setting of Parameter properties works.rG   r   r"   betaNFTc                     dS )Nr   r   )_s    r   <lambda>z+test_parameter_properties.<locals>.<lambda>   s    q r   rH   )   )	r	   rJ   rd   re   AttributeErrorfixedtiedminmax)r   s    r   test_parameter_propertiesr|      sH    	'1%%%A6W 
~	&	&                 7eAG7d????6U????[AFAF6U????5===AE5B;;;;AE5===5===AE5B;;;;;;s   AAAc                     t          dd          } d}d}| |z
  ||z
  k    sJ || z
  ||z
  k    sJ | |z  ||z  k    sJ || z  ||z  k    sJ | |z  ||z  k    sJ || z  ||z  k    sJ | dk     sJ | dk    sJ | | k    sJ | | k    sJ | | k    sJ |  | k    sJ t          |           t          |          k    sJ dS )	z0Test if the parameter arithmetic operators work.rG   rH   rq   g      E@rO   -   rv   N)r	   abs)parnumr   s      r   test_parameter_operatorsr      s+    GR
(
(
(C
C
C9c	!!!!9c	!!!!9c	!!!!9c	!!!!8sCx8sCx88888888#::::#::::#::::4C4<<<<s88s3xxr   c                   D    e Zd Z ed          Z ed          Zd ZdS )M1      ?rq         @c                      d S r   r   r   r   r   r2   zM1.evaluate   r(   r   N)r3   r4   r5   r	   m1am1br2   r   r   r   r   r      sG        
)C
 
 
 C
)C
 
 
 C    r   r   c                   &    e Zd Z ed          ZdS )M2      &@rq   N)r3   r4   r5   r	   m2cr   r   r   r   r               
)D
!
!
!CCCr   r   c                   &    e Zd Z ed          ZdS )M3      4@rq   N)r3   r4   r5   r	   m3dr   r   r   r   r      r   r   r   c                      t                      } | j        dk    sJ | j        dk    sJ | j        dk    sJ | j        dk    sJ dD ]}|| j        v sJ | j        dk    sJ d S )Nr   r   r   r   )r   r   r   r   )r   r   r   r   r   __dict__param_names)modkeys     r   test_parameter_inheritancer      s    
$$C7c>>>>7c>>>>7d????7d????+ # #cl"""""?:::::::r   c                      t                      } | j        d         d         t          dd          k    sJ | j        d         d         t          dd          k    sJ | j        d         d         t          dd          k    sJ | j        d	         d         t          dd
          k    sJ |                                  | j        t          j        g dt
          j                  k                                    sJ d S )Nr   slicer   r   r   r!   r   rO   r      )r   r   r      )dtype)	r   _param_metricsr   _parameters_to_array_parametersr`   rb   rj   rc   )r   s    r   test_param_metricr      s    
$$Ce$W-q!<<<<e$W-q!<<<<e$W-q!<<<<e$W-q!<<<<Orx(<(<(<BJOOOOTTVVVVVVVr   c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'd&S )'TestParametersc                 V   t          d          }t          |          }|                                }|                    d          }|                                 t          j        |d                   }|j        | _        t          |j
        d                   }t          j        |dz
            | _        t          j        ddd          | _        t!          j                    | _        |j        | _        |j        | _        t-          j        |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!   rO   r   )meanstddevN)r   openreadsplitcloser   IdentifyRecordr>   icoeffintfieldsr   Chebyshev1Dr   
Gaussian1Dgmodelr   LinearLSQFitterlinear_fitterr0   zr1   r`   rb   yy)r&   	test_fileflinesreclistrecordr   s          r   setup_classzTestParameters.setup_class   s     **@AA	OO++g&&				(44lFM'*++'	22
'!<<<$466(FHfh/00r   c                 n    g d| j         _        | j         j        g dk                                    sJ dS )z'Tests updating parameters using a list.)   (   2   <   F   )g      >@g      D@g      I@r   r   Nr   
parametersrc   r&   s    r   test_set_parameters_as_listz*TestParameters.test_set_parameters_as_list  sC     !5 4 4

%)C)C)CCHHJJJJJJJr   c                     t          j        g d          | j        _        | j        j        g dk                                    sJ dS )z)Tests updating parameters using an array.)rO   r            )r\   g      @r   g      @g      @N)r`   rb   r   r   rc   r   s    r   test_set_parameters_as_arrayz+TestParameters.test_set_parameters_as_array  sK     !# 9 9

%)B)B)BBGGIIIIIIIr   c                 j    d| j         _        | j         j        g dk                                    sJ dS )z(Tests updating parameters using a tuple.r   r!   rO   r   r   Nr   r   s    r   test_set_as_tuplez TestParameters.test_set_as_tuple  s:     !0

%8==???????r   c                     g d| j         _        d| j         _        | j         j        g dk                                    sJ dS )z{
        Tests updating the parameters attribute when a model's
        parameter (in this case coeff) is updated.
        )r           r   r   r   r   )r   r   r   r   r   N)r   r   c0rc   r   s    r   test_set_model_attr_seqz&TestParameters.test_set_model_attr_seq  sL     !4 3 3


%)<)<)<<AACCCCCCCr   c                 j    d| j         _        | j         j        g dk                                    sJ dS )z>Update the parameter list when a model's parameter is updated.r   )r   rO   r   N)r   	amplituder   rc   r   s    r   test_set_model_attr_numz&TestParameters.test_set_model_attr_num"  s:     !"&)))388:::::::r   c                     g d| j         _        | j         j        }d|d<   || j         _        | j         j        g dk                                    sJ | j         j        dk    sJ dS )z%Update the parameters using indexing.r         $@r   )
   r!   rO   r   r   r   N)r   r   rc   r   )r&   tpars     r   test_set_itemzTestParameters.test_set_item(  ss     !0
z$Q $

%)9)9)99>>@@@@@z}""""""r   c                     d}t          j        t          |          5  g d| j        _        ddd           dS # 1 swxY w Y   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: .*rY   rN   N)rd   re   r   r   r   r&   rn   s     r   test_wrong_size1zTestParameters.test_wrong_size12  s     Y 	 ].g>>> 	. 	.$-IIDJ!	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.   :>>c                     d}t          j        t          |          5  g d| j        _        ddd           dS # 1 swxY w Y   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 .*rY   rN   N)rd   re   r   r   r   r   s     r   test_wrong_size2zTestParameters.test_wrong_size2>  s     	 ].g>>> 	& 	&%IIDJM	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&r   c                     d}t          j        t          |          5  ddg| j        _        ddd           dS # 1 swxY w Y   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 .*rY   r   r!   N)rd   re   r   r   r   r   s     r   test_wrong_shapezTestParameters.test_wrong_shapeK  s     	 ].g>>> 	+ 	+%&FDK!	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+r   c                     |                      | j        | j        | j                  }t          j                            |j        t	          j        g d          d           dS )z[
        Test the fitter modifies model.parameters.

        Uses an iraf example.
        )g`Nڲ@gg'Ǎ@g$:PH)@gi#6gg+?g{Gz?)rtolN)	r   r   r0   r1   r`   testingassert_allcloser   rb   )r&   	new_models     r   test_par_against_irafz$TestParameters.test_par_against_irafX  ss     &&tz4646BB	

"" H     	# 	
 	
 	
 	
 	
r   c                     ddddd}t          j        di |}t          j                            |j        g d           d S )	N            )r   c1c2c3rO   )r   r   r   r   )rO   )r   Polynomial1Dr`   r   assert_equalr   )r&   dp1s      r   testPolynomial1DzTestParameters.testPolynomial1Dn  sP    Rr44 ((a((

/?/?/?@@@@@r   c                 .   t          j        dd          }t          j                            |j        g d           t          j                            |j        g d           g d|_        t          j                            |j        g d           d S )NrO   n_models)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   assert_array_equalr   r&   r   s     r   test_poly1d_multiple_setsz(TestParameters.test_poly1d_multiple_setss  s     Q///

MEEE	
 	
 	
 	
%%beYYY777

MHHH	
 	
 	
 	
 	
r   c                     t          j        dd          }ddg|j        dd<   t          j                            |j        g d           dS )z5
        Test assigning to a parameter slice
        rO   r   r   Nr!   )r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r`   r   r   r   r   s     r   test_par_slicingzTestParameters.test_par_slicing~  s^      Q///Hbqb	

MGGG	
 	
 	
 	
 	
r   c                     t          j        d          }d|_        t          j                            |j        g d           d S )NrO   )degreer   )
r   r   r   r   r   r   r   r   r   r   )r   Polynomial2Dc0_0r`   r   r   r   )r&   p2s     r   test_poly2dzTestParameters.test_poly2d  sC     ***

/M/M/MNNNNNr   c                     ddgddgddgddgddgddgd}t          j        di |}t          j                            |j        g d           d S )	Nr!   rO   r   r   r   )r  c1_0c2_0c0_1c0_2c1_1)r!   rO   r   r!   r   r   r   r   r!   r!   r   r   r!   )r   r  r`   r   r   r   )r&   kwr  s      r   test_poly2d_multiple_setsz(TestParameters.test_poly2d_multiple_sets  sw    FFFFFF
 
  ))b))

/S/S/STTTTTr   c                 z    t          j        d          }d|_        |j        dk    sJ |j        j        dk    sJ d S Nr!   rO   )r   Shiftoffsetrm   )r&   sh1s     r   test_shift_model_parameters1dz,TestParameters.test_shift_model_parameters1d  sA    l1oo
zQz1$$$$$$r   c                     t          j        ddg          }ddg|_        t          j        |j        ddgk              sJ t          j                            |j        j        ddg           d S r  )r   Scalefactorr`   rc   r   r   rm   )r&   sc1s     r   test_scale_model_parametersndz,TestParameters.test_scale_model_parametersnd  sh    lAq6""V
vcjQF*+++++

%%cj&6A?????r   c                 t   t          d          }|j        dk    sJ t          dd          }|j        dk    sJ d}t          j        t          |          5  t          ddd	           d d d            n# 1 swxY w Y   t          j        t          |          5  t          ddd
           d d d            n# 1 swxY w Y   t          j        t          |          5  t          dddd           d d d            n# 1 swxY w Y   t          dg d          }|j        dcxk    r|j        k    sn J d}t          j        t          |                    d                    5  d|_        d d d            n# 1 swxY w Y   t          j        t          |                    d                    5  d|_        d d d            n# 1 swxY w Y   d|_        |j        dcxk    r|j        k    sn J dt          j	        z  dt          j	        z  f|_        |j        dcxk    r|j        k    sn J d S )Nr   r!   )boundsr   r!   )rz   r{   z=bounds may not be specified simultaneously with min or max .*rY   r[   )r  rz   rJ   )r  r{   rJ   )r  rz   r{   rJ   r   r!   rO   r   rI   )NNz'{} value must be a number or a QuantityMin)r[   NMax)Nr[   )
r	   r  rd   re   
ValueError_bounds	TypeErrorformatrf   rg   r&   paramrn   s      r   test_boundszTestParameters.test_bounds  s   (((|v%%%%aQ'''|v%%%% S]:W555 	9 	9V8888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9]:W555 	9 	9V8888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9]:W555 	@ 	@V????	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ v|||<<<||<<<<u}<<<<<< <]9GNN5,A,ABBB 	* 	*)EL	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*]9GNN5,A,ABBB 	* 	*)EL	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* |v6666666666 ACQS)|v666666666666sZ   A88A<?A<B==CC#DD
D,F  FF9GGGc                 P   t          dg d          }|j        g dk                                    sJ d}t          j        t
          |          5  d|t          dd          <   d d d            n# 1 swxY w Y   d}t          j        t
          |          5  t          j        d	g          |d
<   d d d            n# 1 swxY w Y   dd	g|t          dd          <   |j        g dk                                    sJ d|d<   |j        g dk                                    sJ d S )Nr[   rN   rI   z<Slice assignment outside the parameter dimensions for 'test'rY   r!   r   z?Input dimension 3 invalid for 'test' parameter with dimension 1r   rO   r   )r   r   rO   r   r   r   r   )	r	   rm   rc   rd   re   r   r   r`   rb   r#  s      r   test_modify_valuez TestParameters.test_modify_value  s   vyyy999yyy(--///// R].g>>> 	# 	#!"E%1++	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# U].g>>> 	% 	%x}}E!H	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%  VeAqkkyyy(--///// ayyy(--///////s$   A22A69A6B??CCc                 $   t          dg d          }|j        J d}t          j        t          |          5  |                    t          j                   d d d            n# 1 swxY w Y   |                    t          j        d           |j        t          j        k    sJ d}t          j        t          |          5  |                    t          j        d           d d d            n# 1 swxY w Y   d|_	        |                    t          j        d           |j
        t          j        k    sJ d}t          j        t          |          5  |                    t          j                   d d d            d S # 1 swxY w Y   d S )	Nr[   rN   rI   z.Cannot attach units to parameters that were .*rY   Tz>This parameter does not support the magnitude units such as .*z@Cannot change the unit attribute directly, instead change the .*)r	   unitrd   re   r  	_set_unitrf   rg   ABmag_mag_unitKr#  s      r   test__set_unitzTestParameters.test__set_unit  s*   vyyy999z!!! D]:W555 	! 	!OOAC   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	T"""zQS     T]:W555 	+ 	+OOAGT***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 
&&&{ag%%%% V]:W555 	! 	!OOAC   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s5    A&&A*-A*!C22C69C6 FF	F	c                 :   t          dg d          }|j        J |j        J t          dg dt          j                  }|j        t          j        k    sJ |j        t          j        g d          t          j        z  k                                    sJ d S )Nr[   rN   rI   )rJ   r"   r*  )r	   r*  quantityrf   rg   r`   rb   rc   r&   r$  s     r   test_quantityzTestParameters.test_quantity  s    vyyy999z!!!~%%%vyyyqsCCCzQS    "(999"5"5";;@@BBBBBBBr   c                    t          dg d          }|j        dk    sJ d}t          j        t          |          5  d|_        d d d            n# 1 swxY w Y   d|_        |j        dk    sJ |j        d	d
gddggk                                    sJ t          dd	          }|j        dk    sJ d}t          j        t          |          5  d|_        d d d            n# 1 swxY w Y   d|_        t          dt          j        d	g                    }|j        dk    sJ t          j        t          |          5  d|_        d d d            n# 1 swxY w Y   d|_        d S )Nr[   r  rI   )r   z,cannot reshape array of size 4 into shape .*rY   )r   r!   r!   r   r!   rO   r   r   z-Cannot assign this shape to a scalar quantity)r   )	r	   shaperd   re   r  rm   rc   r`   rb   r#  s      r   
test_shapezTestParameters.test_shape  s:   v|||<<<{d""""A]:W555 	 	EK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 {f$$$$AA//4466666 vq111{b    B]:W555 	 	EK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 vrx}}==={d""""]:W555 	 	EK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s5   AAAC%%C),C)EEEc                     t          dg d          }|j        dk    sJ t          ddg          }|j        dk    sJ t          dd          }|j        dk    sJ d S )Nr[   r  rI   r   r   )r	   sizer3  s     r   	test_sizezTestParameters.test_size   so    v|||<<<zQvs333zQvq111zQr   c                     t          dg d          }|j        J |j        J d|_        |j        dcxk    r|j        k    sn J d S )Nr[   r  rI   r   )r	   std_stdr3  s     r   test_stdzTestParameters.test_std*  sj    v|||<<<y   z!!!	yA++++++++++++r   c                 
   t          dg d          }|j        du sJ |j        du sJ d}t          j        t
          |          5  d|_        d d d            n# 1 swxY w Y   d|_        |j        du sJ |j        du sJ d S )	Nr[   r  rI   FzValue must be booleanrY   rO   T)r	   rx   _fixedrd   re   r  r#  s      r   
test_fixedzTestParameters.test_fixed2  s    v|||<<<{e####|u$$$$ +]:W555 	 	EK	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 {d""""|t######s   AA"Ac                    t          dg d          }|j        du sJ |j        du sJ d}t          j        t
          |          5  t          j                    |_        d d d            n# 1 swxY w Y   d |_        |j        J |j        J d|_        |j        du sJ |j        du sJ t          j                    }||_        |j        |cxk    r|j        k    sn J d S )Nr[   r  rI   Fz/Tied must be a callable or set to False or NonerY   )	r	   ry   _tiedrd   re   r!  mkNonCallableMagicMock	MagicMock)r&   r$  rn   ry   s       r   	test_tiedzTestParameters.test_tiedA  sW   v|||<<<zU""""{e#### E]9G444 	3 	3022EJ	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 
z!!!{""" 
zU""""{e#### |~~
zT0000U[00000000s   A,,A03A0c                 `   t          dg d          }|j        J t          j                    }|                    |           |j        |k    sJ d}t          j        t          |          5  |                    t          j                               d d d            d S # 1 swxY w Y   d S )Nr[   r  rI   z*This decorator method expects a callable.*rY   )	r	   
_validatorrE  rG  	validatorrd   re   r  rF  )r&   r$  validrn   s       r   test_validatorzTestParameters.test_validatorZ  s    v|||<<<'''5((((?]:W555 	7 	7OOB355666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   /'B##B'*B'c                 8   t          dg d          }|j        J |j        J |                    t	          j                               t	          j                    }|                    |           |j        |k    sJ |                    t	          j                               |j        g k    sJ t	          j                    |_        t	          j                    }|                    |           |j        t	          j	        |j        |          gk    sJ d S Nr[   r  rI   )
r	   rJ  r   validaterE  rG  rK  call_args_list_modelcall)r&   r$  rK  rm   s       r   test_validatezTestParameters.test_validatef  s   v|||<<<'''{""" 	r|~~&&& LNN		"""9,,,,r|~~&&&'2---- |~~u'BGEL%,H,H+IIIIIIIr   c                     t          dg d          }|                                }||k                                    sJ t          |          t          |          k    sJ d S rO  )r	   copyrc   id)r&   r$  
copy_params      r   	test_copyzTestParameters.test_copy{  se    v|||<<<ZZ\\
#((*****%yyBzNN******r   c                 l   t          dg d          }|j        J |j        J |j        du sJ |j        g dk                                    sJ t          j                    }t          j                    }||_        ||_	        g d|_        t          j                    }t          j                    }t          j                    }t          j
                            t           d||g          5 }||_        |j        |cxk    r|j        k    sn J |j        |k    sJ |j	        |k    sJ |j        t          j        ||          t          j        ||          gk    sJ |j        g dk    sJ 	 d d d            n# 1 swxY w Y   ||_        ||_	        d|_        t          j                    }t          j                    }	t          j                    }
t          j        g d	          |	_        t          j        g d	          |
_        t          j
                            t           d|	|
g          5 }||_        |j        |cxk    r|j        k    sn J |j        |	k    sJ |j	        |
k    sJ |j        t          j        ||          t          j        ||          gk    sJ |j        g d	k                                    sJ 	 d d d            n# 1 swxY w Y   ||_        ||_	        d |_        t          j
                            t           d|	|
g          5 }||_        |j        |cxk    r|j        k    sn J |j        |	k    sJ |j	        |
k    sJ |j        t          j        ||          t          j        ||          gk    sJ |j        J 	 d d d            d S # 1 swxY w Y   d S )
Nr[   r  rI   F)r   r   r      _create_value_wrapper)side_effectT)	   r   r   r   )r	   r   rR  _model_required_valuerc   rE  rG  _setter_getterpatchobjectrQ  rS  r`   rb   return_valuerm   _default)r&   r$  r#   r$   model0setter0getter0mkCreatemodel1r   r   s              r   
test_modelzTestParameters.test_model  s   v|||<<<{"""|###$----,1133333 $||,..,..X__.Wg<N  
 
 	0 EK;&8888EL888888=G++++=G++++*''''/     <<<</////	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0  !%,..,..!x88!x88X__.Wg<N  
 
 	: EK;&8888EL888888=G++++=G++++*''''/     K???277999999	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: X__.Wg<N  
 
 	( EK;&8888EL888888=G++++=G++++*''''/     <''''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s9   1BE??FF7BKKK A;N))N-0N-c                    t          dd          }t          |j        t          j                  rJ |j        dk    sJ t          ddg          }t          |j        t          j                  rJ |j        dk    sJ t          ddgg          }t          |j        t          j                  rJ |j        dk    sJ t          dt          j        dg                    }t          |j        t          j                  rJ |j        dk    sJ t          dg d          }t          |j        t          j                  sJ |j        g dk                                    sJ t          ddgt          t                    }t          |j        t          j                  rJ |j        dk    sJ t          ddggt          t                    }t          |j        t          j                  rJ |j        dk    sJ t          dt          j        dg          t          t                    }t          |j        t          j                  rJ |j        dk    sJ d S )Nr[   r   rI   rN   )rJ   r"   r#   r$   )	r	   rR   rm   r`   ra   rb   rc   r   r   r3  s     r   
test_valuezTestParameters.test_value  sI   vq111ek2:66666{avs333ek2:66666{avu555ek2:66666{avrx}}===ek2:66666{avyyy999%+rz22222yyy(--/////vs77SSSek2:66666{avuWWUUUek2:66666{a1#ww
 
 
 ek2:66666{ar   c                     t          dg d          }|j        |j        k                                    sJ d|_        d|_        |j        dk    sJ d S )Nr[   r  rI   Tr   )r	   
_raw_valuerm   rc   ra  _internal_valuer3  s     r   test_raw_valuezTestParameters.test_raw_value  sg    v|||<<<  EK/4466666  !1$$$$$$r   c                    t          dg d          }d}t          j        t          |          5  |                    t
          j        t          j                               d d d            n# 1 swxY w Y   t          j	        dd          5 }|                    t
          j
        t          j                              |j        k    sJ |j        t          j        t
          j
                  gk    sJ 	 d d d            n# 1 swxY w Y   |                    d t          j                              J d	 }|                    |t          j                              |k    sJ d
 }|j        du sJ |                    |d           |k    sJ |j        du sJ d|_        t          j                    }t          j	                            t           dd          5 }|                    ||          |j        k    sJ 	 d d d            n# 1 swxY w Y   d }d}t          j        t          |          5  |                    |t          j                               d d d            d S # 1 swxY w Y   d S )Nr[   r  rI   z1A numpy.ufunc used for Parameter getter/setter .*rY   z'astropy.modeling.parameters._wrap_ufuncT)autospecc                     d S r   r   )as    r   wrapper1z;TestParameters.test__create_value_wrapper.<locals>.wrapper1
      Dr   c                     d S r   r   )rv  bs     r   wrapper2z;TestParameters.test__create_value_wrapper.<locals>.wrapper2  rx  r   Fpartialc                     d S r   r   )rv  rz  cs      r   wrapper3z;TestParameters.test__create_value_wrapper.<locals>.wrapper3   rx  r   z-Parameter getter/setter must be a function .*)r	   rd   re   r!  r\  r`   addrE  rG  rc  negativere  rQ  rS  r_  rd  	functools)	r&   r$  rn   mkWraprw  r{  r   	mkPartialr  s	            r   test__create_value_wrapperz)TestParameters.test__create_value_wrapper  s   v|||<<< G]9G444 	@ 	@''???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ X5
 
 
 	C++BKHH&' ' ' ' (RWR[-A-A,BBBBBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C **4@@HHH	 	 	 **8R\^^DDPPPP	 	 	 $----**8T::hFFFF$,,,, %X__Y	D_AA 	Y++He<<	@VVVVVV	 	 	 	 	 	 	 	 	 	 	 	 	 	 		 	 	 C]9G444 	B 	B''",..AAA	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	BsH   2A//A36A3A'DDD"HHH8(I--I14I1c                 $   t          dd          }|j        dk    sJ t          j        |          sJ |rnJ t          dd          }|j        dk    sJ t          j        |          rJ |rJ 	 t          dg d          }t          j        |j        g dk              sJ t          j        |          sJ |rnJ t          dg d          }t          j        |j        g dk              sJ t          j        |          rJ |rJ d S )	Nr[   r   rI   TFr   r  )r   r!   r   rO   r   )r	   rm   r`   rc   r3  s     r   	test_boolzTestParameters.test_bool'  sR   vq111{ave}} 	L vq111{a6%==    	L v|||<<<vek\\\122222ve}} 	L v???vek___4555556%==    	LKr   c                 r   t          dd          }t          |          dk    sJ t          dg d          }t          |          dk    sJ t          ddt          j        z            }t          |          dk    sJ t          dg dt          j        z            }t          |          dk    sJ d S )	Nr[   r   rI   z1.r  z[1., 2., 3., 4.]z1. mz[1., 2., 3., 4.] m)r	   r   rf   rg   r3  s     r   test_param_repr_onelinez&TestParameters.test_param_repr_onelineL  s    vq111!%((D0000 v|||<<<!%((,>>>>> vq13w777!%((F2222 v|||ac/ABBB!%((,@@@@@@@r   c                 4   d}t          j        t          |          5  t          ddt                     d d d            n# 1 swxY w Y   t          j        t          |          5  t          ddt
                     d d d            d S # 1 swxY w Y   d S )Nz$setter and getter must both be inputrY   r[   r   )rJ   r"   r$   )rJ   r"   r#   )rd   re   r  r	   r   r   )r&   msgs     r   test_getter_setterz!TestParameters.test_getter_setter]  s   4]:S111 	> 	>61W====	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>]:S111 	> 	>61W====	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s#   AA	A(BBBN)(r3   r4   r5   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r%  r(  r0  r4  r8  r;  r?  rB  rH  rM  rT  rY  rl  rn  rr  r  r  r  r  r   r   r   r   r      sk       1 1 10K K KJ J J@ @ @D D D; ; ;# # #
. 
. 
.& & &+ + +
 
 
,A A A
	
 	
 	

 
 
O O O

U 
U 
U% % %@ @ @!7 !7 !7F0 0 0*! ! !8C C C  <  , , ,$ $ $1 1 12
7 
7 
7J J J*+ + +C( C( C(J!  !  ! F	% 	% 	%0B 0B 0Bd# # #JA A A"> > > > >r   r   c                   &    e Zd Zd Zd Zd Zd ZdS )TestMultipleParameterSetsc                     t          j        ddd          | _        t           j        d dd df         \  | _        | _        t          j        | j        | j        g          j        | _        t          j
        ddgddgdd	gd
          | _        d S )Nr   r   g?r   r         @@皙?ffffff?r!   )r   r   )r`   arangex1mgridr1   r0   rb   Tx11r   r   r   r   s    r   r   z%TestMultipleParameterSets.setup_classf  s    )Ar3''#2#rr'*8TWdg.//1'HsCj#sa
 
 
r   c           	          ddg| j         _        t          j                            | j         j        t          j        ddgddgddgg                     t          j        | j         j        g d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   r   r  r  r  r  N	r   r   r`   r   assert_almost_equal
param_setsrb   rc   r   r   s    r   test_change_parz)TestMultipleParameterSets.test_change_parn  s     "#B

&&K"H"I#J#J 		
 		
 		
 	t{%)H)H)HHIIIIIr   c           	          d| j         j        d<   t          j                            | j         j        t          j        ddgddgddgg                     t          j        | j         j        g d	k               d
S )zg
        Test that a change to one single parameter in a set propagates to
        param_sets.
        r   r   r   r   r  r  r  r  )r   r   r  r  r  r  Nr  r   s    r   test_change_par2z*TestMultipleParameterSets.test_change_par2  s    
 $&a 

&&K"H2J#J#J 		
 		
 		
 	t{%)I)I)IIJJJJJr   c                     g d| j         _        t          j                            | j         j        j        ddg           t          j                            | j         j        j        ddg           d S )N)r   r   r^  r  r  r  g      *@r   g      "@r  )r   r   r`   r   r  r   rm   r   r   s    r   test_change_parametersz0TestMultipleParameterSets.test_change_parameters  s`    !;!;!;

&&t{'<'BT4LQQQ

&&t{'7'=SzJJJJJr   N)r3   r4   r5   r   r  r  r  r   r   r   r  r  e  s[        
 
 
J J J"K K K$K K K K Kr   r  c            
          e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
ej                            d	d
dddgfddgdfg dddgfddgg dfg          d             Zej                            dddiddidddg          d             Zej                            dddiddidddg          d             Zd Zd Zd Zd Zd Zd Zd  Zd! Zd" Zd#S )$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                 6   t          dd          }t          |          dk    sJ |j        du sJ t          j        |j        dgdggk              sJ t          j        |j        ddgk              sJ |j        j        dk    sJ |j	        j        dk    sJ d S )Nr   r   Fr   
r;   lenmodel_set_axisr`   rc   r  r   r>   r7  r?   r&   ts     r   #test_single_model_scalar_parametersz?TestParameterInitialization.test_single_model_scalar_parameters  s    b!1vv{{{{5((((valtaSk122222valr1g-.....w}""""syBr   c                    t          dddg          }t          |          dk    sJ |j        du sJ t          j        |j        j        t          j                  sJ t          |j                  dk    sJ t          j        |j        d         dgk              sJ t          j        |j        d         ddggk              sJ t          j        |j	        g dk              sJ |j
        j        dk    sJ |j        j        dk    sJ d S )	Nr   r   r!   Fr   )r   r   r!   r   r  )r;   r  r  r`   
issubdtyper  r   object_rc   r   r>   r7  r?   r  s     r   -test_single_model_scalar_and_array_parameterszITestParameterInitialization.test_single_model_scalar_and_array_parameters  s   b1a&!!1vv{{{{5((((}Q\/<<<<<1<  A%%%%val1o"-.....val1o1a&122222valjjj011111w}""""syD      r   c                 F   t          ddgddg          }t          |          dk    sJ |j        du sJ t          j        |j        ddggddgggk              sJ t          j        |j        g dk              sJ |j        j        dk    sJ |j	        j        dk    sJ d S )Nr   r   r   r!   Fr   r   r   r!   r  r  r  s     r   %test_single_model_1d_array_parameterszATestParameterInitialization.test_single_model_1d_array_parameters  s    r2hA''1vv{{{{5((((valRzQF8&<<=====valnnn455555w}$$$$syD      r   c                     d}t          j        t          |          5  t          ddgg d           d d d            d S # 1 swxY w Y   d S )NJParameter .* of shape .* cannot be broadcast with parameter .* of shape .*rY   r   r!   rO   r   r   rd   re   r   r;   r   s     r   6test_single_model_1d_array_different_length_parameterszRTestParameterInitialization.test_single_model_1d_array_different_length_parameters  s     	 ].g>>> 	) 	)q!fiii(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   A  AAc                 f   t          ddgddggddgddgg          }t          |          dk    sJ |j        d	u sJ t          j        |j        ddgddgggddgddggggk              sJ t          j        |j        g d
k              sJ |j        j        dk    sJ |j	        j        dk    sJ d S )Nr   r   r   r   r   r!   rO   r   Fr   r   r   r   r   r!   rO   r   r6  r  r  s     r   %test_single_model_2d_array_parameterszATestParameterInitialization.test_single_model_2d_array_parameters  s    Bx"b*aVaV,<==1vv{{{{5((((vLr(RH%&a&1a&!"
 
 	
 	
 	
 val&B&B&BBCCCCCw}&&&&syF""""""r   c                 P   t          j        ddgddgddgg          }t          j        ddgd	d
gddgg          }t          ||          }t          |          dk    sJ |j        du sJ t          j        |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J t          j        |j        g dk              sJ |j        j	        dk    sJ |j
        j	        dk    sJ t          |j        |j                  }t          |          dk    sJ |j        du sJ t          j        |j        g dg dggg dg dgggk              sJ t          j        |j        g dk              sJ |j        j	        dk    sJ |j
        j	        dk    sJ d}t          j        t          |          5  t          ||j                   d d d            n# 1 swxY w Y   t          j        t          |          5  t          |j        |           d d d            d S # 1 swxY w Y   d S )Nr   r   r   r   r   r   r   r!   rO   r   r   r   Fr   r   r   r   r   r   r   r!   rO   r   r   r   rO   r!   )r   r   r   )r   r   r   )r   rO   r   )r!   r   r   )r   r   r   r   r   r   r   rO   r   r!   r   r   r!   rO   r  rY   )r`   rb   r;   r  r  rc   r  r   r>   r7  r?   r  rd   re   r   )r&   r>   r?   r  t2rn   s         r   *test_single_model_2d_non_square_parameterszFTestParameterInitialization.test_single_model_2d_non_square_parameters  s*   RRR
 
 Hq!fq!fq!f-..eQ1vv{{{{5((((vLr(RHr2h/0a&1a&1a&)*
 
 	
 	
 	
 val&P&P&PPQQQQQw}&&&&syF""""uw$$2ww!|||| E))))vM,,-.))YYY'(
 
 	
 	
 	
 vbm'Q'Q'QQRRRRRx~''''tzV#### 	 ].g>>> 	" 	"eQS!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" ].g>>> 	" 	"egq!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s$   0GGG8HH"Hc                    t          g dg dgg d          }t          |          dk    sJ |j        du sJ t          |j                  dk    sJ t	          j        |j        j        t          j                  sJ t	          j        |j        d         g dg dggk              sJ t	          j        |j        d         g dgk              sJ t	          j        |j	        g dk              sJ d S )	Nr   r   r   r   r   r   rN   r   Fr!   r   )	r   r   r   r   r   r   r   r!   rO   )
r;   r  r  r  r`   r  r   r  rc   r   r  s     r   -test_single_model_2d_broadcastable_parameterszITestParameterInitialization.test_single_model_2d_broadcastable_parameters  s   |||\\\2III>>1vv{{{{5((((1<  A%%%%}Q\/<<<<<vLO|||,
 
 	
 	
 	
 val1o)))455555val&G&G&GGHHHHHHHr   )r   r  r  r   r!   rO   rN   r   r   r  c                     t          j        t          d          5  t          ||d           d d d            d S # 1 swxY w Y   d S )Nz.*rY   r!   r   r  )r&   r   r  s      r   *test_two_model_incorrect_scalar_parameterszFTestParameterInitialization.test_two_model_incorrect_scalar_parameters  s     ].e<<< 	* 	*b"q))))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   <A A r@   r   r  r   r   r  c                 B   t          ddgddgfi |}t          |          dk    sJ |j        dk    sJ t          j        |j        ddgddggk              sJ t          j        |j        g dk              sJ |j        j        dk    sJ |j	        j        dk    sJ d S )Nr   r   r   r!   r   r  r  r  r&   r@   r  s      r    test_two_model_scalar_parametersz<TestParameterInitialization.test_two_model_scalar_parameters"  s     r2hA11&111vv{{{{1$$$$valBx!Q&8899999valnnn455555w}$$$$syD      r   c                 2   t          ddgddgddggfi |}t          |          dk    sJ |j        dk    sJ t          |j                  dk    sJ t	          j        |j        j        t          j                  sJ t	          j        |j        d         dgdggk              sJ t	          j        |j        d         ddgddggk              sJ t	          j        |j	        g dk              sJ |j
        j        d	k    sJ |j        j        d
k    sJ d S )Nr   r   r   r!   rO   r   r   )r   r   r   r!   rO   r   r  r6  )r;   r  r  r  r`   r  r   r  rc   r   r>   r7  r?   r  s      r   *test_two_model_scalar_and_array_parameterszFTestParameterInitialization.test_two_model_scalar_and_array_parameters3  s8    r2h!Q!Q 0;;F;;1vv{{{{1$$$$1<  A%%%%}Q\/<<<<<val1o2$566666val1o1a&1a&)99:::::val&:&:&::;;;;;w}$$$$syF""""""r   c                    t          ddgddggddgddggd	          }t          |          dk    sJ |j        d
k    sJ t          j        |j        ddgddggddgddgggk              sJ t          j        |j        g dk              sJ |j        j        dk    sJ |j	        j        dk    sJ t          g dg dgg dg dgd	          }t          |          dk    sJ |j        d
k    sJ t          j        |j        g dg dgg dg dggk              sJ t          j        |j        g dk              sJ |j        j        dk    sJ |j	        j        dk    sJ d S )Nr   r   r   r   r   r!   rO   r   r   r   r  r6  r  r  rN   r'  r  r  r  )r&   r  r  s      r   "test_two_model_1d_array_parametersz>TestParameterInitialization.test_two_model_1d_array_parametersG  s   Bx"b*aVaV,<qIII1vv{{{{1$$$$vLbB8$Q!Q 
 
 	
 	
 	
 val&B&B&BBCCCCCw}&&&&syF""""lll3iii5KVWXXX2ww!|||| A%%%%vM|||,III&
 
 	
 	
 	
 vbm'Q'Q'QQRRRRRx~''''tzV######r   c                     d}t          j        t          |          5  t          ddgddggddgd	d
gggg dg dgd           d d d            n# 1 swxY w Y   t          ddgddggddgddgggddgddggd          }t	          |          dk    sJ |j        dk    sJ t	          |j                  dk    sJ t          j        |j        j	        t          j
                  sJ t          j        |j        d         ddgddggddgddgggk              sJ t          j        |j        d         ddggddgggk              sJ t          j        |j        g dk              sJ |j        j        dk    sJ |j        j        dk    sJ d S )Nr  rY   r   r!   rO   r   r   r   r   r[  )r^  r   r   )r   r   r   r   r   r   r   r   r   r   r   P   r   )r   r   r   r   r   r   r   r  r   r!   rO   r   r!   r!   r!   r6  )rd   re   r   r;   r  r  r  r`   r  r   r  rc   r   r>   r7  r?   )r&   rn   r  s      r   /test_two_model_mixed_dimension_array_parameterszKTestParameterInitialization.test_two_model_mixed_dimension_array_parametersd  s9    	 ].g>>> 	 	a&1a&!QFQF#34lll+   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 2hR!RHr2h#78Aq6Aq6:JUV
 
 
 1vv{{{{1$$$$1<  A%%%%}Q\/<<<<<val1oB8b"X*>"bBPR8@T)UUVVVVVval1oAq6(aVH)==>>>>>val&R&R&RRSSSSSw}	))))syF""""""s   'AAAc                    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
          }t          |          d
k    sJ |j        dk    sJ t          j        |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J t          j        |j        g dk              sJ |j        j        dk    sJ |j	        j        dk    sJ d S )Nr   r   r   r   r   r   r   r  r   r!   rO   r   r   r   r   r[  r   r   )r   r   r   r   r   r   r   r  r   r!   rO   r   r   r   r   r[  r  r  r  s     r   "test_two_model_2d_array_parametersz>TestParameterInitialization.test_two_model_2d_array_parameters~  sZ   2hR!RHr2h#78!fq!fAA/0
 
 

 1vv{{{{1$$$$vLr(RH%R2r(';<a&1a&!QFQF#34
 
 	
 	
 	
 vLTTTT
 
 	
 	
 	
 w}	))))syI%%%%%%r   c                 $   t          j        g dg dgg dg dgg          }t          j        |dd          }t          j        g dg dg          }t          j        |dd	          }t          ||d	d
          }t	          |          d	k    sJ |j        d
k    sJ t	          |j                  d	k    sJ t          j        |j        j        t           j	                  sJ t          j
        |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J t          j
        |j        d         ddgd	dgddgggk              sJ t          j
        |j        g dk              sJ |j        j        dk    sJ |j        j        dk    sJ d S )Nr  )r   r   r   )r   r   r   )r   r  Z   r   rO   rN   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   rO   r!   r   rO   r   )r!   rO   r!   r  )r`   rb   rollaxisr;   r  r  r  r  r   r  rc   r   r>   r7  r?   )r&   r>   r?   r  s       r   %test_two_model_nonzero_model_set_axiszATestParameterInitialization.test_two_model_nonzero_model_set_axis  s    <<<6|||8TUVVE1a((Hiii+,,K1a  eQ2>>>1vv{{{{2%%%%1<  A%%%%}Q\/<<<<<vLObB8b"X.bB8b"X.
 
 	
 	
 	
 val1oAq6Aq6Aq6*B)CCDDDDDvLQQQR
 
 	
 	
 	
 w}	))))syF""""""r   c                 8   d}t          j        t          |          5  t          ddgddggdd           d d d            n# 1 swxY w Y   t          j        t          |          5  t          ddgddggdd	
           d d d            d S # 1 swxY w Y   d S )N;Inconsistent dimensions for parameter .* for 2 model sets.*rY   r   r!   rO   r   )r!   rO   r   r>   r?   r   r   r>   r?   r  r  r   s     r   test_wrong_number_of_paramsz7TestParameterInitialization.test_wrong_number_of_params  sU   P].g>>> 	G 	GaVaV,	AFFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G].g>>> 	M 	MaVaV,	!LLLL	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M 	M#   AA
A)BBBc                 8   d}t          j        t          |          5  t          ddgddggdd           d d d            n# 1 swxY w Y   t          j        t          |          5  t          ddgddggdd	           d d d            d S # 1 swxY w Y   d S )
N6All parameter values must be arrays of dimension at .*rY   r   r!   rO   r   r  r   r  r  r   s     r   test_wrong_number_of_params2z8TestParameterInitialization.test_wrong_number_of_params2  sD   K].g>>> 	? 	?aVaV,A>>>>	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	? 	?].g>>> 	E 	EaVaV,!DDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Er  c                     d}t          j        t          |          5  t          t	          j        ddgddgg          dd           d d d            d S # 1 swxY w Y   d S )	Nr  rY   r   r!   rO   r   r   r  rd   re   r   r;   r`   rb   r   s     r   test_array_parameter1z1TestParameterInitialization.test_array_parameter1  s    K].g>>> 	G 	GbhAA/00!AFFFF	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G   +AAAc                     d}t          j        t          |          5  t          t	          j        ddgddgg          dd	           d d d            d S # 1 swxY w Y   d S )
Nr  rY   r   r!   rO   r   )r   r   r   r   r  r  r   s     r   test_array_parameter2z1TestParameterInitialization.test_array_parameter2  s    P].g>>> 	P 	PbhAA/00*QOOOO	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	Pr  c                    t          ddgddggddgd          }t          |          dk    sJ |j        j        d	k    sJ |j        j        d
k    sJ t          j        |j        j        t
          j	                  sJ t          j
        |j        d         ddgddggk              sJ t          j
        |j        d         ddgk              sJ dS )z
        Test multiple parameter model with array-valued parameters of the same
        size as the number of parameter sets.
        r   r!   rO   r   r   r   Fr  r6  r  r   N)r;   r  r>   r7  r?   r`   r  r  r   r  rc   )r&   t4s     r   test_array_parameter4z1TestParameterInitialization.test_array_parameter4  s     AA'!QFFF2ww!||||x~''''tzT!!!!}R]0"*=====vbmA&Aq6Aq6*::;;;;;vbmA&1a&01111111r   N)r3   r4   r5   rC   r  r  r  r  r  r  r  rd   markparametrizer  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r  r    s3          
! 
! 
!! ! !) ) )# # #/" /" /"bI I I [AKVQKYYAVYYY	
	 	* *	 	* [Oq!a00	
 ! ! ! [Oq!a00	
 
# 
# 
#$ $ $:# # #4& & &*# # #6M M ME E EG G G
P P P
2 2 2 2 2r   r  c                  @   d} t          j        g dg dg          }t          j        g dg dg          } G d dt                    }d}t          j        | ||f          D ]:}t          j        t          |          5   ||  d	d	d	           n# 1 swxY w Y   ;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.
    rO   rN   r'  r  c                   P    e Zd Z e            Z e            Z e            Zd ZdS )3test_non_broadcasting_parameters.<locals>.TestModelc                     d S r   r   )r&   rL   s     r   r2   z<test_non_broadcasting_parameters.<locals>.TestModel.evaluate  s    Fr   N)r3   r4   r5   r	   r   r  p3r2   r   r   r   	TestModelr    sD        Y[[Y[[Y[[	 	 	 	 	r   r  zNParameter '.*' of shape .* cannot be broadcast with parameter '.*' of shape .*rY   N)r`   rb   r   	itertoolspermutationsrd   re   r   )rv  rz  r~  r  rn   rL   s         r    test_non_broadcasting_parametersr    s    	
A
)))YYY'((A
,,,-..A    E   	  &1ay11  ].g>>> 	 	It	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 s    BB	B	c                  >   t           j                            d                              d          } t	          ddt           j                  }| D ]K\  }}t           j                             |||          |dz   dz  |t           j        dz  z
  dz  z              Ld S )Nr   )r   r!   r  rO   )r,   r-   r   r   r!   )r`   randomrandreshaper    pir   r  )parsr   r0   r1   s       r   test_setterr    s    9>>"%%g..D2!ru---E Y Y1

&&uuQ{{QUqLAPQ	MVWCW4WXXXXY Yr   ).rC   r  r  unittest.mockmockrE  numpyr`   rd   astropyr   rf   astropy.modelingr   r   astropy.modeling.corer   r   astropy.modeling.parametersr   r	   r
   r   astropy.utils.datar    r   r   r   r   r    r;   rF   ro   r|   r   r   r   r   r   r   r   r  r  r  r  r   r   r   <module>r     s-   
                          , , , , , , , , 6 6 6 6 6 6 6 6            5 4 4 4 4 4          
  - - - - -- - - -(               7 7 7t  @     2       " " " " " " " "" " " " " " " "; ; ;W W Wu	> u	> u	> u	> u	> u	> u	> u	>p/K /K /K /K /K /K /K /Kd{2 {2 {2 {2 {2 {2 {2 {2|	  :Y Y Y Y Yr   