
    IR-e                     T   d Z ddlZddlZddlmZ ddlmZmZ ddl	m
Z
mZmZ ddlmZ ddlmZ ej        dgfej        dgfej        dgfej        dgfej        dgfgZej        dgfej        d	dgfej        d	dgfgZej        ej        ej        ej        gZ G d
 d          Z  G d d          Z! G d d          Z" G d de
          Z# G d d          Z$ G d d          Z% G d de          Z& G d d          Z' ej(        d          dd	d	ggdd	d	ggd ej(        d          d	d	gdgd	d	gdgd ej)        d          dd	d	ggdd	d	ggd ej)        d          dd	d	ggd	d	gdgd ej)        dd          dd	d	gdgd	d	gdgd ej)        d          dd	d	ggdd	d	gdgd ej)        d           dd	d	ggdd	d	gd	d	ggd ej        d	d	!          dd	d	ggd	d	gd ej        d	d	!          dd	gd	d ej*        d	d	dd	d"          dd	d	ggd#d#gd ej*        d	d	dd	d"          dd	gd$d ej        d	d	!           ej        d	d!          z  g d%d&d ej        d	d	!           ej        d	d!          z  d	d	d	d	gd	d	ggd	ddgfdej+        ,                                 ej-         ej.        dd	d'          g          j/         ej0        d          g ej-        d(d(gd(d)gd(d*gd(d+gd(d,gg          dgZ1ej2        3                    d-e1          d.             Z4d/ Z5 G d0 d1e          Z6d2 Z7d3 Z8d4 Z9ej2        3                    d- ej*                     ej        d	           ej:                     ej;                     ej<         ej=        d5          6          g          ej2        >                    e d78          d9                         Z?ej2        3                    d- ej@                     ej        d	           ejA         ej=        d:          6          g          ej2        >                    e d78          d;                         ZBej2        3                    d- ej*                     ej        d	          z   ej@                     ej        d	          z   ej*                     ej        d	          z    ej*                     ej        d	          z
   ej*                     ej        d	          z   ej(        d           ej        d	          z   ej)        d<           ej        d	          z  g          d=             ZCej2        3                    d- ej(        d           ej)        d           ej)        d<          g          d>             ZDdS )?zD
This module tests fitting and model evaluation with various inputs
    N)assert_allclose)fittingmodels)Fittable1DModelFittableModelModel)	Parameter)	HAS_SCIPY      c                       e Zd ZdZd Zej                            de          d             Z	ej                            de
          d             ZdS )TestInputTypez
    This class tests that models accept numbers, lists and arrays.

    Add new models to one of the lists above to test for this.
    c                     d| _         d| _        t          j        ddd          | _        t          j        ddd          | _        t          j        d dd df         \  | _        | _        d S )Ng333333@g@r   
   皙?   )	xynparangex1y1mgridy2x2selfs    Alib/python3.11/site-packages/astropy/modeling/tests/test_input.pysetup_classzTestInputType.setup_class,   s_    )Ar3'')Ar3''8CRC!G,    )modelparamsc                 p     || } || j                     || j                    || j                   d S N)r   r   r   r   r!   r"   ms       r   test_input1DzTestInputType.test_input1D3   s>    E6N	$&				$'


	$'




r    c                      || } || j         | j                    || j        | j                    || j        | j                   d S r$   )r   r   r   r   r   r   r%   s       r   test_input2DzTestInputType.test_input2D:   sU    E6N	$&$&	$'47	$'47r    N)__name__
__module____qualname____doc__r   pytestmarkparametrizemodel1d_paramsr'   model2d_paramsr)    r    r   r   r   %   s         - - - [0.AA  BA [0.AA  BA  r    r   c                   z   e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zej                            e d
          ej                            de          d                         Zej                            e d
          ej                            de          d                         Zej                            e d
          ej                            de          d                         Zej                            e d
          ej                            de          d                         ZdS )TestFittingz/Test various input options to fitting routines.c                     t          j        d          | _        t           j        d dd df         \  | _        | _        d S )Nr   r   r   r   r   r   r   r   s    r   r   zTestFitting.setup_classE   5    )B--#2#ss(+r    c                    t          j        g d          }t          j        d          }g d|_         || j                  }t          j                    } ||| j        |          }t          |j        |d           dS )z1 set 1D x, 1pset)r   r   r   r      Hz>atolN)	r   arrayr   Polynomial1D
parametersr   r   LinearLSQFitterr   )r   expectedp1r   pfitr!   s         r   test_linear_fitter_1setz#TestFitting.test_linear_fitter_1setI   s     8LLL)) ##$R[[&((R"%%((DDDDDDr    c                    t          j        ddgddgddgddgg          }t          j        dd          }g d|_        i }t          d          D ]}||g||j        |         <   t          j        dddi|} || j        d	
          }t          j	                    } ||| j        |          }t          |j        |d           dS )z%1 set 1D x, 2 sets 1D y, 2 param_setsr   r   r   r:   n_models)        rI         ?rJ          @rK         @rL      model_set_axisFrN   r;   r<   N)r:   )r   r>   r   r?   r@   rangeparam_namesr   r   rA   r   
param_setsr   rB   rC   r"   ir   rD   r!   s           r   test_linear_fitter_Nsetz#TestFitting.test_linear_fitter_NsetT   s     8aVaVaVaV<== Q///@@@q 	/ 	/A)*AF2>!$%% ??1???R...&((R"%%((DDDDDDr    c                    t          j        g dg          j        }t          j        d          }g d|_         || j                  }t          j                    } ||| j        |          }t          |j
        |d           dS )z71 pset, 1 set 1D x, 1 set 1D y, Chebyshev 1D polynomial)g@g@g    C@gq@r:   )r   r   r   r:   {Gz?r<   N)r   r>   Tr   Chebyshev1Dr@   r   r   rA   r   rR   )r   rB   ch1r   rD   r!   s         r   test_linear_fitter_1dchebz%TestFitting.test_linear_fitter_1dchebc   s     8  	
 	
  	  ##%S\\&((S$'2&&((DDDDDDr    c                    t          j        g dg          j        }t          j        d          }g d|_         || j                  }t          j                    } ||| j        |          }t          |j
        |d           dS )zH
        1 pset, 1 set 1D x, 1 set 1D y, Legendre 1D polynomial
        )g    @g   @g    m@gv@r:   )r   r   r:   rM   -q=r<   N)r   r>   rX   r   
