
    tKgp                    @   d dl Z d dlZd dlZd dlZd dlmZmZmZ d dl	m
Z d dl	Z	d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z! d dl"m#c m Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,c m-Z. d dl/m0Z0 d dl1m2Z2 d dlm3Z4 d d	lm5Z6  G d
 d      Z7 G d d      Z8d Z9d Z:d Z;d Z<d Z=d Z>d-dZ?d.dZ@d ZA G d d      ZB G d d      ZCd ZDd/dZE G d d      ZFd ZG G d  d!      ZHd" ZId# ZJd$ ZK G d% d&      ZL G d' d(      ZM G d) d*      ZN G d+ d,      ZOy)0    N)assert_equalassert_allcloseassert_)raises)BSplineBPolyPPolymake_interp_splinemake_lsq_spline_bsplsplevsplrepsplprepsplder
splantidersprootsplintinsertCubicSpline	NdBSplinemake_smoothing_splineRegularGridInterpolator)_not_a_knot_augknt_woodbury_algorithm_periodic_knots_make_interp_per_full_matr)	AxisError)make_ndbspl)	_dfitpack)	_bsplinesc                   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ej@                  jC                  d e"dd            d         Z#d! Z$d" Z%ej@                  jC                  d#g d$      ej@                  jC                  d% e"d&            d'               Z&d( Z'd) Z(d* Z)ej@                  jC                  d+g d,      d-        Z*ej@                  jC                  d+g d,      d.        Z+d/ Z,d0 Z-y1)2TestBSplinec           
         t        t        t        ft        fi t	        ddgdgd       t        j                  d      5  t        t        t        fi t	        dt
        j                  gdgd       d d d        t        t        t        fi t	        dt
        j                  gdgd       t        t        t        fi t	        ddgdgd       t        t        t        fi t	        dgdggdgd       t        t        t        fi t	        g d	dgd       t        t        t        fi t	        g d
ddgd       t        t        t        fi t	        g dg dd       t        t        t        fi t	        g dg dd       t        t        t        fi t	        g dg dd       d\  }}t        j                  ||z   dz         }t
        j                  j                  |      }t        |||      }t        ||j                         t        ||j                         t        ||j                         y # 1 sw Y   xY w)N                 ?      ?r   tckignore)invalidr   r%      r   r%   r0         r0   )        r4   r'          @      @      @)r'   r'   r'   cubic      @)r4   r   r%   r%   r0   r2   )r'   r%   r%      r2   )assert_raises	TypeError
ValueErrorr   dictnperrstatenaninfarangerandomr   r)   r*   r   r+   )selfnr+   r)   r*   bs         i/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/scipy/interpolate/tests/test_bsplines.py	test_ctorzTestBSpline.test_ctor!   s   y*-w 	1!SbTQ/	1[[**gRBFFtq1QR +j'NTQKB41-MNj'JTQGtq-IJj'MTaS1#J2$!-LM 	j'KTI!-JKj' 	<RH:	< 	i 	O1\WM	Oi 	K1\SI	K 	j' 	B,
a@	B 1IIac!eIIQAq!133133Q; +*s   3H??I	c                 <   t               }|j                  }t        |j                  |d   dd       t        |j                  |d   dd       t        |j                  |d          t        j                  t              5  d|_        d d d        y # 1 sw Y   y xY w)Nr   V瞯<atolrtolr%   r0   foo)
_make_random_splinetckr   r)   r*   r   r+   pytestr   AttributeError)rF   rH   rR   s      rI   test_tckzTestBSpline.test_tckD   sr    !eeSV%e<SV%e<QSS#a&! ]]>*AE +**s   BBc                     t        j                  ddd      }t        ddgdgd      }t         ||      d       t        g dddgd      }t         ||      t        j                  |d	k  dd             y )
Nr   r%   
   r6   r(   r2   )r   ffffff?r%   r3   rX   )r@   linspacer   r   whererF   xxrH   s      rI   test_degree_0zTestBSpline.test_degree_0P   sg    [[Ar"q!f*"q!lq!f2"rxxT	1a89    c                 <   g d}g d}d}t        |||      }t        j                  ddd      }t        |d   t	        |      z  |d   t	        |dz
        z  z   |d   t	        |dz
        z  z    ||      d	       t        t        ||||f       ||      d	       y )
Nr1   r%   r0   r2   r%   r2   2   r   r0   +=rN   )r   r@   rY   r   B_012r   )rF   r)   r*   r+   rH   xs         rI   test_degree_1zTestBSpline.test_degree_1Y   s    Aq!KK1b!!U1X!U1Q3Z7!A$uQqSz/I!5	*a!Q+QqT>r^   c                    d}t        j                  dg|dz   z  dg|dz   z  z         }t        j                  g d      }t        |j                  dd      ddg      }t	        |||      }t        j
                  ddd      }t         ||d	
       ||d	
      d       t        t        ||||f       ||      d       y )Nr2   r   r%   r'   r5   r6   r7   r.   g      r5   rW   Textrapolaterb   rc   )r@   asarrayr   reshaper   rY   r   r   )rF   r+   r)   r*   bpbsplr\   s          rI   test_bernsteinzTestBSpline.test_bernsteind   s    JJsAaCyA3!9,-JJ'(199R#aV,q!Q[[b"%240RT2	@b1a),Ru	.r^   c           	      B   t               }|j                  \  }}}t        j                  ||   || dz
     d      } ||      }|D cg c]  }t	        ||||       }}t        ||d       |D cg c]  }t        ||||       }	}t        ||	d       y c c}w c c}w Nr%   ra   rb   rc   )rQ   rR   r@   rY   _naive_evalr   _naive_eval_2)
rF   rH   r)   r*   r+   r\   y_bre   y_ny_n2s
             rI   test_rndm_naive_evalz TestBSpline.test_rndm_naive_evalr   s      !%%1a[[1q!Aw+e0231{1aA&3Su-3562aaAq)26T.	 4 7s   B1Bc           	          t               }|j                  \  }}}t        j                  ||   || dz
     d      }t	         ||      t        ||||f      d       y rq   rQ   rR   r@   rY   r   r   rF   rH   r)   r*   r+   r\   s         rI   test_rndm_splevzTestBSpline.test_rndm_splev   sV    !%%1a[[1q!Aw+"uR!Q3%@r^   c                    t         j                  j                  d       t        j                  t         j                  j                  d            }t         j                  j                  d      }t	        ||      }t        | }|j                  |j                  }}t        j                  ||   || dz
     d      }t         ||      t        ||      d       y )N     r%   P   rb   rc   )r@   rE   seedsortr   r   r)   r+   rY   r   r   )rF   re   yrR   rH   r)   r+   r\   s           rI   test_rndm_splrepzTestBSpline.test_rndm_splrep   s    
		tGGBII$$R()IIR QlSMssACC1[[1q!Aw+"uR~E:r^   c                    t               }t        j                  |j                        |_        t        j                  |j
                  |j                     |j
                  |j                   dz
     d      }t         ||      d       y )Nr%   d   r'   )rQ   r@   	ones_liker*   rY   r)   r+   r   )rF   rH   r\   s      rI   test_rndm_unityzTestBSpline.test_rndm_unity   s\    !ll133[[QSS133tAv;4"r"r^   c                 v   d\  }}t        j                  t         j                  j                  |            }t         j                  j                  |ddf      }t        |||      }||   || dz
     }}|||z
  t         j                  j                  d      z  z   }t	         ||      j
                  d       y )N   r2         sizer%   r2   r3      )r2   r3   r   r   r   )r@   r   rE   r   r   shape)	rF   rG   r+   r)   r*   rH   tmtpr\   s	            rI   test_vectorizationzTestBSpline.test_vectorization   s    1GGBII$$Q'(II1a),Aq!1q!AwB27bii..y999QrU[[/2r^   c           	      n   d\  }}t        j                  t         j                  j                  ||z   dz               }t         j                  j                  |      }t         j                  |t         j                  j                  |dz         f   }t	        |||      t	        |||      }}|d   |d   z
  }t        j
                  |d   |z
  |d   |z   d      }	t         ||	       ||	      d       t         ||	      t        |	|||f      d       t         ||	      t        |	|||f      d       y )N)!   r2   r%   r.   r   ra   rb   rc   )r@   r   rE   r_r   rY   r   r   )
rF   rG   r+   r)   r*   c_padrH   b_paddtr\   s
             rI   
test_len_czTestBSpline.test_len_c   s
    1GGBII$$QqSU+,IIQ a))!A#../1a#WQq%95rUQqT\[[1AbEBJ3"uRyu5"uR!Q3%@"uR!UA7eDr^   c           	          t               }|j                  \  }}}||   || dz
     }}dD ](  }t         |||g|       ||dz   |dz
  g|      d       * y )Nr%   )TF绽|=&.>rc   rQ   rR   r   )rF   rH   r)   _r+   r   r   extraps           rI   test_endpointszTestBSpline.test_endpoints   si    !%%1a1q!AwB#FAr2h/rEz2:6?dL $r^   c           	          t               }|j                  \  }}}t         |||dz   | dz
   dz
         |||dz   | dz
   dz         d       y )Nr%   r   r   rc   r   )rF   rH   r)   r   r+   s        rI   test_continuityzTestBSpline.test_continuity   s\    !%%1a!AaC1+-.!AaC1+2E0F	r^   c           	      P   t               }|j                  \  }}}|d   |d   z
  }t        j                  ||   |z
  || dz
     |z   d      }||   |k  ||| dz
     k  z  }t	         |||   d       |||   d             t	         ||d      t        ||||fd             y )	Nr.   r   r%   ra   Tri   F)extry   )rF   rH   r)   r*   r+   r   r\   masks           rI   test_extrapzTestBSpline.test_extrap   s    !%%1arUQqT\[[1AqbdGbL"5!r	b1aRT7l+ 	"T(5"T(6	8 	"$/b1a)+	-r^   c                     t               }|j                  \  }}}|d   dz
  |d   dz   g} ||      }t        t        j                  t        j
                  |                    y )Nr   r%   r.   )rQ   rR   r   r@   allisnan)rF   rH   r)   r   r+   r\   yys          rI   test_default_extrapzTestBSpline.test_default_extrap   sX    !%%1adQh"	"rUBFF288B<(()r^   c           	      l   t         j                  j                  d       t        j                  t         j                  j                  d            }t         j                  j                  d      }d}t	        |||d      }|j
                  |dz   z
  }|d   |d	   z
  }t        j                  ||   |z
  ||   |z   d
      }||   |||   z
  ||   ||   z
  z  z   }t         ||      t        ||||f             g d}||   |||   z
  ||   ||   z
  z  z   }t         ||d       ||d             y )Nr}      r3   r2   periodicri   r%   r.   r   ra   )r.   r         ?r%   T)
r@   rE   r   r   r   r   rY   r   r   r   )	rF   r)   r*   r+   rH   rG   r   r\   xys	            rI   test_periodic_extrapz TestBSpline.test_periodic_extrap   s%   
		tGGBII$$Q'(IIQAq!4FFa!erUQqT\[[1AaD2Ir2qTR!A$Y1Q4!A$;//"uR!Q34 qTR!A$Y1Q4!A$;//Qrz2Abd4KLr^   c                     t               }|j                  \  }}}t        j                  |||f      }t	        j
                  ||   ||    d      }t         ||       ||      dd       y )Nr   rb   rM   )rQ   rR   r	   from_spliner@   rY   r   )rF   rH   r)   r*   r+   ppr\   s          rI   
test_ppolyzTestBSpline.test_ppoly   sa    !%%1a1ay)[[1q!uc*"r"vE>r^   c                 D   t               }|j                  \  }}}t        j                  |d   |d   d      }t        j                  ||f   }t        d|dz         D ])  }t        ||||f|      }t        | |||      d       + t         |||dz         dd       y )	Nr   r.   ra   r%   dernurb   rc   )rQ   rR   r@   rY   r   ranger   r   )rF   rH   r)   r*   r+   r\   r   yds           rI   test_derivative_rndmz TestBSpline.test_derivative_rndm   s    !%%1a[[1qub)UU2q5\AaC=CrAq!9#.BB"E: !
 	"1qu5r^   c                 p   d}g d}t         j                  j                  d       t         j                  ddt         j                  j                  d      ddf   }t	        |||      }t        j
                  g d      }t         |||dk7     dz
         |||dk7     dz                t        t        j                   |d	       |d
                    t        j
                  ddg      }t         ||dz
  d       ||dz   d             t        j
                  ddg      }t        t        j                  t        j                   ||dz
  d       ||dz   d                          t        t        j                  t        j                   ||dz
  d       ||dz   d                          y )Nr0   )r.   r.   r   r%   r%   r2   r3   r   r   r   r   r   r}   r   r   )r%   r2   r3   r   r   r   g2H@gη   @r2   r3   r%   r   )
r@   rE   r   r   r   rk   r   r   allcloser   )rF   r+   r)   r*   rH   re   x0x1s           rI   test_derivative_jumpsz!TestBSpline.test_derivative_jumps  sz    2
		tEE!Q		((+Q12Aq! JJ|$!AF)e+,!AF)e+,	.BKK(QwZ889 ZZA"u*+"u*+	-ZZABFF2;;qe':'(e':< = = 	> 	BFF2;;qUq'9'(Uq'9; < < 	=r^   c           	         t        j                  ddd      }t        j                  g d      }t	         ||      t        ||j                  |j                  |j                  f      d       t	         ||      t        |      d       t        j                  g d      }t        j                  d	d
d      }t	         ||      t        j                  |dk  ||z  d|z
  d
z        d       y )Nr.   r3   r~   r   r%   r0   r2   )r)   rb   rc   r   r%   r%   r0   r   r0   rW   r%   r5   )r@   rY   r   basis_elementr   r   r)   r*   r+   B_0123rZ   r[   s      rI   test_basis_element_quadraticz(TestBSpline.test_basis_element_quadratic  s    [[Q#!!L1"b133QSS/2	@"r
	0 !!L1[[Ar""aBB
3%	Ar^   c           	          t               }|j                  \  }}}t        j                  ||   || dz
     d      }t	         ||      t        ||||      d       y )Nr%   r~   rb   rc   )rQ   rR   r@   rY   r   _sum_basis_elementsrz   s         rI   test_basis_element_rndmz#TestBSpline.test_basis_element_rndm*  sU    !%%1a[[1q!Aw+"22q!Q?eLr^   c                    t               }|j                  \  }}}|dz  }t        |||      }t        ||j                  j                  |      }t        ||j                  j
                  |      }t        j                  ||   || dz
     d      }t         ||      j                   ||      d       t         ||      j
                   ||      d       y )Ny      ?      @r%   r~   rb   rc   )	rQ   rR   r   r*   realimagr@   rY   r   )	rF   rH   r)   r*   r+   ccb_reb_imr\   s	            rI   
test_cmplxzTestBSpline.test_cmplx0  s    !%%1a(^Ar1q!##((A&q!##((A&[[1q!Aw+"

DH59"

DH59r^   c                     t        j                  g d      }t        t        j                   |t        j
                                     y )Nr   )r   r   r   r@   r   rB   rF   rH   s     rI   test_nanzTestBSpline.test_nan=  s+    !!,/266#$r^   c                    t        d      }|j                  \  }}}t        |||      }t        j                  ||   || dz
     d      }t        d|      D ].  }|j                         }t         |||       ||      dd       0 y )Nr   r+   r%   r~   -q=rM   )rQ   rR   r   r@   rY   r   
