U
    e»{j"Ê  ã                   @   s¸  d Z ddlZddlmZ ddlmZ ddlm	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mZ ddlmZ dd	lmZ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% ddl&m'Z' ddl(m)Z) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 e-�r*ddl4m5Z5 e!e"gZ6ee#eegZ7dZ8G dd„ dƒZ9G dd„ dƒZ:ej;j<e- dd�G dd„ dƒƒZ=G dd„ dƒZ>ej;j<e- dd�G dd „ d ƒƒZ?G d!d"„ d"ƒZ@ej;j<e- dd�G d#d$„ d$ƒƒZAej;j<e- dd�G d%d&„ d&ƒƒZBd'd(„ ZCd)d*„ ZDej;j<e- dd�G d+d,„ d,ƒƒZEej;j<e- dd�ej; Fd-e7¡d.d/„ ƒƒZGd0d1„ ZHd2d3„ ZIej;j<e- dd�ej; Jd4¡ej; Fd-e7e6 ¡d5d6„ ƒƒƒZKej;j<e- dd�ej; Fd7e"e!g¡d8d9„ ƒƒZLejMjNe'eOƒ d:�d;d<„ ƒZPd=d>„ ZQej;j<e- dd�G d?d@„ d@ƒƒZRej;j<e- dd�ej; Fd-e7¡dAdB„ ƒƒZSej;j<e- dd�ej; Fd-e7¡dCdD„ ƒƒZTej;j<e- dd�ej; Fd-e7¡dEdF„ ƒƒZUej;j<e- dd�ej; JdG¡ej; Fd-e7¡dHdI„ ƒƒƒZVdS )Jz!
Module to test fitting routines
é    N)Ú
EntryPoint)Úcombinations)Úmock)Úlinalg)Úassert_allcloseÚassert_almost_equalÚassert_equal)Úmodels)ÚFittable2DModelÚ	Parameter)ÚDogBoxLSQFitterÚFitterÚFittingWithOutlierRemovalÚJointFitterÚLevMarLSQFitterÚLinearLSQFitterÚLMLSQFitterÚNonFiniteValueErrorÚSimplexLSQFitterÚSLSQPLSQFitterÚTRFLSQFitterÚ_NLLSQFitterÚpopulate_entry_points)ÚOptimization)Ú
sigma_clip)ÚNumpyRNGContext)Ú	HAS_SCIPY)Úget_pkg_data_filename)ÚAstropyUserWarningé   )Úirafutil)Úoptimizei7  c                   @   sj   e Zd ZdZdd„ Zdd„ Zdd„ Zejj	e
 dd	�ej d
e¡dd„ ƒƒZejj	e
 dd	�dd„ ƒZdS )ÚTestPolynomial2Dz Tests for 2D polynomial fitting.c                 C   sF   t  d¡| _tjd d…d d…f \| _| _dd„ }|| j| jƒ| _d S )Né   é   c                 S   s8   dd|   d| d   d|  d|d   d|  |  S )Nr   r#   é   é   r$   é   © ©ÚxÚyr(   r(   úb/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/tests/test_fitters.pyÚpoly2<   s    z+TestPolynomial2D.setup_class.<locals>.poly2)r	   ÚPolynomial2DÚmodelÚnpÚmgridr+   r*   Úz)Úselfr-   r(   r(   r,   Úsetup_class8   s    zTestPolynomial2D.setup_classc                 C   sZ   t ƒ }| jj| j| jd�}tj|| j ¡ dd�d }|| j| j| j| jƒ}t	|j
|ƒ d S )Nr)   éÿÿÿÿ)Zrcondr   )r   r/   Z	fit_derivr*   r+   r   Zlstsqr2   Úflattenr   Ú
parameters)r3   ÚfitterÚvÚpÚ	new_modelr(   r(   r,   Útest_poly2D_fittingA   s
    z$TestPolynomial2D.test_poly2D_fittingc                 C   s6   t ƒ }|| j| j| j| jƒ}t|| j| jƒ| jƒ d S ©N)r   r/   r*   r+   r2   r   ©r3   r8   r;   r(   r(   r,   Ú	test_evalH   s    zTestPolynomial2D.test_evalúrequires scipy©Úreasonr8   c              	   C   sf   |ƒ }ddddddg| j _tjtdd�� || j | j| j| jƒ}W 5 Q R X t|jd	d
ddddgƒ d S )Nç333333ã?çÍÌÌÌÌÌü?ç333333@çš™™™™™@çš™™™™™@çÍÌÌÌÌÌ@úModel is linear in parameters©Úmatchr   r#   r%   r&   r$   r'   )	r/   r7   ÚpytestÚwarnsr   r*   r+   r2   r   r>   r(   r(   r,   Útest_nonlinear_fittingM   s
     z'TestPolynomial2D.test_nonlinear_fittingc              
   C   sˆ   ddddddg| j _g }tD ]@}|ƒ }tjtdd��" | || j | j| j| j	ƒ¡ W 5 Q R X qt
|d	ƒD ]}t|d
 j|d jƒ qhd S )NrC   rD   rE   rF   rG   rH   rI   rJ   r#   r   r   )r/   r7   Únon_linear_fittersrL   rM   r   Úappendr*   r+   r2   r   r   )r3   Z
fit_modelsr8   Úpairr(   r(   r,   Útest_compare_nonlinear_fittingW   s     ÿ(z/TestPolynomial2D.test_compare_nonlinear_fittingN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   r<   r?   rL   ÚmarkÚskipifr   ÚparametrizerO   rN   rR   r(   r(   r(   r,   r"   5   s   	r"   c                   @   sx   e Zd ZdZdd„ Zdd„ Zdd„ Zejj	e
 dd	�ej d
e¡dd„ ƒƒZejj	e
 dd	�ej d
e¡dd„ ƒƒZdS )ÚTestICheb2Dzã
    Tests 2D Chebyshev polynomial fitting

    Create a 2D polynomial (z) using Polynomial2DModel and default coefficients
    Fit z using a ICheb2D model
    Evaluate the ICheb2D polynomial and compare with the initial z
    c                 C   sV   t  d¡| _tjd d…d d…f \| _| _|  | j| j¡| _t  dd¡| _	t
ƒ | _d S )Nr#   r$   )r	   r.   Zpmodelr0   r1   r+   r*   r2   ÚChebyshev2DÚcheb2r   r8   ©r3   r(   r(   r,   r4   p   s
    zTestICheb2D.setup_classc                 C   s`   t  d¡| j_t  dddddddd	d
g	¡}|  | j| j¡}|  | j| j| j|¡}t|j|ƒ d S )Né	   g      •@g     °›@g      y@g     �@g      £@g     @�@g      {@g     À�@g      `@)	r0   Úaranger\   r7   Úarrayr*   r+   r8   r   )r3   r:   r2   r/   r(   r(   r,   Útest_default_paramsw   s    ÿzTestICheb2D.test_default_paramsc                 C   s6   |   | j| j| j| j¡}|| j| jƒ}t| j|ƒ d S r=   )r8   r\   r*   r+   r2   r   )r3   r/   Zz1r(   r(   r,   Útest_poly2D_cheb2D€   s    zTestICheb2D.test_poly2D_cheb2Dr@   rA   r8   c                 C   s–   |ƒ }t  dd¡}t d¡|_|| j| jƒ}ddddddd	d
dg	|_tjt	dd�� ||| j| j|ƒ}W 5 Q R X t
|jdddddddddg	dd� d S )Nr#   r^   çš™™™™™¹?rC   rD   rE   rF   rG   rH   ç      @çÍÌÌÌÌÌ!@rI   rJ   r   r   r%   r&   r$   r'   é   é   ç•Ö&è.>©Úatol)r	   r[   r0   r_   r7   r*   r+   rL   rM   r   r   )r3   r8   Úcheb2dr2   r/   r(   r(   r,   Ú"test_chebyshev2D_nonlinear_fitting…   s    z.TestICheb2D.test_chebyshev2D_nonlinear_fittingc                 C   s¦   |ƒ }t  dd¡}t d¡|_|| j| jƒ}ddddddd	d
dg	|_t | j¡}tj	t
dd�� ||| j| j||d�}W 5 Q R X t|jdddddddddg	dd� d S )Nr#   r^   rc   rC   rD   rE   rF   rG   rH   rd   re   rI   rJ   ©Úweightsr   r   r%   r&   r$   r'   rf   rg   rh   ri   )r	   r[   r0   r_   r7   r*   r+   Ú	ones_likerL   rM   r   r   )r3   r8   rk   r2   rn   r/   r(   r(   r,   Ú/test_chebyshev2D_nonlinear_fitting_with_weights’   s     z;TestICheb2D.test_chebyshev2D_nonlinear_fitting_with_weightsN)rS   rT   rU   rV   r4   ra   rb   rL   rW   rX   r   rY   rO   rl   rp   r(   r(   r(   r,   rZ   g   s   	rZ   r@   rA   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚTestJointFitterzA
    Tests the joint fitting routine using 2 gaussian models
    c              	   C   sÌ   t jdddd�| _t jdddd�| _t| j| jg| jdg| jdgidgƒ| _t dd	d
