
    IR-e                        d 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 ddlmZmZ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 d
ZdZej                            d           ej                            e          Z g dZ!ej        "                    e          Z#g dZ$de gZ%ddgZ& G d d          Z'ej(        )                    e d           G d d                      Z*dS )z#Tests for spline models and fitters    N)assert_allclose)FittableModelModelDefinitionError)SplineExactKnotsFitterSplineInterpolateFitterSplineSmoothingFitterSplineSplrepFitter)	Parameter)Spline1D_Spline_SplineFitter)	HAS_SCIPY)AstropyUserWarning2   
   *   r      )r               g{Gz?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
 Zd Zd Zd Zd ZdS )
TestSplinec                     d| _         d t          | j                   D             | _        d t          | j                   D             | _         G d dt                    }|| _        d S )Nr   c                 <    i | ]}d | t          j                    S testmk	MagicMock.0is     Blib/python3.11/site-packages/astropy/modeling/tests/test_spline.py
<dictcomp>z*TestSpline.setup_class.<locals>.<dictcomp>%   s&    XXXq
q

BLNNXXX    c                 <    i | ]}d | t          j                    S )newr    r#   s     r&   r'   z*TestSpline.setup_class.<locals>.<dictcomp>&   s&    TTT1Y1YYTTTr(   c                   2     e Zd ZddiZ fdZd fd	Z xZS )&TestSpline.setup_class.<locals>.Spliner   c                 H    t                                                       d S N)super_init_parameters)self	__class__s    r&   r0   z7TestSpline.setup_class.<locals>.Spline._init_parameters+   s    ((*****r(   Nc                 P    t                                          |||           d S )Nbounds)r/   
_init_data)r1   knotscoeffsr5   r2   s       r&   r6   z1TestSpline.setup_class.<locals>.Spline._init_data.   s(    ""5&"@@@@@r(   r.   )__name__
__module____qualname__optional_inputsr0   r6   __classcell__r2   s   @r&   Spliner,   (   sj        %v.O+ + + + +A A A A A A A A A Ar(   r?   )num_optranger<   extra_kwargsr   r?   )r1   r?   s     r&   setup_classzTestSpline.setup_class#   s    XXE$,DWDWXXXTTdl@S@STTT	A 	A 	A 	A 	AW 	A 	A 	A r(   c                 r   |                                  }|j        J |j        J |j        du sJ |j        J |j        J t          |d          rJ t          j        	                    t          dd          5 }|                                  }|j        g k    sJ t          j                    }t          j                    }t          j                    }|                      |||          }|j        t          j        ||||          gk    sJ |j        J |j        J |j        du sJ |j        J |j        J 	 d d d            n# 1 swxY w Y   d}t          j        t           |          5  |                      t          j                    	           d d d            d S # 1 swxY w Y   d S )
NFdegree_init_splineTautospec)r7   r8   r5   z;If one passes a coeffs vector one needs to also pass knots!match)r8   )r?   _t_c_user_knots_degree_testhasattrr!   patchobjectr   call_args_listr"   callpytestraises
ValueError)r1   splmkInitr7   r8   r5   MESSAGEs          r&   test___init__zTestSpline.test___init__3   s;   kkmmv~~~v~~~%''''{"""y   3))))) X__Wnt_DD 	%++--C(B....LNNE\^^F\^^F++E&+HHC(RWS%-P-P,QQQQQ6>>>6>>>?e++++;&&&9$$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%$ Q]:W555 	/ 	/KKr|~~K...	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/ 	/s%   =CEEE7(F,,F03F0c                 6   |                                  }|j        dk    sJ t          d t          d          D                       }||_        |j        |k    sJ t          d t          d          D                       }||_        |j        ||z   k    sJ d S )N c              3   <   K   | ]}t          j                    V  d S r.   r    r$   _s     r&   	<genexpr>z.TestSpline.test_param_names.<locals>.<genexpr>Z   s(      <<a2<>><<<<<<r(   r   c              3   <   K   | ]}t          j                    V  d S r.   r    r_   s     r&   ra   z.TestSpline.test_param_names.<locals>.<genexpr>^   s(      ==qBLNN======r(   )r?   param_namestuplerA   _knot_names_coeff_names)r1   rX   
knot_namescoeff_namess       r&   test_param_nameszTestSpline.test_param_namesU   s    kkmm"$$$$<<588<<<<<
$*,,,,==E!HH=====&*{":::::::r(   c                 d    |                                  }|                    d          dk    sJ d S )Nr   rO   )r?   _optional_argr1   rX   s     r&   test__optional_argzTestSpline.test__optional_argb   s4    kkmm  ((G333333r(   c                 \     G  fdd j                   } |            } j        D ];}|                    |          }t          ||          sJ t	          ||          J <t          j        t          d          5  |                                 d d d            d S # 1 swxY w Y   d S )Nc                   $    e Zd Z j        Zd ZdS )7TestSpline.test__create_optional_inputs.<locals>.Splinec                 .    |                                   d S r.   _create_optional_inputsr1   s    r&   __init__z@TestSpline.test__create_optional_inputs.<locals>.Spline.__init__j       ,,.....r(   Nr9   r:   r;   r<   ru   rt   s   r&   r?   rp   g   ,        "2O/ / / / /r(   r?   z2Optional argument .* already exists in this class!rI   )	r?   r<   rk   rP   getattrrU   rV   rW   rs   )r1   r?   rX   arg	attributes   `    r&   test__create_optional_inputsz'TestSpline.test__create_optional_inputsf   s/   	/ 	/ 	/ 	/ 	/ 	/ 	/T[ 	/ 	/ 	/ fhh' 	3 	3C))#..I3	*****3	**2222]S
 
 
 	* 	* '')))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   ?B!!B%(B%c                 N     G  fdd j                   } |            } |j        di  j        } j                                        D ],\  }}|                    |          }t          ||          J -| j        k    sJ  j                                        } j        D ]}t          j	                    ||<    |j        di |} j                                        D ]d\  }}|                    |          }t          ||          J t          ||          ||         k    sJ t          ||          |k    sJ ||vsJ e| j        k    sJ | j        k    sJ t          j        t          d          5   |j        di | d d d            d S # 1 swxY w Y   d S )Nc                   $    e Zd Z j        Zd ZdS ):TestSpline.test__intercept_optional_inputs.<locals>.Splinec                 .    |                                   d S r.   rr   rt   s    r&   ru   zCTestSpline.test__intercept_optional_inputs.<locals>.Spline.__init__|   rv   r(   Nrw   rt   s   r&   r?   r   y   rx   r(   r?   z2.* has already been set, something has gone wrong!rI   r]   )r?   _intercept_optional_inputsrB   r<   itemsrk   ry   copyr!   r"   rU   rV   RuntimeError)r1   r?   rX   
new_kwargsrz   valuer{   kwargss   `       r&   test__intercept_optional_inputsz*TestSpline.test__intercept_optional_inputsx   so   	/ 	/ 	/ 	/ 	/ 	/ 	/T[ 	/ 	/ 	/ fhh3S3HHd6GHH
.4466 	3 	3JC))#..I3	**2222T....."''))' 	) 	)C,..F3KK3S3==f==
.4466 	) 	)JC))#..I3	**6663	**fSk99993	**e3333j(((((T.....*****] U
 
 
 	5 	5 +C*44V444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5s   ?FF!Fc                      G  fdd j                   } |            } |j        di  j        } j                                        D ]\  }}||         |k    sJ  j                                        D ]\  }}||         |k    sJ t          |          t           j                  t           j                  z   k    sJ  j                                        } j        D ]}t          j                    ||<    |j	        di |  |j        di  j        }||k    sJ  j        D ])}|
                    |          }t          ||          J * j                                        } j        D ]}t          j                    ||<    |j	        di |  j                                        } j        D ]}t          j                    ||<   ||k    sJ  |j        di |}||k    sJ d S )Nc                       e Zd Z j        ZdS )(TestSpline.test_evaluate.<locals>.SplineN)r9   r:   r;   r<   rt   s   r&   r?   r      s        "2OOOr(   r?   r]   )r?   evaluaterB   r<   r   lenr   r!   r"   r   rk   ry   )	r1   r?   rX   r   rz   r   r   r{   
set_kwargss	   `        r&   test_evaluatezTestSpline.test_evaluate   s   	3 	3 	3 	3 	3 	3 	3T[ 	3 	3 	3 fhh "S\66D$566
.4466 	, 	,JCc?e++++++1133 	, 	,JCc?e+++++:3t';#<#<s4CT?U?U#UVVVV "''))' 	) 	)C,..F3KK&&00000!S\66D$566
V####' 	3 	3C))#..I3	**2222 &++--
' 	) 	)C,..F3KK&&44444"''))' 	) 	)C,..F3KKV####!S\++F++
V######r(   c                    |                                  }t          d t          d          D                       }d t          d          D             }d t          d          D             }t          j                            t          dd|          5 }t          j                            t          dd	          5 }|j         ||i |k    sJ |j	        t          j
        |g|R i |gk    sJ |j	        t          j
        |fi |gk    sJ 	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )
Nc              3   <   K   | ]}t          j                    V  d S r.   r    r_   s     r&   ra   z+TestSpline.test___call__.<locals>.<genexpr>   (      66R\^^666666r(   r   c                 <    i | ]}d | t          j                    S r   r    r$   idxs     r&   r'   z,TestSpline.test___call__.<locals>.<dictcomp>   &    CCC3,,,CCCr(   c                 <    i | ]}d | t          j                    S new_testr    r   s     r&   r'   z,TestSpline.test___call__.<locals>.<dictcomp>   )    KKK3&&&KKKr(   r   TrH   return_value__call__rG   )r?   rd   rA   r!   rQ   rR   r   r   r   rS   rT   )r1   rX   argsr   r   mkInterceptmkCalls          r&   test___call__zTestSpline.test___call__   s   kkmm66U1XX66666CC%((CCCKK%((KKK
X__(#	  
 
 		N
 
TJJ Nf*cc4.B6.B.BBBBB,1Rt1R1R1Rz1R1R0SSSSS"1bgc6L6LV6L6L5MMMMMMN N N N N N N N N N N N N N N		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		N 		Ns7   (D5=ADD5D!	!D5$D!	%D55D9<D9c                   	
 t           j                            d           t           j                            d          }|                                
|                                	 G 	
fdd| j                  } |            }|j        
k                                    sJ |j        	k                                    sJ t          d          D ]7}d| }|	                    ||d           t          ||          sJ t          ||          }t          |t                    sJ |j        |k    sJ |j        du sJ |j        
|         cxk    r|j        |         cxk    r||         k    sn J t           j                                        }||_        |j        |         |k    sJ |j        |         ||         k    sJ t           j                                        }||j        |<   |j        |k    sJ |j        |k    sJ 9t          d          D ]8}d| }|	                    ||d	d
           t          ||          sJ t          ||          }t          |t                    sJ |j        |k    sJ |j        d
u sJ |j        	|         cxk    r|j        |         cxk    r||         k    sn J t           j                                        }||_        |j        |         |k    sJ |j        |         ||         k    sJ t           j                                        }||j        |<   |j        |k    sJ |j        |k    sJ :d S )N%      c                   D    e Zd Zefd            Ze fd            ZdS )1TestSpline.test__create_parameter.<locals>.Splinec                     S r.   r]   r1   r   s    r&   r   z6TestSpline.test__create_parameter.<locals>.Spline.test       r(   c                     S r.   r]   )r1   
fixed_tests    r&   r   z<TestSpline.test__create_parameter.<locals>.Spline.fixed_test   s	    !!r(   N)r9   r:   r;   propertyr   r   )r   r   s   r&   r?   r      s]            X " " " " X" " "r(   r?   	test_namer   Ffixed_test_namer   T)nprandomseedr   r?   r   allr   rA   _create_parameterrP   ry   
isinstancer
   modelfixedr   )r1   base_vecr?   rX   indexnameparamnew_setnew_getr   r   s            @@r&   test__create_parameterz!TestSpline.test__create_parameter   s   
	r9##B''}}]]__
	" 	" 	" 	" 	" 	" 	" 	"T[ 	" 	" 	" fhhD %%'''''*,11333332YY 	* 	*E&u&&D!!$v6663%%%%%C&&EeY/////;#%%%%;%'''';$u+SSSS%SSSSHUOSSSSSSi&&((G!EK8E?g----8E?huo5555i&&((G%CHUO;'))));')))))2YY 	* 	*E,U,,D!!$|TBBB3%%%%%C&&EeY/////;#%%%%;$&&&&e$# # # #>%(# # # # E?# # # # # #
 i&&((G!EK>%(G3333>%(HUO;;;;i&&((G$+CN5!;'))));')))))+	* 	*r(   c                 B   t           j                            d           t           j                            d           G fdd| j                  } |            t	          j                    t          j                            t          dd          5 }	                    dd	          }|t          d
 t          d          D                       k    sJ |j        fdt          d          D             k    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   r   c                   *    e Zd Ze fd            ZdS )2TestSpline.test__create_parameters.<locals>.Splinec                     S r.   r]   r   s    r&   r   z7TestSpline.test__create_parameters.<locals>.Spline.test  r   r(   N)r9   r:   r;   r   r   r   s   r&   r?   r     s8            X  r(   r?   r   TrG   
test_paramr   c              3       K   | ]	}d | V  
dS )r   Nr]   r   s     r&   ra   z5TestSpline.test__create_parameters.<locals>.<genexpr>  s+      "K"K##5#5#5"K"K"K"K"K"Kr(   c           	      F    g | ]}t          j        d | |d          S )r   r   )r!   rT   )r$   r   r   rX   s     r&   
<listcomp>z6TestSpline.test__create_parameters.<locals>.<listcomp>  sD     / / / /#//feDD/ / /r(   )r   r   r   r?   r!   r"   rQ   rR   r   _create_parametersrd   rA   rS   )r1   r?   mkCreateparamsr   rX   r   s       @@@r&   test__create_parametersz"TestSpline.test__create_parameters
  s   
	ry##	 	 	 	 	 	 	T[ 	 	 	
 fhhX__W&9D_II 	X++L&%HHFU"K"Kr"K"K"KKKKKKK* / / / / / 99/ / /     	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   A+DDDc                     |                                  }d}t          j        t          |          5  |                                 d d d            d S # 1 swxY w Y   d S NzThis needs to be implementedrI   )r?   rU   rV   NotImplementedErrorr0   r1   rX   rZ   s      r&   test__init_parametersz TestSpline.test__init_parameters  s    kkmm1].g>>> 	# 	#  """	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s   AAAc                    |                                  }d}t          j        t          |          5  |                    t          j                    t          j                    t          j                               d d d            n# 1 swxY w Y   t          j        t          |          5  |                    t          j                    t          j                               d d d            d S # 1 swxY w Y   d S r   )r?   rU   rV   r   r6   r!   r"   r   s      r&   test__init_datazTestSpline.test__init_data%  sT   kkmm1].g>>> 	K 	KNN2<>>2<>>2<>>JJJ	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K 	K ].g>>> 	; 	;NN2<>>2<>>:::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s$   AB		BB/9C55C9<C9c           	         |                                  }t          j                    }t          j                    }t          j                    }t          j                            t
          dd          5 }t          j                            t
          dd          5 }t          j                    }|                    |d           |                    |d           |                    |||           |j        t          j	        
                    ||||          t          j	                            |          gk    sJ 	 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )Nr0   TrG   r6   
