U
    e»{j!�  ã                   @   s¢  d dl Z d dlZd dlZd dlmZmZ d dlmZ	 d dl
mZmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z! d dl"m#Z# d dl$m%Z% ej& 'dd	d
„ ddgfdd
„ ddgfdd
„ ddgfdd
„ ddgfdd
„ ddgfg¡dd„ ƒZ(ej& 'ddd
„ ddgfdd
„ ddgfdd
„ ddgfdd
„ ddgfdd
„ ddgfg¡dd„ ƒZ)ej& 'ddd
„ dfdd
„ dfdd
„ dfd d
„ dfd!d
„ dfg¡d"d#„ ƒZ*d$d%„ Z+d&d'„ Z,d(d)„ Z-d*d+„ Z.d,d-„ Z/ej& 'd.ed ƒed ƒ ed ƒB ed ƒed ƒ ed ƒB ed ƒed ƒ ed ƒB ed ƒed ƒ ed ƒB ed ƒed ƒ ed ƒB ed/d0d1ƒed2d3d4ƒB g¡d5d6„ ƒZ0d7d8„ Z1d9d:„ Z2d;d<„ Z3d=d>„ Z4ej& 'd?ed/d0ƒed0ƒed/d0ƒg¡d@dA„ ƒZ5dBdC„ Z6dDdE„ Z7dFdG„ Z8dHdI„ Z9G dJdK„ dKeƒZ:G dLdM„ dMeƒZ;dNdO„ Z<dPdQ„ Z=dRdS„ Z>dTdU„ Z?dVdW„ Z@dXdY„ ZAej&jBe% dZd[�d\d]„ ƒZCd^d_„ ZDej&jBe% dZd[�d`da„ ƒZEej& 'd?ed3ƒed3ƒed3ƒg¡dbdc„ ƒZFddde„ ZGej& 'dfdgd
„ dhd
„ did
„ djd
„ g¡dkdl„ ƒZHdmdn„ ZIdodp„ ZJej& 'dfdqd
„ drd
„ dsd
„ dtd
„ g¡dudv„ ƒZKdwdx„ ZLdydz„ ZMd{d|„ ZNd}d~„ ZOdd€„ ZPej&jBe% dZd[�d�d‚„ ƒZQej&jBe% dZd[�dƒd„„ ƒZRej&jBe% dZd[�d…d†„ ƒZSej&jBe% dZd[�d‡dˆ„ ƒZTdS )‰é    N)Úassert_allcloseÚassert_array_equal)ÚCompoundModelÚModelÚModelDefinitionError)ÚLevMarLSQFitter)ÚChebyshev1DÚChebyshev2DÚConst1DÚ
Gaussian1DÚ
Gaussian2DÚIdentityÚ
Legendre1DÚ
Legendre2DÚLinear1DÚMappingÚPolynomial1DÚPolynomial2DÚ
Rotation2DÚScaleÚShiftÚ	Tabular1DÚ
fix_inputs)Ú	Parameter)Ú	HAS_SCIPY)ÚexprÚresultc                 C   s   | | S ©N© ©ÚxÚyr   r   úc/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/tests/test_compound.pyÚ<lambda>'   ó    r#   ç      @c                 C   s   | | S r   r   r   r   r   r"   r#   (   r$   g      ð¿c                 C   s   | | S r   r   r   r   r   r"   r#   )   r$   g      @c                 C   s   | | S r   r   r   r   r   r"   r#   *   r$   gUUUUUUå?c                 C   s   | | S r   r   r   r   r   r"   r#   +   r$   g       @c                 C   s4   | t ddd�t ddd�ƒ}|ddd�}t||ƒ d S )N©é   r'   r'   ©Ún_models)é   r*   r   F)Zmodel_set_axis)r
   r   ©r   r   ÚsÚoutr   r   r"   Útest_model_set$   s    r.   c                 C   s   | | S r   r   r   r   r   r"   r#   7   r$   c                 C   s   | | S r   r   r   r   r   r"   r#   8   r$   c                 C   s   | | S r   r   r   r   r   r"   r#   9   r$   c                 C   s   | | S r   r   r   r   r   r"   r#   :   r$   c                 C   s   | | S r   r   r   r   r   r"   r#   ;   r$   c              	   C   s<   d}t jt|d��  | tddd�tddd�ƒ W 5 Q R X dS )	ziCheck that creating model sets with components whose _n_models are
    different raise a value error
    z+Both operands must have equal values for .*©Úmatchr&   r'   r(   r*   é   N)ÚpytestÚraisesÚ