derivativer   )rF   rH   r)   r*   r+   b0r\   js           rI   test_derivative_methodz"TestBSpline.test_derivative_methodB  s|    !$%%1aQ1[[1q!Aw+q!AABr1Iqu5uE r^   c                    t               }|j                  \  }}}t        j                  ||   || dz
     d      }t	         |j                         j                         |       ||      dd       t        j                  |||f   }t        j                  ||f      }t        |||      }t	         |j                         j                         |       ||      dd       y )Nr%   r~   rb   rM   )
rQ   rR   r@   rY   r   antiderivativer   c_dstackr   rz   s         rI   test_antiderivative_methodz&TestBSpline.test_antiderivative_methodK  s    !%%1a[[1q!Aw+7((*557;"E	7 EE!Q'NIIq!fAq!7((*557;"E	7r^   c                 Z   t        j                  g d      }t        |j                  dd      d       t        |j                  dd      d       t        |j                  dd      d       t        |j                  dd      d       t        |j                  ddd      d       t        |j                  ddd	      d       t        |j                  ddd	      d       t        |j                  ddd	      t	        j
                  dd|j                               d
|_        |j                         } |d       |d      z
  }t        |j                  dd      |       t        |j                  dd      d|z         t        |j                  dd      |       t        |j                  dd      d|z         t        |j                  dd       |d       |d      z
         t        |j                  dd       |d       |d      z
   |d      z    |d      z
         t        |j                  dd       |d       |d      z
   |d      z    |d      z
         t        |j                  dd       |d       |d      z
   |d      z    |d      z
  d|z  z          t        |j                  dd       |d       |d      z
         t        |j                  dd       |d       |d      z
         t        |j                  dd       |d       |d      z
  d|z  z
         y )Nr/   r   r%   r         r.   Tri   Fr   r0   iii      ?r2   g      +@   r   ir3   )	r   r   r   	integrate_implr   rR   rj   r   )rF   rH   i
period_ints       rI   test_integralzTestBSpline.test_integralY  s   !!),Aq)3/Aq)84Aq)40 	B*A.Bt<a@Bu=sCAru=xH 	Aru=QAEE2	4 #qTAaD[
Aq):6Aq)2
?;B+Z8B+Q^<C-qv#?C+QqTAaD[1Q4-?!C&-HIHf5!qtad*QsV3	5C0!qtad*QsV3a*nD	F 	Ar*AaD1Q4K8B,adQqTk:Ar*AaD1Q4K!j.,HIr^   c                     g d}t        ||      }d|_        t        j                  |      }dD ]1  \  }}t	        |j                  ||      |j                  ||             3 y )Nr1   r   ))r   )r   r   )r      )r
   rj   r	   r   r   r   )rF   re   rH   pr   r   s         rI   test_integrate_ppolyz TestBSpline.test_integrate_ppoly~  s[    q!$"a 5FBAKKB/KKB/1 6r^   c                     G d dt               }|j                  g d      }t        |j                  |       t        |j	                         j                  |       t        |j                         j                  |       y )Nc                       e Zd Zy)'TestBSpline.test_subclassing.<locals>.BN)__name__
__module____qualname__ r^   rI   Br     s    r^   r   )r   r%   r0   r0   )r   r   r   	__class__r   r   )rF   r   rH   s      rI   test_subclassingzTestBSpline.test_subclassing  s[    	 	 OOL)Q[[!$Q\\^--q1Q%%'1115r^   axisr   r3   c                    d\  }}t        j                  dd||z   dz         }g d}|dz  }|j                  ||       t         j                  j                  |      }t	        ||||      }t        |j                  j                  ||   g|d | z   ||dz   d  z          t         j                  j                  d      }	t         ||	      j                  |d | t        |	j                        z   ||dz   d  z          |j                   dz
  |j                  fD ]$  }
t        t        t        fi t        ||||
	       & t	        ||||      j                         t	        ||||      j                  d
      t	        ||||      j                         t	        ||||      j                  d
      fD ]"  }t        |j                  |j                         $ y )Nr   r   r%   r   r   r   r3   r   r   r   )r)   r*   r+   r   r0   )r@   rY   r   rE   r   r   r*   r   listndimr<   r   r?   r   r   r   )rF   r   rG   r+   r)   shpos_axisr*   rH   xpaxb1s               rI   	test_axiszTestBSpline.test_axis  s   1KK1a!eai( !8
		(AII"%Aq!$'QSSYYl_r)8}4r(1*+F	H YYi(QrU[[	]T"((^3b!oE	G FF7Q;'B)W : 1QR8: (
 1a.99;1a.99!<1a.==?1a.==a@BB !&&)	Br^   c                     d}g d}t        j                  g dg dg      }t        |||d      }t        ||d   |      }t        ||d   |      }t         |d	       |d	       |d	      g       y )
Nr0   )r   r%   r0   r2   r3   r   r   )r.   r0   r   r.   )r0   r   r%   r.   r   r   r%   r9   )r@   arrayr   r   )rF   r+   r)   r*   splspl0spl1s          rI   test_neg_axiszTestBSpline.test_neg_axis  sn    !HHnm45aAB'q!A$"q!A$"SXS	4956r^   c                     d }d}d}dD ]  } ||||        t        ddd      D ]  } |||d        d}t        dd	      D ]  } |||d
        y)a7  
        Splines with different boundary conditions are built on different
        types of vectors of knots. As far as design matrix depends only on
        vector of knots, `k` and `x` it is useful to make tests for different
        boundary conditions (and as following different vectors of knots).
        c                 z   t         j                  j                  d       t        j                  t         j                  j	                  |       dz  dz
        }t         j                  j	                  |       dz  dz
  }|dk(  r|d   |d<   t        ||||      }t        j                  t        |j                        |z
  dz
        } t        |j                  ||      |      }t        j                  ||j                  |      j                         }t        ||j                  z  |d	
       t        ||d	
       y)zY
            To avoid repetition of code the following function is provided.
            r}   (   r~   r   r.   r   r+   bc_typer%   rb   rc   N)r@   rE   r   r   random_sampler
   eyelenr)   r   design_matrixtoarrayr   r*   )	rG   r+   r  re   r   rn   r*   des_matr_defdes_matr_csrs	            rI   run_design_matrix_testszHTestBSpline.test_design_matrix_bc_types.<locals>.run_design_matrix_tests  s     IINN4 		//2R7"<=A		''*R/"4A*$u!%aaADs466{Q*+A074661a03L"00151244;GI  L466115AL,UCr^   r;   r2   clampednaturalr   r0   
not-a-knotr   r   r   N)r   )rF   r  rG   r+   bcs        rI   test_design_matrix_bc_typesz'TestBSpline.test_design_matrix_bc_types  sm    	D* (B#Aq"- ) q!QA#Aq,7   q!A#Aq*5 r^   rj   )FTr   degreer   c           	         t         j                  j                  d       t         j                  j                  d|dz   z        }t        j                  |      t        j
                  |      }}|}t         j                  t        j                  |dz
  |dz
  |      t        j                  ||d|dz   z        t        j                  |dz   |dz   |      f   }t        j                  t        |      |z
  dz
        }t        ||||      }	t         |	|      t        j                  ||||      j                                t        j                  |dz
  |dz
  |dz   |dz   g      }|s;t        j                   t"              5  t        j                  ||||       ddd       yt         |	|      t        j                  ||||      j                                y# 1 sw Y   yxY w)z;Test that design_matrix(x) is equivalent to BSpline(..)(x).r}   rW   r%   r0   r   N)r@   rE   r   r  aminamaxr   rY   r  r  r   r   r  r  r  rS   r   r>   )
rF   rj   r#  re   xminxmaxr+   r)   r*   bsplines
             rI   'test_design_matrix_same_as_BSpline_callz3TestBSpline.test_design_matrix_same_as_BSpline_call  s    			tII##B&1*$56WWQZdEE"++dQhq&9++dD!vz*:;++dQhq&9: ; FF3q6A:>"!Q;/AJ--aA{CKKM	

 HHdRi4#:tbyABz*%%aA{; +* 
%%aA{;CCE +*s    GG"c                    t         j                  j                  d       d}d}t        j                  t         j                  j	                  |      dz  dz
        }t         j                  j	                  |      dz  dz
  }t        |||      }t        dd      D ]V  }|d | }|d | }t        j                  ||j                  |      j                         }	t        |	|j                  z  |d	
       X y )Nr}   rW   r2   r  r~   r   r%   r3   rb   rc   )r@   rE   r   r   r  r
   r   r   r  r)   r  r   r*   )
rF   rG   r+   re   r   rn   r   xcycr  s
             rI   test_design_matrix_x_shapesz'TestBSpline.test_design_matrix_x_shapes  s    
		tGGBII++A.3b89II##A&+b0!!Q!,q!A2AB2AB"00151244;GI  L46612EB r^   c                 x    g d}t        j                  d|d      j                         }t        |g dgd       y )N)r'   r'   r'   r5   r6   r7   r7   r7   r5   r2   )g      ?gmਪ?gK}\UU?r4   rb   rc   )r   r  r  r   )rF   r)   des_matrs      rI   test_design_matrix_t_shapesz'TestBSpline.test_design_matrix_t_shapes  s7    ,((Q2::<;<"	$r^   c                 @   t         j                  j                  d       d}d}t        j                  t         j                  j	                  |      dz  dz
        }t         j                  j	                  |      dz  dz
  }t        |||      }t        t              5  t        j                  ||j                  d d d   |       d d d        d}g d	}g d
}t        t              5  t        j                  |||       d d d        y # 1 sw Y   CxY w# 1 sw Y   y xY w)Nr}   rW   r2   r  r~   r   r.   r0   )r4   r'   r5   r6   r7         @rh   )r@   rE   r   r   r  r
   r<   r>   r   r  r)   )rF   rG   r+   re   r   rn   r)   s          rI   test_design_matrix_assertsz&TestBSpline.test_design_matrix_asserts  s    
		tGGBII++A.3b89II##A&+b0!!Q!, :&!!!TVVDbD\15 '$:&!!!Q* '& '& '&s   (D'DDDr  )r  r  r   r   c                 
   t         j                  j                  d       t        j                  t         j                  j                  d            }t         j                  j                  d      }|dk(  r|d   |d<   t	        |||      }t        j                  ||      }t        j                  ddd      }t         ||       ||      d	       t        |||      }t        |j                  |j                  d	       y )
Nr}   r~   r   r   r.   r  r%   rL   rc   )r@   rE   r   r   r   r   from_power_basisrY   r   r
   r*   )rF   r  re   r   cbrn   r\   bspl_news           rI   test_from_power_basisz!TestBSpline.test_from_power_basis,  s     			tGGBII$$R()IIR j aDAbEAw/''G<[[Ar"2Ru5%aG<

7r^   c                    t         j                  j                  d       t        j                  t         j                  j                  d            }t         j                  j                  d      t         j                  j                  d      dz  z   }|dk(  r|d   |d<   t	        |||      }t        j                  ||      }t        ||j                  |      }t        ||j                  |      }t        |j                  j                  |j                  d|j                  z  z   j                         t        |j                  |j                  d|j                  z  z   d	       y )
Nr}   r~   r&   r   r   r.   r6  rL   rc   )r@   rE   r   r   r   r   r7  r
   r   r   r   r*   dtyper   )rF   r  re   r   r8  rn   bspl_new_realbspl_new_imags           rI   test_from_power_basis_complexz)TestBSpline.test_from_power_basis_complex;  s    			tGGBII$$R()IIR 299#3#3B#7"#<<j aDAbEAw/''G<*1affgF*1affgFTVV\\MOO&(=??&:%;<AE	C}.!/5:	<r^   c                     t        j                  g d      }t        j                  g d      }t        j                  t	        ||d      d      }t        |j                  g dd       y)	a}  
        For x = [0, 1, 2, 3, 4] and y = [1, 1, 1, 1, 1]
        the coefficients of Cubic Spline in the power basis:

        $[[0, 0, 0, 0, 0],\$
        $[0, 0, 0, 0, 0],\$
        $[0, 0, 0, 0, 0],\$
        $[1, 1, 1, 1, 1]]$

        It could be shown explicitly that coefficients of the interpolating
        function in B-spline basis are c = [1, 1, 1, 1, 1, 1, 1]
        r1   )r%   r%   r%   r%   r%   r  r6  )r%   r%   r%   r%   r%   r%   r%   rL   rc   N)r@   r  r   r7  r   r   r*   )rF   re   r   rn   s       rI   test_from_power_basis_exmpz&TestBSpline.test_from_power_basis_exmpL  sO     HH_%HH_%''Aq)(L09; 5EBr^   c                 8   t        j                  ddg      }t        j                  dg      }|j                  d       |j                  d       t        j                  ddd      }|j                  d       t	        ||d      }t         ||      d       y )	Nr   r%   r6   FwriterW   r(   r2   )r@   r  setflagsrY   r   r   )rF   r)   r*   r\   rH   s        rI   test_read_onlyzTestBSpline.test_read_only_  s{    HHaVHHcUO	


	


[[Ar"
% a1""q!r^   N).r   r   r   rJ   rU   r]   rf   ro   rw   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rS   markparametrizer   r  r  r"  r*  r.  r1  r4  r:  r?  rA  rF  r   r^   rI   r#   r#      s   !F
:	?./A
;#3E$L-*M$?6=8AM:%
F7#JJ	16 [[VU2q\2* 3*:7(6T [[],EF[[XuQx0 1 G4C"$+$ [[Y )C D8D8 [[Y )C D<D<C&"r^   r#   c                       e Zd Zej                  j                  dg d      d        Zej                  j                  dg d      d        Zd Zej                  j                  dg d	      d
        Z	d Z
d Zy)
TestInsertxval)r4   r'   r9   r3         @      @c                 4   t        j                  d      }t        j                  |      dz  }t        ||d      }t	        ||      }|j                  |      }t        |j                  |j                  d       t        |j                  |j                  d |j                   dz
   d       ||d   k7  r|n|d d }t         j                  |d|dd  |d d z   z  f   }t         ||       ||      d       t        j                  |      dz  }t        ||d      }	t        |t         j                  ||f   d      }
|
j                  |      }t        |j                  |j                  d       t        |j                  t         j                  |j                  |      j                  |	j                  |      j                  f   d       ||d   k7  r|n|d d }t         j                  |d|dd  |d d z   z  f   }t         |
|       ||      d       y )	Nr   r2   r   rL   rc   r%   r.   r   )r@   rD   sinr
   r   insert_knotr   r)   r*   r+   r   cosr   )rF   rK  re   r   r  spl_1fspl_1r\   y1spl_y1spl_yyspl_yy1s               rI   test_insertzTestInsert.test_inserto  s    IIaLFF1IqL A+c"%6)CEE6!8!45A !B%-QQsVUU2sAabEAcrFN++,Br7 VVAY\#ArQ/#AruuQU|q9$$T*		5777		255)>)@)@)/););D)A)C)C*D $EKP	R !B%-QQsVUU2sAabEAcrFN++,r
GBKe<r^   zxval, m))r4   r0   )r'   r2   )r   r   )r3   r0   )rM  r0   c                    t        j                  d      }t        j                  |      dz  }t        ||d      }t	        |||      }|j                  ||      }t        |j                  |j                  d       t        |j                  |j                  d |j                   dz
   d       ||d   k7  r|n|d d }t         j                  |d	|dd  |d d z   z  f   }t         ||       ||      d       y )