parametersdatar4   )r?   r!   r"   rQ   rR   r   attach_mockrF   
mock_callsrT   r   r   )r1   rX   r7   r8   r5   mkParametersmkDatamains           r&   test__init_splinezTestSpline.test__init_spline/  s   kkmmX__'$  
 
 	,FF 	&|~~  |<<<  000  777GLLeVFLCCG&&s+++     	 	 	 	 	 	 	 	 	 	 	 	 	 	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s7   5(E&B$EE&E	E&E	E&&E*-E*c                     |                                  }|j        J |j        J |j        J |                      d          }|j        J |j        J |j        dk    sJ d S )Nr   rE   )r?   rL   rK   rN   rl   s     r&   test__init_tckzTestSpline.test__init_tckC  su    kkmmv~~~v~~~{"""kkk##v~~~v~~~{ar(   N)r9   r:   r;   rC   r[   ri   rm   r|   r   r   r   r   r   r   r   r   r   r]   r(   r&   r   r   "   s            /  /  /D; ; ;4 4 4* * *$5 5 5@#$ #$ #$JN N N":* :* :*x  (# # #; ; ;  (	  	  	  	  	 r(   r   zrequires scipy)reasonc                   R   e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!e"d              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+          e'j(        )                    d'e-          d(                                     Z.e'j(        )                    d$e*          e'j(        )                    d%e+          d)                         Z/e'j(        )                    d$e*          e'j(        )                    d%e+          e'j(        )                    d'e-          d*                                     Z0e'j(        )                    d$e*          e'j(        )                    d%e+          d+                         Z1d,d,gd-z  d,d,d,fd.Z2d/ Z3d0 Z4d1 Z5d,S )2TestSpline1Dc                 "   dd}t          j        ddt                    | _         || j        t                    | _         || j                  | _        t          j        | j                  }t           j        	                    |           | j        |         | _
         || j
        t          |                   | _        d| _        t          j        dd| j                  | _        t          j        ddt                    dd         | _        d S )	Nr   c                 >    t          j        | dz             d|z  z   S )Nr   皙?)r   exp)xnoises     r&   funcz&TestSpline1D.setup_class.<locals>.funcR  s    6AqD'??S5[00r(   r   i  r   r   )r   )r   linspacenptsr   r   ytruthargsortr   shufflex_sy_snpts_outxsnknotst)r1   r   arg_sorts      r&   rC   zTestSpline1D.setup_classQ  s    	1 	1 	1 	1 RD))dfe$$T$&\\
:df%%
	(###6(#4%/22+b!T]33RF++AbD1r(   c                 r   ||v sJ |t          |                    |          d                   k    sJ | | }||k    sJ t          ||          sJ t          ||          }t	          |t
                    sJ |j        |k    sJ |j         ||          k    sJ |j        |k    sJ |j	        |u sJ d S Nr   )
intsplitrP   ry   r   r
   r   r   r   r   )	r1   rX   	base_namer   r   r   r   	knot_namer   s	            r&   check_parameterzTestSpline1D.check_parameterd  s    D    DJJy11"5666666 )%))	D    sD!!!!!T""%+++++zT!!!!{eeEll****{c!!!!{e######r(   c           	      d    t          |          D ]\  }}|                     ||||||            d S r.   )	enumerater   )r1   rX   r   r   r   r   r   r   s           r&   check_parameterszTestSpline1D.check_parametersq  sL    "6** 	J 	JIC  isE5IIII	J 	Jr(   c                 X    |D ]&}t          ||          }||_        |j        |k    sJ 'd S r.   )ry   r   )r1   rX   r7   r   r   r   s         r&   update_parameterszTestSpline1D.update_parametersu  sG     	( 	(DC&&EEK;%'''''	( 	(r(   c                     t                      }|j        dk    sJ |j        du sJ |j        J |j        J |j        J t          |j                  dk    sJ t          |j                  dk    sJ d S )Nr   Fr   )	r   rN   rM   rK   rL   _nur   re   rf   rl   s     r&   %test___init__with_no_knot_informationz2TestSpline1D.test___init__with_no_knot_information{  s    jj{a%''''v~~~v~~~w 3?##q((((3#$$))))))r(   c                    t          d          }|j        dk    sJ |j        du sJ |j        J t	          |j                  dk    sJ t          j        d          }d|dd <   |j        |k                                    sJ t	          |j	                  dk    sJ |j	        t          j        d          k                                    sJ t	          |j
                  dk    sJ t	          |j                  dk    sJ d }|                     ||j
        d	|d
           d }|                     ||j        d|d           d S )Nr   r7   r   F   r   c                     | dk     rdS dS N   r   r   r]   r   s    r&   value0z>TestSpline1D.test___init__with_number_of_knots.<locals>.value0      V||qqr(   knotTc                     dS Nr   r]   r  s    r&   value1z>TestSpline1D.test___init__with_number_of_knots.<locals>.value1      1r(   coeff)r   rN   rM   r  r   rK   r   zerosr   rL   re   rf   r   )r1   rX   r   r  r  s        r&   !test___init__with_number_of_knotsz.TestSpline1D.test___init__with_number_of_knots  sv   R    {a%''''w 36{{b    HRLL"##!  """""36{{b    "(2,,&++----- 3?##r))))3#$$****	 	 	 	c3?FFDIII	 	 	 	c3#3WfeLLLLLr(   c                 b   dt          j        d          z  dz
  t                    }|j        dk    sJ |j        du sJ |j        J |j        k                                    sJ t          |j	                  dk    sJ |j	        t          j
        d          k                                    sJ t          |j                  dk    sJ t          |j                  dk    sJ fd}|                     ||j        d|d           d	 }|                     ||j        d
