
    IR-e              	       	   d Z ddlmZ ddlZddlZddlmZm	Z	 ddl
mc mZ ddlmZ ddlmZmZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZmZ dd
lm Z  ddl!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,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ej3        ej4        ej5        ej6        gZ7ej8        9                    e/ d          ej8        :                    de7          dOd                        Z;d Z<d Z=d Z>d Z? G d d          Z@ej8        A                    d           G d d                      ZB	 dPd"ZCej8        A                    d#          ej8        A                    d$          ej8        :                    d% eD e1jE                    d& '                     G d( d)eB                                              ZFej8        A                    d#          ej8        :                    d% eD e2jE                    d* '                     G d+ d,e@                                  ZGd- ZHd. ZIej8        A                    d          d/             ZJd0 ZKej8        9                    e/ d          d1             ZLej8        9                    e/ d          d2             ZMej8        9                    e/ d          d3             ZNd4 ZOej8        9                    e/ d          d5             ZPej8        9                    e/ d          d6             ZQej8        9                    e/ d          d7             ZRej8        9                    e/ d          d8             ZSej8        9                    e/ d          d9             ZTej8        9                    e/ d          d:             ZUej8        9                    e/ d          d;             ZVej8        9                    e/ d          d<             ZW G d= d>e          ZX G d? d@eX          ZYdA ZZej8        A                    d          dB             Z[dC Z\ej8        9                    e/ d          ej8        A                    dD          ej8        A                    d$          dE                                     Z] G dF dGe          Z^dH Z_dI Z` G dJ dKe          Za G dL dMea          ZbdN ZcdS )QzU
Tests for model evaluation.
Compare the results of some models with other programs.
    N)assert_allcloseassert_equal)units)fittingmodels)ModelBoundingBox)FittableModelModel
_ModelMeta)
Gaussian2D)InputParameterError	Parameter)PolynomialBase)BrokenPowerLaw1DExponentialCutoffPowerLaw1DLogParabola1D
PowerLaw1DSmoothlyBrokenPowerLaw1D)separability_matrix)assert_quantity_allclose)NumpyRNGContext
minversion)	HAS_SCIPY   )	models_1D	models_2Drequires scipyreasonfitter   c                 r    |             } dd}dd}t          j        ||          }t          j        ddd          } |            }|                    |dd	           |                    |dd	           t          j                            d            ||          t          j                            t          |                    z   d
z
  } | |||          }	t          j
        t          j        |	j        j        |	j        j        g          t          j        ||g          z
  dk               sJ d S )Nr!   r   c                 V    |t          j        dt           j        z  |z  | z            z  S )z 
        Model function
           npsinpix	amplitude	frequencys      Blib/python3.11/site-packages/astropy/modeling/tests/test_models.py
sine_modelz%test_custom_model.<locals>.sine_model2   )     26!be)i"7!";<<<<    c                     t          j        dt           j        z  |z  | z            }dt           j        z  | z  |z  t          j        dt           j        z  |z  | z            z  }t          j        ||f          S )zv
        Jacobian of model function, e.g. derivative of the function with
        respect to the *parameters*
        r$   )r&   r'   r(   cosvstack)r*   r+   r,   dadfs        r-   
sine_derivz%test_custom_model.<locals>.sine_deriv8   sj    
 VAI	)A-..Y]Y&BE	I0E0I)J)JJy"b"""r0   )	fit_derivr   2   g      @       @      ?gMbP?r!   r   )r   custom_modelr&   linspaceevaluater7   randomseedrandlenallarrayr+   valuer,   )
r    r+   r,   r.   r6   	SineModelr*   	sin_modeldatamodels
             r-   test_custom_modelrJ   -   sS    VXXF= = = =# # # # #J*EEEI
Aq"A	Iq#s###3$$$INN19Q<<")..Q00036DF9a&&E6Heo+U_-BCDDh	9-../ 		      r0   c                      t           j        dd            }  | dd          }|j        dk    sJ |j        dk    sJ d S )Nr!   r   c                 V    |t          j        dt           j        z  |z  | z            z  S zModel functionr$   r%   r)   s      r-   rF   z)test_custom_model_init.<locals>.SineModelV   r/   r0   r9   r:   )r+   r,   r;   )r   r<   r+   r,   rF   rG   s     r-   test_custom_model_initrO   U   sh    = = = =
 	C3777I#%%%%#%%%%%%r0   c                      t           j        dd            }  |             }| j        j        dk    sJ | j        j        dk    sJ |j        dk    sJ |j        dk    sJ d S )Nr!   r   c                 V    |t          j        dt           j        z  |z  | z            z  S rM   r%   r)   s      r-   rF   z-test_custom_model_defaults.<locals>.SineModelb   r/   r0   r;   )r   r<   r+   defaultr,   rN   s     r-   test_custom_model_defaultsrS   a   s    = = = =
 	I&!++++&!++++!####!######r0   c                  P   t                      } t          j        ddd          }|                                }t          j         | |d           | |d|z            z
                                            dk    sJ d|_        d|_         | ||          }|j        dk    sJ d S )Ng      r   g?r   )
   r   )r   rU   )rU   rU   )r   r&   arangecopyabssumshape)gr*   yresults       r-   test_inconsistent_input_shapesr^   p   s    A
	$3A	A6!!Aq''AAaQKK'((,,..!3333AGAGQq!WWF<8######r0   c                     dd}  G d	 d
t          j        |                     } |            }|j        }|                                \  }}}t          j        |          dz                                  \  }}}	t          j        t          |d         |d         dz             t          |d         |d         dz             t          |d         |d         dz             f         \  }
}}t          j        t          |d         |z
  |d         |z   dz             t          |d         |z
  |d         |z   dz             t          |d         |	z
  |d         |	z   dz             f         \  }}} ||||d          } ||||
d          }t          t          j	        |          t          j	        |          z
            t          j	        |          dz  k     sJ dS )z+Test bounding box evaluation for a 3D model   rU      r!      r$   r   c
                 ^    | |z
  |z  dz  ||z
  |z  dz  z   ||z
  |z  dz  z   }