Legendre1Dr@   r   r   rA   r   rR   )r   rB   leg1r   rD   r!   s         r   test_linear_fitter_1dlegendz'TestFitting.test_linear_fitter_1dlegendw   s    
 8  	
 	
  	  ##&,,T$']]&((T47B''((EEEEEEr    c                 D   t          j        d          }g d|_        g d} || j        | j                  }t          j                    } ||| j        | j        |          }t          |j        |d           t           || j        | j                  |d           d S )Nr   )r   r   r   r:   rM      r]   r<   )r   Polynomial2Dr@   r   r   r   rA   r   )r   p2rB   zrD   r!   s         r   test_linear_fitter_1set2dz%TestFitting.test_linear_fitter_1set2d   s     ##***%%%Btvtv&((R++((EEEEdfdf--q{CCCCCCr    c                 0   d}t          j        t          |          5  t          j        d          } || j                  }t          j        dd          }t          j                    } ||| j        |           ddd           dS # 1 swxY w Y   dS )z
        A ValueError is raised if a 1 data set (1d x, 1d y) is fit
        with a model with multiple parameter sets.
        zHNumber of data sets .* is expected to equal the number of parameter setsmatchrb   r   rG   N)r.   raises
ValueErrorr   r?   r   r   rA   )r   MESSAGErC   r   rD   s        r   test_wrong_numpsetzTestFitting.test_wrong_numpset   s     X 	 ]:W555 	" 	"$Q''BDGB$Q333B*,,DDTWb!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   A BBBc           	         t          j        ddgddgddgddgddgddgg          }t          j        dd          }i }t	          d          D ]}d|g||j        |         <   t          j        dd	di|} || j        d
          }t          j                    } ||| j        |          }t          |j
        |d           dS )z;A case of 1 set of x and multiple sets of y and parameters.r   r   r   r:   rM   rb   rG      rN   FrO   r;   r<   Nrb   )r   r>   r   r?   rP   rQ   r   r   rA   r   rR   rS   s           r   test_wrong_psetzTestFitting.test_wrong_pset   s     8AAAAAA	
 	
  Q///q 	/ 	/A)*AF2>!$%% ??1???R...&((R"%%((DDDDDDr    requires scipyreasonfitterc                      |            }t          j        ddd          } || j                  } ||| j        |          }t          |j        g d           dS )z.1 set 1D x, 1 set 1D y, 1 pset NonLinearFitterr   r:   皙?)meanstddev)r   r:   rw   N)r   
Gaussian1Dr   r   r@   )r   ru   g1r   r!   s        r   test_nonlinear_lsqt_1set_1dz'TestFitting.test_nonlinear_lsqt_1set_1d   sg     r#666R[[r47B''(,,,77777r    c                 
    |            }d}t          j        t          |          5  t          j        ddgddgddgd	
          } || j        d          } ||| j        |          }ddd           dS # 1 swxY w Y   dS )z51 set 1D x, 1 set 1D y, 2 param_sets, NonLinearFitterz6Non-linear fitters can only fit one data set at a timerh   gffffff$@r   r:   g	@gq=