|d           d S )N   r       r  r   Tc                     |          S r.   r]   r   r   s    r&   r  z@TestSpline1D.test___init__with_full_custom_knots.<locals>.value0      S6Mr(   r  c                     dS r  r]   r  s    r&   r  z@TestSpline1D.test___init__with_full_custom_knots.<locals>.value1  r  r(   r  F)r   aranger   rN   rM   r  rK   r   r   rL   r  re   rf   r   r1   rX   r  r  r   s       @r&   #test___init__with_full_custom_knotsz0TestSpline1D.test___init__with_full_custom_knots  se   2#Q {a$&&&&w !  """""36{{b    "(2,,&++----- 3?##r))))3#$$****	 	 	 	 	 	c3?FFDIII	 	 	 	c3#3WfeLLLLLr(   c                    t          j        dd          t          ddg          }|j        dk    sJ |j        du sJ |j        J t          |j                  dk    sJ |j        dd	         k                                    sJ |j        d d         dk                                    sJ |j        d	d          dk                                    sJ t          |j	                  dk    sJ |j	        t          j
        d          k                                    sJ fd
}|                     ||j        d|d           d }|                     ||j        d|d           d S )Nr   r   r   )r7   r5   r   T   r   r  c                 :    | dk     rdS | dk    rdS | dz
           S )Nr   r      r   r]   r  s    r&   r  zDTestSpline1D.test___init__with_interior_custom_knots.<locals>.value0  s-    Qwwqrqz!r(   r  c                     dS r  r]   r  s    r&   r  zDTestSpline1D.test___init__with_interior_custom_knots.<locals>.value1  r  r(   r  F)r   r  r   rN   rM   r  r   rK   r   rL   r  r   re   rf   r  s       @r&   'test___init__with_interior_custom_knotsz4TestSpline1D.test___init__with_interior_custom_knots  s   IaQ2w///{a$&&&&w 36{{b    qt!&&(((((rr
a$$&&&&&rssr!&&(((((36{{b    "(2,,&++-----	" 	" 	" 	" 	" 	c3?FFDIII	 	 	 	c3#3WfeLLLLLr(   c                 r   dt          j        d          z  dz
  t          j        ddd          t                    }|j        dk    sJ |j        du sJ |j        J |j        k                                    sJ t          |j
                  dk    sJ |j
        k                                    sJ t          |j                  dk    sJ t          |j                  dk    sJ fd	}|                     ||j        d
|d           fd}|                     ||j        d|d           d S )Nr  r   r  r   r   )r7   r8   r   Tc                     |          S r.   r]   r  s    r&   r  zJTestSpline1D.test___init__with_user_knots_and_coefficients.<locals>.value0  r  r(   r  c                     |          S r.   r]   r   cs    r&   r  zJTestSpline1D.test___init__with_user_knots_and_coefficients.<locals>.value1  r  r(   r  F)r   r  r   r   rN   rM   r  rK   r   r   rL   re   rf   r   )r1   rX   r  r  r*  r   s       @@r&   -test___init__with_user_knots_and_coefficientsz:TestSpline1D.test___init__with_user_knots_and_coefficients  s|   2#KAr""Qq))) {a$&&&&w !  """""36{{b    !  """"" 3?##r))))3#$$****	 	 	 	 	 	c3?FFDIII	 	 	 	 	 	c3#3WfeLLLLLr(   c                 4   d}d| d}t          j        t          |          5  t          |           d d d            n# 1 swxY w Y   d}t	          d          D ]W}t          j        t          |          5  t          t          j        |                     d d d            n# 1 swxY w Y   Xt          j        d          d d d	         }d
}t          j        t          |          5  t          |           d d d            d S # 1 swxY w Y   d S )Ng      @zKnots: z must be iterable or valuerI   r  Must have at least 8 knots   r   r   z'Knots must be in a non-decreasing order)rU   rV   rW   r   rA   r   r  )r1   r7   rZ   r   r   s        r&   test___init__errorsz TestSpline1D.test___init__errors	  s   =E===]:W555 	" 	"5!!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 088 	/ 	/Cz999 / /ry~~..../ / / / / / / / / / / / / / / IbMM$$B$<]:W555 	 	1	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s5   AAA:#B))B-	0B-	/DDDc                    t          d          }d }|                     ||j        d|d           t          j        d                                          |_        fd}|                     ||j        d|d           |                     ||j        d           |j        d d          dk                                    sJ d }|                     ||j	        d	|d
           dt          j        d          z  dz                                   |_
        fd}|                     ||j	        d	|d
           |                     ||j	        d           |j
        d d          dk                                    sJ d S )Nr   c                     | dk     rdS dS r	  r]   r  s    r&   r  z6TestSpline1D.test_parameter_array_link.<locals>.value0   r  r(   r  Tr  c                     |          S r.   r]   r  s    r&   r  z6TestSpline1D.test_parameter_array_link.<locals>.value1,  r  r(   r   c                     dS r  r]   r  s    r&   value2z6TestSpline1D.test_parameter_array_link.<locals>.value26  r  r(   r  Fr   c                     |          S r.   r]   r)  s    r&   value3z6TestSpline1D.test_parameter_array_link.<locals>.value3?  r  r(   r   )r   r   re   r   r  r   rK   r   r   rf   rL   )r1   rX   r  r  r4  r6  r*  r   s         @@r&   test_parameter_array_linkz&TestSpline1D.test_parameter_array_link  s   rll	 	 	 	c3?FFDIII IbMM	 	 	 	 	 	c3?FFDIII 	sCOQ777qqq	Q##%%%%%	 	 	 	c3#3WfeLLL 	""	 	 	 	 	 	c3#3WfeLLL 	sC$4a888qqq	Q##%%%%%%%r(   c                 ^
   t          d          }t          dd          }|j        dk    sJ t          |j                  dk    sJ t	          j        d          }d|d	d <   |j        |k                                    sJ t          |j                  dk    sJ |j        t	          j        d          k                                    sJ |j        dk    sJ t          |j                  d