¡| _|  | j¡}|  | j¡}t	t
ƒ� tj d¡}W 5 Q R X |d|  | _|d|  | _|  | j| j| j| j¡ dS )z²
        Create 2 gaussian models and some data with noise.
        Create a fitter for the two models keeping the amplitude parameter
        common for the two models.
        é
   çÍÌÌÌÌÌ-@ç333333Ó?)ÚmeanÚstddevé   çš™™™™™Ù?Ú	amplitudeçš™™™™™#@é   rc   éd   r#   N)r	   Ú
Gaussian1DÚg1Úg2r   Újfr0   r_   r*   r   Ú_RANDOM_SEEDÚrandomÚrandnÚny1Úny2)r3   Úy1Úy2Únr(   r(   r,   r4   ¨   s    
  ÿ
zTestJointFitter.setup_classc                 C   s8   t | jjd | jjd ƒ t | jjd | jjd ƒ dS )zH
        Tests that the amplitude of the two models is the same
        r   N)r   r€   Ú	fitparamsr~   r7   r   r]   r(   r(   r,   Útest_joint_parameter¾   s    z$TestJointFitter.test_joint_parameterc                    sr   ddg}ddg}d}t j|||f }dd„ ‰ ‡ fdd	„}tj||| j| j| j| jfd
�\}}t|| jj	dd� dS )zk
        Tests the fitting routine with similar procedure.
        Compares the fitted parameters.
        rs   rt   rw   rx   rz   c                 S   s*   | t  d|d d  ||d  d  ¡ S )Nç      à¿r   r#   r   ©r0   Úexp)ÚAr:   r*   r(   r(   r,   r/   Ï   s    z0TestJointFitter.test_joint_fitter.<locals>.modelc              	      sD   t  t jˆ | d | dd… |ƒ| ˆ | d | dd … |ƒ| f ¡S )Nr   r   r%   )r0   ÚravelÚr_)r:   Úx1r†   Zx2r‡   ©r/   r(   r,   ÚerrfuncÒ   s    <ÿz2TestJointFitter.test_joint_fitter.<locals>.errfunc©Úargsç{®Gáz„?©ÚrtolN)