ףp?rw   r   )rx   ry   rH   FrO   N)r.   rj   rk   r   rz   r   )r   ru   rl   r{   r   _s         r   test_nonlinear_lsqt_Nset_1dz'TestFitting.test_nonlinear_lsqt_Nset_1d   s     K]:W555 	( 	("r
!S4+  B DGE222Br47B''A	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   AA88A<?A<c                      |            }t          j        dddddd          } || j        | j                  } ||| j        | j        |          }t	          |j        g d           d	S )
z.1 set 2d x, 1set 2D y, 1 pset, NonLinearFitterr   r:   rM   333333?rw   r   )x_meany_meanx_stddevy_stddevtheta)r   r:   rM   r   rw   r   N)r   
Gaussian2Dr   r   r   r@   )r   ru   g2re   r!   s        r   test_nonlinear_lsqt_1set_2dz'TestFitting.test_nonlinear_lsqt_1set_2d   s     qS3a
 
 
 Btvtvr46461--(*A*A*ABBBBBr    c           
      x    |            }d}t          j        t          |          5  t          j        ddgddgddgddgddgddgd	
          } || j                                        | j                                                  } ||| j        | j        |          }ddd           dS # 1 swxY w Y   dS )z41 set 2d x, 1set 2D y, 2 param_sets, NonLinearFitterTInput argument .* does not have the correct dimensions in .* for a model set with .*rh   r   r:   rM   r   rw   r   r   )r   r   r   rH   N)r.   rj   rk   r   r   r   flattenr   )r   ru   rl   r   re   r~   s         r   test_nonlinear_lsqt_Nset_2dz'TestFitting.test_nonlinear_lsqt_Nset_2d   s     	 ]:W555 	. 	."RAAss!f  B 46>>##TV^^%5%566Ar46461--A	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   A:B//B36B3N)r*   r+   r,   r-   r   rE   rU   r[   r`   rf   rm   rq   r.   r/   skipifr
   r0   fittersr|   r   r   r   r3   r    r   r5   r5   B   s       99, , ,	E 	E 	EE E EE E E(F F F,D D D" " " E E E. [I.>??[Xw//8 8 0/ @?8 [I.>??[Xw//
( 
( 0/ @?
( [I.>??[Xw//	C 	C 0/ @?	C [I.>??[Xw//. . 0/ @?. . .r    r5   c                   H    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S )TestEvaluationzs
    Test various input options to model evaluation

    TestFitting actually covers evaluation of polynomials
    c                     t          j        d          | _        t           j        d dd df         \  | _        | _        d S )N   r   r7   r   s    r   r   zTestEvaluation.setup_class  r8   r    c                    t          j        ddgddgddgd          } || j        d          }t          j        |dd	d	f         |d
d	d	f         z
                                  t          j        g           k              sJ d	S )zY
        This case covers:
            N param sets , 1 set 1D x --> N 1D y data
        r   r:   rw   r   rG   FrO   r   Nr   )r   rz   r   r   allnonzeror>   )r   r{   r   s      r   test_non_linear_NYsetz$TestEvaluation.test_non_linear_NYset  s     Bx!Q#saHHHR...vr!QQQ$x"QT(*3355"EFFFFFFFr    c                     t          j        ddgddgddgd          }t          j        | j        | j        g          } ||          }t          |dddf         |dddf         d	
           dS )zU
        This case covers: N param sets , N sets 1D x --> N N sets 1D y data
        r   r:   rw   r   rG   Nr   r   r]   r<   )r   rz   r   r>   r   r   )r   r{   xxr   s       r   test_non_linear_NXYsetz%TestEvaluation.test_non_linear_NXYset  s    
 Bx!Q#saHHHXtw())RVV111a4"QQQT(======r    c                 h    t          j        d          } || j                  }|j        dk    sJ dS )z 1 data set, 1 pset, Polynomial1DrM   )r   N)r   r?   r   shaper   rC   r   s      r   test_p1_1set_1psetz!TestEvaluation.test_p1_1set_1pset  s<      ##R[[x5      r    c                     t          j        dd          } |t          j        | j        | j        g          j        d          }|j        dk    sJ t          |dddf         |d	ddf         d
           dS )z'N data sets, N param_sets, Polynomial1DrM   r   rG   rO   )r   r   r   Nr   r]   r<   )r   r?   r   r>   r   rX   r   r   r   s      r   test_p1_nset_npsetz!TestEvaluation.test_p1_nset_npset"  s      Q///R$'47+,,.rBBBx7""""1aaa4"QT(======r    c                 t    t          j        d          } || j        | j                  }|j        dk    sJ dS )z#1 pset, 1 2D data set, Polynomial2Drb   )r   r   N)r   rc   r   r   r   )r   rd   re   s      r   test_p2_1set_1psetz!TestEvaluation.test_p2_1set_1pset*  sB      ##Btvtvw(""""""r    c                     t          j        dd          }t          j        | j        | j        g          }t          j        | j        | j        g          } |||          }|j        dk    sJ dS )z$N param_sets, N 2D data sets, Poly2drb   r   rG   )r   r   r   N)r   rc   r   r>   r   r   r   )r   rd   r   yyre   s        r   test_p2_nset_npsetz!TestEvaluation.test_p2_nset_npset1  sq      Q///Xtvtv&''Xtvtv&''Br2JJw+%%%%%%r    c                 .   t          j        | j        | j        g          j        }d|d<   d|d<   d|d<   t	          j        dddgd	d
gd          } ||d          }t          |j        |j                    ||d          }t          ||           dS )z
        Test model set with negative model_set_axis.

        In this case model_set_axis=-1 is identical to model_set_axis=1.
        d   )r   r   r   r   c   )r   r   rb   r   r   r:   rM   )c0c1rH   r   rO   N)r   r>   r   rX   r   r?   r   r   )r   r   rC   r   yy1s        r   test_nset_domainzTestEvaluation.test_nset_domain:  s     Xtw())+444 1v1a&1EEER2&&&"(+++bA&&&C     r    c                     t          j        ddgddgg          }t          j        ddd|          }t           j        d dd df         \  }} |||           d S )NrJ   g?r:   g      @g      @)
cov_matrixr   )r   r>   r   r   r   )r   covgr   r   s        r   test_evaluate_gauss2dz$TestEvaluation.test_evaluate_gauss2dK  sf    hc
S!H-..c3<<<xSbS!1	!Qr    N)r*   r+   r,   r-   r   r   r   r   r   r   r   r   r   r3   r    r   r   r      s         , , ,G G G> > >! ! !> > ># # #& & &! ! !"    r    r   c                   L    e Zd Z e            Z e            Zed             ZdS )
TModel_1_1c                     | |z   |z   S r$   r3   )r   rC   rd   s      r   evaluatezTModel_1_1.evaluateV  s    2v{r    N)r*   r+   r,   r	   rC   rd   staticmethodr   r3   r    r   r   r   R  sC        	B	B  \  r    r   c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )&TestSingleInputSingleOutputSingleModela  
    A suite of tests to check various cases of parameter and input combinations
    on models with n_input = n_output = 1 on a toy model with n_models=1.

    Many of these tests mirror test cases in
    ``astropy.modeling.tests.test_parameters.TestParameterInitialization``,
    except that this tests how different parameter arrangements interact with
    different types of model inputs.
    c                     t          dd          } |d          }t          |t                    sJ t          j        |          dk    sJ |dk    sJ dS )O
        Scalar parameters with a scalar input should return a scalar.
        r   r   r   r   o   N)r   
isinstancefloatr   ndimr   tr   s      r   #test_scalar_parameters_scalar_inputzJTestSingleInputSingleOutputSingleModel.test_scalar_parameters_scalar_inputf  s\    
 q"AcFF!U#####wqzzQCxxxxxxr    c                 
   t          dd          } |t          j        d          dz            }t          |t          j                  sJ t          j        |          dk    sJ t          j        |g dk              sJ dS )
        Scalar parameters should broadcast with an array input to result in an
        array output of the same shape as the input.
        r   r   rb   r   rp      r      7    N)r   r   r   r   ndarrayr   r   r   s      r   %test_scalar_parameters_1d_array_inputzLTestSingleInputSingleOutputSingleModel.test_scalar_parameters_1d_array_inputq  s     q"AbillS !!!RZ(((((x{{d""""va33334444444r    c                 :   t          dd          } |t          j        d                              dd          dz            }t	          |t          j                  sJ t          j        |          dk    sJ t          j        |g dg d	gk              sJ d