ValueErrorr
   )r   r   ÚMESSAGEr   r   r"   Ú!test_model_set_raises_value_error4   s    r6   c                 C   s   | | S r   r   r   r   r   r"   r#   J   r$   c                 C   s   | | S r   r   r   r   r   r"   r#   K   r$   c                 C   s   | | S r   r   r   r   r   r"   r#   L   r$   c                 C   s   | | S r   r   r   r   r   r"   r#   M   r$   c                 C   s   | | S r   r   r   r   r   r"   r#   N   r$   c                 C   sb   | t dƒt dƒƒ}t|tƒs t‚|jdks.t‚|jdks<t‚|dƒ}||ksPt‚t|tƒs^t‚dS )z€
    Like test_two_model_class_arithmetic_1d, but creates a new model from two
    model *instances* with fixed parameters.
    r'   r*   r1   r   N)r
   Ú
isinstancer   ÚAssertionErrorÚn_inputsÚ	n_outputsÚfloatr+   r   r   r"   Ú%test_two_model_instance_arithmetic_1dG   s    r<   c                  C   s²   t dƒtdƒB } t| tƒst‚| jdks,t‚| jdks:t‚| dƒdksJt‚tdƒt dƒB }t|tƒsht‚|jdksvt‚|jdks„t‚|dƒdks”t‚t|dddgƒdddgƒ dS )z\
    Shift and Scale are two of the simplest models to test model composition
    with.
    r'   r*   r1   g      "@r%   g      @N)r   r   r7   r   r8   r9   r:   r   )ÚS1ÚS2r   r   r"   Ú test_simple_two_model_compose_1dc   s    r?   c                  C   s’   t dƒt dƒB } t| tƒst‚| jdks,t‚| jdks:t‚t| ddƒddd� t dƒt dƒB }t|ddƒd	dd� | | B }t|ddƒd	dd� d
S )z7
    A simple example consisting of two rotations.
    é-   r'   r   r1   )éÿÿÿÿr   g»½×Ùß|Û=©ZatoléZ   )r   rA   N)r   r7   r   r8   r9   r:   r   )Úr1Úr2Zr3r   r   r"   Ú test_simple_two_model_compose_2dy   s    rF   c                  C   sb   t ƒ t ƒ  } | jdkst‚| t ƒ  }|jdks2t‚|| B }|jdksHt‚||  }|jdks^t‚dS )z\
    Test that CompoundModel.n_submodels properly returns the number
    of components.
    r'   r*   é   é   N)r   Zn_submodelsr8   )Úg2Zg3Zg5Zg7r   r   r"   Útest_n_submodelsŽ   s    
rJ   c                  C   s¼  t dddƒ} tddddddƒ}| |  }| ¡ dks6t‚| |  |  }| ¡ dksRt‚| | |   }| ¡ d	ksnt‚| |  |  }| ¡ d
ksŠt‚| | |   |  }| ¡ dksªt‚| |  | |   }| ¡ dksÊt‚| |  | |   }| ¡ dksêt‚| |  }| ¡ dk�st‚| | |   }| ¡ dk�s"t‚| |  |  }| ¡ dk�s@t‚| |  | B }| ¡ dk�s^t‚| | | B  }| ¡ dk�s|t‚| | @ |B }| ¡ dk�sšt‚| | | B @ }| ¡ dk�s¸t‚dS )z\
    Test that the expression strings from compound models are formatted
    correctly.
    r1   r'   r*   é   rG   é   z	[0] + [1]z[0] + [1] + [2]z[0] + [1] * [2]z[0] * [1] + [2]z[0] + [1] * [2] + [3]z([0] + [1]) * ([2] + [3])z[0] * [1] + [2] * [3]z