k    sJ t	          j        d
          }d|dd <   |j        |k                                    sJ t          |j                  d
k    sJ |j        t	          j        d
          k                                    sJ t          |j                  dk    sJ t          |j                  d
k    sJ d }| 	                    ||j        d|d           d }| 	                    ||j        d|d           dt	          j
        d          z  dz   dt	          j
        d
          z  dz                                   |j        d d <                                   |j        d d <   fd}| 	                    ||j        d|d           fd}| 	                    ||j        d|d           |                     ||j        d           |                     ||j        d           |j        d d          dk                                    sJ |j        d d          dk                                    sJ t          |j                  dk    sJ t          |j                  d
k    sJ d }| 	                    ||j        d|d           | 	                    ||j        d|d           dt	          j
        d          z  dz   dt	          j
        d
          z  dz                                   |j        d d <                                   |j        d d <   fd}	| 	                    ||j        d|	d           fd}
| 	                    ||j        d|
d           |                     ||j        d            |                     ||j        d!           |j        d d          dk                                    sJ |j        d d          dk                                    sJ |j        d d          d k                                    sJ |j        d d          d!k                                    sJ d S )"Nr   r     r   r7   rE   r   r  r   r     r   c                     | dk     rdS dS r	  r]   r  s    r&   r  z-TestSpline1D.test_two_splines.<locals>.value0`  r  r(   r  Tc                     | dk     rdS dS )Nr  r   r   r]   r  s    r&   r  z-TestSpline1D.test_two_splines.<locals>.value1h  r  r(      r!        c                     |          S r.   r]   )r   t0s    r&   r4  z-TestSpline1D.test_two_splines.<locals>.value2v      c7Nr(   c                     |          S r.   r]   )r   t1s    r&   r6  z-TestSpline1D.test_two_splines.<locals>.value3{  rC  r(   r   c                     dS r  r]   r  s    r&   value4z-TestSpline1D.test_two_splines.<locals>.value4  r  r(   r  Fr  r
  r   /   c                     |          S r.   r]   )r   c0s    r&   value5z-TestSpline1D.test_two_splines.<locals>.value5  rC  r(   c                     |          S r.   r]   )r   c1s    r&   value6z-TestSpline1D.test_two_splines.<locals>.value6  rC  r(   r      )r   rN   r   rK   r   r  r   rL   re   r   r  r   r   rf   )r1   spl0spl1r   r  r  r4  r6  rG  rK  rN  rJ  rM  rB  rE  s              @@@@r&   test_two_splineszTestSpline1D.test_two_splinesH  s   b!!!b+++|q    47||r!!!!HRLL"##1!!#####47||r!!!!28B<<',,.....|q    47||r!!!!HRLL"##1!!#####47||r!!!!28B<<',,..... 4#$$****4#$$****	 	 	 	dD$4ffdKKK	 	 	 	dD$4ffdKKK 2#")B--"$WWYY
WWYY
	 	 	 	 	 	dD$4ffdKKK	 	 	 	 	 	dD$4ffdKKK 	tT%5q999tT%5q999
a$$&&&&&
a$$&&&&& 4$%%++++4$%%++++	 	 	 	dD$5wNNNdD$5wNNN ")B--"$")B--"$WWYY
WWYY
	 	 	 	 	 	dD$5wNNN	 	 	 	 	 	dD$5wNNN 	tT%6:::tT%6:::
a$$&&&&&
a$$&&&&&
a$$&&&&&
a$$&&&&&&&r(   c                     t                      }|j        dk    sJ d t          d          D             }t          d          }|j        t          |          k    sJ d S )Nr]   c                     g | ]}d | S r  r]   r   s     r&   r   z1TestSpline1D.test__knot_names.<locals>.<listcomp>      888slSll888r(   r  r   )r   re   rA   rd   )r1   rX   rg   s      r&   test__knot_nameszTestSpline1D.test__knot_names  se    jj"$$$$ 98eBii888
rll%
"3"3333333r(   c                     t                      }|j        dk    sJ d t          d          D             }t          d          }|j        t          |          k    sJ d S )Nr]   c                     g | ]}d | S r  r]   r   s     r&   r   z2TestSpline1D.test__coeff_names.<locals>.<listcomp>      :::}s}}:::r(   r  r   )r   rf   rA   rd   )r1   rX   rh   s      r&   test__coeff_nameszTestSpline1D.test__coeff_names  sg    jj2%%%% ;:b		:::rll5#5#5555555r(   c                     t                      }|j        dk    sJ d t          d          D             }d t          d          D             }||z   }t          d          }|j        t          |          k    sJ d S )Nr]   c                     g | ]}d | S rU  r]   r   s     r&   r   z1TestSpline1D.test_param_names.<locals>.<listcomp>  rV  r(   r  c                     g | ]}d | S rZ  r]   r   s     r&   r   z1TestSpline1D.test_param_names.<locals>.<listcomp>  r[  r(   r   )r   rc   rA   rd   )r1   rX   rg   rh   rc   s        r&   ri   zTestSpline1D.test_param_names  s    jj"$$$$ 98eBii888
::b		::: ;.rll%"4"4444444r(   c                    t                      }|j        J |j        g dk                                    sJ d}t	          j        t          |          5  t          j                    |_        d d d            n# 1 swxY w Y   t          d          }t          j
        d          }d|dd <   |j        |k                                    sJ |j        |k                                    sJ t          j        d          dz   |_        |j        t          j        d          dz   k                                    sJ |j        t          j        d          dz   k                                    sJ |j        |k                                    sJ d	}t          d
          D ]U}|dk    r	t	          j        t          |          5  t          j        |          |_        d d d            n# 1 swxY w Y   Vd S )Nr   r   r   r   r   r   r   r   z=The model parameters must be initialized before setting knotsrI   r   r  r   r  r9  z9There must be exactly as many knots as previously defined   )r   rK   r   r   rU   rV   rW   r!   r"   r   r  r  rA   )r1   rX   rZ   r   r   s        r&   test_tzTestSpline1D.test_t  sO   jjv~~~11116688888R]:W555 	# 	#LNNCE	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# rllHRLL"##!  """""