Nr   r2   r   mrL   rc   r%   r.   r   )r@   rD   rO  r
   r   rP  r   r)   r*   r+   r   )	rF   rK  r[  re   r   r  rR  rS  r\   s	            rI   test_insert_multizTestInsert.test_insert_multi  s     IIaLFF1IqL A+cQ'a(6)CEE6!8!45A!B%-QQsVUU2sAabEAcrFN++,Br7r^   c                    t         j                  j                  d      }d\  }}t        j                  |j	                  ||z   dz               }|j	                  |ddf      }t        |||      }|j	                  ||dz      || dz
           }|j                  |      }|j	                  ||dz      || dz
     d	      }	t         ||	       ||	      d
       y )N90  r:   r%   r   r2   r0   )lowhighr   r_  r`  r   rL   rc   )r@   rE   default_rngr   uniformr   rP  r   )
rF   rngrG   r+   r)   r*   r  xvrS  r\   s
             rI   test_insert_randomzTestInsert.test_insert_random  s    ii##E*1GGCKKQqSUK+,KKaAYK'aA[[QqsV!QBqD'[2#[[QqsV!QBqD'[;Br7r^   re  )	r   皙?r5   r7         @      @      @gffffff@rM  c           	      
   t        j                  d      }t        j                  |      dz  }t        ||d      }t	        |ddi}|j                  |      }t        ||j                  d      \  }}}	t        |j                  |d	       t        |j                  d |	 d
z
   |d |	 d
z
   d	       t         j                  j                  d      j                  ddd      }
t         ||
      t        |
|||	f      d	       y )Nr   r2   r   rj   r   TperrL   rc   r%   r}   r   r   )   ra  )r@   rD   rO  r   r   rP  r   rR   r   r)   r*   rE   rb  rc  r   )rF   re  re   r   rR   r  rS  tfcfr+   r\   s              rI   test_insert_periodiczTestInsert.test_insert_periodic  s     IIaLFF1IqLQQs3
3#2swwD1	B%0!A5QBqD	>YY""4(00QQR0Hb	5b"a[#9Fr^   c                    d}d}t        j                  dg|dz   z  g dz   dg|dz   z  z         }t        j                  t        |      |z
  dz
        }t	        |||d      }t        t              5  t        ||||fd	
       d d d        t        t              5  |j                  |       d d d        y # 1 sw Y   3xY w# 1 sw Y   y xY w)N      @r2   r   r%   r0   r2   r3   r   r   r   ri   Trl  )	r@   r  onesr  r   r<   r>   r   rP  )rF   re  r+   r)   r*   r  s         rI   +test_insert_periodic_too_few_internal_knotsz6TestInsert.test_insert_periodic_too_few_internal_knots  s     HHaS!A#Y-QqS	9:GGCFQJN#aA:6:&21ayd+ ' :&OOB '& '& '&s   2B6C6B?Cc                    d}t        j                  dg|dz   z  g dz   dg|dz   z  z         }t        j                  t        |      |z
  dz
        }t	        |||      }t        t              5  |j                  d       d d d        t        t              5  |j                  d       d d d        t        t              5  |j                  dd       d d d        y # 1 sw Y   ^xY w# 1 sw Y   AxY w# 1 sw Y   y xY w)	Nr2   r   r%   rt  r   r.   r   rZ  )r@   r  ru  r  r   r<   r>   rP  )rF   r+   r)   r*   r  s        rI   test_insert_no_extrapz TestInsert.test_insert_no_extrap  s    HHaS!A#Y-QqS	9:GGCFQJN#aA:&OOB ' :&OOA ' :&OOAO# '& '& '& '&s$   .CC) C5C&)C25C>N)r   r   r   rS   rG  rH  rX  r\  rf  rq  rv  rx  r   r^   rI   rJ  rJ  m  s    [[V%AB= C=@ [[C888 [[T $8 GG ($r^   rJ  c            
          dd} dD ]S  }t        |      }t        t        |            D ].  \  }} | ||       t        d|dz         D ]  } | |||dd        0 U y )Nc           
         | j                   \  }}}t        j                  |      }t        j                  |d   dz
  d|dd  |d d z   z  |d   dz   f   }t	        t        ||||f|       | ||      ||d| d| j                          y )	Nr   rg  r   r%   r.   zder = z  k = )rN   rO   err_msg)rR   r@   uniquer   r   r   r+   )	rH   r   r   rN   rO   r)   r*   r+   re   s	            rI   check_splevz,test_knots_multiplicity.<locals>.check_splev  s    %%1aIIaLEE!A$s(C122A/2s:;a!QC0!As)se6!##.G	Ir^   )r%   r0   r2   r3   r   r   r%   r   )r   rb   rb   )rQ   	enumerate_make_multiplesr   )r}  r+   rH   r   r  r   s         rI   test_knots_multiplicityr    sd    I !$q12EArAQ!}B3u5 % 3 r^   c                 b   |dk(  r||   | cxk  r||dz      k  rdS  dS |||z      ||   k(  rd}n)| ||   z
  |||z      ||   z
  z  t        | |dz
  ||      z  }|||z   dz      ||dz      k(  rd}||z   S |||z   dz      | z
  |||z   dz      ||dz      z
  z  t        | |dz
  |dz   |      z  }||z   S )zw
    Naive way to compute B-spline basis functions. Useful only for testing!
    computes B(x; t[i],..., t[i+k+1])
    r   r%   r'   r4   _naive_Bre   r+   r   r)   c1c2s         rI   r  r    s   
 	Avda(!AaC&(s1(c11v1~!A$h1Q3!A$'(1ac1a*@@1Qx1QqS6 G !AhlQqs1uX!A#./(1ac1Q32JJGr^   c                          k(  rnt        j                         dz
      cxk  rdz      k  sJ  J k\  rt              z
  k  sJ t         fdt	        ddz         D              S )z=
    Naive B-spline evaluation. Useful only for testing!
    r%   c              3   R   K   | ]  }|z
     t        |z
        z     y wNr  ).0r   r*   r   r+   r)   re   s     rI   	<genexpr>z_naive_eval.<locals>.<genexpr>  s.     F1q1vAqsA..s   $'r   )r@   searchsortedr  sumr   )re   r)   r*   r+   r   s   ````@rI   rr   rr     s     	AaDyOOAq!A%Q41!A#6a#a&1*n$$Fa1FFFr^   c                      t              dz   z
  }|dz   k\  sJ t              |k\  sJ     cxk  r	|   k  sJ  J t         fdt        |      D              S )z'Naive B-spline evaluation, another way.r%   c              3   F   K   | ]  }|   t        |      z    y wr  r  r  r   r*   r+   r)   re   s     rI   r  z _naive_eval_2.<locals>.<genexpr>#  s&     =Hqqthq!Q**H   !r  r  r   re   r)   r*   r+   rG   s   ```` rI   rs   rs     si    A!A#A!8O8q6Q;;Q41!=E!H===r^   c                    t        |      |dz   z
  }||dz   k\  sJ t        |      |k\  sJ d}t        |      D ]F  } t        j                  ||||z   dz    d      |       }|||   t	        j
                  |      z  z  }H |S )Nr%   r4   r0   Fri   )r  r   r   r   r@   
nan_to_num)re   r)   r*   r+   rG   sr   rH   s           rI   r   r   &  s    A!A#A!8O8q6Q;;
A1X@G!!!Aac!e*%@C	QqTBMM!$$$  Hr^   c                     t        j                  |       } t        j                  | | dk  | dkD  z  | dk\  | dk  z  | dk\  | dk  z  gd d d g      S )z+ A linear B-spline function B(x | 0, 1, 2).r   r0   r%   c                      y)Nr4   r   re   s    rI   <lambda>zB_012.<locals>.<lambda>7  s    br^   c                     | S r  r   r  s    rI   r  zB_012.<locals>.<lambda>7  s    Ar^   c                     d| z
  S Nr5   r   r  s    rI   r  zB_012.<locals>.<lambda>7  s    Ar^   )r@   
atleast_1d	piecewiser  s    rI   rd   rd   1  se    
aA<<QUq1u-!VA.!VQ/1 )+~FH Hr^   c                     t        j                  |       } | dk  | dkD  | dk  z  | dkD  g}|dk(  r	d d d g}n|dk(  r	d d d	 g}nt        d
|z        t        j                  | ||      }|S )z0A quadratic B-spline function B(x | 0, 1, 2, 3).r%   r0   r   c                     | | z  dz  S r  r   r  s    rI   r  zB_0123.<locals>.<lambda>?  s    1Q3r6r^   c                     d| dz
  dz  z
  S )Ng      ?r   r0   r   r  s    rI   r  zB_0123.<locals>.<lambda>@  s    41T6A+-r^   c                     d| z
  dz  dz  S )Nr6   r0   r   r  s    rI   r  zB_0123.<locals>.<lambda>A  s    BqD19q=r^   c                      yNr'   r   r  s    rI   r  zB_0123.<locals>.<lambda>C      2r^   c                      y)Ng       r   r  s    rI   r  zB_0123.<locals>.<lambda>D  s    3r^   c                      yr  r   r  s    rI   r  zB_0123.<locals>.<lambda>E  r  r^   znever be here: der=%s)r@   r  r>   r  )re   r   condsfuncspiecess        rI   r   r   :  s    
aAUQUq1u%q1u-E
ax!-(* 
 03677\\!UE*FMr^   c                    t         j                  j                  d       t        j                  t         j                  j                  | |z   dz               }t         j                  j                  |       }t	        j
                  |||      S )N{   r%   )r@   rE   r   r   r   construct_fast)rG   r+   r)   r*   s       rI   rQ   rQ   L  s`    IINN3
		  1Q'(A
		A!!!Q**r^   c              #     K   | j                   | j                  }}| j                  j                         }|d   |dd |d   |d<   t	        |||       | j                  j                         }|d   |d|dz    t	        |||       | j                  j                         }|d   || dz
  d t	        |||       yw)	zIncrease knot multiplicity.         r   r   Nr%   r.   )r*   r+   r)   copyr   )rH   r*   r+   t1s       rI   r  r  S  s     33qA	
B2Br"IVBrF
"a
	
B!uBt!H
"a
	
B2Br!tuI
"a
s   B<B>c                   N    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y)TestInteropc                 l   t        j                  ddt         j                  z  d      }t        j                  |      }t	        ||      }|j
                  |j                  |j                  f| _        |||c| _	        | _
        | _        t        j                  ddt         j                  z  d      | _        t         j                  |j                  |j                  |j                  f   }t        j                  ||f      | _        t!        |j
                  | j                  |j                        | _        y )Nr   r7   rn  r  )r@   rY   pirQ  r
   r)   r*   r+   rR   r\   r   rH   xnewr   r   r  r   b2)rF   r\   r   rH   r  s        rI   setup_methodzTestInterop.setup_methodi  s    [[BruuHb)VVBZr2&CCacc?#%r1 $&KK2bee8R0	UU133QSS=!))RH%!##tww,r^   c           	         | j                   | j                  | j                  }}}t        t	        ||       ||      dd       t        t	        ||j
                         ||      dd       t        |D cg c]  }t	        ||       c} ||      dd       t        t        d      5  t	        ||       d d d        t        t        d|j                  j                              dz   }|j                  j                  |      }|j                  ||j                  f}t        t	        ||       ||      j                  |      dd       y c c}w # 1 sw Y   xY w)NrL   rM   zCalling splev.. with BSplinematchr%   r   )r  rH   r  r   r   rR   r<   r>   tupler   r*   r  	transposer)   r+   )rF   r  rH   r  re   r  r   rR   s           rI   
test_splevzTestInterop.test_splevv  s   iia 	dA$e%	9dAEE*$e%	9d3dq!d3$e%	9
 :-KL$O M 5BDDII&'$.TT^^BttRdC(4**2.U	H 4
 MLs   6E+EEc                    | j                   | j                  }}t        ||      }t        j                  ||      \  }}}t	        |d   |d       t	        |d   |d       t        |d   |       t        ||d      \  }}}}t	        |d   |d       t	        |d   |d       t        |d   |       t        ||      }	t	        ||	d       t        | }
t	        | |
|      d       y )Nr   rL   rc   r%   r0   T)full_output)r\   r   r   r   r   r   r   r   )rF   re   r   rR   r)   r*   r+   tck_fr   r   rH   s              rI   test_splrepzTestInterop.test_splrep  s    ww1Ql,,q!$1aA.A.SVQ  1$7q!Qa!%0a!%0U1Xq! 1c]2E* SM1Q4e,r^   c                 &   | j                   | j                  }}t        j                  ||f   }t	        t
              5  t        ||       d d d        t	        t
              5  t        j                  ||       d d d        t	        t        d      5  t        |d d |d d        d d d        t	        t        d      5  t        j                  |d d |d d        d d d        y # 1 sw Y   xY w# 1 sw Y   xxY w# 1 sw Y   XxY w# 1 sw Y   y xY w)Nm > k must holdr  r2   )	r\   r   r@   r   r<   r>   r   r   r=   )rF   re   r   y2s       rI   test_splrep_errorszTestInterop.test_splrep_errors  s     ww1UU1a4[:&1bM ':&LLB ' 9,=>1Ra5!BQ%  ?9,=>LL2A"1& ?> '&&& ?>>>s/   C#!C/C;=D#C,/C8;DDc                    t        j                  d      j                  d      }t        |      \  }}t	        j                  |      \  }}t        ||d       t        t        ||      |d       t        t        ||      |d       t        |dd      \  \  }}}}}t        ||d       t        t        ||      |d       y )Nr   r2   r   rL   rc   r   T)r  r  )r@   rD   rl   r   r   r   r   )	rF   re   rH   urR   u1b_fu_fr   s	            rI   test_splprepzTestInterop.test_splprep  s    IIbM!!&)qz1--"R 	2E*aQU3aqu5 &a1$?
cAq!3U+c37r^   c                    t        j                  d      j                  d      }t        t        d      5  t        |       d d d        t        t        d      5  t        j
                  |       d d d        t        j                  ddd      }t        t        d	      5  t        |g       d d d        t        t        d	      5  t        j
                  |g       d d d        g d
}t        t        d      5  t        |g       d d d        t        t        d      5  t        j
                  |g       d d d        g d}g d}t        t        d      5  t        |gd |g  d d d        y # 1 sw Y   0xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   vxY w# 1 sw Y   y xY w)N<   r   ztoo many values to unpackr  r   r  r2   )numr  ) >Ir   >Kr  zInvalid inputs)r%   r2   r0   r3   )r   g333333?g?r%   )	r@   rD   rl   r<   r>   r   r   rY   r=   )rF   re   r  s      rI   test_splprep_errorszTestInterop.test_splprep_errors  sC   IIe$$Y/:-HIAJ J:-HIMM! J KK21%9,=>QCL ?9,=>MM1# ?
 E:-=>QCL ?:-=>MM1# ? :-=>qc4^$ ?>/ JIII
 ?>>> ?>>> ?>sS   E0E="F
F<F""F.F:0E:=F
FF"F+.F7:Gc                    | j                   | j                  }}t        j                  g d      t        j                  z  }t        t        |      |dd       t        t        |j                  |j                  |j                  f      |dd       t        t        d      5  t        |d       d d d        |j                  j                  dd	d
      }t        j                  t        |j                  ||j                  fd            }t        |j                  d       t        ||z
  d