[0] ** [1]z[0] + [1] ** [2]z([0] + [1]) ** [2]z[0] + [1] | [2]z[0] + ([1] | [2])z[0] & [1] | [2]z[0] & ([1] | [2])N)r   r   Z_format_expressionr8   )ÚGZG2ÚMr   r   r"   Útest_expression_formatting¡   s<    rO   c                  C   sB   t dƒt dƒ@ tdƒtdƒ@ B tdƒB } t| j| ddƒŽ dƒ dS )z†
    Test basic inversion of compound models in the limited sense supported for
    models made from compositions and joins only.
    r'   r*   rC   r   r1   ©r   r1   N)r   r   r   r   Úinverse)Útr   r   r"   Útest_basic_compound_inverseÜ   s    (rS   Úmodelr1   r'   r*   rK   rG   rL   c              	   C   s(   d}t jt|d�� | j W 5 Q R X dS )zJ
    Ensure inverses aren't supported in cases where it shouldn't be.
    z3No analytical or user-supplied inverse transform .*r/   N)r2   r3   ÚNotImplementedErrorrQ   )rT   r5   r   r   r"   Ú!test_compound_unsupported_inverseæ   s    rV   c            	      C   sœ   t dƒddƒ\} }t dƒtdƒB }|ddƒ\}}t| |f||fƒ t dƒtdƒ@ }|dddƒ\} }}|tdƒB }|dddƒ\}}}t| ||f|||fƒ dS )zx
    Tests a couple basic examples of the Mapping model--specifically examples
    that merely permute the outputs.
    rC   r1   r'   )r1   r   r*   )r'   r   r1   N)r   r   r   r   )	r    r!   ÚrsZx_primeZy_primeÚmÚzÚmsZz_primer   r   r"   Útest_mapping_basic_permutationsû   s    r[   c                  C   sV   t dƒtdƒ@ } t dƒtdƒ@ }| tdddgƒB |B }td|j|dddƒŽ d	d
� dS )z;Tests inverting a compound model that includes a `Mapping`.g333333(@gffffff*@gš™™™™™,@gÍÌÌÌÌÌ.@r'   r   r1   )r   r1   r'   g:Œ0âŽyE>rB   N)r   r   r   r   rQ   )Zrs1Zrs2rX   r   r   r"   Útest_mapping_inverse  s    r\   c                  C   s>   t dƒ} tdƒ}tdd�}| |@ |B }t|ddƒddgƒ dS )zö
    Test a case where an Identity (or Mapping) model is the first in a chain
    of composite models and thus is responsible for handling input broadcasting
    properly.

    Regression test for https://github.com/astropy/astropy/pull/3362
    r1   rC   )Úangler'   g      Àç      ð?N)r   r   r   r   )Zident1ÚshiftZrotationrT   r   r   r"   Útest_identity_input  s
    	