!!!!!	""29R==2-.3355555")B--",-2244444
!!!!!N99 	' 	'Cbyyz999 ' '	#' ' ' ' ' ' ' ' ' ' ' ' ' ' '	' 	's$   A;;A?A?G,,G0	3G0	c                 *   t                      }|j        J |j        g dk                                    sJ d}t	          j        t          |          5  t          j                    |_        d d d            n# 1 swxY w Y   t          d          }|j        t          j
        d          k                                    sJ |j        t          j
        d          k                                    sJ t          j        d          dz   |_        |j        t          j        d          dz   k                                    sJ |j        t          j        d          dz   k                                    sJ |j        t          j
        d          k                                    sJ d}t          d          D ]U}|dk    r	t	          j        t          |          5  t          j        |          |_        d d d            n# 1 swxY w Y   Vd S )	Nr   r   r   r   r   r   r   r   z>The model parameters must be initialized before setting coeffsrI   r   r  r9  z:There must be exactly as many coeffs as previously definedrb  )r   rL   r*  r   rU   rV   rW   r!   r"   r   r  r  rA   )r1   rX   rZ   r   s       r&   test_czTestSpline1D.test_c  sP   jjv~~~11116688888S]:W555 	# 	#LNNCE	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# rll"(2,,&++-----"%**,,,,,	""29R==2-.3355555")B--",-2244444"%**,,,,,O99 	' 	'Cbyyz999 ' '	#' ' ' ' ' ' ' ' ' ' ' ' ' ' '	' 	's$   A;;A?A?!HH	H	c                     t                      }|j        dk    sJ |j        dk    sJ t          d          }|j        dk    sJ |j        dk    sJ d S )Nr   r   r   )r   rN   rE   rl   s     r&   test_degreezTestSpline1D.test_degree  se    jj{azQ a   {azQr(   c                 p    t                      }|j        du sJ t          dd          }|j        du sJ d S )NFr   r   r:  T)r   _initializedrl   s     r&   test__initializedzTestSpline1D.test__initialized  sM    jj5(((( R***4''''''r(   c                    t                      }|j        g dk                                    sJ |j        g dk                                    sJ |j        dk    sJ |j        }|d         |j        k                                    sJ |d         |j        k                                    sJ |d         |j        k    sJ |j        J |j        J |j        dk    sJ |j	        dk    sJ t          j        g d          t          j                            d	           t          j                            d
          d}|f|_        |j        k                                    sJ |j        k                                    sJ |j        |k    sJ fd}|                     ||j        d|d           fd}|                     ||j	        d|d           t          dd          }t          j        d          ddd <   |j        k                                    sJ |j        t          j        d          k                                    sJ |j        dk    sJ |j        }|d         |j        k                                    sJ |d         |j        k                                    sJ |d         |j        k    sJ dt          j        d          z  dz   dt          j        d          z  dz   d}|f|_        |j        k                                    sJ |j        k                                    sJ |j        |k    sJ |j        }|d         |j        k                                    sJ |d         |j        k                                    sJ |d         |j        k    sJ d}t#          j        t&          |          5  df|_        d d d            d S # 1 swxY w Y   d S )Nra  re  r   r   r   r   r]   r   r   r   r   r   r   r   r   r   r   r   r   k     c                     |          S r.   r]   r  s    r&   r  z%TestSpline1D.test_tck.<locals>.value08  r  r(   r  Tc                     |          S r.   r]   r)  s    r&   r  z%TestSpline1D.test_tck.<locals>.value1=  r  r(   r  Fr   r:     r   r   r?  r>     ztck has incompatible degree!rI   r   )r   r   r   r*  rE   tckrK   rL   re   rf   r   arrayr   r   r   r  r  rU   rV   rW   )	r1   rX   rt  kr  r  rZ   r*  r   s	          @@r&   test_tckzTestSpline1D.test_tck  st   jj1111668888811116688888zQgA#%$$&&&&&A#%$$&&&&&1v####v~~~v~~~"$$$$2%%%%H999::
	sIR  a)!  """""!  """""zQ	 	 	 	 	 	c3?FFDIII	 	 	 	 	 	c3#3WfeLLL R***HRLL"##