|
dk     |	z  }|S )Nr$   r    )r*   r\   zx0y0z0abcamprsqvals               r-   	ellipsoidz1test_custom_model_bounding_box.<locals>.ellipsoid   sJ    B!|!a"f\a$77AFa<A:MMQw#o
r0   c                   $    e Zd Zed             ZdS )3test_custom_model_bounding_box.<locals>.Ellipsoid3Dc                     | j         | j        z
  | j         | j        z   f| j        | j        z
  | j        | j        z   f| j        | j        z
  | j        | j        z   ffS N)rh   rk   rg   rj   rf   ri   selfs    r-   bounding_boxz@test_custom_model_bounding_box.<locals>.Ellipsoid3D.bounding_box   s\     46!47TV#3446!47TV#3446!47TV#34 r0   N)__name__
__module____qualname__propertyrv   rd   r0   r-   Ellipsoid3Drq      s-        		 	 
	 	 	r0   r{   r   Twith_bounding_boxHz>N)r`   rU   ra   r!   rb   r$   r   )
r   r<   rv   r&   diffravelmgridslicerX   nansum)ro   r{   rI   bboxzlimylimxlimdzdydxz1y1x1z2y2x2arrsub_arrs                     r-   test_custom_model_bounding_boxr   }   s      
    f))44    KMMED((**D$'$--!#**,,JBBd1gtAw{##d1gtAw{##d1gtAw{##	%JBB
 d1glDGbL1,--d1glDGbL1,--d1glDGbL1,--	/JBB %Bd
3
3
3CeBB$777G ry~~	' 2 2233binnt6KKKKKKKr0   c                   L   e Zd ZdZd Zd Zd Zd Zd Ze	j
                            e d          e	j
                            d	e          d
                         Ze	j
                            e d          e	j
                            d	e          d                         ZdS )Fittable2DModelTestera  
    Test class for all two dimensional parametric models.

    Test values have to be defined in example_models.py. It currently test the
    model with different input types, evaluates the model at different
    positions and assures that it gives the correct values. And tests if the
    model works with non-linear fitters.

    This can be used as a base class for user defined model testing.
    c                    d| _         d| _        d| _        d| _        d| _        d| _        t          j        ddd          | _        t          j        ddd          | _	        t          j
        d dd df         \  | _        | _        d S )	Nd   -C6?皙?333333@@r   rU   ra   NM
eval_error	fit_errorr*   r\   r&   rV   r   r   r   r   r   rt   s    r-   setup_classz!Fittable2DModelTester.setup_class   s{     )Ar3'')Ar3''8CRC!G,r0   c                     t          ||          } || j        | j                    || j        | j                    || j        | j                   dS z&Test model with different input types.N)create_modelr*   r\   r   r   r   r   ru   model_classtest_parametersrI   s       r-   test_input2Dz"Fittable2DModelTester.test_input2D   s[     [/::dfdfdgtwdgtwr0   c                     t          ||          }|d         }|d         }|d         }t          j        t          j         |||          |z
            | j        k               sJ dS )z*Test model values add certain given pointsx_valuesy_valuesz_valuesN)r   r&   rC   rX   r   )ru   r   r   rI   r*   r\   re   s          r-   test_eval2Dz!Fittable2DModelTester.test_eval2D   sl     [/::J'J'J'vbfUU1a[[1_--?@@@@@@@r0   c           	         t          ||          }d|_        |j        dk    sJ d|_        d}t          j        t          |          5  |j         ddd           n# 1 swxY w Y   d}t          j        t
          |          5  d|_        ddd           n# 1 swxY w Y   |`	 |j        }n# t          $ r Y dS w xY wd|\  t          j        d         d	                   }t          j        d         d	                   }t          j        fd
t          ddd          D             |fdt          d	d          D             f          }t          j        fdt          ddd          D             |fdt          d	d          D             f          }	 |||          }
 |||	d          }|t          j
        |                    }t          j        |
|k              sJ dS )Test bounding box evaluation)   r   N,No bounding box is defined for this model .*match5An interval must be some sort of sequence of length 2r   {Gz?r   r   c                 ,    g | ]}d          |z  z
  S r   rd   .0idxddxr   s     r-   
<listcomp>z=Fittable2DModelTester.test_bounding_box2D.<locals>.<listcomp>   &    AAAa39$AAAr0   rU   c                 ,    g | ]}d          |z  z   S r   rd   r   s     r-   r   z=Fittable2DModelTester.test_bounding_box2D.<locals>.<listcomp>   &    ===a39$===r0   c                 ,    g | ]}d          |z  z
  S r   rd   r   r   r   r   s     r-   r   z=Fittable2DModelTester.test_bounding_box2D.<locals>.<listcomp>   r   r0   c                 ,    g | ]}d          |z  z   S r   rd   r   s     r-   r   z=Fittable2DModelTester.test_bounding_box2D.<locals>.<listcomp>   r   r0   Tr|   r   rv   pytestraisesNotImplementedError
ValueErrorr&   rV   concatenaterangeisnanrC   )ru   r   r   rI   MESSAGEr   r   r   r   r   inside_bboxoutside_bboxr   r   r   s               @@@r-   test_bounding_box2Dz)Fittable2DModelTester.test_bounding_box2D   s    [/:: 0!%77777!A].g>>> 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 K]:W555 	) 	)!(E	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	%DD" 	 	 	FF	 
dYtAwQ--YtAwQ--^AAAAAb!R0@0@AAA=====a===
 
 ^AAAAAb!R0@0@AAA=====a===
 
 eBmmuRt<<<#RXl%;%;$;<vk\12222222s6   A  A$'A$BB #B *B2 2
C ?C c                    |                     dd          sd S t          ||          }|j        }|\  }}t          j        |          dz                                  \  }}t          j        t          |d         |d         dz             t          |d         |d         dz             f         \  }	}
t          j        t          |d         |z
  |d         |z   dz             t          |d         |z
  |d         |z   dz             f         \  }} |||          } ||
|	          }t          |	                                |	                                z
            |	                                dz  k     sJ d S )N	bbox_peakFr$   r   r   r~   )
popr   rv   r&   r   r   r   r   rX   rY   )ru   r   r   rI   r   r   r   r   r   r   r   r   r   r   r   s                  r-   test_bounding_box2D_peakz.Fittable2DModelTester.test_bounding_box2D_peak  s^   "";66 	F[/::!
d'$--!#**,,B%Qa155uT!Wd1gPQk7R7RRSB$q'B,Q"q 0115a2tAwQS|VWGW3X3XX
B eBmm%B-- 37799w{{}},--		D0@@@@@@@r0   r   r   r    c                 *    |            }|d         }|d         }|d         t          ||          }t          t                    rfd|j        D             d|v rW|d         rNt	          j        |d         |d         | j                  }t	          j        |d         |d         | j                  }nNt	          j        |d         |d         | j                  }t	          j        |d         |d         | j                  }t	          j        ||          \  }	}
t          j	        
                    d           t          j	                            | j        | j                  dz
  } ||	|
          d	d         z  |z  z   } |||	|