r0   r�   r!   Úleastsqr*   r„   r…   r   r€   r‰   )r3   Úp1Úp2rŽ   r:   r“   ÚcoeffÚ_r(   r’   r,   Útest_joint_fitterÅ   s      ÿ
z!TestJointFitter.test_joint_fitterN)rS   rT   rU   rV   r4   rŠ   rž   r(   r(   r(   r,   rq   ¡   s   rq   c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestLinearLSQFitterc              	   C   sz   d}t jt|d��^ tjdddgdd�}tjdddgdd�}|| }t d¡}||dd�}tƒ }||||ƒ W 5 Q R X d	S )
zCTest that if an user tries to use a compound model, raises an errorz"Model must be simple, not compoundrJ   r#   r   ©ÚdegreeÚc0Ún_modelsrr   F©Úmodel_set_axisN)rL   ÚraisesÚ
ValueErrorr	   ÚPolynomial1Dr0   r_   r   )r3   ÚMESSAGEZinit_model1Zinit_model2Zinit_model_compr*   r+   r8   r(   r(   r,   Ú test_compound_model_raises_errorÞ   s    
z4TestLinearLSQFitter.test_compound_model_raises_errorc              	   C   s    t tj dd¡ƒ}t|ƒ�}| ¡ }| d¡}W 5 Q R X t |d ¡}|j	}t
|jd ƒ}tj|d | ¡ d�}tƒ }	|	||j|jƒ}
t|
jt |¡dd� d	S )
z@Tests fitting a 1D Chebyshev polynomial to some real world data.Údatazidcompspec.fitsÚbeginr   Úorder)Údomainrc   r—   N)r   ÚosÚpathÚjoinÚopenÚreadÚsplitr    ZIdentifyRecordrœ   ÚintÚfieldsr	   ÚChebyshev1DZ	get_ranger   r*   r2   r   r7   r0   r`   )r3   Z	test_fileÚfÚlinesZreclistÚrecordZcoeffsr­   Zinitial_modelr8   Úfitted_modelr(   r(   r,   Útest_chebyshev1Dê   s    
z$TestLinearLSQFitter.test_chebyshev1Dc              	   C   s�   t jdddgdd�}t d¡}||dd�}|jdks8t‚ttƒ� |tjj	dd	|jd
� }W 5 Q R X t
ƒ }||||ƒ}t||dd�|dd� dS )z-Tests fitting multiple models simultaneously.r#   r   r    rr   Fr¤   ©r#   rr   r   r–   ©Úsizerc   r—   N)r	   r¨   r0   r_   ÚshapeÚAssertionErrorr   r�   r‚   Únormalr   r   )r3   Ú
init_modelr*   Z
y_expectedr+   r8   r»   r(   r(   r,   Útest_linear_fit_model_setü   s    

"z-TestLinearLSQFitter.test_linear_fit_model_setc              	   C   s    t jdddgdd�}t d¡}t d¡}|||dd�}|jdksDt‚ttƒ� |tjj	dd	|jd
� }W 5 Q R X t
ƒ }|||||ƒ}t|||dd�|dd� dS )z0Tests fitted multiple 2-D models simultaneously.r#   r   )r¡   Úc0_0r£   rr   Fr¤   r½   r   r–   r¾   rc   r—   N)r	   r.   r0   r_   rÀ   rÁ   r   r�   r‚   rÂ   r   r   )r3   rÃ   r*   r+   Z
z_expectedr2   r8   r»   r(   r(   r,   Útest_linear_fit_2d_model_set  s    


"z0TestLinearLSQFitter.test_linear_fit_2d_model_setc                 C   s`   t jddd�}d|j_t d¡}d| d| |  }tƒ }||||ƒ}t|jdddgd	d
� dS )zX
        Tests fitting a polynomial model with a fixed parameter (issue #6135).
        r#   r   )r¡   Úc1Trr   ç      à?ç       @ç      ð?ç›+¡†›„=ri   N)	r	   r¨   rÇ   Úfixedr0   r_   r   r   r7   ©r3   rÃ   r*   r+   r8   r»   r(   r(   r,   Útest_linear_fit_fixed_parameter  s    
z3TestLinearLSQFitter.test_linear_fit_fixed_parameterc                 C   sš   t jdddgdd�}d|j_t d¡}t d| d| |  d| g¡}tƒ }||||ƒ}t|j	dd	gd
d� t|jddgd
d� t|j
dd	gd
d� dS )zV
        Tests fitting a polynomial model set with a fixed parameter (#6135).
        r#   r   éþÿÿÿ)r¡   rÇ   r£   Trr   rÈ   rÉ   ç        rË   ri   rÊ   ç       ÀN)r	   r¨   rÇ   rÌ   r0   r_   r`   r   r   r¢   Úc2)r3   rÃ   r*   Úyyr8   r»   r(   r(   r,   Ú)test_linear_fit_model_set_fixed_parameter+  s    
"z=TestLinearLSQFitter.test_linear_fit_model_set_fixed_parameterc                 C   s¦   t jdddgddgddddœd�}tjdd…dd…f \}}t d| d	|  d
| |  d| | d| |  g¡}tƒ }|||||ƒ}t|||dd�|dd� dS )zX
        Tests fitting a 2d polynomial model set with fixed parameters (#6135).
        r#   r   r‹   T)Úc1_0Úc0_1)r¡   rÕ   rÖ   r£   rÌ   r   r$   rÈ   rc   çš™™™™™É?Fr¤   rË   ri   N)r	   r.   r0   r1   r`   r   r   )r3   rÃ   r*   r+   Úzzr8   r»   r(   r(   r,   Ú-test_linear_fit_2d_model_set_fixed_parameters<  s    û:zATestLinearLSQFitter.test_linear_fit_2d_model_set_fixed_parametersc                 C   s´   t jddd�}t d¡}tjjd| d |d gt ||g¡d�}d|d< d|jd< d	|ddd
…f< d|jddd
…f< tƒ }||||ƒ}t	|j
ddgdd� t	|jddgdd� dS )zN
        Tests model set fitting with masked value(s) (#4824, #6819).
        r   r#   )r¡   r£   rr   ©Úmaskç      Y@)r   rf   Tg      YÀr%   rÊ   rÑ   rË   ri   rÉ   N)r	   r¨   r0   r_   ÚmaÚmasked_arrayÚ
zeros_likerÛ   r   r   r¢   rÇ   rÍ   r(   r(   r,   Ú'test_linear_fit_model_set_masked_valuesP  s    
*
z;TestLinearLSQFitter.test_linear_fit_model_set_masked_valuesc                 C   sÈ   t jddd�}tjdd…dd…f \}}tjjd| d|  d |d|  d gt ||g¡d�}d	|d
< d|jd
< tƒ }|||||ƒ}t	|j
ddgdd� t	|jddgdd� t	|jddgdd� dS )zQ
        Tests 2D model set fitting with masked value(s) (#4824, #6819).
        r   r#   ©r£   r   r$   r%   rÈ   rÚ   g     @�À)r   r%   r   TrÊ   rÑ   rË   ri   rÉ   ç      @r‹   N)r	   r.   r0   r1   rÝ   rÞ   rß   rÛ   r   r   rÅ   rÕ   rÖ   )r3   rÃ   r*   r+   r2   r8   r»   r(   r(   r,   Ú*test_linear_fit_2d_model_set_masked_valuese  s    " ÿ
z>TestLinearLSQFitter.test_linear_fit_2d_model_set_masked_valuesN)rS   rT   rU   rª   r¼   rÄ   rÆ   rÎ   rÔ   rÙ   rà   rã   r(   r(   r(   r,   rŸ   Ý   s   rŸ   c                   @   s  e Zd ZdZdd„ Zej de¡ej de¡dd„ ƒƒZ	ej de¡ej de¡dd	„ ƒƒZ
ej d
e¡dd„ ƒZej d
e¡dd„ ƒZej d¡ej d¡ej de¡ej d
e¡dd„ ƒƒƒƒZej d¡ej d
e¡dd„ ƒƒZej d
e¡dd„ ƒZdd„ Zej d
e¡dd„ ƒZdS )ÚTestNonLinearFittersz?Tests non-linear least squares fitting and the SLSQP algorithm.c              	   C   s€   dddg| _ t ddd¡| _dt | j¡ }ttƒ� tj d|¡}W 5 Q R X dd	„ }|| j | jƒ| | _	t
jdddd
�| _d S )Nr|   r$   r   r   rr   rc   ç      @c                 S   s.   | d t  d| d d  || d  d  ¡ S ©Nr   r‹   r#   r   rŒ   ©r:   r*   r(   r(   r,   Úfunc‡  s    z.TestNonLinearFitters.setup_class.<locals>.func©rv   )Úinitial_valuesr0   r_   Úxdataro   r   r�   r‚   rÂ   Úydatar	   r}   Úgauss)r3   ÚsigmaZyerrorrè   r(   r(   r,   r4   ~  s    
z TestNonLinearFitters.setup_classÚfitter0Úfitter1c                 C   sX   |ƒ }|| j | j| jƒ}tjdddd�}|ƒ }||| j| jdd�}t|j|jdd� d	S )
ú~
        Runs `LevMarLSQFitter` and `TRFLSQFitter` with estimated and
        analytic derivatives of a `Gaussian1D`.
        r|   ç      @r   ré   T©Úestimate_jacobiançü©ñÒMbP?r—   N)rí   rë   rì   r	   r}   r   r7   )r3   rï   rð   r/   Úg1eÚemodelr(   r(   r,   Ú test_estimated_vs_analytic_deriv�  s    z5TestNonLinearFitters.test_estimated_vs_analytic_derivc                 C   sl   d| j d  }|ƒ }|| j| j| j |d�}tjdddd�}|ƒ }||| j| j |dd	�}t|j|jd
d� dS )rñ   rÊ   ç      $@rm   r|   rò   r   ré   T)rn   rô   rõ   r—   N)rì   rí   rë   r	   r}   r   r7   )r3   rï   rð   rn   r/   rö   r÷   r(   r(   r,   Ú-test_estimated_vs_analytic_deriv_with_weightsœ  s        ÿzBTestNonLinearFitters.test_estimated_vs_analytic_deriv_with_weightsr8   c                    sb   |ƒ }|| j | j| jdd�}dd„ ‰ ‡ fdd„}tj|| j| j| jfd�}t|j|d d	d
� dS )zs
        Tests results from `LevMarLSQFitter` and `TRFLSQFitter` against
        `scipy.optimize.leastsq`.
        Tró   c                 S   s.   | d t  d| d d  || d  d  ¡ S ræ   rŒ   rç   r(   r(   r,   rè   º  s    z5TestNonLinearFitters.test_with_optimize.<locals>.funcc                    s   ˆ | |ƒ| S r=   r(   )r:   r*   r+   ©rè   r(   r,   r“   ½  s    z8TestNonLinearFitters.test_with_optimize.<locals>.errfuncr”   r   rõ   r—   N)rí   rë   rì   r!   r™   rê   r   r7   )r3   r8   r/   r“   Úresultr(   rû   r,   Útest_with_optimize°  s      
ÿz'TestNonLinearFitters.test_with_optimizec                 C   s¼   |ƒ }|| j | j| jdd�}|| j | j| jdt | j¡d�}t|j|jdd� t | j¡}d|ddd…< |dk}|| j | j| | j| dd�}|| j | j| jd|d�}t|j|jdd� dS )	zW
        Tests results from `LevMarLSQFitter` and `TRFLSQFitter` with weights.
        Tró   )rô   rn   ç-Cëâ6?r—   rÊ   Nr#   )rí   rë   rì   r0   ro   r   r7   rß   )r3   r8   r/   Zwithwrn   rÛ   r(   r(   r,   Útest_with_weightsÅ  s6    
û   ÿ    ÿz&TestNonLinearFitters.test_with_weightsz.ignore:.* Maximum number of iterations reachedúQignore:Values in x were outside bounds during a minimize step, clipping to boundsÚfitter_classc                 C   sF   |ƒ }|ƒ }|| j | j| jƒ}|| j | j| jƒ}t|j|jdd� dS )zl
        Tests results from non-linear fitters against `LevMarLSQFitter`
        and `TRFLSQFitter`
        rþ   r—   N)rí   rë   rì   r   r7   )r3   r  r8   Z