d       y # 1 sw Y   xY w)N)r   r   r9   rs  gHz>rM   zCalling sproot.. with BSpliner  ra   )mestr%   r0   r   )r2   r0   r3   r   rc   )rH   r  r@   r  r  r   r   r)   r*   r+   r<   r>   r  rk   r   r   )rF   rH   r  rootsc2rrrs         rI   test_sprootzTestInterop.test_sproot  s    2-.ruu4q	5t$?QSS!##/TM :-LM2B N ddnnQ1%ZZc2440r:;RXXy)U
AE2 NMs   #D55D>c           	      N   | j                   | j                  }}t        t        dd|      t        dd|j                        d       t        t        dd|      |j                  dd      d       t        t        d      5  t        dd|       d d d        |j                  j                  ddd      }t        j                  t        dd|j                  ||j                  f            }t        |j                  d       t        |t        dd|      d       y # 1 sw Y   xY w)	Nr   r%   rb   rc   zCalling splint.. with BSpliner  r0   )r2   r0   )rH   r  r   r   rR   r   r<   r>   r*   r  r@   rk   r)   r+   r   r   )rF   rH   r  r  integrs        rI   test_splintzTestInterop.test_splint  s    2q!Qq!QUU+%	9q!QAq)	7 :-LM1a N ddnnQ1%F1a"$$RTT):;<V\\6*q!Qe	5 NMs   DD$c           	         | j                   | j                  fD ]N  }t        |j                        t        |j                        z
  }|dkD  rRt
        j                  |j                  t        j                  |f|j                  j                  dd  z         f   |_        dD ]  }t        |      }t        j                  |j                  |j                  |j                  f      }t        |j                  |d   d       t        |j                  |d   d       t        |j                  |d          t        t        |t                      t        t        |t"                      Q y Nr   r%   r`   rL   rc   r0   )rH   r  r  r)   r*   r@   r   zerosr   r   r   r+   r   r   r   
isinstancer   r  rF   rH   ctrG   bdtck_ds         rI   test_splderzTestInterop.test_splder	  s    &&$''"AQSSCH$BAveeACC2%!##))AB-*?!@@AAYacc133_5eAhU;eAhU;RTT58,
2w/0
5%01  #r^   c           	         | j                   | j                  fD ]N  }t        |j                        t        |j                        z
  }|dkD  rRt
        j                  |j                  t        j                  |f|j                  j                  dd  z         f   |_        dD ]  }t        |      }t        j                  |j                  |j                  |j                  f      }t        |j                  |d   d       t        |j                  |d   d       t        |j                  |d          t        t        |t                      t        t        |t"                      Q y r  )rH   r  r  r)   r*   r@   r   r  r   r   r   r+   r   r   r   r  r   r  r  s         rI   test_splantiderzTestInterop.test_splantider  s    &&$''"AQSSCH$BAveeACC2%!##))AB-*?!@@A]((!##qssACC9eAhU;eAhU;RTT58,
2w/0
5%01  #r^   c                    | j                   | j                  | j                  }}}|j                  j                  dz  }d|j                  |   |j                  |dz      z   z  }t        ||      t        ||j                  |j                  |j                  f      }}t        t        ||      t        ||      d       t        t        |t                     t        t        |t                     t        t        |j                  j                              }|j                  j!                  |dd  dz         }	t        ||j                  |	|j                  f      }
t        ||      }t        t#        j$                  t        ||
            j!                  ddd       ||      d       t        t        |t                     t        t        |
t                     y )Nr0   r   r%   rL   rc   r  r   )rH   r  r\   r)   r   r   r*   r+   r   r   r   r  r   r  r   r  r  r@   rk   )rF   rH   r  r\   r   tnbntck_nr  r   tck_n2bn2s               rI   rX  zTestInterop.test_insert)  s^   FFDGGTWWr2CCHHM!##a&133qs8#$2qM6"qssACCo#>Eb"b%(u	6
2w'(
5%() 5#$TT^^BqrFTM*RTT2rtt,-Rn 	

5V#45??1aHBe	-
3()
65)*r^   N)r   r   r   r  r  r  r  r  r  r  r  r  r  rX  r   r^   rI   r  r  e  s:    -H6-0' 8%:3"5&2 2 +r^   r  c                      e Zd Z ej                  ddej
                  z        Z ej                  e      Zd Z	d Z
d Zej                  j                  dg d      d        Zej                  j                  dg d      d	        Zd
 Zd Zej                  j                  dg d      d        Zd Zd Zd Zej                  j                  dg d      d        Zd Zd Zd Zd Zd Zej                  j;                  d      d        Zd Zd Z d Z!d Z"d Z#d  Z$d! Z%d" Z&ej                  j                  dg d#      d$        Z'd% Z(d& Z)d' Z*d( Z+d) Z,y*)+
TestInterpr4   r5   c                     t        t              5  t        | j                  | j                  d       d d d        y # 1 sw Y   y xY w)Nr9   r   )r<   r=   r
   r\   r   )rF   s    rI   test_non_int_orderzTestInterp.test_non_int_orderK  s*    9%tww37 &%%s	   #<Ac                 2   t        | j                  | j                  d      }t         || j                        | j                  dd       t        | j                  | j                  dd      }t         || j                        | j                  dd       y )Nr   r   rb   rM   r.   r+   r   r
   r\   r   r   r   s     rI   test_order_0zTestInterp.test_order_0O  d    tww15$''
DGG%eDtww12>$''
DGG%eDr^   c                 2   t        | j                  | j                  d      }t         || j                        | j                  dd       t        | j                  | j                  dd      }t         || j                        | j                  dd       y )Nr%   r   rb   rM   r.   r  r  r   s     rI   test_linearzTestInterp.test_linearU  r  r^   r+   r   c                 |    g d}g d}t        t        d      5  t        |||       d d d        y # 1 sw Y   y xY w)Nr   r%   r0   r2   r3   r   )r   r%   r0   r2   r3   r   r   r   zShapes of xr  r   r<   r>   r
   rF   r+   re   r   s       rI   test_incompatible_x_yz TestInterp.test_incompatible_x_y[  s.    $:];q!q) <;;s   2;c                    g d}g d}t        t        d      5  t        |||       d d d        g d}t        t        d      5  t        |||       d d d        g d}t        j                  |      j                  d      }t        t        d      5  t        |||       d d d        y # 1 sw Y   xY w# 1 sw Y   fxY w# 1 sw Y   y xY w)	N)r   r%   r%   r0   r2   r3   r  zx to not have duplicatesr  r   )r   r0   r%   r2   r3   r   zExpect x to be a 1D strictly)r%   r.   )r<   r>   r
   r@   rk   rl   r   s       rI   test_broken_xzTestInterp.test_broken_xb  s    :-GHq!q) I :-KLq!q) M JJqM!!'*:-KLq!q) ML IH ML
 MLs#   B.B:C.B7:CCc                     dD ]L  }t        | j                  | j                  |      }t         || j                        | j                  dd       N y )Nr  rb   rM   r  )rF   r+   rH   s      rI   test_not_a_knotzTestInterp.test_not_a_knotr  s<    A"477DGGQ7AAdggJe%H r^   c                 Z   t        | j                  | j                  dd      }t         || j                        | j                  dd       t	        dd      D ]:  }t         || j                  d   |       || j                  d	   |      d
       < t        | j                  | j                  ddd	      }t         || j                        | j                  dd       t	        dd      D ]:  }t         || j                  d   |       || j                  d	   |      d
       < y )Nr   r   r  rb   rM   r%   r   r   r.   dy=rc   r+   r  r   )r
   r\   r   r   r   )rF   rH   r   s      rI   test_periodiczTestInterp.test_periodicw  s    tww1jI$''
DGG%eD q!AAdggajQ/4772;11EER  tww1jrR$''
DGG%eDq!AAdggajQ/4772;11EER r^   )r0   r2   r3   r   r   r   c                 J   d}t         j                  j                  d       t        j                  t         j                  j	                  |      dz        }t         j                  j	                  |      dz  }|d   |d<   t        |||d      }t         ||      |d	
       y )Nr   r}   rW   r   r.   r   r   r  rb   rc   )r@   rE   r   r   r  r
   r   )rF   r+   rG   re   r   rH   s         rI   test_periodic_randomzTestInterp.test_periodic_random  s     
		tGGBII++A.34II##A&,u!q!q*=!ae,r^   c                    | j                   j                  d   }t        j                  j	                  d       t        j                  j                  |      dz  t        j                  z  }t        j                  |      }d|d<   dt        j                  z  |d<   t        j                  d|f      }t        j                  |      |d<   t        j                  |      |d<   t        ||ddd	      }t        |      D ]   }t         |||         |d d |f   d
       " t         ||d          ||d         d
       y )Nr   r}   r0   r4   r.   r%   r   r   r  rb   rc   )r\   r   r@   rE   r   r  r  r   r  rO  rQ  r
   r   r   )rF   rG   re   r   rH   r   s         rI   test_periodic_axiszTestInterp.test_periodic_axis  s    GGMM!
		tII##A&*RUU2GGAJ!BEE	"HHaVvvay!vvay!q!q*1EqAAadGQq!tW59 !A$1R56r^   c                 h   t         j                  j                  d       d}d}t        j                  t         j                  j	                  |            }t         j                  j	                  |      }|d   dz
  |d<   t        t              5  t        |||d       d d d        y # 1 sw Y   y xY w)	Nr}   r   r   r.   r%   r   r   r  )r@   rE   r   r   r  r<   r>   r
   )rF   r+   rG   re   r   s        rI   test_periodic_points_exceptionz)TestInterp.test_periodic_points_exception  s    
		tGGBII++A./II##A&uqy!:&q!q*= '&&s   B((B1c                    t         j                  j                  d       d}d}t        j                  t         j                  j	                  |            }t         j                  j	                  |      }t        j
                  |d|z  z         }t        t              5  t        ||||d       d d d        y # 1 sw Y   y xY w)Nr}   r2   r   r0   r   )	r@   rE   r   r   r  r  r<   r>   r
   )rF   r+   rG   re   r   r)   s         rI   test_periodic_knots_exceptionz(TestInterp.test_periodic_knots_exception  s    
		tGGBII++A./II##A&HHQQY:&q!Q:6 '&&s   B88Crt  c                    t        | j                  | j                  |d      }t        | j                  | j                  d|      }t	        | j                  |      }t        | || j                        d       t        d|      D ]:  }t	        | j                  ||      }t        | || j                  |	      d
       < y )Nr   r  T)rm  r+   rb   rc   r%   r   r   r   )r
   r\   r   r   r   r   r   )rF   r+   rH   rR   r  r   s         rI   test_periodic_splevzTestInterp.test_periodic_splev  s     tww1jITWWdgg415DGGS!QtwwZe4 q!A!,CC477q!1> r^   c                    t        | j                  | j                  dd      }t        | j                  | j                  d      }t	         || j                         || j                        d       d}t        j                  t
        j                  j                  |      dz        }t
        j                  j                  |      dz  }|d	   |d
<   t        ||dd      }t        ||d      }t	         ||       ||      d       y )Nr2   r   r  r6  rb   rc   rW   r   r.   r   )	r
   r\   r   r   r   r@   r   rE   r  )rF   rH   cubrG   re   r   s         rI   test_periodic_cubiczTestInterp.test_periodic_cubic  s    tww1jI$''477J?$''
CLu= GGBII++A.34II##A&,u!q!q*=!Q
3!c!f51r^   c                 T   dt        | j                  | j                  d      }t        | j                        t	        | j                  | j                        t        j                  fd      }t         || j                         || j                        d       y )Nr2   r   r  c                      t        |       S r  )rr   )re   r*   r+   r)   s    rI   r  z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>  s    K1a$;r^   rb   rc   )r
   r\   r   r   r   r@   	vectorizer   )rF   rH   r  r*   r+   r)   s      @@@rI   test_periodic_full_matrixz$TestInterp.test_periodic_full_matrix  su     tww1jIDGGQ'&twwA>\\;<$''
BtwwKe<r^   c                    dg}t        | j                  | j                  dd |f      }t         || j                        | j                  dd       t         || j                  d   d      |d   d   dd       t        | j                  | j                  d|d f      }t         || j                        | j                  dd       t         || j                  d   d      |d   d   dd       y )	Nr%   g       @r0   r  rb   rM   r.   r%   r   r  )rF   r   rH   s      rI   test_quadratic_derivzTestInterp.test_quadratic_deriv  s    i tww1tSkJ$''
DGG%eD$''"+q)3q6!95uM tww1sDkJ$''
DGG%eD$''!*a(#a&)%eLr^   c                    d}dgdg}}t        | j                  | j                  |||f      }t         || j                        | j                  dd       t         || j                  d   d       || j                  d	   d      g|d   d   |d   d   gdd       d
gd
g}}t        | j                  | j                  |||f      }t         || j                        | j                  dd       y )Nr2   r%   r6   )r%   r7   r6  rb   rM   r   r%   r.   r0   r   r  )rF   r+   der_lder_rrH   s        rI   test_cubic_derivzTestInterp.test_cubic_deriv  s      y7)utwwUENK$''
DGG%eD4771:q)1TWWR[!+<=q!eAhqk2U	L x&utwwUENK$''
DGG%eDr^   c           	         d\  }}t        j                  |      j                  t         j                        }t        j                  |      }ddg}ddg}t        |||||f      }t         ||      |dd       t         ||d	   d
       ||d	   d      g|D 	cg c]  \  }}	|		 c}	}       t         ||d   d
       ||d   d      g|D 	cg c]  \  }}	|		 c}	}       y c c}	}w c c}	}w )N)r   r   )r%   g      ()r0   r%   r  )r0   r6   r  rb   rM   r   r%   r0   r.   )r@   rD   astypefloat64rO  r
   r   )
rF   r+   rG   re   r   r!  r"  rH   r   vals
             rI   test_quintic_derivszTestInterp.test_quintic_derivs  s    1IIaL

+FF1IF#'"q!q5%.A!ae%81Q4QqtQZ0.34e"ce4	61R5!a"qk2.34e"ce4	6 54s   C&C,unstable)reasonc                     d}t        | j                  |      }ddg}t        | j                  | j                  |||d f      }t	         || j                        | j                  dd       y )Nr2   r  )r0   r7   r6  rb   rM   )r   r\   r
   r   r   )rF   r+   r)   r!  rH   s        rI   test_cubic_deriv_unstablez$TestInterp.test_cubic_deriv_unstable  s[     DGGQ'"twwAt}M$''
DGG%eDr^   c                    d}t         j                  | j                  d   f|dz   z  | j                  dd  | j                  d d z   dz  | j                  d   f|dz   z  f   }t        | j                  | j                  ||dgdgf      }t         || j                        | j                  dd	       t         || j                  d   d       || j                  d   d      gd
d
gd       y )Nr0   r   r%   r.   r5   r   r6  rb   rM   r4   rc   )r@   r   r\   r
   r   r   )rF   r+   r)   rH   s       rI   test_knots_not_data_sitesz$TestInterp.test_knots_not_data_sites  s     EE4771:-1%7712;"-3772;.!A#&' ( twwA)/6(';= 	$''