S )r   r   r   ro   r   r:   r   r   r:   r   r   r   r   r     Nr   r   r   reshaper   r   r   r   r   s      r   %test_scalar_parameters_2d_array_inputzLTestSingleInputSingleOutputSingleModel.test_scalar_parameters_2d_array_input}  s     q"Abill""1a((3.//!RZ(((((x{{f$$$$vaNNNOOO<<=======r    c                 X   t          dd          } |t          j        d                              ddd          dz            }t	          |t          j                  sJ t          j        |          dk    sJ t          j        |dd	gd
dgddggddgddgddgggk              sJ dS )r   r   r      r   r:   r   r   r:   r   r   r   r   r   r   r   c    +      W  Nr   r   s      r   %test_scalar_parameters_3d_array_inputzLTestSingleInputSingleOutputSingleModel.test_scalar_parameters_3d_array_input  s     q"Abimm##Aq!,,s233!RZ(((((x{{i''''vcS#Jc
3sc3Z$6
 
 	
 	
 	
 	
 	
r    c                     t          ddgddg          } |d          }t          |t          j                  sJ t          j        |          dk    sJ t          j        |ddgk              sJ d	S )

        Array parameters should all be broadcastable with each other, and with
        a scalar input the output should be broadcast to the maximum dimensions
        of the parameters.
        r   r   r   r   r   r   r   z   N)r   r   r   r   r   r   r   s      r   %test_1d_array_parameters_scalar_inputzLTestSingleInputSingleOutputSingleModel.test_1d_array_parameters_scalar_input  s}     1vBx((AcFF!RZ(((((x{{d""""vaC:o&&&&&&&r    c                    t          ddgddg          } |ddg          }t          j        |          dk    sJ t          j        |dd	gk              sJ  |dgdgg          }t          j        |          d
k    sJ t          j        |ddgdd	ggk              sJ d}t	          j        t          |          5   |g d           ddd           dS # 1 swxY w Y   dS )e
        When given an array input it must be broadcastable with all the
        parameters.
        r   r   r   r   r      r   r      r   r   r   r   zWself input argument 'x' of shape .* cannot be broadcast with parameter 'p1' of shape .*rh   r   r   ,  Nr   r   r   r   r.   rj   rk   r   r   r   r   rl   s        r   'test_1d_array_parameters_1d_array_inputzNTestSingleInputSingleOutputSingleModel.test_1d_array_parameters_1d_array_input  sU    1vBx((QSz]]x||t####vbS#J&'''''Qu~x||v%%%%vbc3Z#s4455555! 	 ]:W555 	 	Aooo	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   >CC Cc                 8   t          ddgddggddgddgg          } |d	d
gddgg          }t          j        |          dk    sJ t          j        |ddgddggk              sJ  |d	ggd
gggdggdgggg          }t          j        |          dk    sJ 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J d}t	          j        t          |           5   |g d!g d"g           d#d#d#           d#S # 1 swxY w Y   d#S )$r   r   r   r:   rM   r   r      (   r   r   r     r   r   r   M    r   r   r   r   r         r         r   B  X  r       Tself input argument .* of shape .* cannot be broadcast with parameter .* of shape .*rh   r   r     X  Nr   r   s        r   'test_2d_array_parameters_2d_array_inputzNTestSingleInputSingleOutputSingleModel.test_2d_array_parameters_2d_array_input  s    AA'2r(RH)=>>Qc
S#J'((x||v%%%%vbc3Z#s4455555Q3%C5'"seWug$6788x|||++++v*sCj)S#Jc
+CD*sCj)S#Jc
+CD
 
 	
 	
 	
 	 ]:W555 	2 	2A0111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   0DDDc           	         t          g dg dgg dg dggg d          } |g d          }t          j        |          dk    sJ t          |g dg d	gg d
g dgg            |dgggdgggdgggg          }t          j        |          dk    sJ t          |g dg dgg dg dggg dg dgg dg dggg dg dgg dg dggg           dS )r   rW   g{Gz?gQ?g{Gz?g?gQ?gQ?g{Gz?g
ףp=
?r   g)\(?gQ?r   r   r:   r   r   r   r   r   r:   Q&@Q6@p=
׃@@Gz&@6@Hz@@p=
#&@Gz6@Q@@333333&@\(6@(\@@r   r   r   r:   r   r   r:   r  g
ףp=
(@g(\*@r  g(@gQ*@r  g)\((@gGz.*@r  gQ8(@g=
ףp=*@g(\5@r  gHz7@g
ףp=
5@r  g(\7@gR5@r  gףp=
7@g5@r  gQ7@g(\?@g(\@@r  g
ףp=
?@gfffff@@r  gR?@g
ףp=
@@r  g?@gGz@@r  N)r   r   r   r   r   r   r   r   s       r   *test_mixed_array_parameters_1d_array_inputzQTestSingleInputSingleOutputSingleModel.test_mixed_array_parameters_1d_array_input  s    ###%7%7%78###%7%7%78 II
 
 Q|||__x||y((((&&&(=(=(=>&&&(=(=(=>	
 	
 	
 Q2$RD6(rdVH-..x|||++++ +**,A,A,AB***,A,A,AB
 +**,A,A,AB***,A,A,AB
 +**,A,A,AB***,A,A,AB	
 	
 	
 	
 	
r    Nr*   r+   r,   r-   r   r   r   r   r   r   r  r(  r3   r    r   r   r   [  s         	 	 	
5 
5 
5
> 
> 
>
 
 
$' ' '  .2 2 2<*
 *
 *
 *
 *
r    r   c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )#TestSingleInputSingleOutputTwoModela  
    A suite of tests to check various cases of parameter and input combinations
    on models with n_input = n_output = 1 on a toy model with n_models=2.

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

    With n_models=2 all outputs should have a first dimension of size 2 (unless
    defined with model_set_axis != 0).
    c                     t          ddgddgd          } |d          }t          j        |          dk    sJ t          j        |dd	gk              sJ d
S )z
        Scalar parameters with a scalar input should return a 1-D array with
        size equal to the number of models.
        r   r   r   r   rG   r   r   r   r   Nr   r   r   r   r   s      r   r   zGTestSingleInputSingleOutputTwoModel.test_scalar_parameters_scalar_input  sj     1vBx!444AcFFx{{d""""vaC:o&&&&&&&r    c                    t          ddgddgd          }d}t          j        t          |          5   |t	          j        d          d	z             d
d
d
           n# 1 swxY w Y    |d	dg          }t	          j        |          dk    sJ t	          j        |ddgk              sJ  |d	dgd          }t	          j        |          dk    sJ t	          j        |ddgddggk              sJ  |g dd          }t	          j        |          dk    sJ t	          j        |g dg dgk              sJ d
S )
        The dimension of the input should match the number of models unless
        model_set_axis=False is given, in which case the input is copied across
        all models.
        r   r   r   r   rG   r   rh   rb   r   Nr   r   r   r   FrO   r   r   r   r   r   )r   r   r   )r   r   r   )r   r.   rj   rk   r   r   r   r   )r   r   rl   r   r   y3s         r   r   zITestSingleInputSingleOutputTwoModel.test_scalar_parameters_1d_array_input$  s    1vBx!444 	 ]:W555 	" 	"AbillS !!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" QSz]]x||t####vbS#J&'''''QSz%000 x||v%%%%vbc3Z#s4455555Qu555x||v%%%%vb___ooo>>???????s   !A!!A%(A%c                    t          ddgddgd          } |t          j        d                              dd          dz            }t          j        |          d	k    sJ t          j        |g d
g dgk              sJ  |t          j        d                              dd          dz  d          }t          j        |          dk    sJ t          j        |g d
g dgg dg dggk              sJ dS )r/  r   r   r   r   rG   ro   r:   r   r   r   )r   r   i
  FrO   r	  r   )   r   r   N)r   r   r   r   r   r   r'  s       r   r   zITestSingleInputSingleOutputTwoModel.test_scalar_parameters_2d_array_inputC  s&    1vBx!444Qry||##Aq))C/00x||v%%%%vb^^^___==>>>>>Qry||##Aq))C/FFFx||y((((vNNNOOO4~~~6WXX
 
 	
 	
 	
 	
 	
