
    IR-eH                     Z
   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Z8 G d d          Z9 G d d          Z:ej;        <                    e- d           G d d                      Z= G d d          Z>ej;        <                    e- d           G d d                       Z? G d! d"          Z@ej;        <                    e- d           G d# d$                      ZAej;        <                    e- d           G d% d&                      ZBd' ZCd( ZDej;        <                    e- d           G d) d*                      ZEej;        <                    e- d          ej;        F                    d+e7          d,                         ZGd- ZHej;        F                    d.i d/fd0d/id/fd1d/id2fg          d3             ZId4 ZJej;        <                    e- d          ej;        K                    d5          ej;        F                    d+e7e6z             d6                                     ZLej;        <                    e- d          ej;        F                    d7e"e!g          d8                         ZMejN        O                    e' eP            9          d:             ZQd; ZRej;        <                    e- d           G d< d=                      ZSej;        <                    e- d          ej;        F                    d+e7          ej;        F                    d> ejT        d?          dg          d@                                     ZUej;        <                    e- d          ej;        F                    d+e7          ej;        F                    d> ejT        d?          dg          dA                                     ZVej;        <                    e- d          ej;        F                    d+e7          ej;        F                    d> ejT        dB          dg          dC                                     ZWej;        <                    e- d          ej;        K                    dD          ej;        F                    d+e7          dE                                     ZXdS )Fz!
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                       e 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          d	             Zd
S )TestPolynomial2Dz Tests for 2D polynomial fitting.c                     t          j        d          | _        t          j        d dd df         \  | _        | _        d } || j        | j                  | _        d S )N      c                 T    dd| z  z   d| dz  z  z   d|z  z   d|dz  z  z   d| z  |z  z   S )Nr    r&         r'       xys     Clib/python3.11/site-packages/astropy/modeling/tests/test_fitters.pypoly2z+TestPolynomial2D.setup_class.<locals>.poly2<   s@    q1u9q1a4x'!a%/!ad(:QUQYFF    )r
   Polynomial2Dmodelnpmgridr/   r.   z)selfr1   s     r0   setup_classzTestPolynomial2D.setup_class8   sc    (++
"1"bqb&)	G 	G 	G tvtv&&r2   c                 D   t                      }| j                            | j        | j                  }t          j        || j                                        d          d         } || j        | j        | j        | j                  }t          |j
        |           d S )Nr-   )rcondr   )r   r4   	fit_derivr.   r/   r   lstsqr7   flattenr   
parameters)r8   fittervp	new_models        r0   test_poly2D_fittingz$TestPolynomial2D.test_poly2D_fittingA   s     ""J  46TV 44LDFNN,,B777:F4:tvtvtv>>		,a00000r2   c                     t                      } || j        | j        | j        | j                  }t           || j        | j                  | j                   d S N)r   r4   r.   r/   r7   r   r8   rA   rD   s      r0   	test_evalzTestPolynomial2D.test_evalH   sR     ""F4:tvtvtv>>			$&$&1146:::::r2   requires scipyreasonrA   c                     |            }g d| j         _        t          j        t          d          5   || j         | j        | j        | j                  }d d d            n# 1 swxY w Y   t          |j        g d           d S )N333333??333333@皙@皙@@Model is linear in parametersmatch)r    r&   r)   r*   r'   r+   )	r4   r@   pytestwarnsr   r.   r/   r7   r   rH   s      r0   test_nonlinear_fittingz'TestPolynomial2D.test_nonlinear_fittingM   s      > > >
\,4TUUU 	C 	Ctz464646BBI	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C	,.@.@.@AAAAAs   #A##A'*A'c           
         g d| j         _        g }t          D ]t} |            }t          j        t
          d          5  |                     || j         | j        | j        | j	                             d d d            n# 1 swxY w Y   ut          |d          D ](}t          |d         j        |d         j                   )d S )NrN   rU   rV   r&   r   r    )r4   r@   non_linear_fittersrX   rY   r   appendr.   r/   r7   r   r   )r8   
fit_modelsrA   pairs       r0   test_compare_nonlinear_fittingz/TestPolynomial2D.test_compare_nonlinear_fittingW   s/    > > >