r`   c               	   C   sh   d} t jt| d�� tdƒtdddƒB  W 5 Q R X d} t jt| d�� tdƒtdddƒ  W 5 Q R X dS )	zq
    Test that certain operators do not work with models whose inputs/outputs do
    not match up correctly.
    zUnsupported operands for |:.*r/   rC   r1   r   çš™™™™™¹?z6Both operands must match numbers of inputs and outputsN)r2   r3   r   r   r   )r5   r   r   r"   Útest_invalid_operands.  s    rb   Úpolyc                 C   sb   ddddddg| _ tdƒ}| |B }tjdd…dd…f \}}|||ƒ}|| ||ƒƒ}t||ƒ dS )zY
    Tests that polynomials are scaled when used in compound models.
    Issue #3699
    r1   r'   r*   rK   Né   é%   )Ú
parametersr   ÚnpÚmgridr   )rc   r_   rT   r    r!   Úresult_compoundr   r   r   r"   Ú!test_compound_with_polynomials_2d=  s    
rj   c                  C   s  t dddddƒ} t dddddƒ}t| ddiƒ}t|dƒ| ddƒƒ t|dddgƒ| dddgdddgƒƒ t| d	diƒ}t|dƒ| ddƒƒ | |@ }t|d
ddœƒ}t|ddƒ|dd
ddƒƒ t|dd
dœƒ}t|ddƒ|ddd
dƒƒ t|ddd�|ddd
dƒƒ d S )Nr1   r   r'   g      ø?ç      à?gš™™™™™É¿ç333333Ó?r*   r    ra   çš™™™™™É?)r1   r*   gš™™™™™¹¿)Úx0r'   )Zy0Úy1)r   r   r   )Úg1rI   Zsg1_1Zsg1_2Úgg1Zsgg1_1Zsgg1_2r   r   r"   Útest_fix_inputsL  s    &rr   c               	   C   sì  t dddddƒ} d}tjt|d�� t| dddœƒ W 5 Q R X tjt|d�� t| ddiƒ W 5 Q R X tjt|d�� t| t d¡diƒ W 5 Q R X tjt|d�� t| t d¡diƒ W 5 Q R X tjt|d�� t| ddiƒ W 5 Q R X d	}tjt|d�� t| d
ƒ W 5 Q R X d}tjt|d�� t	d| | ƒ W 5 Q R X d}tjt|d��  t| ddiƒ}|ddd� W 5 Q R X tjt|d��& t| t d¡diƒ}|ddd� W 5 Q R X tjt|d��& t| t d¡diƒ}|ddd� W 5 Q R X d S )Nr1   r   r'   z4Substitution key .* not among possible input choicesr/   )rn   r   r*   Úwz9Expected a dictionary for second argument of "fix_inputs"rP   z.*Illegal operator: ', '#'.*ú#z,Too many input arguments - expected 1, got 2)r!   )
r   r2   r3   r4   r   rg   Zint32Zint64r   r   )rp   r5   rq   r   r   r"   Útest_fix_inputs_invalid\  s8    ru   c                  C   s¢   t dddddƒ} t dddddƒ}| jdks.t‚| |@ }d|_|jdksJt‚t|dddœƒ}|jdksht‚tdddƒ} | | @ }d	|_t|ddiƒ}|jd
ksžt‚d S )Nr1   r   )©g      Àg      @rv   )rv   )gš™™™™™Àgš™™™™™@©g333333Àg333333@)gÍÌÌÌÌÌÀgÍÌÌÌÌÌ@)r   r'   )rv   rw   é
   r*   )©r1   rK   )rL   é   ry   )r   Úbounding_boxr8   r   r   )rp   rI   rq   ZsgÚgZgfr   r   r"   Ú!test_fix_inputs_with_bounding_box…  s    r}   c            
   	   C   sš  t dddƒtdƒ } t| d t ƒs&t‚t| d tƒs8t‚| jdksFt‚| d jd  krb| jkshn t‚| d jd  kr„| jksŠn t‚| d j	d  kr¦| j
ks¬n t‚| d jd  krÈ| jksÎn t‚| d }d| _|jdksêt‚d|_| jdksþt‚t dddd	d
�}tddd
�}|| } | d jd	k�s6t‚| d jdk�sJt‚| d	 jd	k�s^t‚| d jdk�srt‚| d }d| _|jdk�s�t‚d|_| jdk�s¦t‚t| d tƒ�sºt‚t| d t ƒ�sÎt‚d}tjt|d�� | d  W 5 Q R X d}tjt|d�� | d  W 5 Q R X tdddddd	d
�}t|ddiƒ} | d	 jd	k�sPt‚tddd
�}tddd
�}tddd
�}|||  }	t|	dd… dƒdƒ dS )z*Test indexing on compound model instances.r1   r   ra   r'   )Úamplitude_0Úmean_0Ústddev_0Úamplitude_1é*   é‰   r*   r|   ©ÚnameÚpi90  i…  rA   éþÿÿÿzlist index out of ranger/   z%No component with name 'foobar' foundZfoobarrK   rG   gš™™™™™ñ?ÚAgÍÌÌÌÌÌ @ÚBgÍÌÌÌÌÌ@ÚCg×£p=
@N)r   r
   r7   r8   Úparam_namesZ	amplituder~   Úmeanr   Ústddevr€   r�   r   r…   Zc0_1Úc0Úc1Zc1_1r2   r3   Ú
IndexErrorr   r   r   )
rX   Úconstr|   r†   rc   r5   rˆ   r‰   rŠ   rN   r   r   r"   Útest_indexing_on_instance˜  sR    """"r’   c                   @   s2   e Zd Zedddd�Zeddd�Zedd„ ƒZdS )	Ú_ConstraintsTestAr   rl   )ÚdefaultÚminÚmaxT©r”   Úfixedc                 C   s   | |fS r   r   )r�   rŒ   r   r   r"   ÚevaluateÛ  s    z_ConstraintsTestA.evaluateN)Ú__name__Ú
__module__Ú__qualname__r   r�   rŒ   Ústaticmethodr™   r   r   r   r"   r“   ×  s   r“   c                   @   s$   e Zd Zeddd�Zedd„ ƒZdS )Ú_ConstraintsTestBr   Tr—   c                 C   s   | S r   r   )rŒ   r   r   r"   r™   ã  s    z_ConstraintsTestB.evaluateN)rš   r›   rœ   r   rŒ   r�   r™   r   r   r   r"   rž   à  s   rž   c                  C   sº  t ddiddid�t ddid� } d| jks0t‚| jd dksBt‚| jjdksRt‚d| jks`t‚| jd dksrt‚| jjdks‚t‚d	| jks�t‚| jd	 dks¢t‚| jjdks²t‚| j| d
 jksÆt‚d| j_| d
 jjdksât‚| d
 jd dksøt‚d| j_| d
 jjdk�st‚| d
 jd dk�s.t‚d| d j_| jjdk�sLt‚| d jjdk�sbt‚| jd dk�svt‚d| _	d| d
 j_| jd dk�sœt‚d| _	| jd dk�s¶t‚dS )z¯
    Various tests for copying of constraint values between compound models and
    their members.

    Regression test for https://github.com/astropy/astropy/issues/3481
    r�   )r   rl   rŒ   T)Úboundsr˜   )r˜   r€   r   Úmean_1r   )r   gš™™™™™Ù?)ra   rk   Fr1   )r   rm   N)