r    c                    t          ddgddgd          }t          j        d                              ddd          dz  } ||          }t          j        |          d	k    sJ t          j        |d
dgddgddggddgddgddgggk              sJ  ||d          }t          j        |          dk    sJ t          j        |t          j        |d
z   |dz   g          k              sJ dS )r/  r   r   r   r   rG   r   r:   r   r   r   r   r   r   r   r   in  i  i6  i  i  ib  FrO   )r   r   r:   r   r2  N)r   r   r   r   r   r   r>   )r   r   datar   r   s        r   r   zITestSingleInputSingleOutputTwoModel.test_scalar_parameters_3d_array_inputV  s(    1vBx!444y}}$$Q1--3QtWWx||y((((vcS#Jc
3sc3Z$6
 
 	
 	
 	
 QtE***x|||++++vbBHdRi%;<<<=======r    c                     t          g dg dgg dg dgd          } |d          }t          j        |          dk    sJ t          j        |g d	g d
gk              sJ dS )r   r  rM   rb   ro   r  r   2   <   r   rG   r   r   r   r   r   )r         Nr-  r   s      r   r   zITestSingleInputSingleOutputTwoModel.test_1d_array_parameters_scalar_inputn  s     			999-lll/KVWXXXAcFFx{{f$$$$vaOOO___==>>>>>>>r    c                 n   t          g dg dgg dg dgd          }d}t          j        t          |          5   |g d	          }d
d
d
           n# 1 swxY w Y    |ddg          }t	          j        |          dk    sJ t	          j        |g dg dgk              sJ d}t          j        t          |          5   |ddgd          }d
d
d
           n# 1 swxY w Y    |g d	d          }t	          j        |          dk    sJ t	          j        |g dg dgk              sJ d
S )z
        When the input is an array, if model_set_axis=False then it must
        broadcast with the shapes of the parameters (excluding the
        model_set_axis).

        Otherwise all dimensions must be broadcastable.
        r  r6  r  r7  r   rG   r   rh   r   Nr   r   r   r:  )r      i
  UModel input argument .* of shape .* cannot be broadcast with parameter .* of shape .*FrO   )r   r   r   )r   r>  in  )r   r.   rj   rk   r   r   r   )r   r   rl   r   r   s        r   r   zKTestSingleInputSingleOutputTwoModel.test_1d_array_parameters_1d_array_input{  s    			999-lll/KVWXXX 	 ]:W555 	$ 	$???##B	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ QSz]]x||v%%%%vb___ooo>>????? 	 ]:W555 	5 	5C:e444B	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 Qu555x||v%%%%vb___ooo>>???????s#   AAAC!!C%(C%c                 J   t          ddgddggddgddgggd	d
gddggddgddgggd          } |ddgddgg          }t          j        |          dk    sJ t          j        |ddgddggddgddgggk              sJ d}t	          j        t          |           5   |g d!g d"g          }d d d            n# 1 swxY w Y    |ddgddggd#d$gd%d&ggg          }t          j        |          dk    sJ t          j        |ddgd'd(ggd)d*gd+d,gggk              sJ d S )-Nr   r   r:   rM   rb   ro      r   r   r   r   r   r8  r9  F   P   rG   r   r   r   r   )r   r   r   r   r   r   r   ic  i  iy  i  r?  rh   r   r   r   r   i  i   r   r   i+  i  i	  ix  r   )r   r   r   rl   r   s        r   r  zKTestSingleInputSingleOutputTwoModel.test_2d_array_parameters_2d_array_input  s   !fq!fAA/02hR!RHr2h#78
 
 

 Qc
S#J'((x||y((((vsc3Z(sc3Z(
 
 	
 	
 	
 	 ]:W555 	7 	7OOO___566B	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 Q#sc3Z(C:Sz*BCDDx||y((((vsc3Z(sc3Z(
 
 	
 	
 	
 	
 	
s   B==CCc                 d   t          g dg dgg dg dggg dg dgd          }d	}t          j        t          |
          5   |g d          }d d d            n# 1 swxY w Y    |g dd          }t	          j        |          dk    sJ t          |g dg dgg dg dgg           d S )Nr  r  r  r  r  r6  r   rG   r   rh   r  FrO   r	  r
  r  )gp=