DGG%eD4771:q)1TWWR[!+<=Bx	r^   c                     d}ddg}ddg}t        |||dgdgf      }t        j                  dd      }|dz  }t         ||      |dd       y )	Nr2   r4   r'   r%   r4   r  r6  rb   rM   )r
   r@   rY   r   )rF   r+   re   r   rH   r\   r   s          rI   test_minimum_points_and_derivz(TestInterp.test_minimum_points_and_deriv"  s_     HHq!Q'WI0FG[[R U"rE:r^   c                    g dx}}t        t              5  t        ||dgd f       d d d        t        t              5  t        ||d       d d d        t        t              5  t        ||dg       d d d        t        t              5  t        ||d       d d d        d\  }}t        t              5  t        ||||f       d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   uxY w# 1 sw Y   [xY w# 1 sw Y   y xY w)N)r'   r0   r2   r3   r   r   r0  r6  *   )r0  r0  r  rF   re   r   lrs        rI   test_deriv_speczTestInterp.test_deriv_spec.  s     %$A:&q!wi->? ' :&q!W5 ' :&q!gY7 ' :&q!R0 '
 "1:&q!aV4 '& '& '& '& '& '&s:   CC%C)C57DCC&)C25C>D
c                 (   t        j                  d      }|dz  }dgdg}}t        t        d      5  t	        ||||f       d d d        dgdg}}t        t        d	      5  t	        ||||f       d d d        y # 1 sw Y   :xY w# 1 sw Y   y xY w)
Nr   r0   )r   r   r%   r   zBad boundary conditions at 0.r  r6  )ir   zBad boundary conditions at 6.)r@   rD   r<   r>   r
   r4  s        rI   test_deriv_order_too_largez%TestInterp.test_deriv_order_too_largeE  s    IIaLqDx&1:-LMq!aV4 N x'1:-LMq!aV4 NM NM
 NMs   A<"B<BBc                 j   d}| j                   }| j                  d| j                  z  z   }dgdg}}t        |||||f      }t         ||      |dd       t         ||d   d	       ||d
   d	      g|d   d	   |d   d	   gdd       dD ]%  }t        |||      }t         ||      |dd       ' y )Nr2   r&   )r%   y              @)r%   y      @       @r6  rb   rM   r   r%   r.   )r   r%   r   )r\   r   r
   r   )rF   r+   r\   r   r!  r"  rH   s          rI   test_complexzTestInterp.test_complexR  s    WWWWs477{" !zK=ur2q5%.A"rE:2a5!a2l3q!eAhqk2U	L A"2rQ/AAbE2E> r^   c                     t        j                  d      j                  t              }t        j                  d      j                  t              }dD ]  }t	        |||      } ||        y )NrW   r   r   )r@   rD   r%  intr
   )rF   re   r   r+   rH   s        rI   test_int_xyzTestInterp.test_int_xyc  sS    IIbM  %IIbM  % A"1a1-AaD r^   c                 |    t        j                  ddd      }|d d d   }|d d d   }dD ]  }t        |||        y )Nr.   r%   r   r   r   r   )r@   rY   r
   )rF   r\   re   r   r+   s        rI   test_sliced_inputzTestInterp.test_sliced_inputm  sD    [[Q$ssGssGAq!q) r^   c                     t        j                  d      j                  t              }|dz  }t         j                  t         j
                  t         j
                   fD ]  }||d<   t        t        t        ||        y )NrW   r0   r.   )	r@   rD   r%  floatrB   rC   r<   r>   r
   rF   re   r   zs       rI   test_check_finitezTestInterp.test_check_finitew  sZ    IIbM  'qD&&"&&266'*AAbE*&8!Q? +r^   )r%   r0   r2   r   c                 v    t        t        d            }|D cg c]  }|dz  	 }}t        |||       y c c}w )NrW   r0   r   )r  r   r
   )rF   r+   re   ar   s        rI   test_list_inputzTestInterp.test_list_input  s:     rO1aQT11a1% s   6c                    t         j                  t        j                  | j                        t        j                  | j                        f   }dddgfg}dddgfg}t        | j                  |d||f      }t         || j                        |dd	       t         || j                  d
   d      |d
   d   dd	       t         || j                  d   d      |d
   d   dd	       y )Nr%   r'   r5   r6   r7   r2   r  rb   rM   r   r.   )r@   r   rO  r\   rQ  r
   r   )rF   r   r!  r"  rH   s        rI   test_multiple_rhszTestInterp.test_multiple_rhs  s    UU266$''?BFF477O34b"Xb"Xtwwa%H$''
BU?$''!*a(%(1+EN$''"+q)58A;UOr^   c                 Z   t         j                  j                  d       d\  }}t        j                  t         j                  j                  |            }t         j                  j                  |dddf      }t	        |||      }t        |j                  j                  |dddf       dt         j                  j                  d      fg}dt         j                  j                  d      fg}t	        |||||f	      }t        |j                  j                  ||z   dz
  dddf       y )
Nr}   r2   r   r   r   r   r   r%   r   r   r   r6  )r@   rE   r   r   r
   r   r*   r   )rF   r+   rG   re   r   rH   d_ld_rs           rI   test_shapeszTestInterp.test_shapes  s    
		t1GGBII$$!$,-II1aA,/q!Q'QSSYYAq!- 299##I./0299##I./0q!Qc
;QSSYYQAq! 45r^   c                    t        j                  | j                        }t        | j                  |dd      }t        | j                  |ddgdgf      }t	        |j
                  |j
                  d       t        | j                  |dd      }t        | j                  |ddgdgf      }t	        |j
                  |j
                  d       t        | j                  |d	d
      }t        | j                  |d	d dgf      }t	        |j
                  |j
                  d       t        | j                  |dd      }t        | j                  |dd       }t	        |j
                  |j
                  d       t        t              5  t        | j                  |dd       d d d        t         j                  t        j                  | j                        t        j                  | j                        f   }dddgfg}d	ddgfg}t        | j                  |d||f      }t        | j                  |dd      }t	        |j
                  |j
                  d       t         j                  j                  d       d\  }}t        j                  t         j                  j                  |            }t         j                  j                  |dddf      }	dt        j                  d      fg}
dt        j                  d      fg}t        ||	||
|f      }t        ||	|d      }t	        |j
                  |j
                  d       y # 1 sw Y   xY w)Nr2   r  r  r   rL   rc   )r  r  r9  r0   )Nr  r0  r   typor%   r4   r  r}   rM  r   r   r   r   rN  r6  r  )r@   rO  r\   r
   r   r*   r<   r>   r   rQ  rE   r   r   r  )rF   r   r  r  r!  r"  r+   rG   re   r   rO  rP  s               rI   test_string_aliaseszTestInterp.test_string_aliases  s   VVDGG_  q)DqF8fX:NObdd/  q(>@q*0F8(<>bdd/  q:KLq4(:LMbdd/  q,Gq$?bdd/ :&twwa@ ' UU266$''?BFF477O34b"Xb"Xq5%.Iq(>@bdd/ 			t1GGBII$$!$,-II1aA,/ 288I&'(288I&'(1a#s<1a;bdd// '&s   
MMc                 t   t         j                  j                  d       d\  }}t        j                  t         j                  j                  |            }t         j                  j                  |      }t	        ||      }t        ||||      }t        ||||      }t        |j                  |dd       y )Nr}   )r2   r   r   rb   rM   )	r@   rE   r   r   r   r
   make_interp_full_matrr   r*   )rF   r+   rG   re   r   r)   rH   rp  s           rI   test_full_matrixzTestInterp.test_full_matrix  s    
		t1GGBII$$!$,-II!$1q!Q*"1aA.Re%8r^   c                    t         j                  j                  d       d}t        ddd      D ]  }t	        |dz
  dz        }t        j
                  t         j                  j                  d|f            }t        d|dz         D ]  }|d| |dfxx   t        j
                  t         j                  j                  d||z
  f            z  cc<   ||dd| fxx   t        j
                  t         j                  j                  d||z
  f            z  cc<    t         j                  j                  ||f      }||d|| df<   t         j                  j                  ||f      }||| dd|f<   t        j                  ||f      }t        t        || dz
  d            D ]G  \  }}	|	d	k  rt        j                  ||	
      ||d|	f<   *t        j                  ||	
      |||	df<   I t         j                  j                  |      }
t        t        ||||
|      t         j                  j                  ||
      d        y)z
        Random elements in diagonal matrix with blocks in the
        left lower and right upper corners checking the
        implementation of Woodbury algorithm.
        r}      r2       r0   r%   Nr.   r   )offsetrb   rc   )r@   rE   r   r   r>  diagflatr  r~  diagonalr   r   linalgsolve)rF   rG   r+   r[  rH  r   urlldr   rH   s              rI   test_woodburyzTestInterp.test_woodbury  s    			tq"aA!a%1%FBII,,aV45A1fqj)#A2#qr'
bkk"))*:*:Aq1u:*FGG
!"crc'
bkk"))*:*:Aq1u:*FGG
 * !!66"23B#%Agvgwx !!66"23B#%Avgh !Q A!%!R"@A1q5!{{1Q7Aa!eH!{{1Q7AaeH	 B
 		  #A/2r1a@IIOOAq1?# !r^   N)-r   r   r   r@   rY   r  r\   rO  r   r  r  r  rS   rG  rH  r  r  r  r	  r  r  r  r  r  r  r  r  r#  r(  xfailr,  r.  r1  r7  r:  r<  r?  rA  rF  rI  rK  rQ  rT  rW  rc  r   r^   rI   r  r  D  s    
RBEE	"B	B8EE [[S,/* 0* [[S,/* 0*I
S [[S"45- 6-7	>	7 [[S,/
? 0
?2=ME6 [[j)E *E
;5.5?"*@ [[S,/& 0&P610f	9?r^   r  c                    | j                   |j                   k(  sJ |j                   | j                   |z   dz   k(  sJ | j                   }t        j                  ||ft        j                        }t	        |      D ]R  }| |   }|||   k(  r|}nt        j
                  ||      dz
  }t        j                  ||||      }	|	||||z
  |dz   f<   T t        j                  ||      }
|
S )zAssemble an spline order k with knots t to interpolate
    y(x) using full matrices.
    Not-a-knot BC only.

    This routine is here for testing only (even though it's functional).
    r%   r<  )
r   r@   r  r&  r   r  r   evaluate_all_bsplslr_  )re   r   r)   r+   rG   Ar   rK  leftbbr*   s              rI   rV  rV    s     66QVV66QVVaZ!^###	A
!Qrzz*A1Xt1Q4<D??1d+a/D $$Q46 !T!VDF]
  	AAHr^   c                 F   t        t        j                  | ||f      \  } }}| j                  }|j                  |z
  dz
  }t        j                  ||ft        j
                        }t        |      D ]R  }| |   }|||   k(  r|}	nt        j                  ||      dz
  }	t        j                  ||||	      }
|
|||	|z
  |	dz   f<   T t        j                  |j                  |      }t        j                  |j                  |      }t        j                  ||      }|||ffS )z,Make the least-square spline, full matrices.r%   rf  )mapr@   rk   r   r  r&  r   r  r   rg  dotTrh  r_  )re   r   r)   r+   r[  rG   ri  r   rK  rj  rk  r   Yr*   s                 rI   make_lsq_full_matrixrq    s   "**q!Qi(GAq!	A	
QA
!Qrzz*A1Xt1Q4<D??1d+a/D $$Q46 !T!VDF]
  	qssAA
qssAA
AAq!f9r^   c                   J   e Zd Zej                  j                  d       d\  ZZ ej                  ej                  j	                  e            Z	ej                  j	                  e      Z
 e ej                  e	d   e	d   d      e      Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zy)TestLSQr}   )r   r2   r   r.   r   c                    | j                   | j                  | j                  | j                  f\  }}}}t	        ||||      \  }}t        ||||      }t        |j                  |       t        |j                  j                  |j                  |z
  dz
  f       |\  }}	t        j                  j                  ||d      \  }
}}}t        |j                  |
       y )Nr%   r.   )rcond)re   r   r)   r+   rq  r   r   r*   r   r   r   r@   r^  lstsq)rF   re   r   r)   r+   c0AYrH   aar   r  r   s               rI   
test_lstsqzTestLSQ.test_lstsq=  s    VVTVVTVVTVV3
1a%aAq1BAq!Q'R QSSYY!a 12 Biioob!2o6Aq!R r^   c                    | j                   | j                  | j                  | j                  f\  }}}}t	        j
                  |      }t        ||||      }t        |||||      }t        |j                  |j                  d       t        |j                  |j                  d       t        |j                  |j                         y )N)wrb   rc   )
re   r   r)   r+   r@   r   r   r   r*   r   )rF   re   r   r)   r+   r|  rH   b_ws           rI   test_weightszTestLSQ.test_weightsL  s    VVTVVTVVTVV3
1aLLOAq!Q'aAqA.SUU/SUU/QSS#%% r^   c                 6   | j                   | j                  | j                  | j                  f\  }}}}t        j
                  j                  |dddf      }t        ||||      }t        |j                  j                  |j                  |z
  dz
  dddf       y )Nr   r   r   r   r%   )re   r)   r+   rG   r@   rE   r   r   r*   r   r   )rF   re   r)   r+   rG   r   rH   s          rI   rK  zTestLSQ.test_multiple_rhsX  s~    VVTVVTVVTVV3
1aII1aA,/Aq!Q'QSSYY!Q1 56r^   c                 4   | j                   | j                  | j                  }}}| j                  dz  }t	        ||||      }t	        ||j
                  ||      }t	        ||j                  ||      }t         ||       ||      d ||      z  z   dd       y )Ny      ?       @r&   rL   rM   )re   r)   r+   r   r   r   r   r   )rF   re   r)   r+   r-  rH   r   r   s           rI   r<  zTestLSQ.test_complex_  s    &&$&&$&&a1VVx Ar1a(q"''1a0q"''1a0!d1gDG3%eLr^   c                     t        j                  d      j                  t              }t        j                  d      j                  t              }t	        |d      }t        |||d       y )NrW   r%   r   )r@   rD   r%  r>  r   r   rF   re   r   r)   s       rI   r?  zTestLSQ.test_int_xyj  sK    IIbM  %IIbM  %AO1a1%r^   c                     t        j                  ddd      }|d d d   }|d d d   }t        |d      }t        |||d       y )Nr.   r%   r   r2   r   )r@   rY   r   r   )rF   r\   re   r   r)   s        rI   rA  zTestLSQ.test_sliced_inputq  sG    [[Q$ssGssGAqM1a1%r^   c                    t        j                  d      j                  t              }|dz  }t	        |d      }t         j
                  t         j                  t         j                   fD ]  }||d<   t        t        t        |||         y )N   r0   r2   r.   )
r@   rD   r%  rC  r   rB   rC   r<   r>   r   )rF   re   r   r)   rE  s        rI   test_checkfinitezTestLSQ.test_checkfinitez  sf    IIbM  'qDAqM&&"&&266'*AAbE*oq!Q? +r^   c                     | j                   | j                  | j                  }}}|j                  d       |j                  d       |j                  d       t	        |||       y )NFrC  )re   r   r)   )re   r   r)   rE  r   r  s       rI   rF  zTestLSQ.test_read_only  sQ    &&$&&$&&a1	


	


	


!qA&r^   N)r   r   r   r@   rE   r   rG   r+   r   re   r   r   rY   r)   rz  r~  rK  r<  r?  rA  r  rF  r   r^   rI   rs  rs  3  s     IINN4DAq		  #$A
		AAaD!B%+Q/A!