|          fd
j        D             }d |D             }t	          j        d t          |          D                       }t	          j        d |D                       }t          ||| j                   dS )z3Test if the parametric model works with the fitter.x_limy_lim
parametersc                      g | ]
}|         S rd   rd   r   namer   s     r-   r   z7Fittable2DModelTester.test_fitter2D.<locals>.<listcomp>"      IIIt*T*IIIr0   log_fitr   r   r:   r   c                 0    g | ]}t          |          S rd   getattrr   r   	new_models     r-   r   z7Fittable2DModelTester.test_fitter2D.<locals>.<listcomp>3  #    MMMt')T**MMMr0   c                     g | ]	}|j         
S rd   fixedr   params     r-   r   z7Fittable2DModelTester.test_fitter2D.<locals>.<listcomp>4      111111r0   c                     g | ]	\  }}||
S rd   rd   r   rn   r   s      r-   r   z7Fittable2DModelTester.test_fitter2D.<locals>.<listcomp>5  "    WWWZS%QVWSWWWr0   c                 *    g | ]}|j         	|j        S rd   r   rE   r   s     r-   r   z7Fittable2DModelTester.test_fitter2D.<locals>.<listcomp>6  !    NNN5%+N5;NNNr0   atolN)r   
isinstancedictparam_namesr&   logspacer   r=   meshgridr?   r@   rA   rD   zipr   r   )ru   r   r   r    r   r   rI   r*   r\   xvyvnoiserH   paramsr   expectedfittedr   r   s                    @@r-   test_fitter2Dz#Fittable2DModelTester.test_fitter2D  s
    (($\2
[/::j$'' 	JIIIIu7HIIIJ''y) <Ka%(DF;;Ka%(DF;;E!HeAh77AE!HeAh77AQ""B
	q	tvtv..4uR}}sZ]2U::F5"b$//	MMMMy7LMMM11&1118WW3z53I3IWWWXXNNFNNNOOt~>>>>>>r0   c                 (    |            }|d         }|d         }|j         t          |t                    rdS d|v r|d         rt          j        |d         |d         | j                  }t          j        |d         |d         | j                  }t          j        |d         |d         | j        dz            }t          j        |d         |d         | j        dz            }	nt          j        |d         |d         | j                  }t          j        |d         |d         | j                  }t          j        |d         |d         | j        dz            }t          j        |d         |d         | j        dz            }	t          j        ||          \  }
}t          j        ||	          \  }}	 t          ||dd	
          }t          ||dd	
          }t          ||dd	
          }nF# t          $ r9 t          ||d          }t          ||d          }t          ||d          }Y nw xY wt          j                            d          }|d         d         }d|z  |                    | j        | j        f          dz
  z  } ||
|          |z   }|} |||
||          }|} |||
||d          }t           |||           |||          d           |t          k    rt          |j        |j        d           dS dS )zp
        Test the derivative of a model by fitting with an estimated and
        analytical derivative.
        r   r   Nr   r   r   rU   Fderiv_initial)use_constraintsparameter_keyr  r   r   r:   Testimate_jacobianr   )rtol)r7   
issubclassr   r&   r   r   r   r=   r   r   KeyErrorr?   default_rngr   r   r   )ru   r   r   r    r   r   r*   r\   x_testy_testr   r   xv_testyv_testmodel_with_derivmodel_no_derivrI   rsnr+   nrH   fitter_with_derivnew_model_with_derivfitter_no_derivnew_model_no_derivs                            r-   test_deriv_2Dz#Fittable2DModelTester.test_deriv_2D9  s    (( (J{N,S,S(F''y) FKa%(DF;;Ka%(DF;;U1XuQx"EEU1XuQx"EEE!HeAh77AE!HeAh77A[q58TVb[AAF[q58TVb[AAFQ""B;vv66	V+ %-	      * %-	  N ! %-	  EE  	V 	V 	V+_e      *_e  N !ouUUUEEE	V i##A&&#L1!4	)Oszz4646*:;;cABuR}}q "001A2r4PP ,_BDD
 
 
 	  '22w00	
 	
 	
 	

 *$$$/1C1NUX      %$s   ;9G5 5A H87H8N)rw   rx   ry   __doc__r   r   r   r   r   r   markskipifr   parametrizefittersr   r  rd   r0   r-   r   r      s       	 		- 	- 	-     A A A23 23 23hA A A( [I.>??[Xw// ?  ? 0/ @? ?D [I.>??[Xw//K K 0/ @?K K Kr0   r   z-ignore:humlicek2 has been deprecated since .*c                      e Zd ZdZeeeeegZ	d Z
ej                            d          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j                            d
e          d                                     ZdS )Fittable1DModelTestera  
    Test class for all one dimensional parametric models.

    Test values have to be defined in example_models.py. It currently test the
    model with different input types, evaluates the model at different
    positions and assures that it gives the correct values. And tests if the
    model works with non-linear fitters.

    This can be used as a base class for user defined model testing.
    c                    d| _         d| _        d| _        d| _        d| _        d| _        t          j        ddd          | _        t          j        ddd          | _	        t          j
        d dd d	f         \  | _        | _        d S )
Nr   r   g)\(?r   r   r   rU   r   ra   r   rt   s    r-   r   z!Fittable1DModelTester.setup_class  s{     )Ar3'')Ar3''8CRC!G,r0   ignore:.*:RuntimeWarningc                     t          ||          } || j                    || j                    || j                   dS r   )r   r*   r   r   r   s       r-   test_input1Dz"Fittable1DModelTester.test_input1D  sD     [/::dfdgdgr0   c                     t          ||          }|d         }|d         }t           ||          || j                   dS )z;
        Test model values at certain given points
        r   r   r   N)r   r   r   )ru   r   r   rI   r*   r\   s         r-   test_eval1Dz!Fittable1DModelTester.test_eval1D  sL     [/::J'J'a!$/::::::r0   c           	        	
 t          ||          }d|_        d|_        d}t          j        t          |          5  |j         ddd           n# 1 swxY w Y   |`d}t          j        t
          |          5  d|_        ddd           n# 1 swxY w Y   	 |j                                        	n# t          $ r Y dS w xY wd
t          j        	d         	d	         
          }t          j        	