fitter_clsr;   r/   r(   r(   r,   Útest_fitter_against_LevMaræ  s
    z/TestNonLinearFitters.test_fitter_against_LevMarc                 C   sZ   |ƒ }t jdddd�}d|j_tƒ }||| j| jƒ}||| j| jƒ}t|j|jdd� dS )	zq
        Runs `LevMarLSQFitter`/`TRFLSQFitter` and `SLSQPLSQFitter` on a
        model with constraints.
        r|   r$   r   ré   Trþ   r—   N)	r	   r}   ru   rÌ   r   rë   rì   r   r7   )r3   r8   r~   ZfslsqpZslsqp_modelr/   r(   r(   r,   Útest_LSQ_SLSQP_with_constraintsû  s    
z4TestNonLinearFitters.test_LSQ_SLSQP_with_constraintsc              	   C   sŠ  |ƒ }t j d¡ d}tƒ }t |¡}d}dddg}t j dd|¡}t j dd|¡}|d	 |d
 |  |d |d   }	|	t j dd|¡7 }	tj	t
dd�� ||||	|d�}
W 5 Q R X ||||	|d�}t|
j|jdd� t|
j|ddd� t ¡ }t|tƒ�s
t|tƒ�r6tj	t
dd�� ||||	|d� W 5 Q R X n||||	|d� t |¡}d}d}|| }ddddddg}t j dd|¡ ||¡}t j dd|¡ ||¡}t j dd|¡ ||¡}	|d	 |d
 |  |d |d   |d |	  |d |	d   |d | |	  }|t j dd|¡ ||¡7 }tj	t
dd�� ||||	||d�}
W 5 Q R X ||||	||d�}t|
j|jdd� t|
j|ddd� dS )z:
        Tests that issue #11581 has been solved.
        é*   r#   i'  rÉ   g      $Àg      @rÐ   rù   r   r   g      ø?rI   rJ   rm   ç¼‰Ø—²Òœ<ri   r–   )r˜   rj   zThe fit may be unsuccessful; *.r|   é–   rÊ   rå   g       Àg      "Àç      Àr%   r&   r$   N)r0   r‚   Úseedr   r	   r¨   ÚuniformrÂ   rL   rM   r   r   r7   r}   Ú
isinstancer   r   r.   Úreshape)r3   r8   ZnorderZfitter2r/   ZnptsÚcZtwZtxÚtyZtf1Ztf2ZnxptsZnyptsÚtzr(   r(   r,   Ú'test_non_linear_lsq_fitter_with_weights  sd    

$ ÿ

ÿþ
ýüûÿz<TestNonLinearFitters.test_non_linear_lsq_fitter_with_weightsc              	   C   s”   G dd„ dt ƒ}t ddd¡ }}ttƒ�. | ||dd¡}|tjjdd	|jd
�7 }W 5 Q R X t	ƒ }|ddƒ}|||||ƒ}t
|jddgdd� dS )z)A basic test for the `SimplexLSQ` fitter.c                   @   s$   e Zd Zeƒ Zeƒ Zedd„ ƒZdS )z@TestNonLinearFitters.test_simplex_lsq_fitter.<locals>.Rosenbrockc                 S   s    ||  d ||| d  d   S )Nr#   r(   )r*   r+   ÚaÚbr(   r(   r,   ÚevaluateR  s    zITestNonLinearFitters.test_simplex_lsq_fitter.<locals>.Rosenbrock.evaluateN)rS   rT   rU   r   r  r  Ústaticmethodr  r(   r(   r(   r,   Ú
RosenbrockN  s   r  r  râ   r|   rÊ   rÜ   rÐ   rc   r¾   r   r–   r—   N)r
   r0   Úlinspacer   r�   r  r‚   rÂ   rÀ   r   r   r7   )r3   r  r*   r+   r2   r8   Zr_iZr_fr(   r(   r,   Útest_simplex_lsq_fitterK  s    
"
z,TestNonLinearFitters.test_simplex_lsq_fitterc              
   C   s.  |ƒ }d}d}t tƒ�0 t ddd¡}|| | tj t|ƒ¡ }W 5 Q R X t |t t|ƒ¡g¡j	}t 
t 
tj t 
|j	|¡¡|j	¡|j	¡}t |t 
||¡ ¡  d ¡t|ƒt|ƒ  }tj t 
|j	|¡¡| }	t ||¡}
tjtdd�� ||
||ƒ}W 5 Q R X t|j| ¡ ƒ t|	|jd ƒ dS )	z�
        Tests that the 'param_cov' fit_info entry gets the right answer for
        *linear* least squares, where the answer is exact
        r#   r|   r   r   rI   rJ   Z	param_covN)r   r�   r0   r  r‚   rƒ   ÚlenZvstackÚonesÚTÚmatmulr   ÚinvÚsumr�   r	   ÚLinear1DrL   rM   r   r   r7   Úfit_info)r3   r8   r  r  r*   r+   ÚXÚbetaÚs2ZolscovÚmodÚfmodr(   r(   r,   Útest_param_cova  s    