!7	M&&@'r^   rs  c                     t         j                  j                  t         j                  j                  t         j                  j	                  t
                    d|       S )Ndata)ospathjoinabspathdirname__file__)basenames    rI   	data_filer    s8    77<<(AB* *r^   c                   $    e Zd Zd Zd Zd Zd Zy)TestSmoothingSplinec                 h   t         j                  j                  d       d}t        j                  t         j                  j	                  |      dz  dz
        }|dz  t        j
                  d|z        z  |dz  z   t         j                  j                  dd|      z   }t        t              5  t        ||dd         d d d        t        t              5  t        |dd  |       d d d        t        t              5  t        |j                  d|      |       d d d        t        t              5  t        |d d d	   |       d d d        t        j                  |      }|d   |d
<   t        t              5  t        ||       d d d        t        j                  d      }t        j                  d      }d}t        j                  t        |      5  t        ||       d d d        y # 1 sw Y   -xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y xY w)Nr}   r   r3   r0   r2   r4   r   r%   r.   r   z)``x`` and ``y`` length must be at least 5r  )r@   rE   r   r   r  rO  normalr<   r>   r   rl   r  rD   ru  rS   r   )rF   rG   re   r   x_duplexception_messages         rI   test_invalid_inputz&TestSmoothingSpline.test_invalid_input  s   
		tGGBII++A.2Q67qD266!a%= 1a4'"))*:*:2sA*FF :&!!QqrU+ ':&!!AB%+ ':&!!))Aq/15 ' :&!!DbD'1- ' 1Iq	:&!&!, ' IIaLGGAJG]]:->?!!Q' @?+ '&&&&& '& '& @?sH   /G*G7=H1H8HH(*G47HHHH%(H1c                     t        j                  t        d            5 }|d   }|d   }|d   }ddd        t              |      }t	        |dd       y# 1 sw Y   +xY w)ae  
        Data is generated in the following way:
        >>> np.random.seed(1234)
        >>> n = 100
        >>> x = np.sort(np.random.random_sample(n) * 4 - 2)
        >>> y = np.sin(x) + np.random.normal(scale=.5, size=n)
        >>> np.savetxt('x.csv', x)
        >>> np.savetxt('y.csv', y)

        We obtain the result of performing the GCV smoothing splines
        package (by Woltring, gcvspl) on the sample data points
        using its version for Octave (https://github.com/srkuberski/gcvspl).
        In order to use this implementation, one should clone the repository
        and open the folder in Octave.
        In Octave, we load up ``x`` and ``y`` (generated from Python code
        above):

        >>> x = csvread('x.csv');
        >>> y = csvread('y.csv');

        Then, in order to access the implementation, we compile gcvspl files in
        Octave:

        >>> mex gcvsplmex.c gcvspl.c
        >>> mex spldermex.c gcvspl.c

        The first function computes the vector of unknowns from the dataset
        (x, y) while the second one evaluates the spline in certain points
        with known vector of coefficients.

        >>> c = gcvsplmex( x, y, 2 );
        >>> y0 = spldermex( x, c, 2, x, 0 );

        If we want to compare the results of the gcvspl code, we can save
        ``y0`` in csv file:

        >>> csvwrite('y0.csv', y0);

        z
gcvspl.npzre   r   y_GCVSPLNg-C6?rM   )r@   loadr  r   r   )rF   r  re   r   r  y_comprs         rI   test_compare_with_GCVSPLz,TestSmoothingSpline.test_compare_with_GCVSPL  sh    R WWY|,-S	AS	AJ'H . .'1-a0
 	4@ .-s   AA"c                    t         j                  j                  d       d}t        j                  t         j                  j	                  |      dz  dz
        }|dz  t        j
                  d|z        z  |dz  z   t         j                  j                  dd|      z   }t        ||d      }t        ||dd	
      }t        j                  |d   |d   d|z        }t         ||       ||      d       y)z
        In case the regularization parameter is 0, the resulting spline
        is an interpolation spline with natural boundary conditions.
        r}   r   r3   r0   r2   r4   r   )lamr  r6  r   r.   rL   rc   N)r@   rE   r   r   r  rO  r  r   r
   rY   r   )rF   rG   re   r   
spline_GCVspline_interpgrids          rI   test_non_regularized_casez-TestSmoothingSpline.test_non_regularized_case  s     			tGGBII++A.2Q67qD266!a%= 1a4'"))*:*:2sA*FF*1aR8
*1aIF{{1Q42A.
4(%d+"	$r^   c                    t         j                  j                  d       d}t        j                  t         j                  j	                  |      dz  dz
        }|dz  t        j
                  d|z        z  |dz  z   t         j                  j                  dd|      z   }t        ||      }t         j                  j                  t        d      d	      D ]u  }t        j                  |      }d
||<   t        |||      }t         |||         ||   z
        }t         |||         ||   z
        }	||	k  sdt        d|dd|	d       y )Nr}   r   r3   r0   r2   r4   r   rW   r   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )r@   rE   r   r   r  rO  r  r   choicer   ru  absr>   )
rF   rG   re   r   r  indr|  spl_worigweighteds
             rI   test_weighted_smoothing_splinez2TestSmoothingSpline.test_weighted_smoothing_spline  s4   
		tGGBII++A.2Q67qD266!a%= 1a4'"))*:*:2sA*FF#Aq) 99##E#JR#8C
AAcF)!Q2E s1S6{QsV+,D53=1S612Hh  $CCG)3$,R="2 3 3 9r^   N)r   r   r   r  r  r  r  r   r^   rI   r  r    s    (>4Al$&3r^   r  c           	         	 | \  	|\  t              z
  dz
  }|dz   k\  sJ t              z
  dz
  dz   k\  sJ t        	fdt        |      D              S )z-A naive 2D tensort product spline evaluation.r%   c           	   3      K   | ]9  }t              D ])  }||f   t        |      z  t        	|      z   + ; y wr  )r   r   )
r  ixiyr*   r+   nytxtyre   r   s
      rI   r  zbspline2.<locals>.<genexpr>"  sO      8"2U2Yr Ry1Q2r?*Qq!R_<-6 ="s   ?Ar  )
r   r)   r*   r+   nxr  r  r  re   r   s
     `` @@@@@rI   bspline2r    sz    DAqFB	R1qB!A#II	R1qB!A#II 8 8r8 8 8r^   c                 b   |dk(  r||   | cxk  r||dz      k  rdS  dS |||z      ||   k(  rd}n)| ||   z
  |||z      ||   z
  z  t        | |dz
  ||      z  }|||z   dz      ||dz      k(  rd}||z   S |||z   dz      | z
  |||z   dz      ||dz      z
  z  t        | |dz
  |dz   |      z  }||z   S )Nr   r%   r'   r4   r   r  s         rI   r   r   &  s    Avda(!AaC&(s1(c11v1~!A$h1Q3!A$'!AqsAq/91Qx1QqS6 7N !AhlQqs1uX!A#./!AqsAaC2CC7Nr^   c                      t              z
  dz
  }|dz   k\  rt              |k\  sJ t         fdt        |      D              S )Nr%   c              3   F   K   | ]  }|   t        |      z    y wr  r  r  s     rI   r  zbspline.<locals>.<genexpr>7  s%     6Xqta1am#Xr  r  r  s   ```` rI   r)  r)  4  sD    A
QA1H3q6Q;''6U1X666r^   c                       e Zd ZddZd Zy)
NdBSpline0c                     t        |      }|t        |j                        k  sJ 	 t        |       t        d |D              | _        t        d |D              | _        || _        y# t        $ r	 |f|z  }Y Gw xY w)a  Tensor product spline object.

        c[i1, i2, ..., id] * B(x1, i1) * B(x2, i2) * ... * B(xd, id)

        Parameters
        ----------
        c : ndarray, shape (n1, n2, ..., nd, ...)
            b-spline coefficients
        t : tuple of 1D ndarrays
            knot vectors in directions 1, 2, ... d
            ``len(t[i]) == n[i] + k + 1``
        k : int or length-d tuple of integers
            spline degrees.
        c              3   F   K   | ]  }t        j                  |        y wr  )operatorindex)r  kis     rI   r  z&NdBSpline0.__init__.<locals>.<genexpr>S  s     6Abx~~b)As   !c              3   R   K   | ]  }t        j                  |t                ! yw)rf  N)r@   rk   rC  )r  tis     rI   r  z&NdBSpline0.__init__.<locals>.<genexpr>T  s     ?Qrrzz"E22Qs   %'N)r  r   r=   r  r+   r)   r*   )rF   r)   r*   r+   r  s        rI   __init__zNdBSpline0.__init__;  sx     1vs177|###	F
 6A66?Q??  	T	A	s   A( (A:9A:c                 <   t        | j                        }t        |      |k(  sJ dg|z  }t        |      D ]  }| j                  |   ||   }}| j                  |   }|||   k(  r|||<   nt	        j
                  ||      dz
  ||<   |||      |cxk  r|||   dz      k  sJ  J ||   |k\  r||   t        |      |z
  k  rJ  t        |      }d}t        |      D cg c]'  }t        ||   | j                  |   z
  ||   dz         ) }	}t        j                  |	 D ]o  }
| j                  |
   t	        j                  t        |      D cg c]0  }t        ||   | j                  |   |
|   | j                  |         2 c}      z  }||z  }q |S c c}w c c}w )Nnoner%   r   )r  r)   r   r+   r@   r  r  	itertoolsproductr*   prodr   )rF   re   r  r   rb  tdxdr+   resultitersidxterms               rI   __call__zNdBSpline0.__call__W  s   466{1v~~ JtOtAVVAY!Bq	A RU{!r2.2!ad8r/R!QZ/////Q4191B!!333  !H
 <A$KHKqqtdffQi'12KH$$e,C66#;38;*@3>a +,AaD$&&)SVTVVAY*O3>*@ "A ADdNF -  I*@s    ,F5FNr2   )r   r   r   r  r  r   r^   rI   r  r  :  s    8r^   r  c                   V   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ej&                  j)                  dddg      ej&                  j)                  dddg      d               Zej&                  j)                  dddg      d        Zd Zd Zd Zd Zd Zy)TestNdBSplinec                    t         j                  j                  d      }d\  }}d}t        j                  |j	                  ||z   dz               }|j	                  ||f      }t        |||      }t        |f||      }|j	                  d      }	t         ||	d d d f          ||	      d        ||	d d d f         j                  |	j                  d	   |j                  d   fk(  sJ y )
Nr^  r:   r   r%   r   r  rb   rc   r   )	r@   rE   rb  r   rc  r   r   r   r   )
rF   rd  rG   r+   n_trr)   r*   rH   nbxis
             rI   test_1DzTestNdBSpline.test_1Dy  s    ii##E*1GGCKKQUQYK/0KKaYK'Aq!tQ"[[b[!2ag;"E	+"QW+$$!aggaj(AAAAr^   c                    t        j                  d      }|dz  }t        ||d      }|dz  d|z  z   }t        ||d      }|j                  |j                  f}|j                  d d d f   |j                  d d d f   z  }||dfS )Nr   r2   r   r0   r@   rD   r
   r)   r*   rF   re   r   r  y_1rS  t2r  s           rI   make_2d_casezTestNdBSpline.make_2d_case  s    IIaLqD A+dQqSj"1cQ/eeUWWUU1d7^eggdAg..2qyr^   c                 f   t        j                  d      }|dz  }t        ||d      }t        j                  d      dz   }|dz  d|z  z   }t        ||d      }|j                  |j                  f}|j                  d d d f   |j                  d d d f   z  }|||j
                  |j
                  fS )Nr   r2   r   r   r   r0   )r@   rD   r
   r)   r*   r+   r  s           rI   make_2d_mixedzTestNdBSpline.make_2d_mixed  s    IIaLqD A+IIaL3dQqSj"1cQ/eeUWWUU1d7^eggdAg..2suuegg%%r^   c                    g d}| j                         \  }}}|D cg c]  \  }}|dz  |dz  d|z  z   z   }}}t        |D cg c]  }t        ||||       c}|d       t        ||d      }	 |	|      j                  t        |      fk(  sJ t         |	|      |d       t        j                  j                  d      }
|
j                  d	      d
z  } |	|      }|j                  dk(  sJ |j                  d      j                  \  }}t        |j                         |dz  |dz  d|z  z   z  d       y c c}}w c c}w )Nr   r9   )r9   r%   )r   r   r2   r0   rb   rc   r   r^  )r3   r2   r0   r   r   )r3   r2   )r.   r0   )r  r   r  r   r   r  r@   rE   rb  rc  rl   ro  ravel)rF   r  r  r  r+   re   r   targetr   bspl2rd  r  s               rI   test_2D_separablezTestNdBSpline.test_2D_separable  sG   /%%'	B467B&1a!Q$!Q$1*%B7 	2>2R"b"a02>"	$
 "bA&Ry3r7+---b	U	, ii##E*[[i[(1,r||v%%% zz'"$$111qs
+%	9+ 8 ?s   D>Ec                    d}g d}|D cg c]  \  }}|dz  |dz  d|z  z   z   }}}| j                         \  }}}t        j                  ||||f      }	d}
t        ||	d      } ||
      } t        |||      |
      }|j                  dk(  sJ t        ||gdz  d	        ||      j                  t        j                  |      d d
 |j                  j                  |d  z   k(  sJ t         ||      t        j                  |      d d d f   z
  dd	       |	j                  d      }t        ||d      } ||
      }|j                  dk(  sJ t        |||g||ggd	        ||      j                  t        j                  |      d d
 |j                  j                  |d  z   k(  sJ t         ||      t        j                  |      d d d d f   z
  dd	       y c c}}w )Nr0   r  r2   r  r   )r3   r3   rb   rc   r.   r   gvIh%,=r   r   r0   r0   )r0   r0   )	r  r@   r   r   r   r   r*   rk   rl   )rF   r  r  re   r   r  r  r  r+   c2_4r   bspl2_4r  
val_singlec2_22bspl2_22s                   rI   test_2D_separable_2z!TestNdBSpline.test_2D_separable_2  s   /467B&1a!Q$!Q$1*%B7%%'	Byy"b"b)*B*)Yr2q)"-
||t####q(u	6
 r{  BHHRL"$5		8N$NNNNbjj&8D&AA	' \*R!,"||v%%%$j1$j139>	@ ""Sb!HJJ$4$4TU$;;< 	= <rzz&'9!T4-'HH	'C 8s   G#c                    t         j                  j                  d      }d}t         j                  ddddt        j                  |j                  d            dz  ddddf	   }t         j                  ddddt        j                  |j                  d            dz  ddddf	   }|j                  |j                  |z
  dz
  |j                  |z
  dz
  f      }t        ||f||	      }d
}t         ||      t        |||f||      d       t         j                  g dg df   }t         ||      |D cg c]  }t        |||f||       c}d       y c c}w )Nr^  r2   r   r   r   r   r3   r%   r   )r'   r'   rb   rc   r%   r   r0   皙?g? @)r@   rE   rb  r   r   rc  r   r   r   r  r   )	rF   rd  r+   r  r  r*   r  r  r   s	            rI   test_2D_randomzTestNdBSpline.test_2D_random  sE   ii##E*UU1aArwws{{{':;a?Aq!KLUU1aArwws{{{':;a?Aq!KLKKbggaik27719Q;7K8R!q)B b"Xq!45	B UU;"# $B@BC""r2h15C"	$Cs   7E
c                    | j                         \  }}}}g d}|D cg c]  \  }}|dz  |dz  d|z  z   z   }}}t        ||||f      }	 |	|      j                  t        |      fk(  sJ t	         |	|      |d       y c c}}w )N)ffffff?rh  )r9   g333333@)rh  rs  r2   r0   r   rb   rc   )r  r   r   r  r   )
rF   r  r  kxkyr  re   r   r  r  s
             rI   test_2D_mixedzTestNdBSpline.test_2D_mixed  s    ++-BB1467B&1a!Q$!Q$1*%B7"bRH-Ry3r7+---b	U	, 8s   Bc                    | j                         \  }}}}g d}t        ||||f      } ||d      }t        ||D 	cg c]  \  }}	d|dz  z  |	dz  d|	z  z   z   c}	}d        ||d	      }t        ||D 	cg c]  \  }}	d|dz  z  d|	z  dz   z   c}	}d        ||d
      }t        ||D 	cg c]  \  }}	|dz  |	dz  d|	z  z   z   c}	}d       t        t              5   ||d      }d d d        t        t              5   ||d      }d d d        y c c}	}w c c}	}w c c}	}w # 1 sw Y   >xY w# 1 sw Y   y xY w)Nr  r   r9  r   r2   r0   rb   rc   r%   r%   )r   r   )r.   r   )r.   r   r%   )r  r   r   r<   r>   )