( 	N 	NFVXXF"*J   N N !!&&TVTVTV"L"LMMMN N N N N N N N N N N N N N N
 !Q// 	D 	DDDG.Q0BCCCC	D 	Ds   6BB	B	N)__name__
__module____qualname____doc__r9   rE   rI   rX   markskipifr   parametrizer\   rZ   r`   r,   r2   r0   r$   r$   5   s        **' ' '1 1 1; ; ;
 [I.>??[X'9::B B ;: @?B [I.>??D D @?D D Dr2   r$   c                   @   e 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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                 &   t          j        d          | _        t          j        d dd df         \  | _        | _        |                     | j        | j                  | _        t          j        dd          | _	        t                      | _        d S )Nr&   r'   )r
   r3   pmodelr5   r6   r/   r.   r7   Chebyshev2Dcheb2r   rA   r8   s    r0   r9   zTestICheb2D.setup_classp   sr    )!,,"1"bqb&)TVTV,,'1--
%''r2   c                 &   t          j        d          | j        _        t          j        g d          }|                     | j        | j                  }|                     | j        | j        | j        |          }t          |j        |           d S )N	   )	g      @g     @g      y@g     @g      @g     @@g      {@g     @g      `@)	r5   arangerm   r@   arrayr.   r/   rA   r   )r8   rC   r7   r4   s       r0   test_default_paramszTestICheb2D.test_default_paramsw   s}     "	!
HOOO
 
 JJtvtv&&DJ::E,a00000r2   c                     |                      | j        | j        | j        | j                  } || j        | j                  }t          | j        |           d S rG   )rA   rm   r.   r/   r7   r   )r8   r4   z1s      r0   test_poly2D_cheb2DzTestICheb2D.test_poly2D_cheb2D   sN    DJ??U4646""DFB'''''r2   rJ   rK   rA   c                 |    |            }t          j        dd          }t          j        d          |_         || j        | j                  }g d|_        t          j        t          d          5   ||| j        | j        |          }d d d            n# 1 swxY w Y   t          |j        g dd           d S )	Nr&   rp   	皙?rO   rP   rQ   rR   rS   rT   g      @g!@rU   rV   	r   r    r&   r)   r*   r'   r+         &.>atol)r
   rl   r5   rq   r@   r.   r/   rX   rY   r   r   )r8   rA   cheb2dr7   r4   s        r0   "test_chebyshev2D_nonlinear_fittingz.TestICheb2D.test_chebyshev2D_nonlinear_fitting   s     #Aq))IaLLF4646""III\,4TUUU 	6 	6F64646155E	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6(*E*E*EFSSSSSSs   3BBBc                     |            }t          j        dd          }t          j        d          |_         || j        | j                  }g d|_        t          j        | j                  }t          j	        t          d          5   ||| j        | j        ||          }d d d            n# 1 swxY w Y   t          |j        g dd	           d S )
Nr&   rp   rx   rU   rV   weightsrz   r}   r~   )r
   rl   r5   rq   r@   r.   r/   	ones_likerX   rY   r   r   )r8   rA   r   r7   r   r4   s         r0   /test_chebyshev2D_nonlinear_fitting_with_weightsz;TestICheb2D.test_chebyshev2D_nonlinear_fitting_with_weights   s%    #Aq))IaLLF4646""III,tv&&\,4TUUU 	G 	GF646461gFFFE	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G 	G(*E*E*EFSSSSSSs   B33B7:B7N)ra   rb   rc   rd   r9   rs   rv   rX   re   rf   r   rg   r\   r   r   r,   r2   r0   ri   ri   g   s         ( ( (1 1 1( ( (
 [I.>??[X'9::	T 	T ;: @?	T [I.>??[X'9::
T 
T ;: @?
T 
T 
Tr2   ri   rJ   rK   c                   $    e Zd ZdZd Zd Zd ZdS )TestJointFitterzA
    Tests the joint fitting routine using 2 gaussian models
    c                    t          j        ddd          | _        t          j        ddd          | _        t	          | j        | j        g| j        dg| j        dgidg          | _        t          j        dd	d
          | _        |                     | j                  }|                     | j                  }t          t                    5  t          j                            d          }ddd           n# 1 swxY w Y   |d|z  z   | _        |d|z  z   | _        |                     | 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皙#@   ry   d   Nr&   )r
   
Gaussian1Dg1g2r   jfr5   rq   r.   r   _RANDOM_SEEDrandomrandnny1ny2)r8   y1y2ns       r0   r9   zTestJointFitter.setup_class   sa    #BT#>>>#BR<<<Wdg;-;- PSVRW
 
 2r3''WWTV__WWTV__\** 	% 	%	$$A	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% A:A:$&$(33333s    C;;C?C?c                     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   r@   r   rn   s    r0   test_joint_parameterz$TestJointFitter.test_joint_parameter   sR     	)!,dg.@.CDDD)!,dg.@.CDDDDDr2   c                     ddg}ddg}d}t           j        |||f         }d fd}t          j        ||| j        | j        | j        | j        f          \  }}t          || j        j	        d	
           dS )zk
        Tests the fitting routine with similar procedure.
        Compares the fitted parameters.
        r   r   r   r   r   c                 f    | t          j        d|d         dz  z  ||d         z
  dz  z            z  S )N      r    r&   r   r5   exp)ArC   r.   s      r0   r4   z0TestJointFitter.test_joint_fitter.<locals>.model   s5    rvdQqTQY.!ad(q@AAAAr2   c           
          t          j        t           j         | d         | dd         |          |z
   | d         | dd          |          |z
  f                   S )Nr   r    r)   )r5   ravelr_)rC   x1r   x2r   r4   s        r0   errfuncz2TestJointFitter.test_joint_fitter.<locals>.errfunc   sd    8eeAaD!AaC&"--2EE!A$!""r4J4JR4OOP  r2   args{Gz?rtolN)
r5   r   r"   leastsqr.   r   r   r   r   r   )	r8   p1p2r   rC   r   coeff_r4   s	           @r0   test_joint_fitterz!TestJointFitter.test_joint_fitter   s    
 C[#YE!R)	B 	B 	B	 	 	 	 	
 #QdfdhA
 
 
q 	tw0zBBBBBBr2   N)ra   rb   rc   rd   r9   r   r   r,   r2   r0   r   r      sS         4 4 4,E E EC C C C Cr2   r   c                   D    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )TestLinearLSQFitterc                 X   d}t          j        t          |          5  t          j        dddgd          }t          j        dddgd          }||z   }t          j        d          } ||d          }t                      } ||||           d	d	d	           d	S # 1 swxY w Y   d	S )
zCTest that if an user tries to use a compound model, raises an errorz"Model must be simple, not compoundrV   r&   r    degreec0n_modelsr   Fmodel_set_axisN)rX   raises
ValueErrorr
   Polynomial1Dr5   rq   r   )r8   MESSAGEinit_model1init_model2init_model_compr.   r/   rA   s           r0    test_compound_model_raises_errorz4TestLinearLSQFitter.test_compound_model_raises_error   s    7]:W555 	* 	* -QAq6ANNNK -QAq6ANNNK)K7O	"A%888A$&&FF?Aq)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   A4BB#&B#c                 h   t          t          j                            dd                    }t	          |          5 }|                                }|                    d          }ddd           n# 1 swxY w Y   t          j        |d                   }|j	        }t          |j        d                   }t          j        |dz
  |                                          }t                      }	 |	||j        |j                  }
t%          |
j        t)          j        |          d	           dS )
z@Tests fitting a 1D Chebyshev polynomial to some real world data.datazidcompspec.fitsbeginNr    order)domainry   r   )r   ospathjoinopenreadsplitr!   IdentifyRecordr   intfieldsr
   Chebyshev1D	get_ranger   r.   r7   r   r@   r5   rr   )r8   	test_fileflinesreclistrecordcoeffsr   initial_modelrA   fitted_models              r0   test_chebyshev1Dz$TestLinearLSQFitter.test_chebyshev1D   s>    *"',,v?P*Q*QRR	)__ 	+FFHHEkk'**G	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ (44FM'*++*519V=M=M=O=OPPP ""vmVXvx@@/&1A1ANNNNNNs   *A33A7:A7c                    t          j        dddgd          }t          j        d          } ||d          }|j        dk    sJ t          t                    5  |t          j                            dd	|j        
          z   }ddd           n# 1 swxY w Y   t                      } ||||          }t           ||d          |d           dS )z-Tests fitting multiple models simultaneously.r&   r    r   r   Fr   r&   r   r   r   sizeNry   r   )r
   r   r5   rq   shaper   r   r   normalr   r   )r8   
init_modelr.   
y_expectedr/   rA   r   s          r0   test_linear_fit_model_setz-TestLinearLSQFitter.test_linear_fit_model_set   s9    (q!fqIII
IbMMZ%888
7**** \** 	N 	NRY--aJ<L-MMMA	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N !""vj!Q//Qu===zPTUUUUUUs   +BBBc                    t          j        dddgd          }t          j        d          }t          j        d          } |||d          }|j        dk    sJ t          t                    5  |t          j                            dd	|j        
          z   }ddd           n# 1 swxY w Y   t                      } |||||          }t           |||d          |d           dS )z0Tests fitted multiple 2-D models simultaneously.r&   r    )r   c0_0r   r   Fr   r   r   r   r   Nry   r   )r
   r3   r5   rq   r   r   r   r   r   r   r   )r8   r   r.   r/   
z_expectedr7   rA   r   s           r0   test_linear_fit_2d_model_setz0TestLinearLSQFitter.test_linear_fit_2d_model_set  sL    (AKKK
IbMMIbMMZ1U;;;
7**** \** 	N 	NRY--aJ<L-MMMA	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N !""vj!Q22Q%@@@*SWXXXXXXs   1+B((B,/B,c                     t          j        dd          }d|j        _        t	          j        d          }d|z   d|z  |z  z   }t                      } ||||          }t          |j        g dd	           d
S )zX
        Tests fitting a polynomial model with a fixed parameter (issue #6135).
        r&   r    )r   c1Tr         ?)       @      ?r   +=r~   N)	r
   r   r   fixedr5   rq   r   r   r@   r8   r   r.   r/   rA   r   s         r0   test_linear_fit_fixed_parameterz3TestLinearLSQFitter.test_linear_fit_fixed_parameter  s     (a888
"
IbMMEC!GaK ""vj!Q///uMMMMMMr2   c                    t          j        dddgd          }d|j        _        t	          j        d          }t	          j        d|z   d|z  |z  z   d|z  g          }t                      } ||||          }t          |j	        dd	gd
           t          |j        ddgd
           t          |j
        dd	gd
           dS )zV
        Tests fitting a polynomial model set with a fixed parameter (#6135).
        r&   r    )r   r   r   Tr   r   r           r   r~   r          N)r
   r   r   r   r5   rq   rr   r   r   r   c2)r8   r   r.   yyrA   r   s         r0   )test_linear_fit_model_set_fixed_parameterz=TestLinearLSQFitter.test_linear_fit_model_set_fixed_parameter+  s     (q"gJJJ
"
IbMMXq1usQw{*BF344 ""vj!R00#s%@@@@#t5AAAA#s%@@@@@@r2   c           	      ^   t          j        dddgddgdddd          }t          j        ddddf         \  }}t          j        d|z   d	|z  z
  d
|z  |z  z   d|z  |z   d|z  |z  z
  g          }t                      } |||||          }t           |||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   ry   皙?Fr   r   r~   N)r
   r3   r5   r6   rr   r   r   )r8   r   r.   r/   zzrA   r   s          r0   -test_linear_fit_2d_model_set_fixed_parameterszATestLinearLSQFitter.test_linear_fit_2d_model_set_fixed_parameters<  s     (Q..
 
 

 x!QqS!1Xq1usQwq14a!eai#'A+6MNOO ""vj!Q33Q%@@@"5QQQQQQr2   c                    t          j        dd          }t          j        d          }t          j                            d|z  dz   |dz
  gt          j        ||g                    }d|d<   d|j        d<   d	|ddd
f<   d|j        ddd
f<   t                      } ||||          }t          |j
        ddgd           t          |j        ddgd           dS )zN
        Tests model set fitting with masked value(s) (#4824, #6819).
        r    r&   )r   r   r   mask      Y@)r   r{   Tg      Yr)   r   r   r   r~   r   N)r
   r   r5   rq   mamasked_array
zeros_liker
  r   r   r   r   r   s         r0   'test_linear_fit_model_set_masked_valuesz;TestLinearLSQFitter.test_linear_fit_model_set_masked_valuesP  s     (A>>>
IbMMEA	1q51q!f8M8MNN$t!QqS&	q!A#v ""vj!Q//#t5AAAA#s%@@@@@@r2   c                    t          j        dd          }t          j        ddddf         \  }}t          j                            d|z  d|z  z   dz   |d|z  z
  dz
  gt          j        ||g                    }d	|d
<   d|j        d
<   t                      } |||||          }t          |j
        ddgd           t          |j        ddgd           t          |j        ddg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   r~   r         @r   N)r
   r3   r5   r6   r  r  r  r
  r   r   r   r  r  )r8   r   r.   r/   r7   rA   r   s          r0   *test_linear_fit_2d_model_set_masked_valuesz>TestLinearLSQFitter.test_linear_fit_2d_model_set_masked_valuese  s    (Q777
x!QqS!1EUQU]QC!Ga0r}aV7L7L  
 
 '
w ""vj!Q22)C;UCCCC)C:EBBBB)C;UCCCCCCr2   N)ra   rb   rc   r   r   r   r   r   r  r  r  r  r,   r2   r0   r   r      s        
* 
* 
*O O O$V V V Y Y Y"N N NA A A"R R R(A A A*D D D D Dr2   r   c                   ,   e Zd ZdZd Zej                            de          ej                            de          d                         Z	ej                            de          ej                            de          d                         Z
ej                            de          d             Zej                            de          d	             Zej                            d
          ej                            d          ej                            de          ej                            de          d                                                 Zej                            d          ej                            de          d                         Zej                            de          d             Zd Zej                            de          d             Zej                            de          d             ZdS )TestNonLinearFittersz?Tests non-linear least squares fitting and the SLSQP algorithm.c                    g d| _         t          j        ddd          | _        dt          j        | j                  z  }t          t                    5  t          j                            d|          }d d d            n# 1 swxY w Y   d } || j         | j                  |z   | _	        t          j        ddd	
          | _        d S )N)r   r'   r    r   r   ry         @c                 r    | d         t          j        d| d         dz  z  || d         z
  dz  z            z  S Nr   r   r&   r    r   rC   r.   s     r0   funcz.TestNonLinearFitters.setup_class.<locals>.func  9    Q4"&!	!1Q1X!O!CDDDDr2   r   r'   r    r   )initial_valuesr5   rq   xdatar   r   r   r   r   ydatar
   r   gauss)r8   sigmayerrorr  s       r0   r9   z TestNonLinearFitters.setup_class~  s   )kkYq"c**
bl4:...\** 	0 	0Y%%a//F	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0 	0	E 	E 	E T$-tz::VC
&sAa888


s   !BB	Bfitter0fitter1c                      |            } || j         | j        | j                  }t          j        ddd          } |            } ||| j        | j        d          }t          |j        |j        d           d	S )
~
        Runs `LevMarLSQFitter` and `TRFLSQFitter` with estimated and
        analytic derivatives of a `Gaussian1D`.
        r         @r    r  Testimate_jacobianMbP?r   N)r!  r  r   r
   r   r   r@   )r8   r$  r%  r4   g1eemodels         r0    test_estimated_vs_analytic_derivz5TestNonLinearFitters.test_estimated_vs_analytic_deriv  s     '))
DJ
;;S333'))dj$*MMM(&*;*MMMMMMr2   c                    d| j         dz  z  } |            } || j        | j        | j         |          }t          j        ddd          } |            } ||| j        | j         |d	          }t          |j        |j        d
           dS )r'  r         $@r   r   r(  r    r  T)r   r*  r+  r   N)r   r!  r  r
   r   r   r@   )r8   r$  r%  r   r4   r,  r-  s          r0   -test_estimated_vs_analytic_deriv_with_weightszBTestNonLinearFitters.test_estimated_vs_analytic_deriv_with_weights  s     d*+'))
DJ
GLLLS333'))TZD
 
 
 	(&*;*MMMMMMr2   rA   c                      |            } || j         | j        | j        d          }d fd}t          j        || j        | j        | j        f          }t          |j        |d         d           d	S )
zs
        Tests results from `LevMarLSQFitter` and `TRFLSQFitter` against
        `scipy.optimize.leastsq`.
        Tr)  c                 r    | d         t          j        d| d         dz  z  || d         z
  dz  z            z  S r  r   r  s     r0   r  z5TestNonLinearFitters.test_with_optimize.<locals>.func  r  r2   c                 "     | |          |z
  S rG   r,   )rC   r.   r/   r  s      r0   r   z8TestNonLinearFitters.test_with_optimize.<locals>.errfunc  s    41::>!r2   r   r   r+  r   N)r!  r  r   r"   r   r  r   r@   )r8   rA   r4   r   resultr  s        @r0   test_with_optimizez'TestNonLinearFitters.test_with_optimize  s     tz4:tzTRRR	E 	E 	E	" 	" 	" 	" 	" !T(
DJ/G
 
 
 	(&)*EEEEEEr2   c           	          |            } || j         | j        | j        d          } || j         | j        | j        dt          j        | j                            }t          |j        |j        d           t          j        | j                  }d|ddd<   |dk    } || j         | j        |         | j        |         d          } || j         | j        | j        d|          }t          |j        |j        d           dS )	zW
        Tests results from `LevMarLSQFitter` and `TRFLSQFitter` with weights.
        Tr)  )r*  r   -C6?r   r   Nr&   )r!  r  r   r5   r   r   r@   r  )r8   rA   r4   withwr   r
  s         r0   test_with_weightsz&TestNonLinearFitters.test_with_weights  s*   
  tz4:tzTRRRJJJ"L,,
 
 
 	(%*:LLLL -
++!#~J
4($*T*:d
 
 
 J
DJ$PW
 
 
 	(%*:LLLLLLr2   z.ignore:.* Maximum number of iterations reachedQignore:Values in x were outside bounds during a minimize step, clipping to boundsfitter_classc                      |            } |            } || j         | j        | j                  } || j         | j        | j                  }t          |j        |j        d           dS )zl
        Tests results from non-linear fitters against `LevMarLSQFitter`
        and `TRFLSQFitter`
        r8  r   N)r!  r  r   r   r@   )r8   r<  rA   
fitter_clsrD   r4   s         r0   test_fitter_against_LevMarz/TestNonLinearFitters.test_fitter_against_LevMar  so     !\^^
 Jtz4:tzBB	tz4:tz::()*>ZPPPPPPr2   c                     |            }t          j        ddd          }d|j        _        t	                      } ||| j        | j                  } ||| j        | j                  }t          |j        |j        d           dS )	zq
        Runs `LevMarLSQFitter`/`TRFLSQFitter` and `SLSQPLSQFitter` on a
        model with constraints.
        r   r'   r    r  Tr8  r   N)	r
   r   r   r   r   r  r   r   r@   )r8   rA   r   fslsqpslsqp_modelr4   s         r0   test_LSQ_SLSQP_with_constraintsz4TestNonLinearFitters.test_LSQ_SLSQP_with_constraints  s     sAa000!!fRTZ88r4:tz22(+*@zRRRRRRr2   c                 b    |            }t           j                            d           d}t                      }t	          j        |          }d}g d}t           j                            dd|          }t           j                            dd|          }|d         |d         |z  z   |d         |dz  z  z   }	|	t           j                            dd	|          z  }	t          j	        t          d
          5   ||||	|          }
ddd           n# 1 swxY w Y    ||||	|          }t          |
j        |j        d           t          |
j        |dd           t	          j                    }t          |t          t           f          rCt          j	        t          d          5   ||||	|           ddd           n# 1 swxY w Y   n ||||	|           t	          j        |          }d}d}||z  }g d}t           j                            dd|                              ||          }t           j                            dd|                              ||          }t           j                            dd|                              ||          }	|d         |d         |z  z   |d         |dz  z  z   |d         |	z  z   |d         |	dz  z  z   |d         |z  |	z  z   }|t           j                            dd	|                              ||          z  }t          j	        t          d
          5   ||||	||          }
ddd           n# 1 swxY w Y    ||||	||          }t          |
j        |j        d           t          |
j        |dd           dS )z:
        Tests that issue #11581 has been solved.
        *   r&   i'  )r   g      $      @r   r0  r   r    g      ?rU   rV   r   N缉ؗҜ<r~   r   r   r   zThe fit may be unsuccessful; *.r      )r   r  rF  g       g      "      r)   r*   r'   )r5   r   seedr   r
   r   uniformr   rX   rY   r   r   r@   r   
isinstancer   r   r3   reshape)r8   rA   norderfitter2r4   nptsctwtxtytf1tf2nxptsnyptstzs                  r0   'test_non_linear_lsq_fitter_with_weightsz<TestNonLinearFitters.test_non_linear_lsq_fitter_with_weights  s   
 
	r!###F++YsD$//YsD$//qTAaD2I!A.
bisC...\,4TUUU 	4 	4&B333C	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4geRR000[IIII
LLLL!##f|[9:: 	."*L   2 2 ub"b11112 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 F5"b"----#F++u}---YsD$//77uEEYsD$//77uEEYsD$//77uEEaDdRidb!en dRi db!en	
 dRi"n 	 	bisC..66ueDDD\,4TUUU 	8 	8&BB777C	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8geRR444[IIII
LLLLLLs6   8DDD,GGGM  M$'M$c                     G d dt                     }t          j        ddd          x}}t          t                    5  |                    ||dd          }|t          j                            dd	|j        
          z  }ddd           n# 1 swxY w Y   t                      } |dd          } |||||          }t          |j        ddgd           dS )z)A basic test for the `SimplexLSQ` fitter.c                   L    e Zd Z e            Z e            Zed             ZdS )@TestNonLinearFitters.test_simplex_lsq_fitter.<locals>.Rosenbrockc                 0    || z
  dz  ||| dz  z
  dz  z  z   S )Nr&   r,   )r.   r/   abs       r0   evaluatezITestNonLinearFitters.test_simplex_lsq_fitter.<locals>.Rosenbrock.evaluateR  s&    A!|a1q!t8/&999r2   N)ra   rb   rc   r   r`  ra  staticmethodrb  r,   r2   r0   
Rosenbrockr^  N  sC        	A	A: : \: : :r2   rd  rJ  r  r   r   r  r   ry   r   Nr    r   r   )r   r5   linspacer   r   rb  r   r   r   r   r   r@   )r8   rd  r.   r/   r7   rA   r_ir_fs           r0   test_simplex_lsq_fitterz,TestNonLinearFitters.test_simplex_lsq_fitterK  s9   	: 	: 	: 	: 	: 	: 	: 	: D#s+++A\** 	: 	:##Aq#u55A!!#s!999A	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: 	: "##jC  fS!Q""e4@@@@@@s    ABBBc           
          |            }d}d}t          t                    5  t          j        ddd          }||z  |z   t          j                            t          |                    z   }ddd           n# 1 swxY w Y   t          j        |t          j        t          |                    g          j	        }t          j
        t          j
        t          j                            t          j
        |j	        |                    |j	                  |j	                  }t          j        |t          j
        ||                                          z
  dz            t          |          t          |          z
  z  }t          j                            t          j
        |j	        |                    |z  }	t          j        ||          }
t#          j        t&          d          5   ||
||          }ddd           n# 1 swxY w Y   t)          |j        |                                           t)          |	|j        d                    dS )	
        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    NrU   rV   	param_cov)r   r   r5   re  r   r   lenvstackonesTmatmulr   invsumr   r
   Linear1DrX   rY   r   r   r@   fit_info)r8   rA   r`  ra  r.   r/   Xbetas2olscovmodfmods               r0   test_param_covz#TestNonLinearFitters.test_param_cova  sS    \** 	4 	4Aq#&&A A	BIOOCFF333A		4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 Iq"'#a&&//*++-y29==131B1B#C#CQSII13OOVQ1d++113339::c!ffs4yy>PQrya0011B6 oa##\,4TUUU 	% 	%6#q!$$D	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	666 <=====s$   AA;;A?A?0H

HHc                     |            }d}d}t          t                    5  t          j        ddd          }||z  |z   t          j                            t          |                    z   }t          j                            ddt          |                    }ddd           n# 1 swxY w Y   t          j        |t          j        t          |                    g          j	        }t          j
                            t          j        |          dz            }t          j
                            |j	        |z  |z            }	|	|j	        z  |z  |j	        z  }
t          j        ||          }t          j        t"          d	
          5   |||||dz            }ddd           n# 1 swxY w Y   t%          |j        |
                                           t%          |	|j        d                    dS )rj  r&   r   r   r    r   ry   locscaler   NrU   rV   r;   r   rk  )r   r   r5   re  r   r   rl  rm  rn  ro  r   rq  diagr
   rs  rX   rY   r   r   r@   r   rt  )r8   rA   r`  ra  r.   r/   r"  ru  inv_Ncovrv  ry  rz  s                r0   !test_param_cov_with_uncertaintiesz6TestNonLinearFitters.test_param_cov_with_uncertainties  s>    \** 	D 	DAq#&&A A	BI,,#a&&,999AI$$#CFF$CCE	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D 	D Iq"'#a&&//*++-	bgenn122immAC%K!O,,QSy5 13& oa##\,4TUUU 	8 	86#q!UBY777D	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	666V_[9:::::s$   A<B++B/2B/F22F69F6N)ra   rb   rc   rd   r9   rX   re   rg   r\   r.  r1  r6  r:  filterwarningsfittersr?  rC  r[  rh  r{  r  r,   r2   r0   r  r  z  s       II9 9 9 [Y(:;;[Y(:;;N N <; <;N [Y(:;;[Y(:;;N N <; <;N$ [X'9::F F ;:F( [X'9::M M ;:M@ [ QRR[	  [^W55[X'9::Q Q ;: 65	  SRQ [	  [X'9::S S ;:	 
S [X'9:::M :M ;::MxA A A, [X'9::> > ;:>> [X'9::; ; ;:; ; ;r2   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 )TestEntryPointz4Tests population of fitting with entry point fittersc                 ,     G d dt                     }|S )Nc                       e Zd ZdZ dS )2TestEntryPoint.successfulimport.<locals>.goodclass	GoodClassNra   rb   rc   r,   r2   r0   	goodclassr    s        "HHHr2   r  )r   )r8   r  s     r0   successfulimportzTestEntryPoint.successfulimport  s4    	# 	# 	# 	# 	# 	# 	# 	# r2   c                     t           rG   )ImportErrorrn   s    r0   raiseimporterrorzTestEntryPoint.raiseimporterror  s    r2   c                     d }|S )Nc                      d S rG   r,   r,   r2   r0   badfuncz-TestEntryPoint.returnbadfunc.<locals>.badfunc  s    Dr2   r,   )r8   r  s     r0   returnbadfunczTestEntryPoint.returnbadfunc  s    	 	 	 r2   c                       G d d          }|S )Nc                       e Zd ZdS )/TestEntryPoint.returnbadclass.<locals>.badclassNr  r,   r2   r0   badclassr    s        Dr2   r  r,   )r8   r  s     r0   returnbadclasszTestEntryPoint.returnbadclass  s1    	 	 	 	 	 	 	 	 r2   c                 ~    t          j        t                    }d|_        | j        |_        t          |g           dS )zThis should work fineWorkingN)r   create_autospecr   namer  loadr   )r8   mock_entry_workings     r0   test_workingzTestEntryPoint.test_working  s@    !1*=="+"&"71233333r2   c                     t          j        t                    }d|_        | j        |_        t          j        t          d          5  t          |g           ddd           dS # 1 swxY w Y   dS )zHThis raises an import error on load to test that it is handled correctlyIErrz.*ImportError.*rV   N)
r   r  r   r  r  r  rX   rY   r   r   )r8   mock_entry_importerrors     r0   test_import_errorz TestEntryPoint.test_import_error  s     "&!5j!A!A&,#&*&;#\,4FGGG 	< 	<!#9":;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<   A&&A*-A*c                     t          j        t                    }d|_        | j        |_        t          j        t          d          5  t          |g           ddd           dS # 1 swxY w Y   dS )z2This returns a function which fails the type checkBadFuncz	.*Class.*rV   N)
r   r  r   r  r  r  rX   rY   r   r   )r8   mock_entry_badfuncs     r0   test_bad_funczTestEntryPoint.test_bad_func  s     "1*=="+"&"4\,LAAA 	8 	8!#5"6777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8r  c                     t          j        t                    }d|_        | j        |_        t          j        t          d          5  t          |g           ddd           dS # 1 swxY w Y   dS )z8This returns a class which doesn't inherient from fitterBadClassz.*BadClass.*rV   N)
r   r  r   r  r  r  rX   rY   r   r   )r8   mock_entry_badclasss     r0   test_bad_classzTestEntryPoint.test_bad_class  s     #2:>>#- #'#6 \,ODDD 	9 	9!#6"7888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9r  N)ra   rb   rc   rd   r  r  r  r  r  r  r  r  r,   r2   r0   r  r    s        >>        4 4 4< < <8 8 89 9 9 9 9r2   r  c                       e Zd Zd Zej                            d          ej                            d          ej                            dee	z             d                                     Z
dS )Test1DFittingWithOutlierRemovalc                     t          j        ddd          | _        d| _        d } || j        | j                  | _        d S )Ng      r(     )r  ?皙?c                 r    | d         t          j        d|| d         z
  dz  z  | d         dz  z            z  S )Nr   r   r    r&   r   r  s     r0   r  z9Test1DFittingWithOutlierRemoval.setup_class.<locals>.func  s9    Q4"&QqTa!7!A$!)!CDDDDr2   )r5   re  r.   model_paramsr/   )r8   r  s     r0   r9   z+Test1DFittingWithOutlierRemoval.setup_class  sO    T3,,+	E 	E 	E d'00r2   "ignore:The fit may be unsuccessfulr;  rA   c                 4   dd l m}  |            }t          j                            d           |j                            d| j        j                  }| j	        t          j        
                    dd| j        j                  |t          j        
                    dd| j        j                  z  z   z   }t          j        ddd	          }t          |t          d
d          } ||| j        |          \  }}t          |j        | j        d           d S )Nr         ?r   r   r  r  r(  r   )r   r   r   r)   niterr"  ry   r   )scipy.statsstatsr5   r   rK  	bernoullirvsr.   r   r/   r   r
   r   r   r   r   r@   r  )	r8   rA   r  rR  r/   g_initfitr   r   s	            r0    test_with_fitters_and_sigma_clipz@Test1DFittingWithOutlierRemoval.test_with_fitters_and_sigma_clip  s    	$#####
	qO46<88FIS#tv|44")""3TV\:::;

 "SqEEE'
!3OOO#fdfa00a/1BNNNNNNr2   N)ra   rb   rc   r9   rX   re   r  rg   r\   r  r  r,   r2   r0   r  r    s        1 1 1 [ DEE[	  [X'9G'CDDO O ED	  FEO O Or2   r  c                       e Zd Zd Zd Zej                            d          ej                            d          ej                            de	e
z             d                                     ZdS )Test2DFittingWithOutlierRemovalc                     t           j        ddddddf         \  | _        | _        d| _        d } || j        t          j        | j        | j        g                    | _        d S )Nr)   y              `@)r  r   r   r  r  c                     | d         t          j        d|d         | d         z
  dz  z  | d         dz  z  d|d         | d         z
  dz  z  | d         dz  z  z
            z  S )Nr   r   r&   r*   r   r    r)   r   )rC   poss     r0   Gaussian_2Dz@Test2DFittingWithOutlierRemoval.setup_class.<locals>.Gaussian_2D  sr    Q4"&A1!++adai7Q!A$1,,qtqy89   r2   )r5   r6   r/   r.   r  rr   r7   )r8   r  s     r0   r9   z+Test2DFittingWithOutlierRemoval.setup_class  sm    "Qt)R$Y"675	 	 	 T.$&$&9I0J0JKKr2   c                    |d         }|d         }	 ||z  }||z  }t          j        |          }t          j        |          |z  }t          j        |          |z  }	|d         j        ||d         j        dz
           |d         j        dz
           |d         d         z
  z  }
|d         j        ||d         j        dz
           |d         j        dz
           |d         d         z
  z  }t          j        ||
z  |d         j        dz  z                                 t
                    }t          j        |	|z  |d         j        dz  z                                 t
                    }||         |         }|||	fS )Nr   r    r   )r5   rr  r   aroundastyper   )r8   r   r  r/   r.   wxwytotal_intensityx_meany_mean
x_to_pixel
y_to_pixelx_posy_posr   s                  r0   initial_guessz-Test2DFittingWithOutlierRemoval.initial_guess  sQ   FF	 XX&,,o-o-qTY!AaDIM"21Q49q="AAaDG"KL
qTY!AaDIM"21Q49q="AAaDG"KL
	&:-!	C?@@GGLL	&:-!	C?@@GGLLK&	&&((r2   r  r;  rA   c                    dd l m}  |            }t          j                            d           |j                            d| j        j                  }| j        t          j        	                    dd| j        j                  |t          j        	                    | j        d| j        j                  z  z   z   }| 
                    | j        t          j        | j        | j        g                    }t          j        |d         |d         |d         d	d
          }t!          |t"          dd          } ||| j        | j        |          \  }}	t%          |j        dd         | j        d           d S )Nr   r  r   r   r  r   r    r&   g      ?g      ?r   r  r  x_stddevy_stddevr)   r  r  r'   ry   r~   )r  r  r5   r   rK  r  r  r7   r   r   r  rr   r/   r.   r
   
Gaussian2Dr   r   r   r@   r  )
r8   rA   r  rR  r7   guessg2_initr  r   r   s
             r0   r  z@Test2DFittingWithOutlierRemoval.test_with_fitters_and_sigma_clip-  s^    	$#####
	qO46<88FIS#tv|44")""463===>

 ""4628TVTV4D+E+EFF#Ah88
 
 
 (
!3OOO#gtvtvq99a/!4d6GdSSSSSSr2   N)ra   rb   rc   r9   r  rX   re   r  rg   r\   r  r  r,   r2   r0   r  r  	  s        
L 
L 
L) ) ), [ DEE[	  [X'9G'CDDT T ED	  FET T Tr2   r  c                     t          j        dd          } t          t                      t          ddt
          j        j        t
          j        j                  }t          j	        d          }t          j
        d|z  dz
  d|z  |z  |z   dz   g          }d|d	<    || ||          \  } }t          | j        d
dgd           t          | j        ddgd           t          | j        ddgd           dS )z9Test model set fitting with outlier removal (issue #6819)r&   r        @r)   r"  r  cenfuncstdfuncr   r*   i)r    r'   g      r0  r   r~   r   r   r   N)r
   r   r   r   r   r5   r  r   stdrq   rr   r   r   r   r   )poly_setrA   r.   r/   filt_ys        r0   (test_1d_set_fitting_with_outlier_removalr  M  s    "1q111H&
	  F 		"A
#'A+q1uqy1}r1233AAdGvh1--HfHK$E::::HK#s%8888HK#s%888888r2   c                  <   t          j        ddd          } t          t                      t          ddt
          j        j        t
          j        j                  }t
          j	        ddddf         \  }}t          j
        t          j        ||z   dd	|z  z
  d
|z  z   g          dd          }d|ddddf<    || |||          \  } }t          | j        ddgggd           t          | j        ddgggd           t          | j        dd
gggd           dS )zETest fitting 2D model set (axis 2) with outlier removal (issue #6819)r    r&   r   r   r  r)   r  r   r'   ry   r  r  r   r   r   r~   gN)r
   r3   r   r   r   r5   r  r   r  r6   rollaxisrr   r   r   r  r  )r  rA   r/   r.   r7   filt_zs         r0   /test_2d_set_axis_2_fitting_with_outlier_removalr  f  s4    "1qCCCH&
	  F 8AaC1HDAq
BHa!eQq[37%:;<<aCCAAa1aiLvh1a00HfHMc3ZL>>>>>HMc4[M?????HMc3ZL>>>>>>>r2   c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zej                            de          d             Zd Zej                            de          d             Zd ZdS )%TestWeightedFittingWithOutlierRemovalzIssue #7020c                    t           j        ddddf         \  | _        | _        t          j        | j        | j        z   d          dz  dz
  | _        t          j        | j        | j        z   d          dz  dz   | _        d| j        d<   d| j        d<   | j                                        | _        | j                                        | _	        | j                                        | _
        d S )Nr   r   r&   r    g     @@r   r   r   r    )r5   r6   r/   r.   ry  r7   r   r?   x1dz1d	weights1drn   s    r0   r9   z1TestWeightedFittingWithOutlierRemoval.setup_class  s    !B$"*-++a/!3vdftvoq11A59tt6>>##6>>##--//r2   c                     t          j        d          }t                      } ||| j        | j                  }t          |j        d         | j                                        d           d S Nr   r   r~   )r
   r   r   r  r  r   r@   r   r8   r4   rA   r  s       r0   *test_1d_without_weights_without_sigma_clipzPTestWeightedFittingWithOutlierRemoval.test_1d_without_weights_without_sigma_clip  s`    #A&& ""fUDHdh//q)48==??LLLLLLr2   c                 X   t          j        d          }t          t                      t          dd          } ||| j        | j                  \  }}|                                 | j        j        dz
  k    sJ |d         r|d         sJ t          |j
        d         dd	           d S )
Nr   r)   r  r  r&   r    r   r   r~   )r
   r   r   r   r   r  r  rr  r   r   r@   r8   r4   rA   r  r
  s        r0   'test_1d_without_weights_with_sigma_clipzMTestWeightedFittingWithOutlierRemoval.test_1d_without_weights_with_sigma_clip  s    #A&&*z#
 
 
 F5$(DH55	T{{}} 11111Aw"47"""N1s	
 	
 	
 	
 	
 	
r2   c                     t          j        d          }t                      } ||| j        | j        | j                  }|j        d         dk    sJ d S Nr   r   r   )r
   r   r   r  r  r  r@   r  s       r0   'test_1d_with_weights_without_sigma_clipzMTestWeightedFittingWithOutlierRemoval.test_1d_with_weights_without_sigma_clip  sY    #A&& ""fUDHdhGGG~a 3&&&&&&r2   c                    t          j        d          }t          t                      t          dd          } ||| j        | j        | j                  \  }}|j        d         dk    sJ |j        d         dk     sJ dS )	zr
        smoke test for #7020 - fails without fitting.py
        patch because weights does not propagate
        r   r)   r  r  r   r   r   N)	r
   r   r   r   r   r  r  r  r@   )r8   r4   rA   r  filtereds        r0   $test_1d_with_weights_with_sigma_clipzJTestWeightedFittingWithOutlierRemoval.test_1d_with_weights_with_sigma_clip  s    
 #A&&*z#
 
 
 udh$.QQQX~a :----~a 3&&&&&&r2   c                 $   t          j        dd          }t          t                      t          dd          }t          j        | j        | j        g          } ||| j        || j	                  \  }}t          |j        ddgd	
           dS )z5added for #6819 (1D model set with weights in common)r   r&   r  r)   r  r  r   r  r   r~   N)r
   r   r   r   r   r5   rr   r  r  r  r   r@   )r8   r4   rA   r  r  r  s         r0   /test_1d_set_with_common_weights_with_sigma_clipzUTestWeightedFittingWithOutlierRemoval.test_1d_set_with_common_weights_with_sigma_clip  s    #A222*z#
 
 
 h$(+,,udhT^LLLXc
??????r2   c                 Z   t          j        dd          }t          t                      t          dd          }t          j        | j        | j        g          }t          j        | j        | j        g          } ||| j	        ||          \  }}t          |j        ddgd	
           dS )z"1D model set with separate weightsr   r&   r  r)   r  r  r   r  r   r~   N)r
   r   r   r   r   r5   rr   r  r  r  r   r@   )r8   r4   rA   r  r   r  r  s          r0   (test_1d_set_with_weights_with_sigma_clipzNTestWeightedFittingWithOutlierRemoval.test_1d_set_with_weights_with_sigma_clip  s    #A222*z#
 
 
 h$(+,,(DNDN;<<udhWEEEXc
??????r2   c                     t          j        d          }t                      } ||| j        | j        | j                  }t          |j        d         | j                                        d           d S r  )	r
   r3   r   r.   r/   r7   r   r@   r   r  s       r0   *test_2d_without_weights_without_sigma_clipzPTestWeightedFittingWithOutlierRemoval.test_2d_without_weights_without_sigma_clip  sd    #A&& ""fUDFDFDF33q)46;;==zJJJJJJr2   c                 d   t          j        d          }t          t                      t          dd          } ||| j        | j        | j                  \  }}|                                 | j        j	        dz
  k    sJ |d         r|d         sJ t          |j        d         dd	
           d S )Nr   r)   r  r  r&   r  r  r   r   r~   )r
   r3   r   r   r   r.   r/   r7   rr  r   r   r@   r  s        r0   'test_2d_without_weights_with_sigma_clipzMTestWeightedFittingWithOutlierRemoval.test_2d_without_weights_with_sigma_clip  s    #A&&*z#
 
 
 F5$&$&$&99	T{{}}a////Dz(d4j(((q)3Z@@@@@@r2   rA   c                     |            }t          j        d          }t          j        t          d          5   ||| j        | j        | j        | j                  }d d d            n# 1 swxY w Y   |j	        d         dk    sJ d S )Nr   rU   rV   r   r   )
r
   r3   rX   rY   r   r.   r/   r7   r   r@   )r8   rA   r4   r  s       r0   'test_2d_with_weights_without_sigma_clipzMTestWeightedFittingWithOutlierRemoval.test_2d_with_weights_without_sigma_clip  s    #A&&\,4TUUU 	N 	N&MMMC	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N 	N~a 3&&&&&&s   %A++A/2A/c                     t          j        d          }t                      } ||| j        | j        | j        | j                  }|j        d         dk    sJ d S r  )r
   r3   r   r.   r/   r7   r   r@   r  s       r0   .test_2d_linear_with_weights_without_sigma_clipzTTestWeightedFittingWithOutlierRemoval.test_2d_linear_with_weights_without_sigma_clip  s]    #A&& ""fUDFDFDFDLIII~a 3&&&&&&r2   base_fitterc                 r    |            }t          j        d          }t          |t          dd          }t	          j        t          d          5   ||| j        | j        | j	        | j
                  \  }}ddd           n# 1 swxY w Y   |j        d         d	k    sJ |j        d         d
k     sJ dS )z`smoke test for #7020 - fails without fitting.py patch because
        weights does not propagater   r)   r  r  rU   rV   r   Nr   r   )r
   r3   r   r   rX   rY   r   r.   r/   r7   r   r@   )r8   r  r4   rA   r  r   s         r0   $test_2d_with_weights_with_sigma_clipzJTestWeightedFittingWithOutlierRemoval.test_2d_with_weights_with_sigma_clip  s    "kmm#A&&*;
!SVWWW\,4TUUU 	Q 	QVE4646464<PPPFC	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q~a :----~a 3&&&&&&s   (BB
B
c                    t          j        d          }t          t                      t          dd          } ||| j        | j        | j        | j                  \  }}|j	        d         dk    sJ |j	        d         dk     sJ dS )	z(same as test above with a linear fitter.r   r)   r  r  r   r   r   N)
r
   r3   r   r   r   r.   r/   r7   r   r@   )r8   r4   rA   r  r   s        r0   +test_2d_linear_with_weights_with_sigma_clipzQTestWeightedFittingWithOutlierRemoval.test_2d_linear_with_weights_with_sigma_clip  s    #A&&*z#
 
 
 tvtvtvt|LLLQ~a :----~a 3&&&&&&r2   N)ra   rb   rc   rd   r9   r  r  r  r   r  r  r  r  rX   re   rg   r\   r
  r  r  r  r,   r2   r0   r  r  ~  s-       	0 	0 	0M M M

 

 

' ' '' ' '	@ 	@ 	@
@ 
@ 
@K K KA A A [X'9::' ' ;:'' ' ' [],>??' ' @?'	' 	' 	' 	' 	'r2   r  rA   c           	      r    |             } t          | t                    rt          j        d           t          j        ddddf         \  }}t          t                    5  t          j        	                    dd|j
                  }ddd           n# 1 swxY w Y   t          j        dddd	d
          } |||          } | t          j        ddddd          ||||z             }t          |j        |j        d           t          j        d
          }t	          j        d          dz  |_         |||          }t          j        t$          d          5   | t          j        d
          ||||z             }ddd           n# 1 swxY w Y   t          |j        |j        d           dS )zIssue #5737z]This test is poorly designed and causes issues for scipy.optimize.least_squares based fittersr      r   r   Nr   rp   r&   r)      r{   r|   r  333333?r~   rU   rV   )rM  r   rX   xfailr5   r6   r   r   r   r   r   r
   r  r   r@   r3   rq   rY   r   )	rA   XinYinzsigr   r7   gmodr   pmods	            r0   test_fitters_with_weightsr    s<    VXXF&,'' 
9	
 	
 	

 x"ad
#HC		&	& 9 9y4ci889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 
	2r1a	+	+B
3A6&#B1c377c1t8LLDDOR]DDDD 
	Q		BIbMMC'BM
3A	(0P	Q	Q	Q B Bvf)!,,c3DAAB B B B B B B B B B B B B B BDOR]DDDDDDs$   #(BBB $FFFc                     t           j        ddddf         \  } }t                      }t          t                    5  t           j                            dd| j                  }ddd           n# 1 swxY w Y   t          j	        d          }t          j
        d          dz  |_         || |          } |t          j	        d          | |||z   |d	z  
          }t          |j        |j        d           dS )zRegression test for #7035r   r  r   r   Nr)   r   r  r   r   r~   )r5   r6   r   r   r   r   r   r   r
   r3   rq   r@   r   r  r  rA   r  r   r7   r  s          r0   test_linear_fitter_with_weightsr  $  s+   x"ad
#HCF		&	& 9 9y4ci889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 
	Q		BIbMMC'BM
3A6&%a((#sAHdrlSSSDDOR]DDDDDDs   (A22A69A6zfixed, warnsTr  r  Fc                 l   t          j        dddd|           }t                      }g d}g d} |||          }|rDt          j        t
          d	          5   |||||          }d d d            d S # 1 swxY w Y   d S  |||||          }t          j        |j        |j        dd
          sJ d S )Nr    r)   r'   r   )r   r   r  r  r   )r    r&   r)   r*   r'   )r    r    r    r    r    z!The fit may be poorly conditionedrV   r   rH  )	r
   r3   r   rX   rY   r   r5   allcloser@   )r   rY   p0rA   r.   r/   valuesrC   s           r0   "test_polynomial_poorly_conditionedr$  3  s,    
	AAAAU	K	K	KBFAAR1XXF L\&I
 
 
 	) 	) r1a((A	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)
 F2q!V$${2=!,QUKKKKKKKKs   A55A9<A9c                  N   t           j        ddddf         \  } }|                                 |                                }} t                      }t	          t
                    5  t           j                            dd| j                  }ddd           n# 1 swxY w Y   t          j
        d          }t          j        d          dz  |_         || |          } |t          j
        d          | |||z   |d	z  
          }t          |j        |j        d           dS )z6Same as the above #7035 test but with flattened inputsr   r  r   r   Nr)   r   r  r   r   r~   )r5   r6   r?   r   r   r   r   r   r   r
   r3   rq   r@   r   r  s          r0   $test_linear_fitter_with_weights_flatr&  T  sD   x"ad
#HC{{}}ckkmmCF		&	& 9 9y4ci889 9 9 9 9 9 9 9 9 9 9 9 9 9 9 
	Q		BIbMMC'BM
3A6&%a((#sAHdrlSSSDDOR]DDDDDDs   &(BB!Br  c                 B    |             } t          j        ddd          }t          j        d          } ||          }t	          | t
                    rdddd}nd	dd
dd}t	          | t          t          f          r|                    d            | |||fi |}dS )zZ
    Test that ``**kwargs`` work with all optimizers.
    This is a basic smoke test.
    r   r*   r   r  O   r    gư>)maxiter	verblevelaccM   r   )r)  r*  epsilonr+  r*  N)	r
   r   r5   rq   rM  r   r   r   pop)rA   r4   r.   r/   kwargsr   s         r0   test_fitters_interfacer0  d  s     VXXFb!S))E
	"AaA&*++ Oa==aDNN&?L9::  

;ua%%f%%AAAr2   r<  c           	      P    |             }|j         j        dk    sJ d|j         _        |j         j        dk    sJ |j         j        t          j        t          j        t                    j                  k    sJ d|j         _        |j         j        dk    sJ |j         j        dk    sJ d|j         _        |j         j        dk    sJ t          |j                   |j         j	        j
         dk    sJ t          j                    }t          j                    }t          j                    }t          j                    }d}t          j                    }t          j                    }| t          k    r|||||f}	||||d}
n|||||f}	||||d}
t          j                            |j         j	        d	|	
          5  t!          j        t$          d          5  ||
f|                     t          j                    t          j                    t          j                    |          k    sJ 	 d d d            n# 1 swxY w Y   |
|j         j        k    sJ t)          |t                    r|j         j        dk     n|j         j        |k     d d d            d S # 1 swxY w Y   d S )Nr   i  rG  gHz>z()r    )final_func_valnumiter	exit_modemessage)r2  r3  r4  num_function_calls
opt_method)return_valuezThe fit may be unsuccessful; .*rV   )xtol)_opt_methodr)  epsr5   sqrtfinfofloatr+  repr	__class__ra   mk	MagicMockr   patchobjectrX   rY   r   rt  rM  )r<  rA   r   r2  r3  funcallsr4  messr9  r8  rt  s              r0   test_optimizersrG  }  sJ    \^^F %,,,,!%F%---- !RWRXe__-@%A%AAAAA"F!U**** !T))))"F!U**** "##&*<*F*O'S'S'SSSSSI\^^NlnnG|~~HI<>>D<>>D~%%!>7ItL,"	
 
 ">7HiP,""*	
 
 
$l 
 
 
 + + \,4VWWW 	 	x(F,>,>T -? - -     	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 6-66666fn-- 	+"e+++"d**+ + + + + + + + + + + + + + + + + +s8   =JAH;/J;H?	?JH?	AJJ"J)__abstractmethods__c                      t          t          j                              } d}t          j        t
          |          5   |              d d d            d S # 1 swxY w Y   d S )Nz'Subclasses should implement this methodrV   )r   rA  rB  rX   r   NotImplementedError)optimizationr   s     r0   test_Optimization_abstract_callrL    s    //L8G	*'	:	:	:                   s   AAAc                     t          j        d          } t          t                    5  t           j                            ddd          }ddd           n# 1 swxY w Y   d|d<   t          t                      t          d	d
d
d          } |t          j
        dd          | |          \  }}t          t          j        |          dgdgg           |j        d         dk    sJ t          t                      t          dd
d
d          } |t          j
        d          | |d                   \  }}|                                dk    sJ |j        d         dk    sJ 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.
       r0  r   )r&   rN  r}  Nr  )r      r'   r  r    )rA   outlier_funcr  sigma_lowersigma_uppermaxitersr&   r  r   rO  r  )r5   rq   r   r   r   r   r   r   r   r
   r   r	   wherert  rr  )r.   r/   rA   r4   r
  s        r0   'test_fitting_with_outlier_removal_niterrU    s    		"A		&	& @ @ISw??@ @ @ @ @ @ @ @ @ @ @ @ @ @ @AeH '    F &+A:::AqAAKE4 $1#t---?7#q(((( '    F &+A..1Q488KE4 88::?????7#q((((((s   #AAAc            	          e Zd ZdZ ej        d           ej                    gZ ej        ddd           ej        dddgddg          gZd Z	e
j                            d	 e eee                              e
j                            d
e          d                         Ze
j                            d
e          d             Zd ZdS )TestFittingUncertantiesz
    Test that parameter covariance is calculated correctly for the fitters
    that do so (currently LevMarLSQFitter, LinearLSQFitter).
    r&   Fr  r   r   )r   slope	interceptc                    t           j                            d           t          j        d          | _        t           j                            ddd                              dd          | _        t           j                            ddd                              dd          | _        t           j                            d                              dd          | _	        | j	        d         | _
        d S )Nik  r   r   r   r   )r5   r   rK  rq   r.   randintrN  x_gridy_grid	rand_gridrandrn   s    r0   r9   z#TestFittingUncertanties.setup_class  s    
	s2i''3S'99AA"bIIi''3S'99AA"bII))#..66r2>>N1%			r2   )single_model	model_setrA   c                 T    |d          }t          d          } || j                  | j        z   }t          j        t
          d          5   ||| j        |          }ddd           n# 1 swxY w Y   |j        j        } ||| j        |          }|j        j        }	t          |	|           t          t          j	        t          j
        |	                    |j        j                    || j        d          t          j        | j        | j        g          z   } ||| j        |          }
d |
j        D             }t          |d	         |           t          t          j	        t          j
        |d	                             |
j        d	         j                   dS )
zTest 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calc_uncertaintiesrU   rV   NFr   c                     g | ]	}|j         
S r,   
cov_matrix.0js     r0   
<listcomp>z:TestFittingUncertanties.test_1d_models.<locals>.<listcomp>%      PPPaQ\PPPr2   r   )r   r.   r_  rX   rY   r   rg  r   r5   r<  r  stdsrr   )r8   r`  ra  rA   linlsq_fitterr/   	fit_model	cov_modelfit_model_linlsqcov_model_linlsqfit_1d_set_linlsqcov_1d_set_linlsqs               r0   test_1d_modelsz&TestFittingUncertanties.test_1d_models  s    4000'4@@@ L  49,\,4TUUU 	8 	8|TVQ77I	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8(3	 )=tvqAA+6A 	()444(8 9 9::<L<Q<VWWW IdfU333bh	49?U6V6VV)M)TVQ??PP3D3OPPP 	)!,i888GBG-a011224E4J14M4R	
 	
 	
 	
 	
s   A//A36A3c                     |d          }t          d          }t          j        dd          }t          j        ddddgd          } || j        | j                  | j        z   }t          j        t          d	          5   ||| j        | j        |          }d
d
d
           n# 1 swxY w Y   |j	        j	        } ||| j        | j        |          }|j	        j	        }	t          ||	           t          t          j        t          j        |	                    |j        j                    || j        | j                  t          j        | j        | j        f          z   } ||| j        | j        |          }
d |
j	        D             }t          |d         |           t          t          j        t          j        |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.
        Trc  r&   )r   r)   F)r   r   r   r   rU   rV   Nc                     g | ]	}|j         
S r,   rf  rh  s     r0   rk  z:TestFittingUncertanties.test_2d_models.<locals>.<listcomp>O  rl  r2   r   )r   r
   r3   r\  r]  r^  rX   rY   r   rg  r   r5   r<  r  rm  rr   )r8   rA   rn  r`  ra  z_gridro  rp  rq  rr  fit_2d_set_linlsqcov_2d_set_linlsqs               r0   test_2d_modelsz&TestFittingUncertanties.test_2d_models.  sM    4000'4@@@*11555'q1ve
 
 
	
 dk4;77$.H\,4TUUU 	O 	O|T[$+vNNI	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O(3	 )=t{DKQWXX+6A	#3444(8 9 9::<L<Q<VWWW 4;44rx^T^,8
 8
 
 *M)T[$+vVVPP3D3OPPP 	)!,i888GBG-a011224E4J14M4R	
 	
 	
 	
 	
s   B++B/2B/c                 X   t          d          }t          j                    } ||| j         || j                  | j        z             }t          |j                   |                                }d|j        v sJ d|j        v sJ t          |j	                   |                                }d|j        v sJ d|j        v sJ t          |j        
                    dd	                     |                                }d
|j        v sJ d|j        vsJ t          |j	        
                    dd                     |                                }d|j        v sJ d|j        vsJ |j        d         |j        d         k    sJ |j	        d         |j	        d         k    sJ dS )z5
        Test printing methods and indexing.
        Trc  zslope    | 0.001zintercept| -0.005,  0.03zslope    | 0.032zintercept| 0.173r'   r    )	round_val	max_lineszslope    | 0.00105rY  )r~  r}  zslope    | 0.03241r  )rX  rX  N)r   r
   rs  r.   r_  printrg  
readouterroutrm  pprint)r8   capsysrA   ry  fit_modcaptureds         r0   %test_covariance_std_printing_indexingz=TestFittingUncertanties.test_covariance_std_printing_indexingX  s    !D999o&dfcc$&kkDI&=>>g !!!$$&&!X\1111)X\9999gl$$&&!X\1111!X\1111 	g ''!q'AABBB$$&&#x|3333(,....gl!!A!;;<<<$$&&#x|3333(,.... !$'7+=>N+OOOOO |A',{";;;;;;;r2   N)ra   rb   rc   rd   r
   r   rs  example_1D_modelsexample_1D_setsr9   rX   re   rg   listzipr\   ru  r{  r  r,   r2   r0   rW  rW    s9        
 -,Q//1B1BCA%@@@3*AGGGO
& & & [%ttCC0A?,S,S'T'T  [X'9::#
 #
 ;: #
J [X'9::'
 '
 ;:'
R"< "< "< "< "<r2   rW  r   r|   c           
         t          j        dddddt           j        dt           j        g          }t          j        dt           j        dt           j        d	t           j        d
dg          }t	          j                    } |             }t          j        t          d          5   |||||           ddd           dS # 1 swxY w Y   dS )zARegression test error introduced to solve issues #3575 and #12809r    r&   r)   r*   r'   r{   rp      r   r     z$Objective function has encountered.*rV   r   N)	r5   rr   naninfr
   r   rX   r   r   rA   r   r.   r/   m_initr  s         r0   test_non_finite_errorr  }  s    	!Q1aBF344A
!RVRRVR<==A  F
&((C 
#J
 
 
 + + 	FAq'****+ + + + + + + + + + + + + + + + + +s   #C  CCc           
         t          j        g d          }t          j        dt           j        dt           j        dt           j        dt           j        g          }t	          j                    } |             }|t           j        |ddg<   t          j        t          d	
          5   ||||d|           ddd           dS # 1 swxY w Y   dS )FRegression test filter introduced to remove non-finte values from data)r    r&   r)   r*   r'   r+   r{   r|   rp   r  r   r  Nr    r*   4Non-Finite input data has been removed by the fitterrV   Tfilter_non_finiter   )	r5   rr   r  r  r
   r   rX   rY   r   r  s         r0   test_non_finite_filter_1Dr    s"    	)))**A
!RVRRVR@AAA  F
&((C&A	E
 
 
 C C 	FAqD'BBBB	C C C C C C C C C C C C C C C C C Cs   &CCC)r   r   c           	      p   t           j        ddddf         \  }}t          j        ddddd          }t	          t
                    5   |||          t          j        j        |j         z   }ddd           n# 1 swxY w Y   t           j	        |d<   t           j
        |d	<   t           j
         |d
<   |t           j	        |d<   t           j
        |d<   t          j                    } |             }t          j        t          d          5   |||||d|           ddd           dS # 1 swxY w Y   dS )r  r   r   r    r'   r&   r  Nr  )r)   r)   )r{   r'   )r    r    )r*   r)   r  rV   Tr  )r5   r6   r
   r  r   r   r   r_  r   r  r  rX   rY   r   )rA   r   r.   r/   m_truer7   r  r  s           r0   test_non_finite_filter_2Dr    s    8AbD!B$JDAq1QUVWWWF		&	& 4 4F1aLL29>17334 4 4 4 4 4 4 4 4 4 4 4 4 4 4fAdGfAdGvgAdG  F
&((C	E
 
 
 F F 	FAq!tWEEEE	F F F F F F F F F F F F F F F F F Fs$   	&A;;A?A?D++D/2D/z%ignore:Model is linear in parameters*c                 X   t          j        dd          } |             } t          j        dt                    }t          j        d          }t          j        d          } | |||          }t          |j        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   r   )dtype)r   r   r   N)r
   r   r5   rq   r>  rn  r   r   )rA   r4   r.   r/   r   r  s         r0   7test_non_linear_fit_zero_degree_polynomial_with_weightsr    s     a(((EVXXF
	"E"""A
AgennG
&1

C$$$
&1g
.
.
.C$$$$$r2   )Yrd   os.pathr   unittest.mockr   rA  importlib.metadatar   	itertoolsr   unittestnumpyr5   rX   r   numpy.testingr   r   r	   astropy.modelingr
   astropy.modeling.corer   r   astropy.modeling.fittingr   r   r   r   r   r   r   r   r   r   r   r   r   astropy.modeling.optimizersr   astropy.statsr   astropy.utilsr   "astropy.utils.compat.optional_depsr   astropy.utils.datar   astropy.utils.exceptionsr    r!   scipyr"   r  r\   r   r$   ri   re   rf   r   r   r  r  r  r  r  r  r  rg   r  r  r$  r&  r  r0  rG  rC  multiplesetrL  rU  rW  rn  r  r  r  r  r,   r2   r0   <module>r     s           ) ) ) ) ) ) " " " " " "                  L L L L L L L L L L # # # # # # < < < < < < < <                              5 4 4 4 4 4 $ $ $ $ $ $ ) ) ) ) ) ) 8 8 8 8 8 8 4 4 4 4 4 4 7 7 7 7 7 7        ^
,%|[/R /D /D /D /D /D /D /D /Dd7T 7T 7T 7T 7T 7T 7T 7Tt 	M*:;;8C 8C 8C 8C 8C 8C 8C <;8CvZD ZD ZD ZD ZD ZD ZD ZDz 	M*:;;f; f; f; f; f; f; f; <;f;R	?9 ?9 ?9 ?9 ?9 ?9 ?9 ?9D 	M*:;;O O O O O O O <;OD 	M*:;;@T @T @T @T @T @T @T <;@TF9 9 92? ? ?0 	M*:;;B' B' B' B' B' B' B' <;B'J 	M*:;;#566E E 76 <;E<E E E 	T
TN	

 TN	

 L L L&E E E  	M*:;;@AA#5#?@@& & A@ BA <;&, 	M*:;;.:J)KLL9+ 9+ ML <;9+x <SSUU;;  <;*) *) *)Z 	M*:;;I< I< I< I< I< I< I< <;I<X 	M*:;;#566WRWQZZ$677+ + 87 76 <;+  	M*:;;#566WRWQZZ$677C C 87 76 <;C& 	M*:;;#566WRWX%6%6$=>>F F ?> 76 <;F4 	M*:;;DEE#566% % 76 FE <;% % %r2   