r   rŸ   r8   r€   r˜   r   r    r�   rŒ   Zsync_constraints)rT   r   r   r"   Útest_inherit_constraintsè  s8    ÿr¡   c               	   C   sž   t dddd�} tdƒ}tdƒ}| |B }| |_||B }t| d¡| |jB dƒƒ d}tjt|d�� || j W 5 Q R X tjt|d�� || @ j W 5 Q R X dS )zê
    Test that a compound model with a custom inverse has that inverse applied
    when the inverse of another model, of which it is a component, is computed.
    Regression test for https://github.com/astropy/astropy/issues/3542
    r1   r'   )rŽ   r�   zTNo analytical or user-supplied inverse transform has been implemented for this modelr/   N)r   r   r   rQ   r   r2   r3   rU   )rc   Úscaler_   Úmodel1Úmodel2r5   r   r   r"   Útest_compound_custom_inverse  s    ÿr¥   c                  C   s”   t dddƒ} t ddgddgddgƒ}| | }t t |¡¡}|j|jksLt‚|jj|jjks`t‚t 	|j
|j
k¡svt‚t 	|dƒ|dƒk¡s�t‚d	S )
zg
    Regression test for
    https://github.com/astropy/astropy/issues/3867#issuecomment-114547228
    r^   ç        ra   g       @ç      @rm   rl   r   N)r   ÚpickleÚloadsÚdumpsr‹   r8   Ú	__class__rš   rg   Úallrf   )rp   rI   rX   Úm2r   r   r"   Útest_pickle_compound9  s    r®   c                  C   sp   t dƒ} tdƒ}| |B }|dƒdks(t‚d| _|dƒdks>t‚d|_|dƒdksTt‚|| B }|dƒdkslt‚d S )	Nr1   r'   rK   r‚   éV   éd   iÌ  iö  )r   r   r8   ÚoffsetZfactor_1)ÚoffxÚsclrX   r­   r   r   r"   Útest_update_parametersJ  s    r´   c                  C   sx   t dƒ} tdƒ}| |B }d|_|jdks,t‚|jd ks:t‚d|_|jdksNt‚| d¡}|jdksft‚|jdkstt‚d S )Nr1   r'   r¢   )ZNone_0r¢   rN   ZM1)r   r   r…   Zsubmodel_namesr8   Úrename)r²   r³   rX   Úm1r   r   r"   Ú	test_nameY  s    
r·   c               	   C   sŽ   t dddƒ} t dddƒ}| | }d}tjt|d�� |d  W 5 Q R X d| _|d jdks^t‚d|_d}tjt|d�� |d  W 5 Q R X d S )Nr1   r'   z#No component with name 'bozo' foundr/   Zbozoz0Multiple components found using 'bozo' as name.*)r   r2   r3   r�   r…   rŒ   r8   )rp   rI   r|   r5   r   r   r"   Útest_name_indexg  s    r¸   zrequires scipy)Úreasonc                  C   sv   t dddgfdddgdd�} td	ƒ}tdƒ}t d¡ d
¡}|| @ |B }|||ƒ\}}|jd	ksdt‚|jd	ksrt‚dS )zK
    Issue #7411 - evaluate should not change the shape of the output.
    r1   rG   rH   é   é   é   F)ÚpointsZlookup_tableZbounds_errorr'   )r*   rK   N)r   r   r   rg   ÚarangeZreshapeÚndimr8   )rR   Zrotr†   r    rT   Úx1ro   r   r   r"   Útest_tabular_in_compoundw  s    rÁ   c                  C   sD  t ƒ t ddddddƒ } d| _tjdd…dd…f \}}|d }|d }| ||d	d