&*.z#TestNonLinearFitters.test_param_covN)rS   rT   rU   rV   r4   rL   rW   rY   rO   rø   rú   rý   rÿ   ÚfilterwarningsÚfittersr  r  r  r  r$  r(   r(   r(   r,   rä   z  s:   

 
ÿÿ
<rä   c                   @   sP   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTestEntryPointz4Tests population of fitting with entry point fittersc                 C   s   G dd„ dt ƒ}|S )Nc                   @   s   e Zd ZdZ dS )z2TestEntryPoint.successfulimport.<locals>.goodclassZ	GoodClassN©rS   rT   rU   r(   r(   r(   r,   Ú	goodclass‡  s   r)  )r   )r3   r)  r(   r(   r,   Úsuccessfulimport…  s    zTestEntryPoint.successfulimportc                 C   s   t ‚d S r=   )ÚImportErrorr]   r(   r(   r,   ÚraiseimporterrorŒ  s    zTestEntryPoint.raiseimporterrorc                 C   s   dd„ }|S )Nc                   S   s   d S r=   r(   r(   r(   r(   r,   Úbadfunc‘  s    z-TestEntryPoint.returnbadfunc.<locals>.badfuncr(   )r3   r-  r(   r(   r,   Úreturnbadfunc�  s    zTestEntryPoint.returnbadfuncc                 C   s   G dd„ dƒ}|S )Nc                   @   s   e Zd ZdS )z/TestEntryPoint.returnbadclass.<locals>.badclassNr(  r(   r(   r(   r,   Úbadclass™  s   r/  r(   )r3   r/  r(   r(   r,   Úreturnbadclass—  s    zTestEntryPoint.returnbadclassc                 C   s&   t  t¡}d|_| j|_t|gƒ dS )zThis should work fineZWorkingN)r   Úcreate_autospecr   Únamer*  Úloadr   )r3   Zmock_entry_workingr(   r(   r,   Útest_workingž  s    
zTestEntryPoint.test_workingc              	   C   s@   t  t¡}d|_| j|_tjtdd�� t	|gƒ W 5 Q R X dS )zHThis raises an import error on load to test that it is handled correctlyZIErrz.*ImportError.*rJ   N)
r   r1  r   r2  r,  r3  rL   rM   r   r   )r3   Zmock_entry_importerrorr(   r(   r,   Útest_import_error¥  s
    
z TestEntryPoint.test_import_errorc              	   C   s@   t  t¡}d|_| j|_tjtdd�� t	|gƒ W 5 Q R X dS )z2This returns a function which fails the type checkZBadFuncz	.*Class.*rJ   N)
r   r1  r   r2  r.  r3  rL   rM   r   r   )r3   Zmock_entry_badfuncr(   r(   r,   Útest_bad_func¯  s
    
zTestEntryPoint.test_bad_funcc              	   C   s@   t  t¡}d|_| j|_tjtdd�� t	|gƒ W 5 Q R X dS )z8This returns a class which doesn't inherient from fitterZBadClassz.*BadClass.*rJ   N)
r   r1  r   r2  r0  r3  rL   rM   r   r   )r3   Zmock_entry_badclassr(   r(   r,   Útest_bad_class¹  s
    
zTestEntryPoint.test_bad_classN)rS   rT   rU   rV   r*  r,  r.  r0  r4  r5  r6  r7  r(   r(   r(   r,   r'  ‚  s   

r'  c                   @   sF   e Zd Zdd„ Zej d¡ej d¡ej dee	 ¡dd„ ƒƒƒZ
dS )	ÚTest1DFittingWithOutlierRemovalc                 C   s2   t  ddd¡| _d| _dd„ }|| j| jƒ| _d S )Ng      Àrò   éÈ   )râ   çÍÌÌÌÌÌô?çš™™™™™é?c                 S   s.   | d t  d|| d  d  | d d  ¡ S )Nr   r‹   r   r#   rŒ   rç   r(   r(   r,   rè   Ê  s    z9Test1DFittingWithOutlierRemoval.setup_class.<locals>.func)r0   r  r*   Úmodel_paramsr+   )r3   rè   r(   r(   r,   r4   Æ  s    z+Test1DFittingWithOutlierRemoval.setup_classú"ignore:The fit may be unsuccessfulr   r8   c           	      C   s¬   dd l m} |ƒ }tj d¡ |jjd| jjd�}| j	tj 
dd| jj¡|tj 
dd| jj¡   }tjdddd	�}t|td
dd�}||| j|ƒ\}}t|j| jdd� d S )Nr   ç      Ð?r¾   rÐ   r×   râ   rò   rÊ   )ry   ru   rv   r%   ©Úniterrî   rc   r—   )Úscipy.statsÚstatsr0   r‚   r  Ú	bernoulliÚrvsr*   rÀ   r+   rÂ   r	   r}   r   r   r   r7   r<  )	r3   r8   rB  r  r+   Zg_initÚfitr»   r�   r(   r(   r,   Ú test_with_fitters_and_sigma_clipÏ  s    ÿÿz@Test1DFittingWithOutlierRemoval.test_with_fitters_and_sigma_clipN)rS   rT   rU   r4   rL   rW   r%  rY   rO   r&  rF  r(   r(   r(   r,   r8  Ä  s   	
ÿr8  c                   @   sN   e Zd Zdd„ Zdd„ Zej d¡ej d¡ej de	e
 ¡dd	„ ƒƒƒZd
S )ÚTest2DFittingWithOutlierRemovalc                 C   sP   t jddd…ddd…f \| _| _d| _dd„ }|| jt  | j| jg¡ƒ| _d S )Néýÿÿÿr%   y              `@)râ   rÊ   rÐ   r;  r;  c                 S   sV   | d t  d|d | d  d  | d d  d|d | d  d  | d d   ¡ S )Nr   r‹   r#   r&   rÈ   r   r%   rŒ   )r:   Úposr(   r(   r,   ÚGaussian_2Dí  s
    
""ÿÿz@Test2DFittingWithOutlierRemoval.setup_class.<locals>.Gaussian_2D)r0   r1   r+   r*   r<  r`   r2   )r3   rJ  r(   r(   r,   r4   é  s    "z+Test2DFittingWithOutlierRemoval.setup_classc                 C   s  |d }|d }|| }|| }t  |¡}t  |¡| }t  |¡| }	|d j||d jd  |d jd  |d d   }
|d j||d jd  |d jd  |d d   }t  ||
 |d jd  ¡ t¡}t  |	| |d jd  ¡ t¡}|| | }|||	fS )Nr   r   rÉ   )r0   r  r¿   ÚaroundZastyperµ   )r3   r«   rI  r+   r*   ZwxZwyZtotal_intensityÚx_meanÚy_meanZ
x_to_pixelZ
y_to_pixelZx_posZy_posry   r(   r(   r,   Úinitial_guessõ  s    
66""z-Test2DFittingWithOutlierRemoval.initial_guessr=  r   r8   c           
      C   sæ   dd l m} |ƒ }tj d¡ |jjd| jjd�}| jtj 	dd| jj¡|tj 	| jd| jj¡   }|  