rF   r  r  r  r  r  r  r   re   r   s
             rI   test_2D_derivativez TestNdBSpline.test_2D_derivative  s[   ++-BB1"bRH-B6";=>241a1a41a4!A#:.2>U	L B6"8:;11a41Q37+;%	I B6"9;<AAA!,<5	J :&w'C ' :&z*C '& ? < =&& '&s)   D <D&6D,*D2D>2D;>Ec           
         t         j                  j                  d      }d\  }}t         j                  ddddt        j                  |j                  d            dz  ddddf	   }t         j                  ddddt        j                  |j                  d            dz  ddddf	   }|j                  |j                  |z
  d	z
  |j                  |z
  d	z
  f      }t         j                  g d
g df   }t        ||f|||f      }t        ||f|||f      }	t         ||      |D 
cg c]
  }
 |	|
       c}
d       y c c}
w )Nr^  )r0   r2   r   r   r   r2   r   r3   r%   r  r  r   rb   rc   )r@   rE   rb  r   r   rc  r   r   r   r  r   rF   rd  r  r  r  r  r*   r  r  bspl2_0r  s              rI   test_2D_mixed_randomz"TestNdBSpline.test_2D_mixed_random  s2   ii##E*BUU1aArwws{{{':;a?Aq!KLUU1aArwws{{{':;a?Aq!KLKKbgglQ."q0@AKBUU;"# $ 2r(A"b2b"XqRH5b	/12rr2	@2s   *E
c                    t        j                  d      }t        j                  d      dz   }t        ||dz  d      }t        ||dz  d|z  z   d      }|j                  d d d f   |j                  d d d f   z  }t	        |j
                  |j
                  f||j                  |j                  f      }|dz  d d d f   |dz  d|z  z   d d d f   z  }t        ||f|      }t        j                  ||      D 	
cg c]	  \  }	}
|	|
f }}	}
 ||      }t        j                  |      j                         rJ t        | ||      d       t        |j                  |j                        |d       y c c}
}	w )	Nr   r   r   r2   r   r0   rb   rc   )r@   rD   r
   r*   r   r)   r+   r   r  r  r   anyr   rl   r   )rF   re   r   spl_xspl_yr   rn   valuesrgirH  rH   r  bxis                rI   test_tx_neq_tyzTestNdBSpline.test_tx_neq_ty/  sP   IIaLIIaL3"1ada0"1adQqSjA6WWQWa 00%''577+R%''5771CDQ$4AqD1Q3Ja#88%q!ff5!*!2!21a!89!8Aq!f!892h88C=$$&&&SW51FLL16F :s   <E6c                    t        j                  d      }|dz  }t        ||d      }|dz  d|z  z   }t        ||d      }|dz  d|z  z   dz   }t        ||d      }|j                  |j                  |j                  f}|j                  d d d d f   |j                  d d d d f   z  |j                  d d d d f   z  }	||	dfS )Nr   r2   r   r0   r%   r  )
rF   re   r   r  r  rS  y_2spl_2r  r  s
             rI   make_3d_casezTestNdBSpline.make_3d_caseC  s    IIaLqD A+dQqSj"1cQ/dQqSj1n"1cQ/eeUWWegg&eeAtTM"ggdAtm$%ggdD!m$% 2qyr^   c                    t         j                  j                  d      }|j                  d      dz  \  }}}|dz  |dz  d|z  z   z  |dz  d|z  z   dz   z  }| j	                         \  }}}t        ||d      }	t        |||      D 
cg c]  }
|
 }}
 |	|      }|j                  d	k(  sJ t        ||d
       y c c}
w )Nr^  r2   r;   r   r   r2   r0   r%   r   )r;   rb   rc   )	r@   rE   rb  rc  r  r   zipr   r   )rF   rd  re   r   rE  r  t3c3r+   bspl3r   r  r  s                rI   test_3D_separablezTestNdBSpline.test_3D_separableV  s    ii##E*++7++a/1aAA!$1qs
Q7%%'	B"bA&Q1&Aa&r||u$$$U3 's   
	B=c                    | j                         \  }}}t        ||d      }t        j                  j	                  d      }|j                  d      dz  \  }}}t        |||      D 	cg c]  }	|	 }
}	t         ||
d      d|d	z  z  |dz  d	|z  z   z  |dz  d|z  z   d
z   z  d       t         ||
d      d|z  |dz  d	|z  z   z  |dz  d|z  z   d
z   z  d       t         ||
d      d|z  d|d	z  z  d	z   z  |dz  d|z  z   d
z   z  d       t         ||
d      d|z  d|d	z  z  d	z   z  dz  d       t         ||
d      t        j                  t        |
            d       y c c}	w )Nr2   r   r^  r  r   r   )r%   r   r   r   r0   r%   rb   rc   )r0   r   r   r   )r0   r%   r   )r0   r%   r2   )r0   r%   r3   )
r  r   r@   rE   rb  rc  r  r   r  r  )rF   r  r  r+   r  rd  re   r   rE  r   r  s              rI   test_3D_derivativez TestNdBSpline.test_3D_derivativec  s   %%'	B"bA&ii##E*++7++a/1aQ1&Aa&bY/!Q$!Q$1*-A!a@u	N 	bY/!q!tacz*adQqSj1n=E	K 	bY/!qAvz*adQqSj1n=E	K 	bY/!qAvz*a0u	> 	bY/R)	7 's   *	E/c           
      j   t         j                  j                  d      }d}t         j                  ddddt        j                  |j                  d            dz  ddddf	   }t         j                  ddddt        j                  |j                  d            dz  ddddf	   }t         j                  ddddt        j                  |j                  d            dz  ddddf	   }|j                  |j                  |z
  dz
  |j                  |z
  dz
  |j                  |z
  dz
  f      }t        |||f||	      }t        |||f||	      }d
}	t         ||	       ||	      d       t         j                  g dg dg df   }	t         ||	      |	D 
cg c]
  }
 ||
       c}
d       y c c}
w )Nr^  r2   r   r   r   r   r3   r%   r   )r'   r'   r%   rb   rc   r  r  g?r  gffffff?)r@   rE   rb  r   r   rc  r   r   r  r   r   )rF   rd  r+   r  r  tzr*   r  spl_0r  r  s              rI   test_3D_randomzTestNdBSpline.test_3D_randomy  s   ii##E*UU1aArwws{{{':;a?Aq!KLUU1aArwws{{{':;a?Aq!KLUU1aArwws{{{':;a?Aq!KLKKbggaik27719Q;	!DKERa1-BB<a0Br7UU;""# $ 	Bb!9b%)b!9F!9s   F0
c           
          t         j                  j                  d      }d}t         j                  ddddt        j                  |j                  d            dz  ddddf	   }t         j                  ddddt        j                  |j                  d            dz  ddddf	   }t         j                  ddddt        j                  |j                  d            dz  ddddf	   }|j                  |j                  |z
  dz
  |j                  |z
  dz
  |j                  |z
  dz
  f      |j                  |j                  |z
  dz
  |j                  |z
  dz
  |j                  |z
  dz
  f      d	z  z   }t        |||f||
      }t        |||f|j                  |
      }t        |||f|j                  |
      }	t         j                  g dg dg df   }
t         ||
       ||
      d	 |	|
      z  z   d       y )Nr^  r2   r   r   r   r   r3   r%   r&   r   r  r  r  rb   rc   )r@   rE   rb  r   r   rc  r   r   r   r   r   r   )rF   rd  r+   r  r  r  r*   r  spl_respl_imr  s              rI   test_3D_random_complexz$TestNdBSpline.test_3D_random_complex  s   ii##E*UU1aArwws{{{':;a?Aq!KLUU1aArwws{{{':;a?Aq!KLUU1aArwws{{{':;a?Aq!KL[[rwwqy{BGGAIaK1E[F[[rwwqy{BGGAIaK1E[FrIJ Ra1-BB<15BB<15UU;""# $ 	Br
Rr
]2	@r^   
cls_extrapNTcall_extrapc                 R   | j                         \  }}}t        ||d|      }g dg dg d}	}}t        t        j                  |||	f      \  }}}	t        |||	      D 
cg c]  }
|
 }}
|dz  |dz  d|z  z   z  |	dz  d|	z  z   dz   z  } |||      }t        ||d	
       y c c}
w Nr2   )r+   rj   )r.   r   )r
  r   rL  )r.   g            @r0   r%   ri   rb   rc   r  r   rm  r@   rk   r  r   )rF   r  r   r  r  r+   r  re   r   rE  r   r  r  r  s                 rI   test_extrapolate_3D_separablez+TestNdBSpline.test_extrapolate_3D_separable  s     %%'	B"bA:> a1bjj1a),1aQ1&Aa&AA!$1qs
Q7r{3U3	 's    	B$r   )FT)TNc                 \   | j                         \  }}}|\  }}t        ||d|      }g dg dg d}
}	}t        t        j                  ||	|
f      \  }}	}
t        ||	|
      D cg c]  }| }}|dz  |	dz  d|	z  z   z  |
dz  d|
z  z   dz   z  } |||      }t        ||d	
       y c c}w r"  r%  )rF   r   r  r  r+   r  r   r  re   r   rE  r   r  r  r  s                  rI   test_extrapolate_3D_separable_2z-TestNdBSpline.test_extrapolate_3D_separable_2  s     %%'	B"(
K"bA:> a1bjj1a),1aQ1&Aa&AA!$1qs
Q7r{3U3	 's   %	B)c                    | j                         \  }}}t        ||d      }g dg dg d}}}t        t        j                  |||f      \  }}}t        |||      D cg c]  }| }	}|dz  |dz  d|z  z   z  |dz  d|z  z   dz   z  }
 ||	d	      }t        j                  |d
         sJ t        j                  |d         sJ t        |dd |
dd d       y c c}w )Nr2   r   )r#  r%   r   )r
  r   rL  )r.   r   r$  r0   r%   Fri   r   r.   rb   rc   )r  r   rm  r@   rk   r  r   r   )rF   r  r  r+   r  re   r   rE  r   r  r  r  s               rI   #test_extrapolate_false_3D_separablez1TestNdBSpline.test_extrapolate_false_3D_separable  s    %%'	B"bA& nna1bjj1a),1aQ1&Aa&AA!$1qs