#,@gGz9@gQB@)g333333,@g\(9@g(\B@)r   r.   rj   rk   r   r   r   )r   r   rl   r   s       r   r(  zNTestSingleInputSingleOutputTwoModel.test_mixed_array_parameters_1d_array_input  sb   ###%7%7%78###%7%7%78 YY			"
 
 
 	 ]:W555 	  	 ,,,A	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  Alll5111x{{i''''&&&(=(=(=>&&&(=(=(=>	
 	
 	
 	
 	
s   AA"%A"Nr)  r3   r    r   r+  r+  
  s         
' 
' 
'@ @ @>
 
 
&> > >0? ? ? @  @  @D
 
 
B
 
 
 
 
r    r+  c                   h    e Zd ZdZdZ e            Z e            Z e            Ze	d             Z
dS )
TModel_1_2r   r   c                 (    | |z   |z   | |z   |z   |z   fS r$   r3   )r   rC   rd   p3s       r   r   zTModel_1_2.evaluate  s"    BQVb[2-..r    N)r*   r+   r,   n_inputs	n_outputsr	   rC   rd   rH  r   r   r3   r    r   rF  rF    sX        HI	B	B	B/ / \/ / /r    rF  c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )&TestSingleInputDoubleOutputSingleModela  
    A suite of tests to check various cases of parameter and input combinations
    on models with n_input = 1 but n_output = 2 on a toy model with n_models=1.

    As of writing there are not enough controls to adjust how outputs from such
    a model should be formatted (currently the shapes of outputs are assumed to
    be directly associated with the shapes of corresponding inputs when
    n_inputs == n_outputs).  For now, the approach taken for cases like this is
    to assume all outputs should have the same format.
    c                 *   t          ddd          } |d          \  }}t          |t                    sJ t          |t                    sJ t          j        |          t          j        |          cxk    rdk    sn J |dk    sJ |dk    sJ dS )	r   r   r     r   r   r   r   N)rF  r   r   r   r   r   r   r   re   s       r   r   zJTestSingleInputDoubleOutputSingleModel.test_scalar_parameters_scalar_input  s    
 q"d##qvv1!U#####!U#####wqzzRWQZZ,,,,1,,,,,,CxxxxDyyyyyyr    c                    t          ddd          } |t          j        d          dz            \  }}t          |t          j                  sJ t          |t          j                  sJ t          j        |          t          j        |          cxk    rdk    sn J t          j        |g dk              sJ t          j        ||dz   k              sJ dS )	r   r   r   rN  rb   r   rp   r   N)rF  r   r   r   r   r   r   rO  s       r   r   zLTestSingleInputDoubleOutputSingleModel.test_scalar_parameters_1d_array_input   s     q"d##q1#$$1!RZ(((((!RZ(((((x{{bhqkk1111T111111va333344444vaAHo&&&&&&&r    c                    t          ddd          } |t          j        d                              dd          dz            \  }}t	          |t          j                  sJ t	          |t          j                  sJ t          j        |          t          j        |          cxk    rdk    sn J t          j        |g d	g d
gk              sJ t          j        ||dz   k              sJ dS )r   r   r   rN  ro   r   r:   r   r   r   r   NrF  r   r   r   r   r   r   r   rO  s       r   r   zLTestSingleInputDoubleOutputSingleModel.test_scalar_parameters_2d_array_input  s     q"d##q1%%a++c1221!RZ(((((!RZ(((((x{{bhqkk3333V333333vaNNNOOO<<=====vaAHo&&&&&&&r    c                    t          ddd          } |t          j        d                              ddd          dz            \  }}t	          |t          j                  sJ t	          |t          j                  sJ t          j        |          t          j        |          cxk    rdk    sn J t          j        |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        ||dz   k              sJ dS )r   r   r   rN  r   r   r:   r   r   r   r   r   r   r   r   r   r   r   r   r   r   NrR  rO  s       r   r   zLTestSingleInputDoubleOutputSingleModel.test_scalar_parameters_3d_array_input  s)    q"d##q2&&q!Q//#5661!RZ(((((!RZ(((((x{{bhqkk6666Y666666vcS#Jc
3sc3Z$6
 
 	
 	
 	
 vaAHo&&&&&&&r    c                    t          ddgddgddg          } |d          \  }}t          |t          j                  sJ t          |t          j                  sJ t          j        |          t          j        |          cxk    rdk    sn J t          j        |d	d
gk              sJ t          j        |ddgk              sJ dS )r   r   r   r   r   rN    r   r   r   r   r   J  N)rF  r   r   r   r   r   rO  s       r   r   zLTestSingleInputDoubleOutputSingleModel.test_1d_array_parameters_scalar_input0  s     1vBx$66qvv1!RZ(((((!RZ(((((x{{bhqkk1111T111111vaC:o&&&&&vaD$<'(((((((r    c                    t          ddgddgddg          } |ddg          \  }}t          j        |          t          j        |          cxk    rd	k    sn J t          j        |d
dgk              sJ t          j        |ddgk              sJ  |dgdgg          \  }}t          j        |          t          j        |          cxk    rdk    sn J t          j        |d
dgddggk              sJ t          j        |ddgddggk              sJ d}t	          j        t          |          5   |g d          \  }}ddd           dS # 1 swxY w Y   dS )r   r   r   r   r   rN  rU  r   r   r   r   r   r     r   r   r   rV    r   rh   r   NrF  r   r   r   r.   rj   rk   	r   r   r   z1r   z2rl   r0  z3s	            r   r   zNTestSingleInputDoubleOutputSingleModel.test_1d_array_parameters_1d_array_input?  s    1vBx$66C:Bx||rx||3333t333333vbS#J&'''''vbT4L()))))SEC5>""Bx||rx||5555v555555vbc3Z#s4455555vbdD\D$<8899999 	 ]:W555 	( 	(Q''FB	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   9EEEc                 t   t          ddgddggddgddggd	d
gddgg          } |ddgddgg          \  }}t          j        |          t          j        |          cxk    rdk    sn J t          j        |ddgddggk              sJ t          j        |ddgddggk              sJ  |dggdgggdggdgggg          \  }}t          j        |          t          j        |          cxk    rdk    sn J 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J t          j        |dd'gd(d)ggd*dgd+d,gggd-d.gdd/ggd0d1gd2dggggk              sJ d3}t	          j        t          |4          5   |g d5g d6g          \  }}d7d7d7           d7S # 1 swxY w Y   d7S )8r   r   r   r:   rM   r   r   r   r   rN  rU  i  i  r   r   r   r   r   r   r   r   r   r   rX  i  i\  r   r   r   r   r   r   r   r   r   r   r   r   r   rV  i=  i0  rY  i  i  i  i	  i  i  iv	  ii  r   rh   r   r   NrZ  r[  s	            r   r  zNTestSingleInputDoubleOutputSingleModel.test_2d_array_parameters_2d_array_inputX  s    VaVBx"b2dD\D$<4P
 
 S#Jc