�}t ddtjtjtjtjtjtjtjtjg
ddtjtjtjtjtjtjtjtjg
ddtjtjtjtjtjtjtjtjg
ddtjtjtjtjtjtjtjtjg
tjtjtjtjtjtjtjtjtjtjg
tjtjtjtjtjtjtjtjtjtjg
tjtjtjtjtjtjtjtjtjtjg
tjtjtjtjtjtjtjtjtjtjg
tjtjtjtjtjtjtjtjtjtjg
tjtjtjtjtjtjtjtjtjtjg
g
¡}t |¡ }t|| || ƒ | |d |d d	d
�}t |¡ ¡ dk�s@t	‚d S )Nr'   rk   ra   r*   r   )rP   )r   rk   rx   r§   T©Zwith_bounding_boxg¬8“>Æ@g�¯5BÜ€@g›_¤‚P@g±”]@g‡(Oî±£@g«�VZë¸@gù
ûw­@ghh=Õ@r°   )
r   r{   rg   rh   ÚarrayÚnanÚisnanr   Úsumr8   )r|   r!   r    ÚvalÚcompareÚmaskZval2r   r   r"   Útest_bounding_box‰  s¦        ÿ    ÿ    ÿ    ÿ    ÿ    ÿ    ÿ    ÿ    ÿ    ÿíÿrÊ   c                  C   sN   t  d¡tj } t  d¡tj }t| |ƒ}|dtj dd�dtj ksJt‚d S )NrG   r1   TrÂ   r^   )rg   r¾   ÚuZpixZAAr   r8   )r½   ÚltrR   r   r   r"   Útest_bounding_box_with_units³  s    
rÍ   c                 C   s`   ddddddg| _ tdƒ}| |B }t ddd¡}||ƒ}|| |ƒƒ}t||ƒ |jdks\t‚d	S )
zY
    Tests that polynomials are offset when used in compound models.
    Issue #3699
    r1   r'   r*   rK   éûÿÿÿrG   rx   )Zc0_0Zc1_0Zc2_0Zc3_0Zc4_0Zc5_0Zoffset_1N)rf   r   rg   Úlinspacer   r‹   r8   )rc   r_   rT   r    ri   r   r   r   r"   Ú!test_compound_with_polynomials_1d¼  s    
rÐ   c               	   C   s¦  t ddd�tddd�B } tddd�t ddd�B }| |@ }|ddƒd	ksJt‚| dtd
dd�¡}|ddƒdkspt‚|ddƒd	ks‚t‚| dd¡dks–t‚| dt dƒtdƒB ¡}|ddƒd	ksÀt‚|ddƒdksÒt‚| dd¡dksæt‚| | }|dƒdksþt‚| dtd
dd�¡}|dƒdk�s$t‚ttddd�ddiƒ}| |B }t|dƒdƒ | dtdƒ¡}t|dƒdƒ d}tj	t
|d�� | dtdƒ¡}W 5 Q R X tdddd�}	t ddgdd �}
|	|
B }t|ddgƒdƒ d!}tj	t
|d�� | dtddd"�¡}W 5 Q R X | dtdddgdd#�¡}t|ddgƒd$ƒ t dƒ} t dƒ}t dd%d�}||B }t d&ƒ|_| |@ }| d%t d
ƒ¡}|ddƒd'k�sŒt‚| dd(¡dk�s¢t‚d)S )*z-
    Replace a model in a Compound model
    r'   Zshift2r„   r*   Zscale3Zscale2Zshift3r1   )é	   rH   rK   Zscale4)rº   rH   rº   rH   )r1   r'   )é   rH   rÒ   é   é   rC   Úrotate)r]   r…   r   )éúÿÿÿr1   é´   )rA   rÖ   z"No submodels found named not_therer/   Z	not_thererc   )Údegreer)   r…   r(   z6New and old models must have equal values for n_models)rØ   rŽ   )rØ   rŽ   r)   )r'   rK   ÚS3gš™™™™™À)r'   rz   rz   N)r   r   r8   Zreplace_submodelrQ   r   r   r   r2   r3   r4   r   r   )r=   r>   rX   r­   Úm3ÚRÚm4Zm5r5   ÚPÚSrÙ   ZS23r   r   r"   Útest_replace_submodelÔ  sT    
rß   r   c                 C   s   | | S r   r   ©r¶   r­   r   r   r"   r#     r$   c                 C   s   | | S r   r   rà   r   r   r"   r#     r$   c                 C   s   | | S r   r   rà   r   r   r"   r#     r$   c                 C   s   | | S r   r   rà   r   r   r"   r#     r$   c                 C   sŒ   t  ddd¡}t  ddddddg¡}t  ddd	g¡}tdƒ}tdddƒ}| ||ƒ}t|j|f||žŽ | |j|f|žŽ |j|f|žŽ ƒƒ d
S )út
    Tests that compound evaluate function produces the same
    result as the models with the operator applied
    rÎ   rG   rx   r1   r'   r*   rK   r   rk   N)rg   rÏ   rÃ   r   r   r   r™   ©r   r    Úp1Úp2r£   r¤   Úcompoundr   r   r"   Útest_compound_evaluate  s    
 þræ   c                  C   s~   t  ddd¡} t  dddg¡}t  dg¡}tdddƒ}tdƒ}|| }t|j| f||žŽ |j| f|žŽ |j| f|žŽ  ƒ d	S )
úz
    Tests that compound evaluate function produces the same
    result as the models with the power operator applied
    rÎ   rG   rx   r1   r   rm   r*   r'   N©rg   rÏ   rÃ   r   r
   r   r™   ©r    rã   rä   r£   r¤   rå   r   r   r"   Útest_compound_evaluate_power5  s    þrê   c                  C   sÄ   t  ddd¡} t  ddd¡}tddddddƒ}tdƒ}tdƒ}tddddddƒtdƒ@ tdƒ@ }t| | || d |d dddddddd¡| | |dddddd¡| | d d¡| |d d¡gƒ d S )NrÎ   rG   rx   r1   r   r'   rd   )rg   rÏ   r   r   r   r™   )r    r!   r¶   r­   rÚ   rX   r   r   r"   Ú#test_compound_evaluate_double_shiftH  s    "&ýþrë   c                 C   s   | | S r   r   rà   r   r   r"   r#   ]  r$   c                 C   s   | | S r   r   rà   r   r   r"   r#   ^  r$   c                 C   s   | | S r   r   rà   r   r   r"   r#   _  r$   c                 C   s   | | S r   r   rà   r   r   r"   r#   `  r$   c                 C   sž   t  ddd¡}t  dddg¡}t  dddg¡}td	ddƒ}td	ddƒ}| ||ƒ}t|j|f|ž|d |d |d	 d