| jt | j| jg¡¡}tj|d |d |d d	d
d�}t|tddd�}||| j| j|ƒ\}}	t|jdd… | jdd� d S )Nr   r>  r¾   rÐ   r×   rÉ   r   r#   g      è?g      ô?©ry   rL  rM  Zx_stddevZy_stddevr%   râ   r?  r$   rc   ri   )rA  rB  r0   r‚   r  rC  rD  r2   rÀ   rÂ   rN  r`   r+   r*   r	   Ú
Gaussian2Dr   r   r   r7   r<  )
r3   r8   rB  r  r2   ÚguessZg2_initrE  r»   r�   r(   r(   r,   rF    s(    ÿÿûz@Test2DFittingWithOutlierRemoval.test_with_fitters_and_sigma_clipN)rS   rT   rU   r4   rN  rL   rW   r%  rY   rO   r&  rF  r(   r(   r(   r,   rG  ç  s   
ÿrG  c                  C   s´   t jddd�} ttƒ tddtjjtjjd�}t 	d¡}t 
d| d d| | | d g¡}d|d	< || ||ƒ\} }t| jd
dgdd� t| jddgdd� t| jddgdd� dS )z9Test model set fitting with outlier removal (issue #6819)r#   rá   ç      @r%   ©rî   r@  ZcenfuncZstdfuncrr   r&   iüÿÿ)r   r$   g      Àrù   rË   ri   rÊ   rÐ   rÉ   N)r	   r¨   r   r   r   r0   rÝ   ru   Ústdr_   r`   r   r¢   rÇ   rÒ   )Úpoly_setr8   r*   r+   Zfilt_yr(   r(   r,   Ú(test_1d_set_fitting_with_outlier_removal+  s     ú	
&rV  c                  C   sä   t jdddd�} ttƒ tddtjjtjjd�}tj	dd…dd…f \}}t 
t || dd	|  d
|  g¡dd¡}d|ddd…df< || |||ƒ\} }t| jddgggdd� t| jddgggdd� t| jdd
gggdd� dS )zETest fitting 2D model set (axis 2) with outlier removal (issue #6819)r   r#   ©r£   r¥   rR  r%   rS  r   r$   rc   r×   rÜ   rÐ   rÊ   rË   ri   gš™™™™™¹¿N)r	   r.   r   r   r   r0   rÝ   ru   rT  r1   Zrollaxisr`   r   rÅ   rÕ   rÖ   )rU  r8   r+   r*   r2   Zfilt_zr(   r(   r,   Ú/test_2d_set_axis_2_fitting_with_outlier_removalD  s     ú	,rX  c                   @   s”   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zej de¡dd„ ƒZdd„ Zej de¡dd„ ƒZdd„ ZdS )Ú%TestWeightedFittingWithOutlierRemovalzIssue #7020c                 C   s–   t jdd…dd…f \| _| _t  | j| j d¡d d | _t  | j| j d¡d d | _d| jd< d| jd< | j ¡ | _| j ¡ | _	| j ¡ | _
d S )Nr   r{   r#   r   g     @�@©r   r   ©r   r   )r0   r1   r+   r*   r"  r2   rn   r6   Úx1dÚz1dÚ	weights1dr]   r(   r(   r,   r4   `  s    

z1TestWeightedFittingWithOutlierRemoval.setup_classc                 C   s>   t  d¡}tƒ }||| j| jƒ}t|jd | j ¡ dd� d S ©Nr   r–   ri   )r	   r¨   r   r\  r]  r   r7   ru   ©r3   r/   r8   rE  r(   r(   r,   Ú*test_1d_without_weights_without_sigma_clipk  s    
zPTestWeightedFittingWithOutlierRemoval.test_1d_without_weights_without_sigma_clipc                 C   sv   t  d¡}ttƒ tddd�}||| j| jƒ\}}|  ¡ | jjd ksJt	‚|d rZ|d s^t	‚t
|jd ddd	� d S )
Nr   r%   râ   r?  r#   r   rÐ   r–   ri   )r	   r¨   r   r   r   r\  r]  r  r¿   rÁ   r   r7   ©r3   r/   r8   rE  rÛ   r(   r(   r,   Ú'test_1d_without_weights_with_sigma_clipq  s    
   ÿ  ÿzMTestWeightedFittingWithOutlierRemoval.test_1d_without_weights_with_sigma_clipc                 C   s<   t  d¡}tƒ }||| j| j| jd�}|jd dks8t‚d S ©Nr   rm   rÊ   )r	   r¨   r   r\  r]  r^  r7   rÁ   r`  r(   r(   r,   Ú'test_1d_with_weights_without_sigma_clip}  s    
zMTestWeightedFittingWithOutlierRemoval.test_1d_with_weights_without_sigma_clipc                 C   s^   t  d¡}ttƒ tddd�}||| j| j| jd�\}}|jd dksHt	‚|jd dk sZt	‚dS )	zr
        smoke test for #7020 - fails without fitting.py
        patch because weights does not propagate
        r   r%   râ   r?  rm   r–   rÊ   N)
r	   r¨   r   r   r   r\  r]  r^  r7   rÁ   )r3   r/   r8   rE  Úfilteredr(   r(   r,   Ú$test_1d_with_weights_with_sigma_clipƒ  s    
   ÿzJTestWeightedFittingWithOutlierRemoval.test_1d_with_weights_with_sigma_clipc                 C   sb   t jddd�}ttƒ tddd�}t | j| jg¡}||| j|| j	d�\}}t
|jddgd	d
� dS )z5added for #6819 (1D model set with weights in common)r   r#   rá   r%   râ   r?  rm   r;  rË   ri   N)r	   r¨   r   r   r   r0   r`   r]  r\  r^  r   r7   )r3   r/   r8   r]  rE  rf  r(   r(   r,   Ú/test_1d_set_with_common_weights_with_sigma_clip‘  s       ÿzUTestWeightedFittingWithOutlierRemoval.test_1d_set_with_common_weights_with_sigma_clipc                 C   sr   t jddd�}ttƒ tddd�}t | j| jg¡}t | j| jg¡}||| j	||d�\}}t
|jddgd	d
� dS )z"1D model set with separate weightsr   r#   rá   r%   râ   r?  rm   r;  rË   ri   N)r	   r¨   r   r   r   r0   r`   r]  r^  r\  r   r7   )r3   r/   r8   r]  rn   rE  rf  r(   r(   r,   Ú(test_1d_set_with_weights_with_sigma_clipœ  s       ÿzNTestWeightedFittingWithOutlierRemoval.test_1d_set_with_weights_with_sigma_clipc                 C   sB   t  d¡}tƒ }||| j| j| jƒ}t|jd | j ¡ dd� d S r_  )	r	   r.   r   r*   r+   r2   r   r7   ru   r`  r(   r(   r,   Ú*test_2d_without_weights_without_sigma_clip¨  s    
zPTestWeightedFittingWithOutlierRemoval.test_2d_without_weights_without_sigma_clipc                 C   sz   t  d¡}ttƒ tddd�}||| j| j| jƒ\}}|  ¡ | jj	d ksNt
‚|d r^|d sbt
‚t|jd dd	d
� d S )Nr   r%   râ   r?  r#   rZ  r[  rÐ   r–   ri   )r	   r.   r   r   r   r*   r+   r2   r  r¿   rÁ   r   r7   rb  r(   r(   r,   Ú'test_2d_without_weights_with_sigma_clip®  s    
   ÿzMTestWeightedFittingWithOutlierRemoval.test_2d_without_weights_with_sigma_clipr8   c              	   C   sZ   |ƒ }t  d¡}tjtdd��  ||| j| j| j| jd�}W 5 Q R X |j	d dksVt