+,,Bx||rx||5555v555555vbc3Z#s4455555vbdD\D$<8899999seWug&3%C5'(:;<<Bx||rx||;;;;|;;;;;;v*sCj)S#Jc
+CD*sCj)S#Jc
+CD
 
 	
 	
 	
 v,t-ttTl/KL,t-ttTl/KL
 
 	
 	
 	
 	 ]:W555 	; 	;Q9::FB	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s   F--F14F1c           	         t          g dg dgg dg dggg dg d          } |g d          \  }}t          j        |          t          j        |          cxk    rdk    sn J t          |g d	g d
gg dg dgg           t          |g dg dgg dg dgg            |dgggdgggdgggg          \  }}t          j        |          t          j        |          cxk    rdk    sn J t          |g dg dgg dg dggg dg dgg dg dggg dg dgg dg d ggg           t          |g d!g d"gg d#g d$ggg d%g d&gg d'g d(ggg d)g d*gg d+g d,ggg           d-S ).r   r  r  r  r  r  r   r  r	  r
  r  r  r  )q=
ף[@q=
ףk@Gzt@)(\[@皙k@)\t@)Gz[@(\k@=
ףpt@)fffff[@Qk@Rt@r   r   r   r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  )ra  gq=
ףj@gGzs@)rd  gj@g)\s@)rg  g(\j@g=
ףps@)rj  gQj@gRs@)gq=
ף@^@rb  gGz0t@)g(\B^@re  g)\0t@)gGzD^@rh  g=
ףp1t@)gfffffF^@rk  gR1t@)gQ``@gq=
ף m@rc  )gzGa`@gm@rf  )g
ףp=b`@g(\m@ri  )g33333c`@gQm@rl  N)rF  r   r   r   )r   r   r   r\  r   r]  s         r   r(  zQTestSingleInputDoubleOutputSingleModel.test_mixed_array_parameters_1d_array_input  s    ###%7%7%78###%7%7%78 IIOO
 
 <<<Bx||rx||8888y888888&&&(=(=(=>&&&(=(=(=>	
 	
 	
 	)))+C+C+CD)))+C+C+CD	
 	
 	
 rdVHvh2$122Bx||rx||;;;;|;;;;;; +**,A,A,AB***,A,A,AB
 +**,A,A,AB***,A,A,AB
 +**,A,A,AB***,A,A,AB	
 	
 	
$ 	 .--/G/G/GH---/G/G/GH
 .--/G/G/GH---/G/G/GH
 .--/G/G/GH---/G/G/GH	
 	
 	
 	
 	
r    Nr)  r3   r    r   rL  rL    s        	 	  ' ' '' ' '' ' '() ) )( ( (2&; &; &;PD
 D
 D
 D
 D
r    rL  )r!   inputsoutputs)r   r   r   r:   )rI  )r   r   r   )r   r   r   )c0_0g333333?g#>n?gQ>n?)r   r   r   r   r   r   rb   rI   g      ?g      ?g      ?rJ   r!   c                     | d         | d          }t          j        |          rt          || d                    d S t          t	          |                    D ]$}t          ||         | d         |                    %d S )Nr!   rm  rn  )r   isscalarr   rP   len)r!   resultrT   s      r   test_mixed_inputru    s    U7^U8_-F	{6 <i 011111s6{{## 	< 	<AF1IuY'7':;;;;	< 	<r    c                  H    G d dt                     }  | d          } |ddgd          }ddgddgdg}t          ||          D ]\  }}t          ||            | d          } |dddg          }ddddgg}t          ||          D ]\  }}t          ||           d S )Nc                   D     e Zd ZdZdZdZ e            Zd Z fdZ	 xZ
S )test_more_outputs.<locals>.MFr   r:   c                     ||z  ||z
  ||z   fS r$   r3   )r   r   r   as       r   r   z%test_more_outputs.<locals>.M.evaluate  s    q5!a%Q&&r    c                      t                      j        |i |\  }} | j        g || j        R  }d |D             }d |D             } | j        t          |          fg|R i |S )Nc                     g | ]	}|j         
S r3   )r   ).0outs     r   
<listcomp>z9test_more_outputs.<locals>.M.__call__.<locals>.<listcomp>  s    :::3SY:::r    c                 "    g | ]}|d k    rdn|S )r   r3   r3   )r}  r   s     r   r  z9test_more_outputs.<locals>.M.__call__.<locals>.<listcomp>  s$    WWW5D==RReWWWr    )superprepare_inputsr   r@   prepare_outputstuple)r   argskwargsrm  r~   rn  output_shapes	__class__s          r   __call__z%test_more_outputs.<locals>.M.__call__  s    ..???IFA#dm>V>do>>>G::':::MWWWWWM'4'})=)=(?T'TTTVTTTr    )r*   r+   r,   standard_broadcastingrI  rJ  r	   rz  r   r  __classcell__)r  s   @r   Mrx    sk         %	IKK	' 	' 	'	U 	U 	U 	U 	U 	U 	U 	U 	Ur    r  r   rJ   rI   rK   )r   zipr   )r  crt  rB   res         r   test_more_outputsr    s   U U U U UM U U U$ 	
!AQ1vq\\Fc
S#J,HFH%%  11	!AQq1a&\\FS3*%HFH%%  11 r    c                   4    e Zd ZdZdZdZdZed             ZdS )TInputFormatterz6
    A toy model to test input/output formatting.
    r   r   r   c                 
    | |fS r$   r3   r  s     r   r   zTInputFormatter.evaluate/  s    !tr    N)	r*   r+   r,   r-   rI  rJ  rn  r   r   r3   r    r   r  r  &  sH          HIG  \  r    r  c                  J    t                      }  | dd          }|dk    sJ d S )Nr   r   rp  )r  r!   rt  s     r   test_format_input_scalarsr  4  s3    EU1a[[FVr    c                      t                      }  | ddgddg          }t          |t          j        ddg          t          j        ddg          f           d S Nr   r   )r  r   r   r>   r  s     r   test_format_input_arraysr  :  s]    EUAq6Aq6""FFRXq!f--rxA/?/?@AAAAAr    c                      t                      } t          j        ddgg          j        t          j        ddgg          j        f} | | }t	          ||           d S r  )r  r   r>   rX   r   )r!   inputrt  s      r   #test_format_input_arrays_transposedr  @  s^    EHq!fX "(QF8"4"4"66EUE]FFE"""""r    )rM   rb   )lookup_tablerr   rs   c                     | dd          }t          | | dd                     t          | | dd                     d| _        t          | | dd                     t          | | dd                     t          | | dd                     d}t          j        t          |          5   | ddd	           d
d
d
           n# 1 swxY w Y   t          j        t          |          5   | dddd	           d
d
d
           n# 1 swxY w Y   d}t          j        t          |          5   | d           d
d
d
           d
S # 1 swxY w Y   d
S )W
    Test calling a model with positional, keywrd and a mixture of both arguments.
    r   r   r  )r   r  r   r   z-Too many input arguments - expected 2, got .*rh   r:   Nr   r   r  +Missing input arguments - expected 2, got 1r   rm  r.   rj   rk   r!   
positionalrl   s      r   test_call_keyword_args_1r  G  s6    q!JJQ000Ja1...ELJQ000Ja1...Ja,,,>G	z	1	1	1  aA               
z	1	1	1  abA               =G	z	1	1	1  a                 s6   7CCC7DDD;EEErp   c                     | d          }t          | | d                     d| _        t          | | d                     d}t          j        t          |          5   | ddd           ddd           n# 1 swxY w Y   t          j        t          |          5   | ddd	d
           ddd           n# 1 swxY w Y   d}t          j        t          |          5   |              ddd           dS # 1 swxY w Y   dS )r  r   )r   )r  .Too many input arguments - expected .*, got .*rh   r   r:   Nr   r  z+Missing input arguments - expected 1, got 0r  r  s      r   test_call_keyword_args_2r  k  s    qJJ


+++ELJ


+++?G	z	1	1	1  aA               
z	1	1	1  abA               =G	z	1	1	1                   s6   $A>>BB$C  CC(D  DDr  c                      | dd          }d| _         t          | | dd                     t          | | dd                     d}t          j        t          |          5   | ddd           ddd           n# 1 swxY w Y   t          j        t          |          5   | ddd	d
           ddd           n# 1 swxY w Y   d}t          j        t          |          5   |              ddd           dS # 1 swxY w Y   dS )r  r   r   r  r  r  rh   r:   Nr   r  z+Missing input arguments - expected 2, got 0)rm  r   r.   rj   rk   r  s      r   test_call_keyword_args_3r    s     q!JELJQ000Ja1...?G	z	1	1	1  aA               
z	1	1	1  abA               =G	z	1	1	1                   s6   'BBB'CC
C+DD
Dc                     | dd          }t          | | dd                     t          | | dd                     |                                 } d| _        t          | | dd                     t          | | dd                     t          | | dd                     d}t          j        t
          |          5   | ddd	           d
d
d
           n# 1 swxY w Y   t          j        t
          |          5   | dddd	           d
d
d
           n# 1 swxY w Y   d}t          j        t
          |          5   | d           d
d
d
           d
S # 1 swxY w Y   d
S )r  r   r   )x0r   )r   r  r  r  rh   r:   Nr   r  r  )r   copyrm  r.   rj   rk   r  s      r   test_call_keyword_mappingsr    sH    q!JJq 1 1 1222JaA/// JJLLEELJQ000Ja1...Ja,,,?G	z	1	1	1  aA               
z	1	1	1  abA               =G	z	1	1	1  a                 s6   C%%C),C)D''D+.D+E((E,/E,)Er-   numpyr   r.   numpy.testingr   astropy.modelingr   r   astropy.modeling.corer   r   r   astropy.modeling.parametersr	   "astropy.utils.compat.optional_depsr
   r?   r^   rY   ShiftScaler1   rc   
Legendre2DChebyshev2Dr2   LevMarLSQFitterTRFLSQFitterLMLSQFitterDogBoxLSQFitterr   r   r5   r   r   r   r+  rF  rL  IdentityMappingr   mathMultiplyUfuncr>   linspacerX   r   broadcast_modelsr/   r0   ru  r  r  r  r  r  
Rotation2DPix2Sky_TAN	Tabular2Donesr   r  rz   	Tabular1Dr  r  r  r3   r    r   <module>r     s=	         ) ) ) ) ) ) , , , , , , , , G G G G G G G G G G 1 1 1 1 1 1 8 8 8 8 8 8 1#!\A3\A3 1#A!Q  	       :w. w. w. w. w. w. w. w.tS S S S S S S Sl       l
 l
 l
 l
 l
 l
 l
 l
^M
 M
 M
 M
 M
 M
 M
 M
`
/ 
/ 
/ 
/ 
/ 
/ 
/ 
/]
 ]
 ]
 ]
 ]
 ]
 ]
 ]
D foa  QAKQAKPPfoa  aVQKaVQKPPfnV$$QFQPQFTTfnV$$QF!QQRTT333q!fa.FA;   	**q!f+1vq>   	**q!f+1v1v& 
 "f!!!,,,QFQRTUPVWW!f!!!,,,A1MM""1aAs33q!f+
+  #"1aAs33a&!  %$QQ///2E&2Eaa2P2P2PP,,  %$QQ///2E&2Eaa2P2P2PPa!Q!Q(1v;  **,,28[R[Aq112335yry||D283Z#tsCj3+SzJ
 
 U1 h "233< < 43<  @    e     B B B# # # Agbgfoo666	 	 	M*:;;  <;	 	2 Agbgdmm444  	M*:;;  <; , 1f1!4441f1!4441f1!4441f1!4441f1!4440V0333t2v21555   , vt     r    