!!!!!"%**,,,,,zQgA#%$$&&&&&A#%$$&&&&&1v####	""	""a)
!!!!!
!!!!!zQgA#%$$&&&&&A#%$$&&&&&1v#### 2]:W555 	  	 !QiCG	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	 s   O22O69O6c                    ddl m} t                      }|j        }t	          ||          sJ |j        d         |j        d         k                                    sJ |j        d         |j        d         k                                    sJ |j        d         |j        d         k    sJ t          j        g d          t          j	        
                    d           t          j	        	                    d          d}fd	}fd
}t                      }|j        J |j        J |j        dk    sJ |j        dk    sJ  ||          }||_        |j        k                                    sJ |j        k                                    sJ |j        |k    sJ |                     ||j        d|d           |                     ||j        d|d           t                      }|j        J |j        J |j        dk    sJ |j        dk    sJ |f|_        |j        k                                    sJ |j        k                                    sJ |j        |k    sJ |                     ||j        d|d           |                     ||j        d|d           t          dd          }|j        }t	          ||          sJ |j        d         |j        d         k                                    sJ |j        d         |j        d         k                                    sJ |j        d         |j        d         k    sJ d S )Nr   )BSpliner   r   rm  rn  ro  r   c                     |          S r.   r]   r  s    r&   r  z)TestSpline1D.test_bspline.<locals>.value0q  r  r(   c                     |          S r.   r]   r)  s    r&   r  z)TestSpline1D.test_bspline.<locals>.value1t  r  r(   r]   r  Tr  Fr   r:  )scipy.interpolatery  r   bspliner   rt  r   r   ru  r   r   rK   rL   re   rf   rE   r   )	r1   ry  rX   r}  rv  r  r  r*  r   s	          @@r&   test_bsplinezTestSpline1D.test_bspline`  s   ------ jj+'7+++++A#'!*,1133333A#'!*,1133333{1~++++H999::
	sIR  	 	 	 	 		 	 	 	 	 jjv~~~v~~~"$$$$2%%%%'!Q""!  """""!  """""zQc3?FFDIIIc3#3WfeLLL jjv~~~v~~~"$$$$2%%%%!Qi!  """""!  """""zQc3?FFDIIIc3#3WfeLLL R***+'7+++++A#'!*,1133333A#'!*,1133333{1~++++++r(   c                 .   t                      }|j        g k    sJ t          d          }|j        }t          |          dk    sJ |D ]K}t          |t                    sJ t          ||j                  sJ t          ||j                  |k    sJ Ld S Nr   r  )r   r7   r   r   r
   rP   r   ry   )r1   rX   r7   r  s       r&   
test_knotszTestSpline1D.test_knots  s    jjyB rll	5zzR 	3 	3DdI.....3	*****3	**d22222	3 	3r(   c                 .   t                      }|j        g k    sJ t          d          }|j        }t          |          dk    sJ |D ]K}t          |t                    sJ t          ||j                  sJ t          ||j                  |k    sJ Ld S r  )r   r8   r   r   r
   rP   r   ry   )r1   rX   r8   r  s       r&   test_coeffszTestSpline1D.test_coeffs  s    jjzR rll6{{b     	5 	5EeY/////3
+++++3
++u44444	5 	5r(   c                 >   t                      }t          j                            t           dd          5 }|                                 |j        t          j        |ddd          t          j        |dd          gk    sJ 	 d d d            d S # 1 swxY w Y   d S )	Nr   TrG   r  r   )r   r  r*  )r   r!   rQ   rR   r0   rS   rT   )r1   rX   r   s      r&   r   z"TestSpline1D.test__init_parameters  s    jjX__X';d_KK 	x  """*VS555Wc**/     	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   ABBBc                    t                      }|                                \  }}}|du sJ |g dk                                    sJ |g dk                                    sJ |j        J |                    d          \  }}}|du sJ |g dk                                    sJ |g dk                                    sJ |j        dk    sJ d S )NFr   r   r   r   )r   r   r   r   )r   T)r  r  r  r  )r   r   r   r   )r   _init_boundsr   _user_bounding_box)r1   rX   
has_boundsloweruppers        r&   test__init_boundszTestSpline1D.test__init_bounds  s   jj#&#3#3#5#5 
E5U""""%**,,,,,%**,,,,,%---#&#3#3G#<#< 
E5T!!!!))))..00000%**,,,,,%000000r(   c           	         t           j                            d           t           j                            d          }t           j                            d          }t          j                            t          dt          j                  5 }t                      }|j        J |	                    dt          j
                    ||           t          j        |t          j        d          |f          }|j        |k                                    sJ |j        t          j                    gk    sJ 	 d d d            n# 1 swxY w Y   t          j                            t          dt          j                  5 }t           j                            d          }t                      }|j        J |	                    |d||           t          j        |||f          }|j        |k                                    sJ |j        t          j                    gk    sJ 	 d d d            n# 1 swxY w Y   t          j                            t          dt          j                  5 }t           j                            d          }t                      }|j        J |	                    |d||           |j        |k                                    sJ |j        t          j                    gk    sJ d}t!          d	          D ]}t           j                            |          }t                      }|j        J t#          j        t&          |
          5  |	                    |d||           d d d            n# 1 swxY w Y   	 d d d            n# 1 swxY w Y   t                      }|j        J d}t#          j        t&          |
          5  |	                    dd||           d d d            d S # 1 swxY w Y   d S )Nr@  r   r}  new_callabler   TFr-  r.  rI   z$Knots: 0.5 must be iterable or valueg      ?)r   r   r   r!   rQ   rR   r   PropertyMockrK   _init_knotsr"   concatenater  r   rS   rT   rA   rU   rV   rW   )	r1   r  r  	mkBsplinerX   r   r7   rZ   nums	            r&   test__init_knotszTestSpline1D.test__init_knots  s   
	r	  ##	  ## X__ibo  
 
 	;**C6>>>OOBu===rx||U;<<AFaK$$&&&&&+		{:::::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; X__ibo  
 
 		;I$$R((E**C6>>>OOE4666ue455AFaK$$&&&&&+		{:::::		; 		; 		; 		; 		; 		; 		; 		; 		; 		; 		; 		; 		; 		; 		; X__ibo  
 
 	@I$$R((E**C6>>>OOE5%777FeO((*****+		{:::: 4GQxx @ @	((--jjv~~~]:W=== @ @OOE5%???@ @ @ @ @ @ @ @ @ @ @ @ @ @ @	@	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@( jjv~~~9]:W555 	6 	6OOCu555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6so   B(EEE B$H11H58H5-C1NN7NNN
NNN #N PPPc                 h   t           j                            d           t          j                            t          dt          j                  5 }t                      }|j        J g d|_	        |
                                 |j        g dk                                    sJ |j        t          j                    gk    sJ 	 d d d            n# 1 swxY w Y   t          j                            t          dt          j                  5 }t           j                            d          }t                      }|j        J |
                    |           |j        |k                                    sJ |j        t          j                    gk    sJ 	 d d d            d S # 1 swxY w Y   d S )Ni  r}  r  )r   r   r   r   r  r   )r   r   r   r!   rQ   rR   r   r  rL   rK   _init_coeffsr   rS   rT   )r1   r  rX   r8   s       r&   test__init_coeffszTestSpline1D.test__init_coeffs	  s   
	sX__ibo  
 
 	;**C6>>>!\\CFFlll*//11111+		{:::::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; X__ibo  
 
 	;Y%%b))F**C6>>>V$$$Ff$))++++++		{:::::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s&   A5CCCB
F''F+.F+c                 >   t                      }t          j                    }t          j                    }t          j                    }t          j                    }t          j                    }t          j                    }t          j                            t           dd|||f          5 }t          j                            t           dd          5 }	t          j                            t           dd          5 }
t          j                    }|                    |d           |                    |	d           |                    |
d	           |                    |||           |j        t          j        	                    ||          t          j        
                    |||||          t          j                            ||          gk    sJ 	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )
Nr  Tr   r  rG   r  r5   r7   r8   )r   r!   r"   rQ   rR   r   r6   r   rT   r5   r7   r8   )r1   rX   r7   r8   r5   r  r  r  mkBoundsmkKnotsmkCoeffsr   s               r&   r   zTestSpline1D.test__init_data!  s   jj\^^
X__$eU3	  
 
 	
 =4HH GX__nt %   <>>D$$Xx888$$Wg666$$Xx888NN5&&999?sF33c5*eUKKsF33/                                 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s[   ,(H(G:<CG#G:#G''G:*G'+G:.H:G>	>HG>	HHHc                     t                      }t          d t          d          D                       }d t          d          D             }d t          d          D             }t          j                            t          dd|          5 }t          j                            t           dt          j        	          5 }|j        j         |j	        |i |k    sJ |j        j
        t          j        |d
         fi |gk    sJ |j
        t          j                    gk    sJ |j
        t          j        |g|R i |gk    sJ 	 d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d}t          dd          D ]}t          j                            t          ddd|i          5  t          j        t          |          5   |j	        |i | d d d            n# 1 swxY w Y   d d d            n# 1 swxY w Y   d S )Nc              3   <   K   | ]}t          j                    V  d S r.   r    r_   s     r&   ra   z-TestSpline1D.test_evaluate.<locals>.<genexpr>C  r   r(   r   c                 <    i | ]}d | t          j                    S r   r    r   s     r&   r'   z.TestSpline1D.test_evaluate.<locals>.<dictcomp>D  r   r(   c                 <    i | ]}d | t          j                    S r   r    r   s     r&   r'   z.TestSpline1D.test_evaluate.<locals>.<dictcomp>E  r   r(   r   Tr   r}  r  r   z3Cannot evaluate a derivative of order higher than 4r   r.  nurI   )r   rd   rA   r!   rQ   rR   r   r  r   r   rS   rT   rU   rV   r   )	r1   rX   r   r   r   mkEvalr  rZ   r   s	            r&   r   zTestSpline1D.test_evaluate@  s_   jj66U1XX66666CC%((CCCKK%((KKK
X__Z$Z  
 
 	P)"/ !   
P -:lcl?#? ?     !-<GDG22z22A     !/BGII;>>>>,1Nt1N1N1Nv1N1N0OOOOOO
P 
P 
P 
P 
P 
P 
P 
P 
P 
P 
P 
P 
P 
P 
P	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P  IA;; 	2 	2Cd$ !   2 2 ]<w??? 2 2 CL$1&1112 2 2 2 2 2 2 2 2 2 2 2 2 2 22 2 2 2 2 2 2 2 2 2 2 2 2 2 2	2 	2sm   2E,BE	E,E	E,E	E,,E03E05HG+H+G//H2G/3HH		H	c           	           fd} fd}t          |dz             D ]]}d| }                     d|||d           t          j                  |dz   z
  |z   }d| }                     d|||d           ^fd}t          j                  t          j                  k    sJ t          j                  D ]*\  }}|d| k    sJ                      d|||d           +d S )Nc                     j         d         S r  r   r   r1   s    r&   r  z0TestSpline1D.check_knots_created.<locals>.value0`  s    6!9r(   c                     j         d         S r   r  r  s    r&   r  z0TestSpline1D.check_knots_created.<locals>.value1c  s    6":r(   r   r  Tc                     j         |          S r.   r   r   rX   s    r&   r6  z0TestSpline1D.check_knots_created.<locals>.value3n      5:r(   )rA   r   r   r   re   r   )	r1   rX   rv  r  r  r   r   r   r6  s	   ``       r&   check_knots_createdz TestSpline1D.check_knots_created_  sd   	 	 	 	 		 	 	 	 	 Q<< 	I 	IC#<<D  fdCFFFJJ!a%(3.E!%>>D  fdE64HHHH	 	 	 	 	 3?##s35zz1111"3?33 	G 	GIC<#<<''''  fdCFFFF	G 	Gr(   c           	          fd}t          j                  t          j                  k    sJ t          j                  D ]*\  }}|d| k    sJ |                     d|||d           +d S )Nc                     j         |          S r.   )r*  r  s    r&   r   z0TestSpline1D.check_coeffs_created.<locals>.valuew  r  r(   r  F)r   rf   r*  r   r   )r1   rX   r   r   r   s    `   r&   check_coeffs_createdz!TestSpline1D.check_coeffs_createdv  s    	 	 	 	 	 3#$$CE

2222"3#344 	H 	HIC=3==((((  gtS%GGGG	H 	Hr(   c                     |
| j         J nt          | j         |           |
| j        J nt          | j        |           | j        |k    sJ | j        J dS )zCheck the base spline formN)rK   r   rL   rE   _bounding_box)rX   r   r*  rv  s       r&   check_base_splinezTestSpline1D.check_base_spline  sp     96>>>>CFA&&&96>>>>CFA&&&zQ (((((r(   c                    t          |j        |j        d                    t          |j        |j        d                    t          |j        d         j        d         |j        d                    t          |j        d         j        d         |j        d                    t          |j                  t          |j                  t          |j                  z   k    sJ t          |j        dt          |j                           |j                   t          |j        t          |j                  d         |j                   t          |j                  t          |j                  t          |j                  z   k    sJ t          |j        dt          |j                           |j                   t          |j        t          |j                  d         |j                   t          |                                |j        d                    t           || j	                   || j	                             t           || j	                   |j        d         | j	                             t           || j	                  | j
        |           t           || j	                  | j        |           dS )zCheck the spline fitr   r   splineNresidatol)r   r   
_eval_argsr*  fit_infor   _parametersr   get_residualr   r   r   )r1   fit_splr  fitteratol_fit
atol_truths         r&   check_spline_fitzTestSpline1D.check_spline_fit  sI   	6#4Q#7888	6#4Q#78881<Q?ARSTAUVVV1<Q?ARSTAUVVV 7&''3wy>>C	NN+JJJJJ+,<c')nn,<=wyIII+C	NN,<,<=wyIII 7%&&#gi..3wy>>*IIIII*+;S^^+;<giHHH*3wy>>+;+;<giHHH++--vw/GHHH888)B)B46)J)JKKKh????*EEEEEEr(   c                    | j         d         | j         d         g} ||| j         | j        f||d|}|j        t          |          k    sJ t	          |j        |j                   t	          |j        |j                   dS )z%Check the spline fit with bbox optionr   r   )weightsbboxN)r   r   bounding_boxrd   r   r   r*  )r1   rX   r  r  wr   r  bbox_spls           r&   
check_bboxzTestSpline1D.check_bbox  s    q	46":&6#tvtvNqtNNvNN$d3333	8:...	8:.....r(   c                     t          ||          }t          j        t                    5   ||| j        | j        fd|i| ddd           dS # 1 swxY w Y   dS )z&Check that the knots warning is raisedr:  r  N)r   rU   warnsr   r   r   )r1   r  r7   rv  r  r   rX   s          r&   check_knots_warningz TestSpline1D.check_knots_warning  s    U1---\,-- 	= 	=F3<<<V<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s   AAAr  rv  c                    t                      }|j        d d dk    sJ t          |          }|                     |d d |            ||| j        | j        |          }|                     |d d |           t          |j                  t          | j                  |z   dz   cxk    rt          |j                  k    sn J | 	                    ||           | 
                    |           |j        J ddlm}m}  || j        | j        ||          }t          |j        d         |          sJ |                                dk    sJ |                     |||dd           |                     ||||           t'          j        | j        d         | j        d	         t          | j                  |z   dz             }	|                     ||	||           d S )