œŽ| |j|f|žŽ |j|f|žŽ ƒƒ dS )rá   rÎ   rG   rx   r1   r   rm   r*   rk   r'   ©r~   r   r€   N)rg   rÏ   rÃ   r   r   r™   râ   r   r   r"   Ú"test_compound_evaluate_named_paramZ  s    
$ þrí   c                  C   s’   t  ddd¡} t  dddg¡}t  dg¡}tdddƒ}tdƒ}|| }t|j| f|ž|d |d |d d	œŽ|j| f|žŽ |j| f|žŽ  ƒ d
S )rç   rÎ   rG   rx   r1   r   rm   r*   r'   rì   Nrè   ré   r   r   r"   Ú'test_compound_evaluate_name_param_powerv  s    $þrî   c                  C   sv   t  ddd¡} t  dddg¡}t  dg¡}tƒ }tƒ }||@ }t|j| | f||fžŽ |j| f|žŽ | | |¡gƒ dS )	rá   rÎ   rG   rx   r1   ra   rk   r*   N)rg   rÏ   rÃ   r   r   r   r™   ré   r   r   r"   Útest_compound_evaluate_and‰  s    þrï   c                  C   sŠ   t  ddd¡} t  dg¡}t  dg¡}t  dg¡}t  dg¡}tdƒ}tdddƒ}||B }t| | ||||¡| | | |¡|||¡ƒ d	S )
rá   rÎ   rG   rx   rk   r*   r   ra   r1   N)rg   rÏ   rÃ   r   r   r   r™   )r    rã   Zp2_amplitudeZp2_meanZp2_stdr£   r¤   rå   r   r   r"   Útest_compound_evaluate_orœ  s    þrð   c                  C   sx   t jdd…dd…f \} }ddddddg}tddddƒ}t|d	|d
 iƒ}t|j|| f|žŽ |j|d
 | f|žŽ ƒ dS )z”
    Tests that compound evaluate function produces the same
    result as the models fix_inputs operator is applied
    when using the keyword
    Nrx   r*   r   ra   r1   rk   r'   r    rG   ©rg   rh   r   r   r   r™   ©r!   r    Zmodel_paramsrT   rå   r   r   r"   Ú,test_compound_evaluate_fix_inputs_by_keyword±  s    þró   c                  C   sx   t jdd…dd…f \} }ddddddg}tddddƒ}t|d|d	 iƒ}t|j|| f|žŽ |j|d	 | f|žŽ ƒ dS )