fd
t          ddd          D             |	
fdt          d	d          D             f          } ||          } ||d          }|t          j
        |                    }t          j        ||k              sJ dS )r   r   Nr   r   r   r   r   r   r   c                 ,    g | ]}d          |z  z
  S r   rd   r   r   r   r   s     r-   r   z=Fittable1DModelTester.test_bounding_box1D.<locals>.<listcomp>  r   r0   rU   r   c                 ,    g | ]}d          |z  z   S r   rd   r(  s     r-   r   z=Fittable1DModelTester.test_bounding_box1D.<locals>.<listcomp>  r   r0   Tr|   r   )ru   r   r   rI   r   r   r   r   r   r   r   s            @@r-   test_bounding_box1Dz)Fittable1DModelTester.test_bounding_box1D  s=    [/:: %!A].g>>> 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	  K]:W555 	# 	#!"E	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#	%2244DD" 	 	 	FF	 YtAwQ--^AAAAAb!R0@0@AAA=====a===
 
 eBiiuR4888#RXl%;%;$;<vk\12222222s5   AAA<BBBB6 6
CCc                    |                     dd          sd S t          ||          }|j        }t          |t          j        t          j        f          rd}d}nd}d}t          |t                    r|                                }t          j	        |          dz  d         }t          j
        t          |d         |d         dz   |                   }t          j
        t          |d         |z
  |d         |z   dz   |                   }	 ||	          }
 ||          }t          |
                                |                                z
            |
                                |z  k     sJ d S )	Nr   Fr   r   r~   r   r$   r   )r   r   rv   r   r   	Lorentz1DDrude1Dr   r&   r   r   r   rX   rY   )ru   r   r   rI   r   r  r   r   r   r   r   r   s               r-   test_bounding_box1D_peakz.Fittable1DModelTester.test_bounding_box1D_peak  sQ   "";66 	F[/::!ef.?@@ 	DCCDCd,-- 	'$$&&Dgdmma#XeDGT!Wq[#667XeDGbL$q'B,*:C@@AeBii%)) 37799w{{}},--		D0@@@@@@@r0   r   r   r    c                    t          dd           }|t          j        k    r'|t          j        k    r|rt          j        d            |            }|d         }|d         t          ||          }t          t                    rfd|j
        D             d|v r0|d         r't          j        |d	         |d
         | j                  }n't          j        |d	         |d
         | j                  }t          j                            d	           d}d
|t          j                            t%          |                    z  z    ||          z  }	 ||||	          fdj
        D             }
d |
D             }t          j        d t)          |          D                       }t          j        d |
D                       }t+          ||| j                   dS )zE
        Test if the parametric model works with the fitter.
        scipyz1.6z4TRF fitter fails for BrokenPowerLaw1D in scipy < 1.6r   r   r   c                      g | ]
}|         S rd   rd   r   s     r-   r   z7Fittable1DModelTester.test_fitter1D.<locals>.<listcomp>  r   r0   r   r   r   r   c                 0    g | ]}t          |          S rd   r   r   s     r-   r   z7Fittable1DModelTester.test_fitter1D.<locals>.<listcomp>%  r   r0   c                     g | ]	}|j         
S rd   r   r   s     r-   r   z7Fittable1DModelTester.test_fitter1D.<locals>.<listcomp>&  r   r0   c                     g | ]	\  }}||
S rd   rd   r   s      r-   r   z7Fittable1DModelTester.test_fitter1D.<locals>.<listcomp>'  r   r0   c                 *    g | ]}|j         	|j        S rd   r   r   s     r-   r   z7Fittable1DModelTester.test_fitter1D.<locals>.<listcomp>(  r   r0   r   N)r   r   r   r   TRFLSQFitterr   xfailr   r   r   r   r&   r   r   r=   r?   r@   randnrB   rD   r   r   r   )ru   r   r   r    SCIPY_LT_1_6r   rI   r*   relative_noise_amplituderH   r   r   r   r   r   r   s                 @@r-   test_fitter1Dz#Fittable1DModelTester.test_fitter1D   s    &gu555 6222'... / L VWWWW($\2
[/::j$'' 	JIIIIu7HIIIJ''y) <Ka%(DF;;E!HeAh77A
	q#' ,rys1vv/F/FFF%%PQ((RF5!T**	 NMMMy7LMMM11&1118WW3z53I3IWWWXXNNFNNNOOt~>>>>>>r0   c                 l    |            }|| j         v rdS |d         }|j        t          |t                    rdS d|v r0|d         r't	          j        |d         |d         | j                  }n't	          j        |d         |d         | j                  }|d         }t          ||d          }t          ||d          }t	          j	        g d	          }	d
|d         z  |	dz
  z  }
 ||          |
z   }|} ||||          }|} ||||d          }t          |j        |j        d           dS )zk
        Test the derivative of a model by comparing results with an estimated
        derivative.
        Nr   r   r   r   r   Fr  dg8*?gx̭?gWqp?gIo?gd