‚d S )Nr   rI   rJ   rm   rÊ   )r	   r.   rL   rM   r   r*   r+   r2   rn   r7   rÁ   )r3   r8   r/   rE  r(   r(   r,   Ú'test_2d_with_weights_without_sigma_clip¸  s
    
$zMTestWeightedFittingWithOutlierRemoval.test_2d_with_weights_without_sigma_clipc                 C   s@   t  d¡}tƒ }||| j| j| j| jd�}|jd dks<t‚d S rd  )	r	   r.   r   r*   r+   r2   rn   r7   rÁ   r`  r(   r(   r,   Ú.test_2d_linear_with_weights_without_sigma_clipÁ  s    
zTTestWeightedFittingWithOutlierRemoval.test_2d_linear_with_weights_without_sigma_clipÚbase_fitterc              	   C   s€   |ƒ }t  d¡}t|tddd�}tjtdd��$ ||| j| j| j	| j
d�\}}W 5 Q R X |jd dksjt‚|jd d	k s|t‚d
S )z`smoke test for #7020 - fails without fitting.py patch because
        weights does not propagater   r%   râ   r?  rI   rJ   rm   r–   rÊ   N)r	   r.   r   r   rL   rM   r   r*   r+   r2   rn   r7   rÁ   )r3   rn  r/   r8   rE  r�   r(   r(   r,   Ú$test_2d_with_weights_with_sigma_clipÈ  s    
(zJTestWeightedFittingWithOutlierRemoval.test_2d_with_weights_with_sigma_clipc                 C   sb   t  d¡}ttƒ tddd�}||| j| j| j| jd�\}}|j	d dksLt
‚|j	d dk s^t
‚dS )	z(same as test above with a linear fitter.r   r%   râ   r?  rm   r–   rÊ   N)r	   r.   r   r   r   r*   r+   r2   rn   r7   rÁ   )r3   r/   r8   rE  r�   r(   r(   r,   Ú+test_2d_linear_with_weights_with_sigma_clipÖ  s    
   ÿzQTestWeightedFittingWithOutlierRemoval.test_2d_linear_with_weights_with_sigma_clipN)rS   rT   rU   rV   r4   ra  rc  re  rg  rh  ri  rj  rk  rL   rW   rY   rO   rl  rm  ro  rp  r(   r(   r(   r,   rY  \  s    


rY  r8   c           	   	   C   s  | ƒ } t | tƒrt d¡ tjdd…dd…f \}}ttƒ� tjj	dd|j
d�}W 5 Q R X t ddddd	¡}|||ƒ}| t d
dddd¡|||| ƒ}t|j|jdd� t d	¡}t d¡d |_|||ƒ}tjtdd�� | t d	¡|||| ƒ}W 5 Q R X t|j|jdd� dS )zIssue #5737z]This test is poorly designed and causes issues for scipy.optimize.least_squares based fittersr   é   r–   r¾   rr   r^   r#   r%   é   rf   rg   r:  ç333333ó?ri   rI   rJ   N)r
  r   rL   Zxfailr0   r1   r   r�   r‚   rÂ   rÀ   r	   rP  r   r7   r.   r_   rM   r   )	r8   ÚXinÚYinÚzsigr   r2   Zgmodr›   Úpmodr(   r(   r,   Útest_fitters_with_weightsâ  s$    
ÿ

 

"rx  c               	   C   s¢   t jdd…dd…f \} }tƒ }ttƒ� t jjdd| jd�}W 5 Q R X t 	d¡}t  
d¡d |_|| |ƒ}|t 	d¡| ||| |d d	�}t|j|jdd
� dS )zRegression test for #7035r   rq  r–   r¾   r%   rr   rs  rÏ   rm   ri   N)r0   r1   r   r   r�   r‚   rÂ   rÀ   r	   r.   r_   r7   r   ©rt  ru  r8   rv  r›   r2   rw  r(   r(   r,   Útest_linear_fitter_with_weights  s    


 rz  c               	   C   s´   t jdd…dd…f \} }|  ¡ | ¡  } }tƒ }ttƒ� t jjdd| jd�}W 5 Q R X t	 
d¡}t  d¡d |_|| |ƒ}|t	 
d¡| ||| |d d	�}t|j|jdd
� dS )z6Same as the above #7035 test but with flattened inputsr   rq  r–   r¾   r%   rr   rs  rÏ   rm   ri   N)r0   r1   r6   r   r   r�   r‚   rÂ   rÀ   r	   r.   r_   r7   r   ry  r(   r(   r,   Ú$test_linear_fitter_with_weights_flat  s    


 r{  r=  c                 C   s~   | ƒ } t  ddd¡}t d¡}||ƒ}t| tƒr>ddddœ}nd	dd