z˜
    Tests that compound evaluate function produces the same
    result as the models fix_inputs operator is applied
    when using the input index
    Nrx   r*   r   ra   r1   rk   r'   rG   rñ   rò   r   r   r"   Ú-test_compound_evaluate_fix_inputs_by_positionÄ  s    þrô   c            
      C   s  t ƒ } t ddd¡tj }t ddd¡tj tj tj }tdtj tj tj dtj tj d�}tdtj tj d	tj d�}|| }| |||ƒ}||ƒ}||ƒ}|j|j  krÌtjtj tj ksÒn t	‚t
||ƒ |jD ]}	t||	ƒt||	ƒksât	‚qâd
S ©z*
    Regression test for issue #12320
    r   r1   ée   rG   rx   r^   )ZslopeZ	interceptr¦   g      $@N©r   rg   rÏ   rË   r,   rX   Úkgr   Úunitr8   r   r‹   Úgetattr©
Úfitterr    r!   r¶   r­   ÚtruthÚfitÚunfit_outputÚ
fit_outputr…   r   r   r"   Ú3test_fit_multiplied_compound_model_with_mixed_units×  s     *,

r  c                  C   sž  t ƒ } t ddd¡tj }t ddd¡tj tj tj tj }tdtj tj tj dtj tj d�}tdtj tj d	tj d�}tdtj tj d	tj d�}|| | }| |||ƒ}||ƒ}||ƒ}	|j|	j  krütjtj tj tj k�sn t	‚t
||	ƒ |jD ] }
t||
ƒt||
ƒk�st	‚�qt ddd¡tj }t ddd¡tj tj tj tj tj }tdtj tj tj dtj tj d�}tdtj tj d	tj d�}tdtj tj d	tj d�}tdtj tj d	tj d�}|| }|| }|| }| |||ƒ}||ƒ}||ƒ}	|j|	j  k�rbtjtj tj tj tj k�shn t	‚t
||	ƒ |jD ] }
t||
ƒt||
ƒk�sxt	‚�qxd
S rõ   r÷   ©rü   r    r!   r¶   r­   rÚ   rý   rþ   rÿ   r   r…   rÜ   Zm11Zm22r   r   r"   Ú=test_fit_multiplied_recursive_compound_model_with_mixed_unitsð  s<    &*4

,*<

r  c            
      C   s  t ƒ } t ddd¡tj }t ddd¡tj tj tj }tdtj tj tj dtj tj d�}tdtj tj d	tj d�}|| }| |||ƒ}||ƒ}||ƒ}|j|j  krÌtjtj tj ksÒn t	‚t
||ƒ |jD ]}	t||	ƒt||	ƒksât	‚qâd
S rõ   ©r   rg   rÏ   rË   r,   rø   rX   r   rù   r8   r   r‹   rú   rû   r   r   r"   Ú0test_fit_divided_compound_model_with_mixed_units   s     *,

r  c                  C   sž  t ƒ } t ddd¡tj }t ddd¡tj tj tj tj }tdtj tj tj dtj tj d�}tdtj tj d	tj d�}tdtj tj d	tj d�}|| | }| |||ƒ}||ƒ}||ƒ}	|j|	j  krütjtj tj tj k�sn t	‚t
||	ƒ |jD ] }
t||
ƒt||
ƒk�st	‚�qt ddd¡tj }t ddd¡tj tj tj tj tj }tdtj tj tj dtj tj d�}tdtj tj d	tj d�}tdtj tj d	tj d�}tdtj tj d	tj d�}|| }|| }|| }| |||ƒ}||ƒ}||ƒ}	|j|	j  k�rbtjtj tj tj tj k�shn t	‚t
||	ƒ |jD ] }
t||
ƒt||
ƒk�sxt	‚�qxd
S rõ   r  r  r   r   r"   Ú8test_fit_mixed_recursive_compound_model_with_mixed_units9  s<    &*4

,*<

r  )Ur¨   Únumpyrg   r2   Znumpy.testingr   r   Zastropy.unitsZunitsrË   Zastropy.modeling.corer   r   r   Zastropy.modeling.fittingr   Zastropy.modeling.modelsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zastropy.modeling.parametersr   Z"astropy.utils.compat.optional_depsr   ÚmarkZparametrizer.   r6   r<   r?   rF   rJ   rO   rS   rV   r[   r\   r`   rb   rj   rr   ru   r}   r’   r“   rž   r¡   r¥   r®   r´   r·   r¸   ZskipifrÁ   rÊ   rÍ   rÐ   rß   ræ   rê   rë   rí   rî   rï   rð   ró   rô   r  r  r  r  r   r   r   r"   Ú<module>   sä   Lûþ

ûþ

	




ûþ

;
úþ

"
)?	0!
*

Düþ	
üþ	


/