Q7ru-xxq	"""xxr
###qfQrl? 's   	Cc           	         | j                         \  }}}t        ||d      }t        j                  ddt        j                  dddt        j                  g      }t        j                  dddt        j                  dd	d	g      }t        j                  d
dddt        j                  ddg      }t        |||      D cg c]  }| }	}|dz  |dz  d|z  z   z  |dz  d|z  z   dz   z  }
t        j                  |      t        j                  |      z  t        j                  |      z  }t        j                  |
|<    ||	      }t        j                  ||         j                         sJ t        ||
d       y c c}w )Nr2   r   r#  r%   r0   r   r
  rs  rL  r.   r$  rb   rc   )	r  r   r@   rk   rB   r  r   r   r   )rF   r  r  r+   r  re   r   rE  r   r  r  r   r  s                rI   test_x_nan_3DzTestNdBSpline.test_x_nan_3D  sE   %%'	B"bA& JJArvvq!Q78JJCBFFAsC89JJCArvvsC89Q1&Aa&AA!$1qs
Q7xx{RXXa[(288A;6vvtrxxt%))+++U3 's   >	E<c           	         t         j                  j                  d      }d\  }}t        j                  |j	                  ddd            }t         j
                  |d   f|z  ||d   f|z  f   }t        j                  |j	                  ddd            }t         j
                  |d   f|z  ||d   f|z  f   }|d d d   j                  j                  rJ |d d d   j                  j                  rJ |j	                  |j                  dz  |z
  d	z
  |j                  dz  |z
  d	z
  f
      }|j                  }|j                  j                  rJ t         j                  g dg df   }t        |d d d   |d d d   f|||f      }t        |d d d   |d d d   f|||f      }	t         ||      |D 
cg c]
  }
 |	|
       c}
d       y c c}
w )Nr^  r2   r2   r   r3      ra  r.   r0   r%   r   r  r  r   rb   rc   )r@   rE   rb  r   rc  r   flagsc_contiguousr   ro  r   r   r  r   r  s              rI   test_non_c_contiguousz#TestNdBSpline.test_non_c_contiguous  s   ii##E*BWWS[[QQR[89UUBqE8B;RVIbL01WWS[[QQR[89UUBqE8B;RVIbL01cc7==----cc7==----KKbggqj2o1277A:?Q3FGKHCC77''''UU;"# $ 2cc7BssG,aB8<b1gr#A#w/r2h?b	/12rr2	@2s   :G
c                     | j                         \  }}}t        ||d      }t        d      D ]  }d||   j                  _         d|j                  _        t        ||d      } |d       |d      k(  sJ y )Nr2   r   Fr`   )r  r   r   r0  	writeable)rF   r  r  r+   r  r   bspl3_s          rI   test_readonlyzTestNdBSpline.test_readonly  st    %%'	B"bA&qA$)BqEKK! "2rQ'Y6)#4444r^   c                 r   | j                         \  }}}t        j                  g dg dg      }t        |||      j	                  |||      }t        j                  |||||g      }|j
                  d   |j
                  d   k(  sJ t        |j                         |j                         d       t        t              5  t        j                  g d||gdz         d d d        t        t        d      5  t        j                  d	d
gg||gdz         d d d        y # 1 sw Y   BxY w# 1 sw Y   y xY w)Nr`   )r3   r   r   r   gؗҜ<rc   r2   zData and knots*r  r%   r0   )
r  r@   rk   r   r  r   r   todenser<   r>   )rF   r  r  r+   r  dmdm1s          rI   test_design_matrixz TestNdBSpline.test_design_matrix	  s   %%'	BZZI./r2q!//B:%%b"q!Qi8xx{bhhqk)))

ckkm%@:&##IrA3q59 ' :->?##aVHb1#a%8 @? '& @?s   D!9D-!D*-D6)r   r   r   r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  rS   rG  rH  r&  r(  r*  r,  r2  r6  r;  r   r^   rI   r  r  w  s    B"&96&'P$&,+2@ G(&47,G&@& [[\D$<8[[]T4L94 : 94 [[X|'DE4 F4 @ 4$@2
59r^   r  c                   6   e Zd Zd Zd Zej                  j                  dg d      d        Zd Z	d Z
d Zej                  j                  d	ej                  ej                  g      d
        Zd Zej                  j                  dg d      d        Zd Zy)
TestMakeNDc                    t        j                  d      }t        j                  d      dz   }|d d d f   dz  |dz  d|z  z   d d d f   z  }t        j                  ||      D cg c]	  \  }}||f }}}t	        ||f|d      }t         ||      |j                         d       t        ||dz  d      }t        ||dz  d|z  z   d      }	|j                  d d d f   |	j                  d d d f   z  }
t        |
|j                  d	d
       d
dl	m
}  |||f|d      }t         ||       ||      d       y c c}}w )Nr   r   r2   r0   r%   r   rL   rc   r  r   rM   )r   linearmethodrb   )r@   rD   r  r  r   r   r  r
   r*   scipy.interpolater   )rF   re   r   r  rH  rH   r  rn   r  r  r   RGIr  s                rI   test_2D_separable_simplez#TestMakeND.test_2D_separable_simple	  s4   IIaLIIaL31d7Q!Q$1*dAg!66!*!2!21a!89!8Aq!f!89Aq66Q/R&,,.u= #1ada0"1adQqSjA6WWQWa 00DFFQ7 	E1a&&2Bb6 :s   &D?c                    t        j                  d      }t        j                  d      }t        j                  ||      D cg c]	  \  }}||f }}}|d d d f   dz  |dz  d|z  z   d d d f   z  }t        j                  ||||f      }t        ||f|dt        j                        } ||      }	t        j                  ||||f      }
|	j                  dk(  sJ t        |	j                  ddd      |
d       |j                  d	      }t        ||f|dt        j                        } ||      }	|	j                  d
k(  sJ t        |	j                  dddd      |
j                  d	      d       y c c}}w )Nr   r2   r0   r+   solver)$   r3   r3   rb   rc   r  )rH  r0   r0   )r@   rD   r  r  r   r   sslspsolver   r   rl   )rF   re   r   rH  rH   r  r  values4rn   r  r  values22s               rI   test_2D_separable_trailing_dimsz*TestMakeND.test_2D_separable_trailing_dims,	  sa   IIaLIIaL!*!2!21a!89!8Aq!f!89 1d7Q!Q$1*dAg!66))VVVV<=Aq67aDbFFFF;<||w&&&q!Q/U	, ??<0Aq68qEb||z)))q!Q2|45	B' :s   E6r+   )r.  r  )r2   r%   )r%   r2   r  c                 ~   t        j                  d      }t        j                  d      dz   }t        j                  ||      D cg c]	  \  }}||f }}}|dz  d d d f   |dz  d|z  z   d d d f   z  }t	        ||f||t
        j                        }t         ||      |j                         d       y c c}}w )	Nr   r   r   r2   r0   rF  rL   rc   )	r@   rD   r  r  r   rI  rJ  r   r  )	rF   r+   re   r   rH  rH   r  r  rn   s	            rI   r  zTestMakeND.test_2D_mixedF	  s     IIaLIIaL3!*!2!21a!89!8Aq!f!89Q$4AqD1Q3Ja#88Aq66Qs{{CR&,,.u=	 :s   B9c           	          t        j                  g d      }t        j                  g d      }t        j                  g dg dg dg dg dg dg      }|||fS )N)r   r5   r6   r7   ri  rj  )r%   r0   r%   r0   r%   r%   )r%   r0   r2   r0   r%   r%   )r%   r0   r0   r0   r%   r%   )r@   r  rD  s       rI   _get_sample_2d_datazTestMakeND._get_sample_2d_dataQ	  sR    HH./HH./HH""""""	
 !Qwr^   c                     | j                         \  }}}t        ||f|d      }t        ||f|d      }t        j                  g dg dg      j
                  }t         ||       ||      d       y )	Nr%   r   r?  r@  r%   gffffff@g333333@r   ffffff
@333333?r2   r%   rS  rT  r7   r3  r'   r2   rb   rc   rP  r   r   r@   r  ro  r   rF   re   r   rE  rn   r  r  s          rI   test_2D_vs_RGI_linearz TestMakeND.test_2D_vs_RGI_lineara	  sq    **,1aAq61*%q!faAXX668 99: 	 	R#b'6r^   c                    | j                         \  }}}t        ||f|dt        j                        }t	        ||f|d      }t        j                  g dg dg      j                  }t         ||       ||      d       y )	Nr2   rF  cubic_legacyr@  rR  rU  rb   rc   	rP  r   rI  rJ  r   r@   r  ro  r   rW  s          rI   test_2D_vs_RGI_cubiczTestMakeND.test_2D_vs_RGI_cubick	  sw    **,1aAq61#++>%q!faGXX668 99: 	 	R#b'6r^   rG  c                     | j                         \  }}}t        ||f|d|d      }t        ||f|d      }t        j                  g dg dg      j
                  }t         ||       ||      d	       y )
Nr2   gư>)r+   rG  rO   rZ  r@  rR  rU  rb   rc   rV  )rF   rG  re   r   rE  rn   r  r  s           rI   test_2D_vs_RGI_cubic_iterativez)TestMakeND.test_2D_vs_RGI_cubic_iterativeu	  sw     **,1aAq61&tD%q!faGXX668 99: 	 	R#b'6r^   c                    | j                         \  }}}t        ||f|dt        j                        }t	        ||f|d      }t        j                  g dg dg      j                  }t         ||       ||      d       y )	Nr   rF  quintic_legacyr@  rR  rU  rb   rc   r[  rW  s          rI   test_2D_vs_RGI_quinticz!TestMakeND.test_2D_vs_RGI_quintic	  sx    **,1aAq61#++>%q!fa8HIXX668 99: 	 	R#b'6r^   zk, meth))r%   r?  )r2   rZ  )r   r`  c                    t         j                  j                  d      }t        j                  |j	                  d            }t        j                  |j	                  d            }t        j                  |j	                  d            }|j	                  d      }t        |||f||t        j                        }t        |||f||      }	t         j                  j	                  d	d
d      }
t         ||
       |	|
      d       y )Ni@ r   r   r   r   r   rF  r@  gffffff?r  r:   ra  rb   rc   )
r@   rE   rb  cumsumrc  r   rI  rJ  r   r   )rF   r+   methrndmre   r   rE  r  rn   r  r  s              rI   test_3D_random_vs_RGIz TestMakeND.test_3D_random_vs_RGI	  s     yy$$V,IIdlll*+IIdlll*+IIdlll*+9-Aq!9f#++F%q!QiEYY3Sw?R#b'6r^   c                 :   | j                         \  }}}ddi}t        t        d      5  t        ||f|fddi| d d d        t        t        d      5  t        ||ft	        j
                  ||f      fddi| d d d        y # 1 sw Y   JxY w# 1 sw Y   y xY w)Nmaxiterr%   rG  r  r+   r2   )rP  r<   r>   r   r@   r   )rF   re   r   rE  solver_argss        rI   test_solver_err_not_convergedz(TestMakeND.test_solver_err_not_converged	  s    **,1a !n:X6A6Q6+6 7 :X6A		1a& 1FQF+F 76 76 76s   B'BBBN)r   r   r   rD  rM  rS   rG  rH  r  rP  rX  r\  rI  gmresgcrotmkr^  ra  rf  rj  r   r^   rI   r=  r=  	  s    7(B4 [[S"JK> L> 77 [[X		3;;'?@7 A77 [[N77Gr^   r=  c                   H    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)
TestFpchecc                    d}t        j                  d      j                  dd      }t        j                  d      }t        j                  t
        d      5  t        j                  |||       d d d        t        j                  t
        d      5  t        j                  |||       d d d        y # 1 sw Y   ExY w# 1 sw Y   y xY w)Nr%   r  r0   r   z1D sequencer  )r@   rD   rl   rS   r   r>   _bfpcheckrF   r+   r)   re   s       rI   test_1D_x_tzTestFpchec.test_1D_x_t	  s    IIbM!!!Q'IIbM]]:];JJq!Q < ]]:];JJq!Q <; <; <;s   B4C 4B= C	c                    d}d|dz   z  dz
  }|dz   }t        j                  |      }t        j                  |      }t        j                  |||      dk(  sJ t	        j
                  t        d      5  t        j                  |||       d d d        d|dz   z  dz   }||z
  dz
  }t        j                  |      }t        j                  |      }t        j                  |||      dk(  sJ t	        j
                  t        d      5  t        j                  |||       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr2   r0   r%   r;   rW   z	Need k+1*r  )	r@   rD   dfitpackfpchecrS   r   r>   rp  rq  )rF   r+   rG   r[  r)   re   s         rI   test_condition_1zTestFpchec.test_condition_1	  s   AY]FIIaLIIaLq!Q'2---]]:[9JJq!Q : qsGaKEAIIIaLIIaLq!Q'2---]]:[9JJq!Q :9 :9 :9s   4D)D5)D25D>c                    d}dg|dz   z  dgz   dg|dz   z  z   }g d}t        j                  |||      dk(  sJ t        j                  |||      J |j	                         }|d   |d<   t        j                  |||      dk(  sJ t        j                  t        d	
      5  t        j                  |||       d d d        |j	                         }|d   |d<   t        j                  |||      dk(  sJ t        j                  t        d
      5  t        j                  |||       d d d        y # 1 sw Y   yxY w# 1 sw Y   y xY w)Nr2   r   r%   r0   r   )r%   r0   r2   r3   rh  r.   r~   zLast k knots*r  zFirst k knots*ru  rv  rp  rq  r  rS   r   r>   )rF   r+   r)   re   tts        rI   test_condition_2zTestFpchec.test_condition_2	  s*    C1IOqc1Q3i'q!Q'1,,,zz!Q"***VVXA2q"a(B...]]:_=JJq"a  > VVX21q"a(B...]]:-=>JJq"a  ?> >= ?>s   "D2D>2D;>Ec                    d}dg|dz   z  ddgz   dg|dz   z  z   }g d}t        j                  |||      dk(  sJ t        j                  |||      J dg|dz   z  ddgz   dg|dz   z  z   }t        j                  |||      dk(  sJ t	        j
                  t        d	      5  t        j                  |||       d d d        y # 1 sw Y   y xY w)
Nr2   r   r%   r0   r   r%   r0   r2   rs  r3   rh     zInternal knots*r  )ru  rv  rp  rq  rS   r   r>   rr  s       rI   test_condition_3zTestFpchec.test_condition_3	  s    C1IA!ac*"q!Q'1,,,zz!Q"***C1IA!ac*q!Q'2---]]:->?JJq!Q @??s   #CCc                 2   d}dg|dz   z  dg|dz   z  z   }g d}t        j                  |||      dk(  sJ t        j                  |||      J |j	                         }|d   |d<   t        j                  |||      dk(  sJ t        j                  |||      J |j	                         }|d   dz
  |d<   t        j                  |||      dk(  sJ t        j                  t        d      5  t        j                  |||       d d d        |j	                         }|d	   dz   |d	<   t        j                  |||      dk(  sJ t        j                  t        d      5  t        j                  |||       d d d        y # 1 sw Y   |xY w# 1 sw Y   y xY w)
Nr2   r   r%   r   r}  r  zOut of bounds*r  r.   ry  )rF   r+   r)   re   r\   s        rI   test_condition_4zTestFpchec.test_condition_4	  sy    C1IQqS	!"q!Q'1,,,zz!Q"***VVX!1r1a(A---zz!Q"***VVX!q1r1a(B...]]:-=>JJr1a  ? VVX22r1a(B...]]:-=>JJr1a  ?> ?> ?>s   .F FF
Fc                    d}g d}g d}t        j                  |||      dk(  sJ t        j                  t        d      5  t        j                  |||       d d d        g d}t        j                  |||      dk(  sJ t        j                  t        d      5  t        j                  |||       d d d        y # 1 sw Y   exY w# 1 sw Y   y xY w)Nr%   )r   r   r%   r0   r0   )r  r  r  ra   Schoenberg-Whitney*r  )r   r   r   ru  rv  rS   r   r>   rp  rq  rr  s       rI   test_condition_5_x1xmz TestFpchec.test_condition_5_x1xm
  s    q!Q'2---]]:-BCJJq!Q D q!Q'2---]]:-BCJJq!Q DC DC
 DCs   B>C
>C
Cc                     d}g d}ddg}t        j                  |||      dk(  sJ t        j                  |||      J y )Nr%   )r   r   r%   r%   r   g333333?r   )ru  rv  rp  rq  rr  s       rI   test_condition_5_k1zTestFpchec.test_condition_5_k1
  sI    #Jq!Q'1,,,zz!Q"***r^   c                    d}dg|dz   z  dgz   dg|dz   z  z   }dgdz  }t        j                  |||      dk(  sJ t        j                  t        d      5  t        j                  |||       d d d        dg|dz   z  dgz   dg|dz   z  z   }dgdz  }t        j                  |||      dk(  sJ t        j                  t        d      5  t        j                  |||       d d d        y # 1 sw Y   ~xY w# 1 sw Y   y xY w)	Nr2   r   r%   r0   r   ra   r  r  r  rr  s       rI   test_condition_5_1zTestFpchec.test_condition_5_1#
  s    C1IOqc1Q3i'CEq!Q'2---]]:-BCJJq!Q D C1IOqc1Q3i'CEq!Q'2---]]:-BCJJq!Q DC DC DCs   C,C8,C58Dc                    d}dg|dz   z  ddgz   dg|dz   z  z   }dgdz  dgz   }t        j                  |||      dk(  sJ t        j                  t        d	
      5  t        j                  |||       d d d        dgdz  ddgz   }t        j                  |||      dk(  sJ t        j                  |||      J y # 1 sw Y   JxY w)Nr2   r   r%   r0   r   r  r3   ra   r  r  r  rr  s       rI   test_condition_5_2zTestFpchec.test_condition_5_22
  s    C1IA!ac*E!GqcMq!Q'2---]]:-BCJJq!Q D E!Gq!fq!Q'1,,,zz!Q"*** DCs   B==Cc                     d}g d}g d}t        j                  |||      dk(  sJ t        j                  t        d      5  t        j                  |||       d d d        y # 1 sw Y   y xY w)Nr%   )	r   r   r0   r2   r3   r   r   r   r   )r%   r%   r%   @r  r  rL  ra   r  r  r  rr  s       rI   test_condition_5_3zTestFpchec.test_condition_5_3A
  sX    ')q!Q'2---]]:-BCJJq!Q DCCs   A##A,N)r   r   r   rs  rw  r{  r  r  r  r  r  r  r  r   r^   rI   rn  rn  	  s4    	  *!, !> + + r^   rn  r  )#   r2   r  )Pr  r  r  numpyr@   numpy.testingr   r   r   rS   r   r<   rB  r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scipy.linalgr^  rh  scipy.sparse.linalgsparserI  scipy.interpolate._bsplinesr   r   r   r   r   scipy.interpolate._fitpack_implinterpolate_fitpack_implr   scipy._lib._utilr   scipy.interpolate._ndbspliner   r    ru  r!   rp  r#   rJ  r  r  rr   rs   r   rd   r   rQ   r  r  r  rV  rq  rs  r  r  r  r   r)  r  r  r=  rn  r   r^   rI   <module>r     s1   	    @ @ *     
  ! !E E 0 / & 5 3 -K	" K	"\v$ v$r6.&
G>H$+$\+ \+~t? t?n88W' W't*
C3 C3P	87: :z]9 ]9@NG NGba  a r^   