ddœ}t| tƒs`t| tƒrj| d¡ | |||f|Ž}dS )zZ
    Test that ``**kwargs`` work with all optimizers.
    This is a basic smoke test.
    rr   r&   rt   rq  éO   r   g�íµ ÷Æ°>)ÚmaxiterÚ	verblevelÚaccéM   r–   )r}  r~  Úepsilonr  r~  N)	r	   r}   r0   r_   r
  r   r   r   Úpop)r8   r/   r*   r+   Úkwargsr�   r(   r(   r,   Útest_fitters_interface!  s    


r„  r  c              
   C   sÆ  | ƒ }|j jdkst‚d|j _|j jdks.t‚|j jt t t¡j¡ksLt‚d|j _|j jdksdt‚|j jdkstt‚d|j _|j jdksŒt‚t	|j ƒ|j j
j› d�ksªt‚t ¡ }t ¡ }t ¡ }t ¡ }d}t ¡ }t ¡ }| tk�r|||||f}	||||dœ}
n|||||f}	||||dœ}
tjj|j j
d	|	d
��„ tjtdd��2 ||
f|j t ¡ t ¡ t ¡ |d�k�svt‚W 5 Q R X |
|j jk�s’t‚t|tƒ�r¬|j jdk n|j j|k W 5 Q R X d S )Nr|   iè  r  gH¯¼šò×z>z()r   )Úfinal_func_valÚnumiterÚ	exit_modeÚmessage)r…  r†  r‡  Znum_function_callsZ
opt_method)Úreturn_valuezThe fit may be unsuccessful; .*rJ   )Úxtol)Z_opt_methodr}  rÁ   Úepsr0   ÚsqrtZfinfoÚfloatr  ÚreprÚ	__class__rS   ÚmkÚ	MagicMockr   ÚpatchÚobjectrL   rM   r   r  r
  )r  r8   r‰   r…  r†  Zfuncallsr‡  ZmessrŠ  r‰  r  r(   r(   r,   Útest_optimizers:  s^    
üü  ÿ
   ÿr”  )Ú__abstractmethods__c               	   C   s4   t t ¡ ƒ} d}tjt|d�� | ƒ  W 5 Q R X d S )Nz'Subclasses should implement this methodrJ   )r   r�  r‘  rL   r¦   ÚNotImplementedError)Úoptimizationr©   r(   r(   r,   Útest_Optimization_abstract_callx  s    r˜  c               	   C   sè   t  d¡} ttƒ� t jjdddd�}W 5 Q R X d|d< ttƒ tdd	d	d
d�}|t	j
ddd�| |ƒ\}}tt  |¡dgdggƒ |jd dks’t‚ttƒ tdd	d	d
d�}|t	 
d¡| |d ƒ\}}| ¡ dksÒt‚|jd dksät‚dS )z¾
    Test that FittingWithOutlierRemoval stops prior to reaching niter if the
    set of masked points has converged and correctly reports the actual number
    of iterations performed.
    é   rù   rÊ   )r#   r™  )ÚlocÚscaler¿   rÜ   )r   é   r$   râ   r   )r8   Zoutlier_funcr@  Zsigma_lowerZsigma_upperZmaxitersr#   rá   r   rœ  r@  N)r0   r_   r   r�   r‚   rÂ   r   r   r   r	   r·   r   Úwherer  rÁ   r  )r*   r+   r8   r/   rÛ   r(   r(   r,   Ú'test_fitting_with_outlier_removal_niter€  s4    

úúrž  c                   @   sž   e Zd ZdZe d¡e ¡ gZejdddd�ejdddgddgd�gZdd	„ Z	e
j d
eeeeƒƒ¡e
j de¡dd„ ƒƒZe
j de¡dd„ ƒZdd„ ZdS )ÚTestFittingUncertantiesz�
    Test that parameter covariance is calculated correctly for the fitters
    that do so (currently LevMarLSQFitter, LinearLSQFitter).
    r#   FrW  rÊ   r   )r£   ÚslopeÚ	interceptc                 C   sv   t j d¡ t  d¡| _t jjdddd� dd¡| _t jjdddd� dd¡| _t j d¡ dd¡| _	| j	d | _
d S )Nik  rr   r   r|   r¾   )r0   r‚   r  r_   r*   Úrandintr  Úx_gridÚy_gridÚ	rand_gridÚrandr]   r(   r(   r,   r4   º  s    z#TestFittingUncertanties.setup_class)Úsingle_modelÚ	model_setr8   c              	   C   s   |dd�}t dd�}|| jƒ| j }tjtdd�� ||| j|ƒ}W 5 Q R X |jj}||| j|ƒ}|jj}	t|	|ƒ tt 	t 
|	¡¡|jjƒ || jdd�t | j| jg¡ }||| j|ƒ}
dd„ |
jD ƒ}t|d	 |ƒ tt 	t 
|d	 ¡¡|
jd	 jƒ d
S )zÙTest that fitting uncertainties are computed correctly for 1D models
        and 1D model sets. Use covariance/stds given by LevMarLSQFitter as
        a benchmark since they are returned by the numpy fitter.
        T©Zcalc_uncertaintiesrI   rJ   Fr¤   c                 S   s   g | ]
}|j ‘qS r(   ©Ú
cov_matrix©Ú.0Újr(   r(   r,   Ú
<listcomp>â  s     z:TestFittingUncertanties.test_1d_models.<locals>.<listcomp>r   N)r   r*   r¦  rL   rM   r   r«  r   r0   rŒ  ÚdiagÚstdsr`   )r3   r§  r¨  r8   Úlinlsq_fitterr+   Ú	fit_modelÚ	cov_modelÚfit_model_linlsqÚcov_model_linlsqZfit_1d_set_linlsqZcov_1d_set_linlsqr(   r(   r,   Útest_1d_modelsÂ  s$    	


  
ÿz&TestFittingUncertanties.test_1d_modelsc              	   C   s4  |dd�}t dd�}tjddd�}tjddddgdd�}|| j| jƒ| j }tjtdd	�� ||| j| j|ƒ}W 5 Q R X |j	j	}||| j| j|ƒ}|j	j	}	t
||	ƒ t
t t |	¡¡|jjƒ || j| jƒt | j| jf¡ }||| j| j|ƒ}
d
d„ |
j	D ƒ}t
|d |ƒ t
t t |d ¡¡|
jd jƒ dS )zâ
        Test that fitting uncertainties are computed correctly for 2D models
        and 2D model sets. Use covariance/stds given by LevMarLSQFitter as
        a benchmark since they are returned by the numpy fitter.
        Tr©  r#   )rÅ   r%   F)r¡   r£   rÅ   r¥   rI   rJ   c                 S   s   g | ]
}|j ‘qS r(   rª  r¬  r(   r(   r,   r¯    s     z:TestFittingUncertanties.test_2d_models.<locals>.<listcomp>r   N)r   r	   r.   r£  r¤  r¥  rL   rM   r   r«  r   r0   rŒ  r°  r±  r`   )r3   r8   r²  r§  r¨  Zz_gridr³  r´  rµ  r¶  Zfit_2d_set_linlsqZcov_2d_set_linlsqr(   r(   r,   Útest_2d_modelsë  s6    

   ÿ

ÿ 
ÿz&TestFittingUncertanties.test_2d_modelsc                 C   s0  t dd�}t ¡ }||| j|| jƒ| j ƒ}t|jƒ | ¡ }d|jksLt	‚d|jksZt	‚t|j
ƒ | ¡ }d|jkszt	‚d|jksˆt	‚t|jjddd	�ƒ | ¡ }d
|jks²t	‚d|jksÀt	‚t|j
jddd�ƒ | ¡ }d|jksêt	‚d|jksøt	‚|jd |jd k�st	‚|j
d |j
d k�s,t	‚dS )z5
        Test printing methods and indexing.
        Tr©  zslope    | 0.001zintercept| -0.005,  0.03zslope    | 0.032zintercept| 0.173r$   r   )Ú	round_valÚ	max_lineszslope    | 0.00105r¡  )rº  r¹  zslope    | 0.03241rZ  )r   r   N)r   r	   r  r*   r¦  Úprintr«  Z
readouterrÚoutrÁ   r±  Úpprint)r3   Zcapsysr8   r"  Zfit_modZcapturedr(   r(   r,   Ú%test_covariance_std_printing_indexing  s*    


z=TestFittingUncertanties.test_covariance_std_printing_indexingN)rS   rT   rU   rV   r	   r¨   r  Zexample_1D_modelsZexample_1D_setsr4   rL   rW   rY   ÚlistÚziprO   r·  r¸  r¾  r(   r(   r(   r,   rŸ  ­  s   þ ÿ%
)rŸ  c              
   C   sv   t  dddddt jdt jg¡}t  dt jdt jd	t jd
dg¡}t ¡ }| ƒ }tjtdd�� ||||ƒ W 5 Q R X dS )zARegression test error introduced to solve issues #3575 and #12809r   r#   r%   r&   r$   rf   r^   é   rw   rr  é   z$Objective function has encountered.*rJ   N)	r0   r`   ÚnanÚinfr	   r}   rL   r¦   r   ©r8   r*   r+   Úm_initrE  r(   r(   r,   Útest_non_finite_error:  s      ÿrÇ  c              
   C   sx   t  ddddddddg¡}t  d	t jd
t jdt jdt jg¡}t ¡ }| ƒ }tjtdd�� ||||dd� W 5 Q R X dS )úFRegression test filter introduced to remove non-finte values from datar   r#   r%   r&   r$   r'   rf   rg   r^   rÁ  rw   rr  ú4Non-Finite input data has been removed by the fitterrJ   T©Zfilter_non_finiteN)	r0   r`   rÃ  rÄ  r	   r}   rL   rM   r   rÅ  r(   r(   r,   Útest_non_finite_filter_1DL  s    "þrË  c              	   C   s¸   t jdd…dd…f \}}tjdddddd�}ttƒ� |||ƒt jj|jŽ  }W 5 Q R X t j	|d< t j
|d< t j
 |d	< t ¡ }| ƒ }tjtd
d�� |||||dd� W 5 Q R X dS )rÈ  r   rr   r   r$   r#   rO  rZ  )r%   r%   )rf   r$   rÉ  rJ   TrÊ  N)r0   r1   r	   rP  r   r�   r‚   r¦  rÀ   rÃ  rÄ  rL   rM   r   )r8   r*   r+   Zm_truer2   rÆ  rE  r(   r(   r,   Útest_non_finite_filter_2D^  s    
"

þrÌ  z%ignore:Model is linear in parameters*c                 C   sn   t jddd�}| ƒ } tjdtd�}t d¡}t d¡}| |||ƒ}t|jdƒ | ||||d�}t|jdƒ dS )	a  
    Regression test for issue #13617

        Issue:
            Weighted non-linear weighted fits of O-degree polynomials cause an error
            to be raised by scipy.

        Fix:
            There should be no error raised in this circumstance
    r   )r¢   rr   )Zdtype)rr   rÊ   rm   N)r	   r¨   r0   r_   r�  r  r   r¢   )r8   r/   r*   r+   rn   rE  r(   r(   r,   Ú7test_non_linear_fit_zero_degree_polynomial_with_weightsv  s    

rÍ  )WrV   Úos.pathr¯   Zunittest.mockr   r�  Úimportlib.metadatar   Ú	itertoolsr   ZunittestÚnumpyr0   rL   r   Znumpy.testingr   r   r   Zastropy.modelingr	   Zastropy.modeling.corer
   r   Zastropy.modeling.fittingr   r   r   r   r   r   r   r   r   r   r   r   r   Zastropy.modeling.optimizersr   Zastropy.statsr   Zastropy.utilsr   Z"astropy.utils.compat.optional_depsr   Zastropy.utils.datar   Zastropy.utils.exceptionsr   Ú r    Zscipyr!   r&  rO   r�   r"   rZ   rW   rX   rq   rŸ   rä   r'  r8  rG  rV  rX  rY  rY   rx  rz  r{  r%  r„  r”  r’  ZmultipleÚsetr˜  rž  rŸ  rÇ  rË  rÌ  rÍ  r(   r(   r(   r,   Ú<module>   s–   <2:;   	B"C 
<
- 