Nr  r  r   r  r   r   )InterpolatedUnivariateSplineUnivariateSpliner  rv  r  r   )r   r  r   r  r   r   r   r   re   r  r  r  r|  r  r  r   r  r  r  r   r   r  )
r1   r  rv  r  rX   r  r  r  r  r7   s
             r&   test_interpolate_fitterz$TestSpline1D.test_interpolate_fitter  s     )**DD"A"AAAAAa   sD$222&dfdfa888sD$22279~~#df++/A"5RRRR#g>Q:R:RRRRRRR  !,,,!!'***$,,,TTTTTTTT--dfdfQGGG&/(35EFFFFF""$$))))gvvq!<<<Wfa000DF1Itvbz3tv;;?Q3FGG  155555r(   sc                    t                      }|j        d d dk    sJ t          |          }|                     |d d |            ||| j        | j        ||          }|                     |d d |           |                     ||           |                     |           |j        J ddl	m
}  || j        | j        |||          }t          |j        d         |          sJ |                     |||dd           |                     |||||	           |j                                        }	|                     ||	|||	           d S )
Nr  r   r  r  r   )r  )r  rv  r  r  r   r  )r   r  r   r  r   r   r  r  r  r|  r  r   r  r  r   r   r  )
r1   r  rv  r  r  rX   r  r  r  r7   s
             r&   test_smoothing_fitterz"TestSpline1D.test_smoothing_fitter  s    '((DD"A"AAAAAa   sD$222&dfdf1===sD$222  !,,,!!'***$,,,666666!!$&$&Aa@@@&/(35EFFFFFgvvq!<<<Wfa1555 	    1 :::::r(   c                 *   t                      }|j        d d dk    sJ g d}t          j        | j        d         g|dz   z  || j        d         g|dz   z  f          }t          j        t          |                    }t          ||| j        d         | j        d         g          }|                     ||||           |j	        |k    
                                sJ  ||| j        | j        |          }|                     ||||           |j	        |k    
                                sJ t          |j                  t          |          cxk    rt          |j                  k    sn J |                     ||           |                     |           |j        J ddlm}	m}
  |	| j        | j        |||	          }t)          |j        d
         |
          sJ t+          |                                dd           t+          |j        d
                                         dd           |                     |||dd           |                     ||||           t3          j        t6                    5   ||| j        | j        ||           d d d            n# 1 swxY w Y   t          |          }d}t3          j        t:          |          5   ||| j        | j        |           d d d            d S # 1 swxY w Y   d S )Nr  r   r   r   r   r7   rE   r5   r  )LSQUnivariateSpliner  r  r  r   r  r   r  r   zNo knots have been providedrI   )r   r  r   r  r   r  r   r   r  
t_interiorr   r   r   re   r  r  r  r|  r  r  r   r   r  r  r  rU   r  r   rV   r   )r1   r  rv  r  r7   r   r*  rX   r  r  r  r  rZ   s                r&   test_exact_knots_fitterz$TestSpline1D.test_exact_knots_fitter  s    ())DD"A"AAAAA

NTVAYK1q51546":,!a%:PQRRHSVV U1dfQi5LMMMsAq!,,,%',,.....&dfdfa888sAq!,,,%',,.....79~~QCCCC3w/B+C+CCCCCCC  !,,,!!'***$,,,KKKKKKKK$$TVTVUa1EEE&/(35EFFFFF++--s;;;;1>>@@#ANNNNgvvq!<<<Wfa000 \,-- 	< 	<F3%;;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< a   0]<w777 	3 	3F32222	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s$   J))J-0J-!LLLc                    t                      }|j        d d d dk    sJ t          |          }|                     |d d |            ||| j        | j        ||          }|                     |d d |           |                     ||           |                     |           |j        J ddl	m
}m}  || j        | j        |||d          \  }	}
}}t          |j        |	d                    t          |j        |	d                    |j        d         |
k    sJ |j        d	         |k    sJ |j        d
         |k    sJ  ||	 }t           || j                   || j                             t           || j                  | j        d           t           || j                  | j        d           |                     |||||           d S )Nfpiermsgr   r  r   ry  splrepr   )r  rv  r  full_outputr  r  r  r  r  )r	   r  r   r  r   r   r  r  r  r|  ry  r  r   r   r*  r   r  )r1   r  rv  r  r  rX   r  ry  r  rt  	spline_fp
spline_ier
spline_msgr  s                 r&   test_splrep_fitter_no_knotsz(TestSpline1D.test_splrep_fitter_no_knots  s    $%%d4"H"HHHHHa   sD$222&dfdf1===sD$222  !,,,!!'***$,,,5555555517FDFa1q2
 2
 2
.Y
J 		3q6***	3q6***t$	1111u%3333u%3333#888a8888!<<<<Wfa155555r(   c                    t                      }|j        d d d dk    sJ g d}t          j        | j        d         g|dz   z  || j        d         g|dz   z  f          }t          j        t          |                    }t          ||| j        d         | j        d         g          }|                     ||||           |j	        |k    
                                sJ  ||| j        | j        |          }|                     ||||           |j	        |k    
                                sJ |                     ||           |                     |           |j        J ddlm}	m}
  |
| j        | j        |||d	          \  }}}}t%          |j        |d                    t%          |j        |d                    |j        d
         |k    sJ |j        d         |k    sJ |j        d         |k    sJ  |	| }t%           || j                   || j                             t%           || j                  | j        d           t%           || j                  | j        d           |                     ||||           t/          j        t2                    5   ||| j        | j        ||           d d d            n# 1 swxY w Y   t          |          }|                     |d d |            ||| j        | j        ||          }|                     |d d |           |                     ||           |                     |           |j        J ddlm}	m}
  |
| j        | j        |||          }t%          |j        |d                    t%          |j        |d                     |	| }t%           || j                   || j                             t%           || j                  | j        d           t%           || j                  | j        d           |                     |||||           d S )Nr  r   r   r   r   r  r  r  )r  rv  r   r  r  r  r  r  r  r   )r  rv  r   r  )r	   r  r   r  r   r  r   r   r  r  r   r   r  r  r  r|  ry  r  r   r   r*  r   r  rU   r  r   )r1   r  rv  r  r7   r   r*  rX   r  ry  r  rt  r  r  r  r  s                   r&   test_splrep_fitter_with_knotsz*TestSpline1D.test_splrep_fitter_with_knotsA  s    $%%d4"H"HHHHH

NTVAYK1q51546":,!a%:PQRRHSVV U1dfQi5LMMMsAq!,,,%',,.....&dfdfa888sAq!,,,%',,.....  !,,,!!'***$,,,5555555517FDFa112
 2
 2
.Y
J 		3q6***	3q6***t$	1111u%3333u%3333#888a8888!<<<<Wfa000 \,-- 	< 	<F3%;;;;	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< a   sD$222&dfdfqAAAsD$222  !,,,!!'***$,,,55555555fTVTVqA777	3q6***	3q6***#888a8888!<<<<Wfa599999s   (KKKNr   c           
      v    |d}ddl m}m}  || j        | j        ||d         |d         |||          } || S )Nr   r   r  r   )r  xbxerv  r  r   )r|  ry  r  r   r   )	r1   r  r  rv  r  r   ry  r  rt  s	            r&   generate_splinezTestSpline1D.generate_spline  s\    9A55555555fTVTVqT!WaAaPPPw}r(   c                    |                                  }t                      }||_        t          |j        |j                   t          |j        |j                   |j        |j        k    sJ |                    d          }t           || j	                   || j	        d                     t           || j	        d           || j	        d                     t           || j	        d           || j	        d                     t           || j	        d           || j	        d                     |                                }t          |j        |j                   t          |j        |j                   |j        |j        cxk    rdk    sn J t          |
                    | j	                  |
                    | j	        d                     t          |
                    | j	        d          |
                    | j	        d                     t          |
                    | j	        d          |
                    | j	        d                     t          |
                    | j	        d          |
                    | j	        d                     |                    d          }t           || j	                   || j	        d                     t           || j	        d           || j	        d                     t           || j	        d           || j	        d                     |                    d          }t          |j        |j                   t          |j        |j                   |j        |j        cxk    rdk    sn J t          |
                    | j	                  |
                    | j	        d                     t          |
                    | j	        d          |
                    | j	        d                     t          |
                    | j	        d          |
                    | j	        d                     |                    d          }t           || j	                   || j	        d                     t           || j	        d           || j	        d                     |                    d          }t          |j        |j                   t          |j        |j                   |j        |j        cxk    rdk    sn J t          |
                    | j	                  |
                    | j	        d                     t          |
                    | j	        d          |
                    | j	        d                     d}t          dd          D ]K}t          j        t          |	          5  |                    |           d d d            n# 1 swxY w Y   Ld S )