H?gÕ7?g,?g:\i!?g,)uH?g
`3?g=M?g})?gw?gX Sf?g=L}?gSCi?gj=?g7o{?g!V?gxY?gd?^?gER=_?g2LaY?gSVX?g(-?gJ̈́?gzJs?gC|?gL|Q?gh=4?g.
1?gx?gP?g*g?gk?gc}^Ln?ggZ`?gN7DC?g?ggF?gg:?gBY?gє|p?g<ڛ?g]2q\?g}?g䴫?gѲjf?gI,?gx?gcx?gE.??g5?gIi?gE~z?gb W?gڿ?gqDkc?g+ס?ga?g<W8?g2aM{?g@(T?g5e?gR?gΉ=?gh#?gQ?gnn$?gqSm?g{L:?g6/%?gTɾ3G?gڦ?g]L?gcz?gzeq?gG/;?gȮ?g1?gJҝ?gYY?g!f1b8?g}?gR'?g*Qf?gcIʈ?g]\?gR/?g}?g־:?g_ю?gC|8?gʡL?gk?g֋F?gzLP?_?g|K?gO%?gQak?r   r:   Tr  g333333?r   )_non_finite_modelsr7   r	  r   r&   r   r   r=   r   rD   r   r   )ru   r   r   r    r   r*   r   r  r  rsn_rand_1234567890r  rH   r  r  r  r  s                   r-   test_deriv_1Dz#Fittable1DModelTester.test_deriv_1D+  s    $111F( (J{N,S,S(F''y) <Ka%(DF;;E!HeAh77A$\2
'%
 
 
 &%
 
 
 !h  
 
4 *Q-#6#<=""Q&"001A1dKK ,_Att
 
 
 	 +-?-JQU	
 	
 	
 	
 	
 	
r0   N)rw   rx   ry   r  r   r   r   r   r   r>  r   r   r  filterwarningsr#  r%  r*  r.  r  r   r  r  r;  r@  rd   r0   r-   r  r    sj       	 	 	# 	- 	- 	- [ ;<<  =<; ; ;'3 '3 '3RA A A4 [I.>??[Xw//'? '? 0/ @?'?R [I.>??[ ;<<[Xw//F
 F
 0/ =< @?F
 F
 F
r0   r  Tr   c                     i }t          | t                    r | di ||         S t          | t                    r;d|v rt          st	          j        d           |rd|v r|d         } | ||         i |S dS )zCreate instance of model class.requires_scipyzSciPy not foundconstraintsNrd   )r	  r   r	   r   r   skip)r   r   r  r  rD  s        r-   r   r   w  s    
 K+~.. K{<<_];<<<	K	/	/ K..y.K)*** 	=//-m<{OM:JkJJJK Kr0   z&ignore:Model is linear in parameters.*z$ignore:The fit may be unsuccessful.*)r   r   c                 ,    t          | d                   S Nr   strr*   s    r-   <lambda>rK        C!II r0   )keyc                       e Zd ZdS )TestFittable1DModelsNrw   rx   ry   rd   r0   r-   rO  rO    s         	Dr0   rO  c                 ,    t          | d                   S rG  rH  rJ  s    r-   rK  rK    rL  r0   c                       e Zd ZdS )TestFittable2DModelsNrP  rd   r0   r-   rS  rS    s         	Dr0   rS  c                  6   t          j        d          }  | d          dk    sJ t           | ddg          ddg           t          j        ddgd          } t           | d          ddg           t           | ddgd	          ddgdd
gg           d S )N*   r   r   r$   +   ,   n_modelsFmodel_set_axis-   )r   Shiftr   ms    r-   test_ShiftModelr`    s    RA1Q442::::Aq6RH%%% 	b"X***A1Bx   Aq6%000B8b"X2FGGGGGr0   c                  6   t          j        d          }  | d          dk    sJ t           | ddg          ddg           t          j        ddgd          } t           | d          ddg           t           | ddgd	          ddgdd
gg           d S )NrU  r   r   r$   T   rV  rX  FrZ  V   )r   Scaler   r^  s    r-   test_ScaleModelre    s    RA1Q4419999Aq6RH%%% 	b"X***A11vAq6%000B8b"X2FGGGGGr0   c                      t          j        dddd          } t          j        ddd          } | |          }|d         |                                k    sJ d	S )
z
    Currently just tests that the model peaks at its origin.
    Regression test for https://github.com/astropy/astropy/issues/3942
    r   rU   r:   ?x_0amplitude_Lfwhm_Lfwhm_Gr   r   i  N)r   Voigt1Dr&   rV   max)r_  r*   r\   s      r-   test_voigt_modelro    s_     	1"SEEEA
	!RA	!AS6QUUWWr0   c                  \    t          j        ddd          } t          |           dk    sJ d S )N      ?      @      @z1<Gaussian1D(amplitude=1.5, mean=2.5, stddev=3.5)>)r   
Gaussian1Dreprr^  s    r-   test_model_instance_reprrv    s4    #sC((A77IIIIIIIr0   c            	      v   t          j        dd          } g d}t          j        d          } || |          }g d}g d}t	           ||          |            ||          }t	           ||          |           g d	}d
}t          j        t          |          5   ||           ddd           n# 1 swxY w Y    ||dd          }t	           ||          g d           |t          j	        z  }|t          j
        z  } || t          j	        z  |t          j
        z            }t           ||          |           t           ||                    t          j	                            |           |j        dt          j	        z  dt          j	        z  fk    sJ  |g dg dt          j
        z  ddt          j        t          j        t          j        z  t          j        z  z  z            }t           |t          j        d                    g dt          j
        z             dS )z
    Test Tabular1D model.
    r   r   )      ?rU   r$   r\  r   pointslookup_table        ffffff?ffffff? @333333@)rx  333333@333333@333333@?r|  )r~  r  r  r  r  gffffff@7One of the requested xi is out of bounds in dimension 0r   NF)r|  bounds_error
fill_value)rx  r  r  r  r  g333333r!   r   r$   rb   )rU         g\w9r  r  )r   rU   r  r  r   )r&   rV   r   tabular_modelr   r   r   r   unmnJyr   torv   Wr_  Hz)r{  valuesLookupTablerI   xnewans1xextrapr   s           r-   test_tabular_interp_1dr    sy   
 Yq!__F!!!F&q))KKvF;;;E$$$D$$$DEE$KK&&&KV,,,EEE$KK&&&,,,GHG	z	1	1	1  g               KV%DQQQEEE'NN$C$C$CDDD !$;D!%<DKv}6AE>JJJEUU4[[$///UU47714==114888!ad(AH!55555 K		quAC139qt#345	  E UU29Q<<002H2H2H152PQQQQQs   "B::B>B>c                     t          j        g dg dg dg dg dg          } t          j        dd          }||f}t          j        g d          }t          j        d	          } |||           } |||          }t          j        g d
          }t          ||d           t          j        d                              d          }t           j        d dd df         \  }}	t          j        |          }
 |
||	          }t          ||           d}t          j
        t          |          5   |d	          }d d d            n# 1 swxY w Y   d}t          j
        t          |          5   |ddgddgddgf          }d d d            n# 1 swxY w Y   d}t          j
        t          |          5   |g d          }d d d            n# 1 swxY w Y   d}t          j
        t          |          5   |dd	gddgfddg          }d d d            n# 1 swxY w Y   d}t          j
        t          |          5   |dd	gt          j        z  ddgfddgdd gg          }d d d            n# 1 swxY w Y   d!}t          j
        t          |          5   ||| d"dt          j        z  #          }d d d            n# 1 swxY w Y   |d         t          j        z  }||f}|t          j        z  } ||| t          j        z            }|t          j        z  }t%           |||          |dt          j        z             |                    t          j                  }t%           |||          |dt          j        z             dt          j        z  dt          j        z  f}||f}|j        |k    sJ d S )$N)r:g%Yɿ}g3{`yga.e?g,ypw?)g~O2 g|bLg+冿g?g쀐Ѧ?)g8gRrwkӷg&2gI+;?g9?c?)g`&rg8Qg-
rg©ja?g#ɻ?)g廙g{Bg>jYg?gd?r   r   r}  r$   )r  ggngBog|g>%ړ?r~   r      )rb   r!   rb   r!   r  zOnly n_models=1 is supportedr   rX  zMust provide a lookup tableg333333?ffffff@r   )r{  z1lookup_table should be an array with 2 dimensionsr  r      z"points must all have the same unit   ra   z/fill value is in Jy but expected to be unitlessFr  )r&   rD   rV   r   r  r   reshaper   	Tabular2Dr   r   r   r   r  r_  Jyr  r  r   r  rv   )tabler{  r  r  rI   znewr]   ri   r\   r*   trr   r   s                 r-   test_tabular_interp_2dr    s   HIIIKKKKKKKKKKKK	
 E Yq!__FfF8---..D&q))KK&&E5tDXUUUVVFD&t,,,, 		"f%%A8BQBFDAqa(((A	!QAAq-G	*'	:	:	: ( (Q'''( ( ( ( ( ( ( ( ( ( ( ( ( ( (,G	z	1	1	1 E ES#Jc
QF#CDDDE E E E E E E E E E E E E E EBG	z	1	1	1 4 43334 4 4 4 4 4 4 4 4 4 4 4 4 4 4BG	z	1	1	1 6 6aVaV,q!f556 6 6 6 6 6 6 6 6 6 6 6 6 6 63G	z	1	1	1 F FaVac\Aq62aVaV4DEEF F F F F F F F F F F F F F F@G	z	1	1	1 T TFE!ad(SSST T T T T T T T T T T T T T T AYFfF!$;DK..Eae^FUU4..TAE\JJJJ7713<<DUU4..TAE\JJJJHa!$hD$<D%%%%%%sl   7EEE8FF!FGG!$G!H&&H*-H*&J  JJ(KKKc                     t          j        d                              d          } t           j        d dd dd df         \  }}}t	          j        d          } ||           } ||||          }t          | |           d}t          j        t          |          5  t	          j        d	           d d d            d S # 1 swxY w Y   d S )
N   )r$   rb   r!   r$   rb   r!   r  z-Lookup table must have at least one dimensionr   r   )
r&   rV   r  r   r   r  r   r   r   r   )ri   r*   r\   re   tabr  r]   r   s           r-   test_tabular_ndr  -  s   
	"i((Ahrr2A2rrz"GAq!

q
!
!CAQq!QZZFAv>G	z	1	1	1    Q                                   s   !CC
Cc                  |   t          j        d          t          j        d          z  } t          j        d          | z  }t          d          5  t          j                            d          |_        ddd           n# 1 swxY w Y   d|_        t          j	        ddddf         \  }} |||          \  }} |||d	          \  }}t	          j
        |                                           }t          ||         ||                    t          ||         ||                     |||dd
          \  }}|d
k                                    }t          ||         ||                    t          ||         ||                    t          j        ddd          } d| _         | d           | dd	          k    sJ t          j        d          t          j        d          z  t          j        d          z  }	d|	_        t           |	ddgddgddgd	          t          j        dgt          j        dgt          j        dgg           t          j        d          t          j        d          z  t          j        d          z  }
d|
_        t           |
dddd	          g d           dS )zM
    Test the option to evaluate a model respecting
    its bunding_box.
    r$   )r   r   r   r   i r  N))rb   	   )r   ra   rU   Tr|   i  )r}   r  r   r  )c0c1)r   r   r   ))g333333@g@)r     )r   rU   r  rb   r         r!   )r  r  r!   )r   Polynomial2DMappingr   r&   r?   rA   r   rv   r   r   nonzeror   Polynomial1Dr]  rd  nan)pr_  r*   r\   ri   rj   awbwindt3trans3s              r-   test_with_bounding_boxr  ;  s   
 	A!4Q!7!77A|$$q(A		!	! * *y~~b))* * * * * * * * * * * * * * * &AN8CRC"HDAq1Q77DAqQq!t,,,FBHRLL=
!
!
#
#CAcFBsG$$$AcFBsG$$$Qq!t===FB:


 
 CAcFBsG$$$AcFBsG$$$ 	A"---AAN1Q4411Q$///////	b		FLOO	+fl2.>.>	>B5BO
Aq6Aq6Aq6T:::
&"|bfa[1  
 \"Q/&,r2B2BBF9FFF1ad;;;[[[IIIIIs   %BBBc                      t          j        d          } t          j        g d          }t          j        | |          } |dd          }|dk    sJ |                    |d          dk    sJ d S )Nr   rq  333333@r   r      r   Tr|   r  rx  )r&   rV   rD   r   	Tabular1Dinverse)r{  r  r  r]   s       r-   test_tabular_with_bounding_boxr  c  s    Yq\\FX,,,--F((AQqD)))FS====99Vt944;;;;;;r0   c                  f   t          j        d          t          j        z  } t          j        d          t          j        z  }t          j        | |          } |dt          j        z  d          }|dt          j        z  k    sJ |                    |d          dt          j        z  k    sJ d S )Nr   r   Tr|   rx  )r&   rV   r  pixAAr   r  r  )r{  ltr  r]   s       r-   $test_tabular_bounding_box_with_unitsr  n  s    Yq\\AE!F	1	B$$AQq15yD111FS14Z99Vt944AE	AAAAAAr0   c                     t          j        d          } t          j        g d          }t          j        | |          }|                    d          }t          |t          j        d                     t          j        | |ddd                   }t          |j        j        d         |j        ddd                    |                    d          }t          |t          j        d                     t          j        d          } t          j        g d	          }t          j        | |          }t          j
        t          d
          5  |                    d           ddd           n# 1 swxY w Y   t          j        d                              dd          }t          j        dd          } | | f} t          j        | |          }t          j
        t          d
          5  |                    d           ddd           n# 1 swxY w Y   t          j        d          } t          j        g d          }t          j        | |          }d}t          j
        t          |          5  |                    d           ddd           n# 1 swxY w Y   t          j        | |dd          }|                    d          }t           ||          d           dS )z*Test that the Tabular1D inverse is definedr   r  )r  r   )rx  r9   Nr   r   )r  r   )rq  r  r  r      r   )r  g      @r  rz  )rb   rb   r  r   Fr  )r&   rV   rD   r   r  r  r   r{  r|  r   r   r   r  r  r   )	r{  r  r  r]   t2result2r  r  r   s	            r-   test_tabular1d_inverser  y  sO    Yq\\FX,,,--F((AYYz""FFBHZ00111 
	&&2,	/	/BBJ%a("/$$B$*?@@@jj""GGRXj11222 Yq\\FX---..F((A	*#	6	6	6  			*               Ie$$Q**EYq!__FfF		e	<	<	<B	*#	6	6	6  


6               Yq\\FX,,,--F((AHG	z	1	1	1  			#              eMMMAYYs^^FAAfIIs#####s6   E66E:=E:3HHH<JJ"%J"c                      t          j        d          } t           j        ddddf         d         }d}t          j        t
          |          5  t          j        | |           d d d            d S # 1 swxY w Y   d S )Nr   r   z,Expected grid points in 2 directions, got 5.r   )r&   rV   r   r   r   r   r   r  )r{  r  r   s      r-   &test_tabular_grid_shape_mismatch_errorr    s    Yq\\F	!A#qs(	A	B=G	z	1	1	1 % %$$$% % % % % % % % % % % % % % % % % %s   A33A7:A7c                     t          j        d          } t          j        d          }t          j        | |          }t	          |          dk    sJ t          j        d                              dd          }t          j        dd          } | | f} t          j        | |          }t	          |          dk    sJ d S )Nr   zG<Tabular1D(points=(array([0, 1, 2, 3, 4]),), lookup_table=[0 1 2 3 4])>r  r   rz  z<Tabular2D(points=(array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4])), lookup_table=[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]])>)r&   rV   r   r  ru  r  r  r{  r  r  r  s       r-   test_tabular_reprr    s    Yq\\F	1B$$AQT	U 	U 	U 	U Ie$$Q**EYq!__FfFU;;;AQ	 	 	 	 	 	r0   c                     t          j        d          } t          j        d          }t          j        | |          }t	          |          dk    sJ t          j        d                              dd          }t          j        dd          } | | f} t          j        | |          }t	          |          dk    sJ d S )Nr   zModel: Tabular1D
N_inputs: 1
N_outputs: 1
Parameters: 
  points: (array([0, 1, 2, 3, 4]),)
  lookup_table: [0 1 2 3 4]
  method: linear
  fill_value: nan
  bounds_error: Truer  r   rz  a  Model: Tabular2D
N_inputs: 2
N_outputs: 1
Parameters: 
  points: (array([0, 1, 2, 3, 4]), array([0, 1, 2, 3, 4]))
  lookup_table: [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
  method: linear
  fill_value: nan
  bounds_error: True)r&   rV   r   r  rI  r  r  r  s       r-   test_tabular_strr    s    Yq\\F	1B$$AA  	 	 	 	 Ie$$Q**EYq!__FfFU;;;AA  	 	 	 	 	 	r0   c                  0   t          j        d          } t          j        d          d d d         }t          j        | |          }|                    g d          g dk                                    sJ |                    t          j        g d          t          j        z            g dk                                    sJ d|_	        t          j        g d          t          j        g d          g}t          j                            t          dd|          5 }|                    g d          }t          |          D ]%\  }}t          j        ||         |k              sJ &|j        d	k    sJ 	 d d d            d S # 1 swxY w Y   d S )
Nr   r   r  )rb   r$   r   r$   interpnT)autospecreturn_valuer   )r&   rV   r   r  r>   rC   rD   r  r_  	n_outputsmkpatchobjecttabular_models	enumerate
call_count)r{  r  r  rE   	mkInterpnoutputsindexoutputs           r-   test_tabular_evaluater    s   Yq\\F	1ddd	B$$AJJyyy!!YYY.3355555JJrx			**QS011YYY>CCEEEEEAKXiii  "(999"5"56E		Du 
 
 
 )	**YYY''&w// 	2 	2ME66%,&0111111#q((((() ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )s   #AFFFc                  V    t           j        t           j        fD ]} | j        dk    sJ dS )za
    The module name must be set manually because
    these classes are created dynamically.
    zastropy.modeling.tabularN)r   r  r  rx   rI   s    r-   test_tabular_module_namer    s@     "F$45 > >#======> >r0   c                        e Zd Z ed          Z ed          Z ed          Zej        ej        ej        f fd	Zd Z	 xZ
S )
classmodelr   rR   r   r$   c                 N    t                                          |||           d S rs   super__init__)ru   fr*   r\   	__class__s       r-   r  zclassmodel.__init__  %    Aq!!!!!r0   c                     d S rs   rd   rt   s    r-   r>   zclassmodel.evaluate      r0   )rw   rx   ry   r   r  r*   r\   rR   r  r>   __classcell__r  s   @r-   r  r  	  s        	!A	!A	!Aai19 " " " " " "      r0   r  c                        e Zd Z edd          Z ed          Z ed          Z ed          Zej        ej        ej        ej        f fd	Z	d	 Z
 xZS )
subclassmodelrb   T)rR   r   rU   r  r  r   c                 N    t                                          |||           d S rs   r  )ru   r  r*   r\   hr  s        r-   r  zsubclassmodel.__init__  r  r0   c                     d S rs   rd   rt   s    r-   r>   zsubclassmodel.evaluate  r  r0   )rw   rx   ry   r   r  r*   r\   r  rR   r  r>   r  r  s   @r-   r  r    s        	!4(((A	"A	"A	!Aai19	 " " " " " "      r0   r  c                      t                      } | j        dk    sJ | j        dk    sJ | j        dk    sJ | j        j        dk    sJ d S )N)r  r*   r\   r  r   rb   T)r  r   r  r  r   )rj   s    r-   test_parameter_inheritancer  "  sX    A=000003!88883!888839r0   c                     t          j        ddd          } | j        j        dk    sJ | j        j        dk    sJ t          j        dddd	
          } | j        j        dk    sJ | j        j        dk    sJ | j        j        dk    sJ d S )Nrq  rr  rs  &Amplitude (peak value) of the GaussianPosition of peak (Gaussian)r   rU   r:   rg  rh  zThe Lorentzian amplitudez)The Lorentzian full width at half maximumz'The Gaussian full width at half maximum)	r   rt  r+   _descriptionmeanrm  rj  rk  rl  r  s    r-   test_parameter_descriptionr  *  s    c3,,E?'+SSSSS:"&CCCCCNqbSIIIE)-GGGGG<$(SSSSS<$(QQQQQQQr0   c                     d} t          j        t          |           5  t          d           d d d            n# 1 swxY w Y   d} t          j        t          |           5  t          d           d d d            d S # 1 swxY w Y   d S )Nzamplitude parameter must be > 0r   r   )r+   z delta parameter must be >= 0.001r   )delta)r   r   r   r   )r   s    r-   (test_SmoothlyBrokenPowerLaw1D_validatorsr
  6  s   0G	*'	:	:	: / / 2..../ / / / / / / / / / / / / / / 2G	*'	:	:	: * * q))))* * * * * * * * * * * * * * * * * *s   ;??#BBBr!  c                     ddg} t          j        | d         | d         d          }g dddddid	}t          t          |d
          }t          t          |d
          }t          j        g d          }d|d         d         z  |dz
  z  } ||          |z   }t          j                    } ||||          }	t          j                    }
 |
|||d          }t          |	j        |j        d           d S )Nr   r   r   r   )r   rU   r$   r:   r   T)x_breakr	  )r   rD  Fr  r=  r   r   r:   r  r   )	r&   r   r   r   rD   r   LevMarLSQFitterr   r   )r   r*   r   r  r  r?  r  rH   r  r  r  r  s               r-   'test_SmoothlyBrokenPowerLaw1D_fit_derivr  @  sg    3KE
E!HeAh,,A *))TD!A!AB J $ *e   " *e  N (	
 	
 	
 4 	j&q))-@3-FGAA"D/11,,-=q$GG-//O(44   ');)FS     r0   c                        e Zd Ze fd            Z ej        ddd          Zej        j	        dk    sJ ej
        j	        dk    sJ  xZS )_ExtendedModelMetac                 h     t                      j        ||fi |}|                    |           |S rs   )r  __prepare__update)mclsr   baseskwds	namespacer  s        r-   r  z_ExtendedModelMeta.__prepare__  s?     (EGG'e<<t<<	r0   rq  rr  rs  r  r  )rw   rx   ry   classmethodr  r   rt  rI   r+   r  r  r  r  s   @r-   r  r    s            [ Fc3,,E?'+SSSSS:"&CCCCCCCCCr0   r  c                  0     G d dt           d          } dS )zTest can pass kwargs to Modelsc                       e Zd Zd ZdS ))test_metaclass_kwargs.<locals>.ClassModelc                     d S rs   rd   rt   s    r-   r>   z2test_metaclass_kwargs.<locals>.ClassModel.evaluate      Dr0   Nrw   rx   ry   r>   rd   r0   r-   
ClassModelr    #        	 	 	 	 	r0   r   flag)r"  N)r	   r   s    r-   test_metaclass_kwargsr$    s=        ]      r0   c                  V     G d dt           t          d          } | j        dk    sJ dS )z)Test can pass kwargs to Model subclasses.c                       e Zd Zd ZdS ),test_submetaclass_kwargs.<locals>.ClassModelc                     d S rs   rd   rt   s    r-   r>   z5test_submetaclass_kwargs.<locals>.ClassModel.evaluate  r  r0   Nr  rd   r0   r-   r   r'    r!  r0   r   r"  )	metaclassr"  N)r	   r  r"  r#  s    r-   test_submetaclass_kwargsr*    sQ        ].@v     ?f$$$$$$r0   c                   P    e Zd Z e            Z e            ZdZed             ZdS )ModelDefaultFc                     || z  |z   S rs   rd   )r*   slope	intercepts      r-   r>   zModelDefault.evaluate  s    qy9$$r0   N)	rw   rx   ry   r   r.  r/  
_separablestaticmethodr>   rd   r0   r-   r,  r,    sH        IKKE	IJ% % \% % %r0   r,  c                       e Zd Zd ZdS )ModelCustomc                 .    t          j        dgg          S rG  )r&   rD   rt   s    r-   _calculate_separability_matrixz*ModelCustom._calculate_separability_matrix  s    x!r0   N)rw   rx   ry   r5  rd   r0   r-   r3  r3    s#            r0   r3  c                      t          t          dd                    } |                                 sJ t          t          dd                    }|                                rJ d S )Nr   r$   )r.  r/  )r   r,  rC   r3  any)originalcustoms     r-   test_custom_separability_matrixr:    sd    "<a1#E#E#EFFH<<>> 1!B!B!BCCFzz||r0   r;   )Tr   )dr  unittest.mockmockr  numpyr&   r   numpy.testingr   r   astropy.modeling.tabularmodelingtabularr  astropyr   r  astropy.modelingr   r   astropy.modeling.bounding_boxr   astropy.modeling.corer	   r
   r   astropy.modeling.modelsr   astropy.modeling.parametersr   r   astropy.modeling.polynomialr   astropy.modeling.powerlawsr   r   r   r   r   astropy.modeling.separabler   astropy.tests.helperr   astropy.utilsr   r   "astropy.utils.compat.optional_depsr   example_modelsr   r   r  r6  LMLSQFitterDogBoxLSQFitterr  r  r  r  rJ   rO   rS   r^   r   r   rA  r  r   sorteditemsrO  rS  r`  re  ro  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r$  r*  r,  r3  r:  rd   r0   r-   <module>rS     s               7 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1       , , , , , , , , : : : : : : B B B B B B B B B B . . . . . . F F F F F F F F 6 6 6 6 6 6              ; : : : : : 9 9 9 9 9 9 5 5 5 5 5 5 5 5 8 8 8 8 8 8 0 0 0 0 0 0 0 0 	 	M*:;;7++# # # ,+ <;#L	& 	& 	&$ $ $
$ 
$ 
$%L %L %LPa a a a a a a aH LMMj
 j
 j
 j
 j
 j
 j
 NMj
\ GSK K K K" EFFCDD&
F?9?"5"5666 	 	 	 	 	0 	 		  ED GF	 EFF&
F?9?"5"5666 	 	 	 	 	0 	 		  GF
		H 	H 	H	H 	H 	H LMM	 	 NM	J J J
 	M*:;;&R &R <;&RR 	M*:;;:& :& <;:&z 	M*:;;
  
  <;
 %J %J %JP 	M*:;;< < <;< 	M*:;;B B <;B 	M*:;;'$ '$ <;'$T 	M*:;;% % <;% 	M*:;;  <;0 	M*:;;" " <;"J 	M*:;;) ) <;)$ 	M*:;;> > <;>	 	 	 	 	 	 	 	
 
 
 
 
J 
 
 
   LMMR R NMR* * * 	M*:;;788CDD9 9 ED 98 <;9xD D D D D D D D  % % %% % % % %5 % % %    ,   
    r0   