Nr   r  r   r   r   r   zMust have nu <= 3	   rI   )r  r   r}  r   r   r*  rE   rv  
derivativer   r   rA   rU   rV   rW   )r1   r}  rX   	d_bsplinederrZ   r  s          r&   test_derivativezTestSpline1D.test_derivative  s   &&((jjwy)))wy)))zWY&&&& &&!&,,			$'**GGDG,B,B,BCCC		$'a000''$'a2H2H2HIII		$'a000''$'a2H2H2HIII		$'a000''$'a2H2H2HIIInny{+++y{+++zY[----A------TW--s||DG|/J/JKKKTW33S\\$'a\5P5PQQQTW33S\\$'a\5P5PQQQTW33S\\$'a\5P5PQQQ &&!&,,			$'**GGDG,B,B,BCCC		$'a000''$'a2H2H2HIII		$'a000''$'a2H2H2HIIInnn""y{+++y{+++zY[----A------TW--s||DG|/J/JKKKTW33S\\$'a\5P5PQQQTW33S\\$'a\5P5PQQQ &&!&,,			$'**GGDG,B,B,BCCC		$'a000''$'a2H2H2HIIInnn""y{+++y{+++zY[----A------TW--s||DG|/J/JKKKTW33S\\$'a\5P5PQQQ '1++ 	& 	&Bz999 & &"%%%& & & & & & & & & & & & & & &	& 	&s   X99X=	 X=	c                    |                                  }t                      }||_        |                    d          }t	           || j                   || j        d                     t	           || j        d           || j        d                     t	           || j        d           || j        d                     t	           || j        d           || j        d                     t	           || j        d           || j        d                     |                                }t	          |j        |j                   t	          |j        |j                   |j        |j	        cxk    rdk    sn J t	          |
                    | j                  |
                    | j        d                     t	          |
                    | j        d          |
                    | j        d                     t	          |
                    | j        d          |
                    | j        d                     t	          |
                    | j        d          |
                    | j        d                     t	          |
                    | j        d          |
                    | j        d                     |                    d          }t	           || j                   || j        d                     t	           || j        d           || j        d                     t	           || j        d           || j        d                     t	           || j        d           || j        d                     t	           || j        d           || j        d                     |                    d          }t	          |j        |j                   t	          |j        |j                   |j        |j	        cxk    rdk    sn J t	          |
                    | j                  |
                    | j        d                     t	          |
                    | j        d          |
                    | j        d                     t	          |
                    | j        d          |
                    | j        d                     t	          |
                    | j        d          |
                    | j        d                     t	          |
                    | j        d          |
                    | j        d                     t          dd          D ]S}d	|dz    }t          j        t          |
          5  |                    |           d d d            n# 1 swxY w Y   Td S )Nr   r  r   r   r   r   rO  r  zGSupported splines can have max degree 5, antiderivative degree will be rI   )r  r   r}  antiderivativer   r   r   r*  rE   rv  r   rA   rU   rV   rW   )r1   r}  rX   	a_bsplineantir  rZ   s          r&   test_antiderivativez TestSpline1D.test_antiderivative  s   &&((jj **a*00	(())DG*B*B*BCCCA...		$'a0H0H0HIIIA...		$'a0H0H0HIIIA...		$'a0H0H0HIIIA...		$'a0H0H0HIII!!##	,,,	,,,{ik....Q......TW--t}}TW}/K/KLLLTW33T]]47q]5Q5QRRRTW33T]]47q]5Q5QRRRTW33T]]47q]5Q5QRRRTW33T]]47q]5Q5QRRR **a*00	(())DG*B*B*BCCCA...		$'a0H0H0HIIIA...		$'a0H0H0HIIIA...		$'a0H0H0HIIIA...		$'a0H0H0HIII!!Q!''	,,,	,,,{ik....Q......TW--t}}TW}/K/KLLLTW33T]]47q]5Q5QRRRTW33T]]47q]5Q5QRRRTW33T]]47q]5Q5QRRRTW33T]]47q]5Q5QRRR 1++ 	* 	*B Av     z999 * *""b")))* * * * * * * * * * * * * * *	* 	*s   W66W:	=W:	c                    t                      } G d dt                    } |            }d}t          j        t          |          5   ||t          j                    t          j                    t          j                               d d d            n# 1 swxY w Y   d}t          j        t          |          5   |t          j                    t          j                    t          j                               d d d            n# 1 swxY w Y   d}t          j        t          |          5   ||t          j                    t          j                               d d d            d S # 1 swxY w Y   d S )Nc                        e Zd Z fdZ xZS );TestSpline1D.test__SplineFitter_error.<locals>.SplineFitterc                 @     t                      j        |||fi | d S r.   )r/   _fit_method)r1   r   r   r   r   r2   s        r&   r   zGTestSpline1D.test__SplineFitter_error.<locals>.SplineFitter._fit_method  s,    ##E1a::6:::::r(   )r9   r:   r;   r   r=   r>   s   @r&   SplineFitterr    s8        ; ; ; ; ; ; ; ; ;r(   r  z$1D model can only have 2 data pointsrI   z2Only spline models are compatible with this fitterz/This has not been implemented for _SplineFitter)	r   r   rU   rV   rW   r!   r"   r   r   )r1   rX   r  r  rZ   s        r&   test__SplineFitter_errorz%TestSpline1D.test__SplineFitter_error  s6   jj	; 	; 	; 	; 	;= 	; 	; 	; 9]:W555 	H 	HF3GGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H H]/w??? 	C 	CF2<>>2<>>2<>>BBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C E].g>>> 	8 	8F3777	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s8   	ABBB?ADDD40E11E58E5)6r9   r:   r;   rC   r   r   r   r  r  r  r%  r+  r/  r7  rR  rW  r\  ri   rc  rf  rh  rk  rw  r~  r  r  r   r  r  r  r   r   r  r  staticmethodr  r  r  r  rU   markparametrizewieght_testsdegree_testsr  smoothing_testsr  r  r  r  r  r  r  r  r]   r(   r&   r   r   O  s\       2 2 2&$ $ $J J J( ( (
* 
* 
*!M !M !MFM M M< M  M  MDM M M>  &*& *& *&X_' _' _'B	4 	4 	4	6 	6 	65 5 5' ' '>' ' ':  ( ( (?  ?  ? B9, 9, 9,v3 3 35 5 5  1 1 156 56 56n; ; ;0  >2 2 2>G G G.H H H ) ) \)F F F2/ / /= = = [S,//[S,//6 6 0/ 0/66 [S,//[S,//[S/22; ; 32 0/ 0/;4 [S,//[S,//(3 (3 0/ 0/(3T [S,//[S,//[S/22 6  6 32 0/ 0/ 6D [S,//[S,//D: D: 0/ 0/D:L !%D6A:    7& 7& 7&r1* 1* 1*f8 8 8 8 8r(   r   )+__doc__unittest.mockmockr!   numpyr   rU   numpy.testingr   astropy.modeling.corer   r   astropy.modeling.fittingr   r   r   r	   astropy.modeling.parametersr
   astropy.modeling.spliner   r   r   "astropy.utils.compat.optional_depsr   astropy.utils.exceptionsr   r   r   r   r   randtest_wrc  randnr   r  r  r  r   r  skipifr   r]   r(   r&   <module>r     s   * )            ) ) ) ) ) ) E E E E E E E E            2 1 1 1 1 1 D D D D D D D D D D 8 8 8 8 8 8 7 7 7 7 7 7		 	r   				
	f~,j  j  j  j  j  j  j  j Z	 	M*:;;B8 B8 B8 B8 B8 B8 B8 <;B8 B8 B8r(   