
    e!h-                    Z   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ 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  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-Z-m.Z.m/Z/ d dl0m1c m2Z3 d dl4m5Z5 d d	l6m7Z7 d d
l8m9Z9 d dlm:Z; d dlm<Z= d dlm>Z>  G d d      Z? G d d      Z@d ZAd ZBd ZCd ZDd ZEd ZFdFdZGdGdZHd ZI G d d      ZJ G d d      ZKd ZLdHd ZMej                  j                  d!d"d#g      ZP G d$ d%      ZQ G d& d'      ZRdId(ZSd) ZTd* ZU G d+ d,      ZVd- ZW G d. d/      ZXd0 ZYd1 ZZd2 Z[ G d3 d4      Z\ G d5 d6      Z] G d7 d8      Z^ G d9 d:      Z_d; Z`d< Za G d= d>      Zbd? Zc G d@ dA      Zd G dB dC      Ze G dD dE      Zfy)J    N)suppress_warnings)xp_assert_equalxp_assert_close)raises)BSplineBPolyPPolymake_interp_splinemake_lsq_spline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)generate_knotsmake_splrepmake_splprep)	AxisError)_run_concurrent_barrier)make_ndbspl)	_dfitpack)	_bsplines)_dierckxc                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Ze jB                  jE                  d e#dd             d!        Z$d" Z%e jB                  jL                  d#        Z'e jB                  jE                  d$g d%      e jB                  jE                  d& e#d'            d(               Z(d) Z)d* Z*d+ Z+e jB                  jE                  d,g d-      d.        Z,e jB                  jE                  d,g d-      d/        Z-d0 Z.d1 Z/e jB                  jL                  d2        Z0d3 Z1y4)5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                        }t
        j                  j                  |      }t        |||      }t        ||j                         t        ||j                         ||j                  k(  sJ y # 1 sw Y   xY w)N                 ?      ?r   tckignore)invalidr   r)      r   r)   r4         r4   )        r8   r+          @      @      @)r+   r+   r+   cubic      @)r8   r   r)   r)   r4   r6   )r+   r)   r)      r6   dtype)assert_raises	TypeError
ValueErrorr   dictnperrstatenaninfarangefloat64randomr   r-   r.   r/   )selfnr/   r-   r.   bs         m/var/www/html/diagnosisapp-backend/venv/lib/python3.12/site-packages/scipy/interpolate/tests/test_bsplines.py	test_ctorzTestBSpline.test_ctor)   s   y*-w 	1!SbTQ/	1[[* 	S*gRBFFtq1QR	S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!e2::.IIQAq!133133ACCxx;	S 	Ss   3I

Ic                 2   t               }|j                  }t        |j                  |d   dd       t        |j                  |d   dd       |j
                  |d   k(  sJ t        j                  t              5  d|_        d d d        y # 1 sw Y   y xY w)Nr   V瞯<atolrtolr)   r4   foo)	_make_random_splinetckr   r-   r.   r/   pytestr   AttributeError)rM   rO   rY   s      rP   test_tckzTestBSpline.test_tckL   s}    !eeSV%e<SV%e<ssc!f}} ]]>* 	AE	 	 	s   <BBc                    t        j                  ddd      }t        ddgdgd      }t         ||      t        j                  |      dz         t        g dddgd      }t         ||      t        j
                  |d	k  dd
             y )Nr   r)   
   r:   r,   )r   ffffff?r)   r6   r7   r_   r;   )rF   linspacer   r   	ones_likewhererM   xxrO   s      rP   test_degree_0zTestBSpline.test_degree_0X   su    [[Ar"q!f*"r||B/#56lq!f2"rxxT	3<=    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 )
Nr5   r)   r4   r6   r)   r6   2   r   r4   +=rU   )r   rF   r`   r   B_012r   )rM   r-   r.   r/   rO   xs         rP   test_degree_1zTestBSpline.test_degree_1a   s    Aq!KK1b!!U1X!U1Q3Z7!A$uQqSz/I!5	*a!Q+QqT>rf   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 )Nr6   r   r)   r+   r9   r:   r;   r2   g      r9   r^   Textrapolaterj   rk   )rF   asarrayr   reshaper   r`   r   r   )rM   r/   r-   r.   bpbsplrd   s          rP   test_bernsteinzTestBSpline.test_bernsteinl   s    JJsAaCyA3!9,-JJ'(199R#aV,q!Q[[b"%240RT2	@b1a),Ru	.rf   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)   ri   rj   rk   )rX   rY   rF   r`   _naive_evalr   _naive_eval_2)
rM   rO   r-   r.   r/   rd   y_brm   y_ny_n2s
             rP   test_rndm_naive_evalz TestBSpline.test_rndm_naive_evalz   s      !%%1a[[1q!Aw+e0231{1aA&33Su-356aaAq)66T.	 4 7s   B1Bc           	          t               }|j                  \  }}}t        j                  ||   || dz
     d      }t	         ||      t        ||||f      d       y ry   rX   rY   rF   r`   r   r   rM   rO   r-   r.   r/   rd   s         rP   test_rndm_splevzTestBSpline.test_rndm_splev   sV    !%%1a[[1q!Aw+"uR!Q3%@rf   c                    t         j                  j                  d      }t        j                  |j                  d            }|j                  d      }t	        ||      }t        | }|j                  |j                  }}t        j                  ||   || dz
     d      }t         ||      t        ||      d       y )N     r)   P   rj   rk   )rF   rL   RandomStatesortr   r   r-   r/   r`   r   r   )	rM   rngrm   yrY   rO   r-   r/   rd   s	            rP   test_rndm_splrepzTestBSpline.test_rndm_splrep   s    ii##D)GGCJJrN#JJrNQlSMssACC1[[1q!Aw+"uR~E:rf   c                 <   t               }t        j                  |j                        |_        t        j                  |j
                  |j                     |j
                  |j                   dz
     d      }t         ||      t        j                  |             y )Nr)   d   )rX   rF   ra   r.   r`   r-   r/   r   )rM   rO   rd   s      rP   test_rndm_unityzTestBSpline.test_rndm_unity   se    !ll133[[QSS133tAv;4"r||B/0rf   c                 V   t         j                  j                  d      }d\  }}t        j                  |j                  |            }|j                  |ddf      }t	        |||      }||   || dz
     }}|||z
  |j                  d      z  z   }	 ||	      j
                  dk(  sJ y )	Nr      r6         sizer)   r6   r7      )r6   r7   r   r   r   )rF   rL   r   r   r   shape)
rM   r   rN   r/   r-   r.   rO   tmtprd   s
             rP   test_vectorizationzTestBSpline.test_vectorization   s    ii##D)1GGCJJqM"JJQ1IJ&Aq!1q!AwB27cjj333u{{o---rf   c           	      X   t         j                  j                  d      }d\  }}t        j                  |j                  ||z   dz               }|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 )	Nr   )!   r6   r)   r2   r   ri   rj   rk   )	rF   rL   r   r   r_r   r`   r   r   )rM   r   rN   r/   r-   r.   c_padrO   b_paddtrd   s              rP   
test_len_czTestBSpline.test_len_c   s
    ii##D)1GGCJJqs1u%&JJqM aAaC()1a#WQq%95rUQqT\[[1AbEBJ3"uRyu5"uR!Q3%@"uR!UA7eDrf   c           	          t               }|j                  \  }}}||   || dz
     }}dD ])  }t         |||g|       ||dz   |dz
  g|      dd       + y )Nr)   TF绽|=&.>Hz>rT   rX   rY   r   )	rM   num_parallel_threadsrO   r-   _r/   r   r   extraps	            rP   test_endpointszTestBSpline.test_endpoints   ss    !%%1a1q!AwB# 	WFAr2h/rEz2:6?dQUW	Wrf   c           	          t               }|j                  \  }}}t         |||dz   | dz
   dz
         |||dz   | dz
   dz         d       y )Nr)   r   r   rk   r   )rM   r   rO   r-   r   r/   s         rP   test_continuityzTestBSpline.test_continuity   s\    !%%1a!AaC1+-.!AaC1+2E0F	rf   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 )	Nr2   r   r)   ri   Trq   F)extr   )rM   rO   r-   r.   r/   r   rd   masks           rP   test_extrapzTestBSpline.test_extrap   s    !%%1arUQqT\[[1AqbdGbL"5!r	b1aRT7l+ 	"T(5"T(6	8 	"$/b1a)+	-rf   c                     t               }|j                  \  }}}|d   dz
  |d   dz   g} ||      }t        j                  t        j                  |            rJ y )Nr   r)   r2   )rX   rY   rF   allisnan)rM   rO   r-   r   r/   rd   yys          rP   test_default_extrapzTestBSpline.test_default_extrap   sY    !%%1adQh"	"rU66"((2,''''rf   c           	      4   t         j                  j                  d      }t        j                  |j                  d            }|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      r7   r6   periodicrq   r)   r2   r   ri   )r2   r         ?r)   T)
rF   rL   r   r   r   r   r`   r   r   r   )
rM   r   r-   r.   r/   rO   rN   r   rd   xys
             rP   test_periodic_extrapz TestBSpline.test_periodic_extrap   s   ii##D)GGCJJqM"JJqMAq!4FFa!erUQqT\[[1AaD2Ir2qTR!A$Y1Q4!A$;//"uR!Q34 qTR!A$Y1Q4!A$;//"*5q7NOrf   c                     t               }|j                  \  }}}t        j                  |||f      }t	        j
                  ||   ||    d      }t         ||       ||      dd       y )Nr   rj   rT   )rX   rY   r	   from_splinerF   r`   r   )rM   rO   r-   r.   r/   pprd   s          rP   
test_ppolyzTestBSpline.test_ppoly   sa    !%%1a1ay)[[1q!uc*"r"vE>rf   c                 j   t               }|j                  \  }}}t        j                  |d   |d   d      }t        j                  ||f   }t        d|dz         D ])  }t        ||||f|      }t        | |||      d       + t         |||dz         t        j                  |      d       y )	Nr   r2   ri   r)   dernurj   rk   )	rX   rY   rF   r`   r   ranger   r   
zeros_like)rM   rO   r-   r.   r/   rd   r   yds           rP   test_derivative_rndmz TestBSpline.test_derivative_rndm   s    !%%1a[[1qub)UU2q5\AaC= 	;CrAq!9#.BB"E:	;
 	"1r}}R'8uErf   c                    d}g d}t         j                  j                  d      }t         j                  dd|j                  d      ddf   }t	        |||      }t        j
                  g d      }t         |||dk7     dz
         |||dk7     dz                t        j                   |d	       |d
            rJ t        j
                  ddg      }t         ||dz
  d       ||dz   d             t        j
                  ddg      }t        j                   ||dz
  d       ||dz   d            rJ t        j                   ||dz
  d       ||dz   d            rJ y )Nr4   )r2   r2   r   r)   r)   r6   r7   r   r   r   r   r   r   r   r   )r)   r6   r7   r   r   r   g2H@gη   @r6   r7   r)   r   )rF   rL   r   r   r   rs   r   allclose)	rM   r/   r-   r   r.   rO   rm   x0x1s	            rP   test_derivative_jumpsz!TestBSpline.test_derivative_jumps  sP    2ii##D)EE!Q

1q!+,Aq! JJ|$!AF)e+,!AF)e+,	.;;q{AgJ777 ZZA"u*+"u*+	-ZZA;;qe2Ab5jQ4GHHH ;;qUq11QY13EFFFFrf   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 )Nr2   r7   r   r   r)   r4   r6   )r-   rj   rk   r   r)   r)   r4   r   r4   r^   r)   r9   )rF   r`   r   basis_elementr   r   r-   r.   r/   B_0123rb   rc   s      rP   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rf   c           	          t               }|j                  \  }}}t        j                  ||   || dz
     d      }t	         ||      t        ||||      d       y )Nr)   r   rj   rk   )rX   rY   rF   r`   r   _sum_basis_elementsr   s         rP   test_basis_element_rndmz#TestBSpline.test_basis_element_rndm3  sU    !%%1a[[1q!Aw+"22q!Q?eLrf   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   rj   rk   )	rX   rY   r   r.   realimagrF   r`   r   )	rM   rO   r-   r.   r/   ccb_reb_imrd   s	            rP   
test_cmplxzTestBSpline.test_cmplx9  s    !%%1a(^Ar1q!##((A&q!##((A&[[1q!Aw+"

DH59"

DH59rf   c                     t        j                  g d      }t        j                   |t        j                              sJ y )Nr   )r   r   rF   r   rH   rM   rO   s     rP   test_nanzTestBSpline.test_nanF  s,    !!,/xx"&&	"""rf   c                    t        d      }|j                  \  }}}t        |||      }t        j                  ||   || dz
     d      }t        d|      D ].  }|j                         }t         |||       ||      dd       0 y )Nr   r/   r)   r   -q=rT   )rX   rY   r   rF   r`   r   
derivativer   )rM   rO   r-   r.   r/   b0rd   js           rP   test_derivative_methodz"TestBSpline.test_derivative_methodK  s    !$%%1aQ1[[1q!Aw+q! 	FAABr1Iqu5uE	Frf   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   rj   rT   )
rX   rY   rF   r`   r   antiderivativer   c_dstackr   r   s         rP   test_antiderivative_methodz&TestBSpline.test_antiderivative_methodT  s    !%%1a[[1q!Aw+7((*557;"E	7 EE!Q'NIIq!fAq!7((*557;"E	7rf   c           
      	   t        j                  g d      }t        |j                  dd      t	        j
                  d             t        |j                  dd      t	        j
                  d             t        |j                  dd      t	        j
                  d             t        |j                  dd      t	        j
                  d             t        |j                  ddd	      t	        j
                  d             t        |j                  ddd
	      t	        j
                  d             t        |j                  ddd
	      t	        j
                  d             t        |j                  ddd
	      t	        j
                  t        j                  dd|j                                     d|_	        |j                         }t	        j
                   |d       |d      z
        }t        |j                  dd      |       t        |j                  dd      t	        j
                  d|z               t        |j                  dd      |       t        |j                  dd      t	        j
                  d|z               t        |j                  dd      t	        j
                   |d       |d      z
               t        |j                  dd      t	        j
                   |d       |d      z
   |d      z    |d      z
               t        |j                  dd      t	        j
                   |d       |d      z
   |d      z    |d      z
               t        |j                  dd      t	        j
                   |d       |d      z
   |d      z    |d      z
  d|z  z                t        |j                  dd      t	        j
                   |d       |d      z
               t        |j                  dd      t	        j
                   |d       |d      z
               t        |j                  dd      t	        j
                   |d       |d      z
  d|z  z
               y )Nr3   r   r)   r         r2   r8   Trq   Fr   r4   iii      ?r6   g      +@   r   ir7   )r   r   r   	integraterF   rs   _implr   rY   rr   r   )rM   rO   i
period_ints       rP   test_integralzTestBSpline.test_integralb  sI   !!),Aq)2::c?;Aq)2::h+?@Aq)2::d+;< 	B*BJJsO<Bt<bjjoNBu=rzz#OAru=rzz(?ST 	Aru=

5<<2quu#=>	@ #ZZ!qt,
Aq):6Aq)2::b:o+FGB+Z8B+RZZJ-GHC-

1S6AcF?3	5C+

1Q4!A$;1#5##>?	AHf5

1Q4!A$;1#5##>?	AC0

1Q4!A$;1#5##>Z#OP	R 	Ar*BJJqtad{,CDB,bjj1!.EFAr*

1Q4!A$;Z#?@	Brf   c                     g d}t        ||      }d|_        t        j                  |      }dD ]1  \  }}t	        |j                  ||      |j                  ||             3 y )Nr5   r   ))r   )r   r   )r      )r
   rr   r	   r   r   r   )rM   rm   rO   pr   r   s         rP   test_integrate_ppolyz TestBSpline.test_integrate_ppoly  s`    q!$"a 5 	1FBAKKB/KKB/1	1rf   c                     t        j                  g d      }dD ]C  }|j                  dd|      }t        |t        j
                        sJ |j                  dk(  rCJ  y )Nr3   r   r   r)   rq   )r   r   r   
isinstancerF   ndarrayndim)rM   rO   rr   ress       rP   test_integrate_0D_alwaysz$TestBSpline.test_integrate_0D_always  sY    !!),( 	!K++a+<Cc2::...88q= =	!rf   c                      G d dt               }|j                  g d      }|j                  |k(  sJ |j                         j                  |k(  sJ |j	                         j                  |k(  sJ y )Nc                       e Zd Zy)'TestBSpline.test_subclassing.<locals>.BN)__name__
__module____qualname__ rf   rP   Br    s    rf   r  )r   r)   r4   r4   )r   r   	__class__r   r   )rM   r  rO   s      rP   test_subclassingzTestBSpline.test_subclassing  sg    	 	 OOL){{a||~''1,,,!++q000rf   axisr   r7   c                    d\  }}t        j                  dd||z   dz         }g d}|dz  }|j                  ||       t        |      }t         j                  j                  d      }|j	                  |      }t        ||||      }	|	j                  j                  ||   f|d | z   ||dz   d  z   k(  sJ |j	                  d	      }
 |	|
      j                  |d | |
j                  z   ||dz   d  z   k(  sJ |j                   dz
  |j                  fD ]$  }t        t        t        fi t        ||||
       & t        ||||      j                         t        ||||      j                  d      t        ||||      j                         t        ||||      j                  d      fD ]  }|j                  |	j                  k(  rJ  y )Nr   r   r)   r   r   r   r7   r   r   r  r   )r-   r.   r/   r  r4   )rF   r`   r   tuplerL   r   r   r.   r   r  rB   r    rE   r   r   r  )rM   r  rN   r/   r-   shpos_axisr   r.   rO   xpaxb1s                rP   	test_axiszTestBSpline.test_axis  s   1KK1a!eai( !8
		(A2Yii##D)JJBJAq!$'ssyyR\Ob(m;b!oMMMMZZ	"u{{b(mbhh6HQJKHHHH FF7Q;' 	:B)W : 1QR8:	:
 1a.99;1a.99!<1a.==?1a.==a@B 	%B 77aff$$$		%rf   c                     d}g d}t        j                  g dg dg      }t        |||d      }t        ||d   |      }t        ||d   |      }t         |d	       |d	       |d	      g       y )
Nr4   )r   r)   r4   r6   r7   r   r   )r2   r4   r   r2   )r4   r   r)   r2   r  r   r)   r=   )rF   arrayr   r   )rM   r/   r-   r.   splspl0spl1s          rP   test_neg_axiszTestBSpline.test_neg_axis  sn    !HHnm45aAB'q!A$"q!A$"C49d3i"89rf   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                 B   t         j                  j                  d      }t        j                  |j	                  |       dz  dz
        }|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   r2   r   r/   bc_typer)   rj   rk   N)rF   rL   r   r   random_sampler
   eyelenr-   r   design_matrixtoarrayr   r.   )
rN   r/   r%  r   rm   r   rv   r.   des_matr_defdes_matr_csrs
             rP   run_design_matrix_testszHTestBSpline.test_design_matrix_bc_types.<locals>.run_design_matrix_tests  s     ))''-C))!,r1B67A!!!$r)B.A*$u!%aaADs466{Q*+A074661a03L"00151244;GI  L466115AL,UCrf   r?   r6   clampednaturalr   r4   
not-a-knotr   r   r   N)r   )rM   r-  rN   r/   bcs        rP   test_design_matrix_bc_typesz'TestBSpline.test_design_matrix_bc_types  s|    	D* ( 	.B#Aq"-	. q!Q 	8A#Aq,7	8 q! 	6A#Aq*5	6rf   rr   )FTr   degreer   c           	         t         j                  j                  d      }|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   r^   r)   r4   r   N)rF   rL   r   r&  aminamaxr   r`   r'  r(  r   r   r)  r*  r  rZ   r   rD   )rM   rr   r4  r   rm   xminxmaxr/   r-   r.   bsplines              rP   'test_design_matrix_same_as_BSpline_callz3TestBSpline.test_design_matrix_same_as_BSpline_call  s    ii##D)bFQJ/0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   2GGc                    t         j                  j                  d      }d}d}t        j                  |j	                  |      dz  dz
        }|j	                  |      dz  dz
  }t        |||      }t        dd      D ]V  }|d | }|d | }	t        j                  ||j                  |      j                         }
t        |
|j                  z  |	d	
       X y )Nr   r^   r6   r#  r   r   r)   r7   rj   rk   )rF   rL   r   r   r&  r
   r   r   r)  r-   r*  r   r.   )rM   r   rN   r/   rm   r   rv   r   xcycr,  s              rP   test_design_matrix_x_shapesz'TestBSpline.test_design_matrix_x_shapes  s    ii##D)GGC%%a(2-23a 2%*!!Q!,q! 	CA2AB2AB"00151244;GI  L46612EB	Crf   c                 x    g d}t        j                  d|d      j                         }t        |g dgd       y )N)r+   r+   r+   r9   r:   r;   r;   r;   r9   r6   )g      ?gmਪ?gK}\UU?r8   rj   rk   )r   r)  r*  r   )rM   r-   des_matrs      rP   test_design_matrix_t_shapesz'TestBSpline.test_design_matrix_t_shapes'  s7    ,((Q2::<;<"	$rf   c                    t         j                  j                  d      }d}d}t        j                  |j	                  |      dz  dz
        }|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   r^   r6   r#  r   r   r2   r4   )r8   r+   r9   r:   r;         @rp   )rF   rL   r   r   r&  r
   rB   rD   r   r)  r-   )rM   r   rN   r/   rm   r   rv   r-   s           rP   test_design_matrix_assertsz&TestBSpline.test_design_matrix_asserts/  s    ii##D)GGC%%a(2-23a 2%*!!Q!, :& 	6!!!TVVDbD\15	6$:& 	+!!!Q*	+ 	+	6 	6	+ 	+s   (C,C8,C58Dr%  )r0  r/  r   r1  c                    t         j                  j                  d      }t        j                  |j                  d            }|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   r2   r%  r)   rS   rk   )rF   rL   r   r   r   r   from_power_basisr`   r   r
   r.   )	rM   r%  r   rm   r   cbrv   rd   bspl_news	            rP   test_from_power_basisz!TestBSpline.test_from_power_basisA  s     ii##D)GGCJJrN#JJrNj aDAbEAw/''G<[[Ar"2Ru5%aG<

7rf   c                    t         j                  j                  d      }t        j                  |j                  d            }|j                  d      |j                  d      dz  z   }|dk(  r|d   |d<   t	        |||      }t        j                  ||      }t        ||j                  |      }t        ||j                  |      }t        |j                  |j                  d|j                  z  z   d	       y )
Nr   r   r*   r   r   r2   rG  rS   rk   )rF   rL   r   r   r   r   rH  r
   r   r   r   r.   )	rM   r%  r   rm   r   rI  rv   bspl_new_realbspl_new_imags	            rP   test_from_power_basis_complexz)TestBSpline.test_from_power_basis_complexP  s     ii##D)GGCJJrN#JJrNSZZ^b00j aDAbEAw/''G<*1affgF*1affgF"}2F FUSrf   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]
        r5   )r)   r)   r)   r)   r)   r0  rG  )r+   r)   r)   r)   r)   r)   r)   rS   rk   N)rF   r  r   rH  r   r   r.   )rM   rm   r   rv   s       rP   test_from_power_basis_exmpz&TestBSpline.test_from_power_basis_exmp^  sO     HH_%HH_%''Aq)(L09; 7eDrf   c                 d   t        j                  ddg      }t        j                  dg      }|j                  d       |j                  d       t        j                  ddd      }|j                  d       t	        ||d      }t         ||      t        j                  |      dz         y )Nr   r)   r:   Fwriter^   r,   )rF   r  setflagsr`   r   r   ra   )rM   r-   r.   rd   rO   s        rP   test_read_onlyzTestBSpline.test_read_onlyq  s    HHaVHHcUO	


	


[[Ar"
% a1""r||B/#56rf   c                 8    t               }d }t        d||       y )Nc                 v    |j                   \  }} }t        j                  ||   || dz
     d      } ||       y )Nr)   i'  )rY   rF   r`   )r   rO   r-   r/   rd   s        rP   	worker_fnz/TestBSpline.test_concurrency.<locals>.worker_fn  s8    eeGAq!QqT1aRT7E2BbErf   r^   )rX   r!   )rM   rO   rY  s      rP   test_concurrencyzTestBSpline.test_concurrency~  s      !	
 	 Iq1rf   c           	      n   t               }t        j                  ddd      } ||      }t        j                         }t        j
                  t        |j                  d| d            d|j                  j                  |j                  j                        }|j                  |d d  t        j
                  t        |j                  d| d            d|j                  j                  |j                  j                        }|j                  |d d  ||_        ||_        t         ||      |       y )	Nr   r)   r^   r-   z.datzw+)moderA   r   r.   )rX   rF   r`   	threadingget_native_idmemmapstrjoinr-   rA   r   r.   r   )rM   tmpdirrO   rd   expectedtidt_mmc_mms           rP   test_memmapzTestBSpline.test_memmap  s      ![[Ar"R5%%'yyV[[1SE78t ssyy		;##QyyV[[1SE78t ssyy		;##Q"x(rf   N)2r  r	  r
  rQ   r\   re   rn   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  rZ   markparametrizer   r  r   thread_unsafer3  r;  r?  rB  rE  rK  rO  rQ  rV  rZ  rg  r  rf   rP   r'   r'   '   s   !F
>	?./A
;1.E&W-(P$?FG4AM:#
F7&BP	1!1 [[VU2q\2% 3%:: [[(6 (6T [[],EF[[XuQx0 1 G4C"$+$ [[Y )C D8D8 [[Y )C D
TD
TE&7 [[	2 	2)rf   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	ej                  j                  dddg      d        Z
d Zd Zy)
TestInsertxval)r8   r+   r=   r7         @      @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   r6   r   rS   rk   r)   r2   r   )rF   rJ   sinr
   r   insert_knotr   r-   r.   r/   r   cosr   )rM   rm  rm   r   r  spl_1fspl_1rd   y1spl_y1spl_yyspl_yy1s               rP   test_insertzTestInsert.test_insert  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<rf   zxval, m))r8   r4   )r+   r6   )r   r   )r7   r4   )ro  r4   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   r6   r   mrS   rk   r)   r2   r   )rF   rJ   rq  r
   r   rr  r   r-   r.   r/   r   )	rM   rm  r}  rm   r   r  rt  ru  rd   s	            rP   test_insert_multizTestInsert.test_insert_multi  s     IIaLFF1IqL A+cQ'a(6)CEE6!8!45A!B%-QQsVUU2sAabEAcrFN++,Br7rf   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   r6   r4   )lowhighr   r  r  r   rS   rk   )rF   rL   default_rngr   uniformr   rr  r   )
rM   r   rN   r/   r-   r.   r  xvru  rd   s
             rP   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7rf   r  )	r   皙?r9   r;         @      @      @gffffff@ro  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   r6   r   rr   r   TperrS   rk   r)   r   r   r   )   r  )rF   rJ   rq  r   r   rr  r   rY   r   r-   r.   rL   r  r  r   )rM   r  rm   r   rY   r  ru  tfcfr/   rd   s              rP   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Frf   rr   Nr   c                    t        j                  d      dz  t         j                  z  }t        j                  |      t        j                  |      }}t        ||d|z  z   d      }||_        t        ||d      }||_        t        ||d      }||_        d}|j                  |      }	|j                  |      }
|j                  |      }t        |	j                  |
j                  d       t        |	j                  |j                  d       t        |	j                  |
j                  d|j                  z  z   d       y )	Nr   r4   r*   r6   r         @rS   rk   )rF   rJ   pirq  rs  r
   rr   rr  r   r-   r.   )rM   rr   rm   y_rey_imr  spl_respl_imr  ru  spl_1respl_1ims               rP   test_complexzTestInsert.test_complex  s    IIaLN255 VVAYq	d D2d7Na8%#Atq1(#Atq1(#$$R($$R(77R		\!9Frf   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)Nr  r6   r   r)   r4   r6   r7   r   r   r   rq   Tr  )	rF   r  onesr(  r   rB   rD   r   rr  )rM   r  r/   r-   r.   r  s         rP   +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)	Nr6   r   r)   r  r   r2   r   r|  )rF   r  r  r(  r   rB   rD   rr  )rM   r/   r-   r.   r  s        rP   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>)r  r	  r
  rZ   rh  ri  rz  r~  r  r  r  r  r  r  rf   rP   rl  rl    s    [[V%AB= C=@ [[C888 [[T $8 GG [[]T:,>?G @G, ($rf   rl  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   r  r   r)   r2   zder = z  k = )rU   rV   err_msg)rY   rF   uniquer   r   r   r/   )	rO   r   r   rU   rV   r-   r.   r/   rm   s	            rP   check_splevz,test_knots_multiplicity.<locals>.check_splev6  s    %%1aIIaLEE!A$s(C122A/2s:;a!QC0!As)se6!##.G	Irf   r)   r4   r6   r7   r   r   r)   r   )r   rj   rj   )rX   	enumerate_make_multiplesr   )r  r/   rO   r   r  r   s         rP   test_knots_multiplicityr  2  ss    I  6!$q12 	6EArAQ!} 6B3u56	66rf   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+   r8   _naive_Brm   r/   r   r-   c1c2s         rP   r  r  I  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rf   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-   rm   s     rP   	<genexpr>z_naive_eval.<locals>.<genexpr>f  s-     F1q1vAqsA..Fs   $'r   )rF   searchsortedr(  sumr   )rm   r-   r.   r/   r   s   ````@rP   rz   rz   \  s     	AaDyOOAq!A%Q41!A#6a#a&1*n$$Fa1FFFrf   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-   rm   s     rP   r  z _naive_eval_2.<locals>.<genexpr>o  s%     =qqthq!Q**=   !r(  r  r   rm   r-   r.   r/   rN   s   ```` rP   r{   r{   i  si    A!A#A!8O8q6Q;;Q41!=E!H===rf   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)   r8   r4   Frq   )r(  r   r   r   rF   
nan_to_num)rm   r-   r.   r/   rN   sr   rO   s           rP   r   r   r  s    A!A#A!8O8q6Q;;
A1X %@G!!!Aac!e*%@C	QqTBMM!$$$% Hrf   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   r4   r)   c                      y)Nr8   r  rm   s    rP   <lambda>zB_012.<locals>.<lambda>      rf   c                     | S r  r  r  s    rP   r  zB_012.<locals>.<lambda>  s    A rf   c                     d| z
  S Nr9   r  r  s    rP   r  zB_012.<locals>.<lambda>  s
    A rf   )rF   
atleast_1d	piecewiser  s    rP   rl   rl   }  se    
aA<<QUq1u-!VA.!VQ/1 )+~FH Hrf   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
|       t        j                  | ||      }|S )z0A quadratic B-spline function B(x | 0, 1, 2, 3).r)   r4   r   c                     | | z  dz  S r  r  r  s    rP   r  zB_0123.<locals>.<lambda>  s    1Q3r6 rf   c                     d| dz
  dz  z
  S )Ng      ?r   r4   r  r  s    rP   r  zB_0123.<locals>.<lambda>  s    41T6A+- rf   c                     d| z
  dz  dz  S )Nr:   r4   r  r  s    rP   r  zB_0123.<locals>.<lambda>  s    BqD19q= rf   c                      yNr+   r  r  s    rP   r  zB_0123.<locals>.<lambda>  r  rf   c                      y)Ng       r  r  s    rP   r  zB_0123.<locals>.<lambda>  r  rf   c                      yr  r  r  s    rP   r  zB_0123.<locals>.<lambda>  r  rf   znever be here: der=)rF   r  rD   r  )rm   r   condsfuncspiecess        rP   r   r     s    
aAUQUq1u%q1u-E
ax!-(* 
 .se455\\!UE*FMrf   c                     t         j                  j                  d      }t        j                  |j                  | |z   dz               }|j                  |       }t	        j
                  |||      S )N{   r)   )rF   rL   r   r   r   construct_fast)rN   r/   r   r-   r.   s        rP   rX   rX     sW    
))


$C


1Q3q5!"A

1A!!!Q**rf   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)   r2   )r.   r/   r-   copyr   )rO   r.   r/   t1s       rP   r  r    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   r;   r  r  )rF   r`   r  rs  r
   r-   r.   r/   rY   rd   r   rO   xnewr   r   r  r   b2)rM   rd   r   rO   r  s        rP   setup_methodzTestInterop.setup_method  s    [[BruuHb)VVBZr2&CCacc?#%r1 $&KK2bee8R0	UU133QSS=!))RH%!##tww,rf   c                    | j                   | j                  | j                  }}}t        t	        ||       ||      dd       t        t	        ||j
                         ||      dd       t        t        j                  |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                  t	        ||             ||      j                  |      dd       y c c}w # 1 sw Y   xY w)NrS   rT   zCalling splev.. with BSplinematchr)   r   )r  rO   r  r   r   rY   rF   rs   rB   rD   r  r   r.   r  	transposer-   r/   )rM   r  rO   r  rm   r  r   rY   s           rP   
test_splevzTestInterop.test_splev  s.   iia 	dA$e%	9dAEE*$e%	9

#>AE!QK#>?$e%	9
 :-KL 	$O	 5BDDII&'$.TT^^BttR

5s#344**2.U	H $?
	 	s   E5>E::Fc                    | j                   | j                  }}t        ||      }t        j                  ||      \  }}}t	        |d   |d       t	        |d   |d       |d   |k(  sJ t        ||d      \  }}}}t	        |d   |d       t	        |d   |d       |d   |k(  sJ t        ||      }	t	        ||	d       t        | }
t	        | |
|      d       y )Nr   rS   rk   r)   r4   T)full_output)rd   r   r   r   r   r   r   )rM   rm   r   rY   r-   r.   r/   tck_fr   r   rO   s              rP   test_splrepzTestInterop.test_splrep  s    ww1Ql,,q!$1aA.A.1v{{  1$7q!Qa!%0a!%0Qx1}} 1c]2E* SM1Q4e,rf   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  r6   )	rd   r   rF   r   rB   rD   r   r   rC   )rM   rm   r   y2s       rP   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t         j                        j                  d      }t	        |      \  }}t        j                  |      \  }}t        ||d       t        t        j                  t        ||            |d       t        t        j                  t        ||            |d       t	        |dd      \  \  }}}}}t        ||d       t        t        j                  t        ||            |d       y )	Nr   r@   r6   r   rS   rk   r   T)r  r  )	rF   rJ   rK   rt   r   r   r   rs   r   )	rM   rm   rO   urY   u1b_fu_fr   s	            rP   test_splprepzTestInterop.test_splprep  s    IIb

+33F;qz1--"R 	2E*

5A;/?

5C=115A &a1$?
cAq!3U+

5c?3QUCrf   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#  r6   )numr  ) >Ir   >Kr  zInvalid inputs)r)   r6   r4   r7   )r   g333333?g?r)   )	rF   rJ   rt   rB   rD   r   r   r`   rC   )rM   rm   r  s      rP   test_splprep_errorszTestInterop.test_splprep_errors  sy   IIe$$Y/:-HI 	AJ	:-HI 	MM!	 KK21%9,=> 	QCL	9,=> 	MM1#	
 E:-=> 	QCL	:-=> 	MM1#	 :-=> 	%qc4^$	% 	%/	 		 	
	 		 		 		 		% 	%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            }|j                  dk(  sJ t        ||z
  t        j                  |      d       y # 1 sw Y   xY w)N)r   r   r=   r  r   rT   zCalling sproot.. with BSpliner  ri   )mestr)   r4   r   )r6   r4   r7   r   rk   )rO   r  rF   r  r  r   r   r-   r.   r/   rB   rD   r  rs   r   r   )rM   rO   r  rootsc2rrrs         rP   test_sprootzTestInterop.test_sproot1  s    2-.ruu4q	5t$?QSS!##/TM :-LM 	 2B	  ddnnQ1%ZZc2440r:;xx9$$$U
BMM"$5EB	  	 s   #EEc           	      J   | j                   | j                  }}t        t        dd|      t        dd|j                        dd       t        t        dd|      |j                  d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            }|j                  d	k(  sJ t        |t        dd|      dd
       y # 1 sw Y   xY w)Nr   r)   rj   F)rU   check_0dzCalling splint.. with BSpliner  r4   )r6   r4   )rU   check_shape)rO   r  r   r   rY   r   rB   rD   r.   r  rF   rs   r-   r/   r   )rM   rO   r  r  integrs        rP   test_splintzTestInterop.test_splintB  s    2q!Qq!QUU+%%	Iq!QAq)	G :-LM 	1a	 ddnnQ1%F1a"$$RTT):;<||v%%%q!Qe	H	 	s   DD"c           	         | j                   | j                  fD ]@  }t        |j                        t        |j                        z
  }|j                  j                         }|dkD  r9t        j                  |t        j                  |f|j                  dd  z         f   }dD ]  }t        |      }t        j                  |j                  j                         ||j                  f      }t        |j                  |d   d       t        |j                  |d   d       |j                  |d   k(  sJ t        |t              sJ t        |t               rJ  C y Nr   r)   rh   rS   rk   r4   )rO   r  r(  r-   r.   r  rF   r   zerosr   r   r   r/   r   r   r   r  rM   rO   ctb_crN   bdtck_ds          rP   test_splderzTestInterop.test_splderV  s   &&$''" 	0AQSSCH$B##((*CAveeC2%#))AB-*?!@@A 0AYacchhj#qss%;<eAhU;eAhU;ttuQx'''!"g...!%///0	0rf   c           	         | j                   | j                  fD ]@  }t        |j                        t        |j                        z
  }|j                  j                         }|dkD  r9t        j                  |t        j                  |f|j                  dd  z         f   }dD ]  }t        |      }t        j                  |j                  j                         ||j                  f      }t        |j                  |d   d       t        |j                  |d   d       |j                  |d   k(  sJ t        |t              sJ t        |t               rJ  C y r  )rO   r  r(  r-   r.   r  rF   r   r  r   r   r   r/   r   r   r   r  r  s          rP   test_splantiderzTestInterop.test_splantiderg  s   &&$''" 	0AQSSCH$B##((*CAveeC2%#))AB-*?!@@A 0]((!##((*c133)?@eAhU;eAhU;ttuQx'''!"g...!%///0	0rf   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              sJ t        |t              sJ 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              sJ t        |
t              sJ y )Nr4   r   r)   rS   rk   r  r   )rO   r  rd   r-   r   r   r.   r/   r   r   r   r   r  r   r  r  rF   rs   )rM   rO   r  rd   r   tnbntck_nr  r   tck_n2bn2s               rP   rz  zTestInterop.test_insertx  sb   FFDGGTWWr2CCHHM!##a&133qs8#$2qM6"qssACCo#>Eb"b%(u	6"g&&&%''' 5#$TT^^BqrFTM*RTT2rtt,-Rn 	

5V#45??1aHBe	-#w'''&%(((rf   N)r  r	  r
  r  r  r  r  r  r   r  r  r  r  rz  r  rf   rP   r  r    s=    -H6-0' D%:C"H(0"0")rf   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*)+
TestInterpr8   r9   c                     t        t              5  t        | j                  | j                  d       d d d        y # 1 sw Y   y xY w)Nr=   r   )rB   rC   r
   rd   r   rM   s    rP   test_non_int_orderzTestInterp.test_non_int_order  s3    9% 	8tww37	8 	8 	8s	   #<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   rj   rT   r2   r/   r  r
   rd   r   r   r   s     rP   test_order_0zTestInterp.test_order_0  d    tww15$''
DGG%eDtww12>$''
DGG%eDrf   c                 2   t        | j                  | j                  d      }t         || j                        | j                  dd       t        | j                  | j                  dd      }t         || j                        | j                  dd       y )Nr)   r   rj   rT   r2   r#  r$  r   s     rP   test_linearzTestInterp.test_linear  r&  rf   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)   r4   r6   r7   r   )r   r)   r4   r6   r7   r   r   r   zShapes of xr  r   rB   rD   r
   rM   r/   rm   r   s       rP   test_incompatible_x_yz TestInterp.test_incompatible_x_y  s7    $:]; 	*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)   r4   r6   r7   r*  zx to not have duplicatesr  r   )r   r4   r)   r6   r7   r   zExpect x to be a 1D strictly)r)   r2   )rB   rD   r
   rF   rs   rt   r,  s       rP   test_broken_xzTestInterp.test_broken_x  s    :-GH 	*q!q)	* :-KL 	*q!q)	* JJqM!!'*:-KL 	*q!q)	* 	*	* 	*	* 	*
	* 	*s#   B.B:C.B7:CCc                     dD ]L  }t        | j                  | j                  |      }t         || j                        | j                  dd       N y )Nr4   r6   r7   r   r   r   rj   rT   r$  )rM   r/   rO   s      rP   test_not_a_knotzTestInterp.test_not_a_knot  sC    # 	IA"477DGGQ7AAdggJe%H	Irf   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$  rj   rT   r)   r   r   r2   dy=rk   r/   r%  r  )r
   rd   r   r   r   )rM   rO   r   s      rP   test_periodiczTestInterp.test_periodic  s    tww1jI$''
DGG%eD q! 	SAAdggajQ/4772;11EER	S tww1jrR$''
DGG%eDq! 	SAAdggajQ/4772;11EER	Srf   r1  c                    d}t         j                  j                  d      }t        j                  |j	                  |      dz        }|j	                  |      dz  }|d   |d<   t        |||d      }t         ||      |d	
       y )Nr   r   r^   r   r2   r   r   r$  rj   rk   )rF   rL   r   r   r&  r
   r   )rM   r/   rN   r   rm   r   rO   s          rP   test_periodic_randomzTestInterp.test_periodic_random  s}     ii##D)GGC%%a(2-.a 3&u!q!q*=!ae,rf   c                 h   | j                   j                  d   }t        j                  j	                  d      }|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   r4   r8   r2   r)   r   r   r5  rj   rk   )rd   r   rF   rL   r   r&  r  r   r  rq  rs  r
   r   r   )rM   rN   r   rm   r   rO   r   s          rP   test_periodic_axiszTestInterp.test_periodic_axis  s    GGMM!ii##D)a 1$ruu,GGAJ!BEE	"HHaVvvay!vvay!q!q*1Eq 	:AAadGQq!tW59	:!A$1R56rf   c                 0   t         j                  j                  d      }d}d}t        j                  |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   r2   r)   r   r   r$  )rF   rL   r   r   r&  rB   rD   r
   )rM   r   r/   rN   rm   r   s         rP   test_periodic_points_exceptionz)TestInterp.test_periodic_points_exception  s    ii##D)GGC%%a()a uqy!:& 	>q!q*=	> 	> 	>s   3BBc                 P   t         j                  j                  d      }d}d}t        j                  |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   r6   r   r4   r   )	rF   rL   r   r   r&  r  rB   rD   r
   )rM   r   r/   rN   rm   r   r-   s          rP   test_periodic_knots_exceptionz(TestInterp.test_periodic_knots_exception  s    ii##D)GGC%%a()a HHQQY:& 	7q!Q:6	7 	7 	7s   BB%r  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)r  r/   rj   rk   r)   r   r   r   )r
   rd   r   r   r   r   r   )rM   r/   rO   rY   r  r   s         rP   test_periodic_splevzTestInterp.test_periodic_splev  s     tww1jITWWdgg415DGGS!QtwwZe4 q! 	?A!,CC477q!1>	?rf   c                     t        | j                  | j                  dd      }t        | j                  | j                  d      }t	         || j                         || j                        d       t
        j                  j                  d      }d}t        j                  |j                  |      dz        }|j                  |      d	z  }|d
   |d<   t        ||dd      }t        ||d      }t	         ||       ||      d       y )Nr6   r   r$  rG  rj   rk   r   r^   r   r2   r   )
r
   rd   r   r   r   rF   rL   r   r   r&  )rM   rO   cubr   rN   rm   r   s          rP   test_periodic_cubiczTestInterp.test_periodic_cubic  s    tww1jI$''477J?$''
CLu= ii##D)GGC%%a(2-.a 3&u!q!q*=!Q
3!c!f51rf   c                 T   dt        | j                  | j                  d      }t        | j                        t	        | j                  | j                        t        j                  fd      }t         || j                         || j                        d       y )Nr6   r   r$  c                      t        |       S r  )rz   )rm   r.   r/   r-   s    rP   r  z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>(  s    K1a$; rf   rj   rk   )r
   rd   r   r   r   rF   	vectorizer   )rM   rO   r  r.   r/   r-   s      @@@rP   test_periodic_full_matrixz$TestInterp.test_periodic_full_matrix!  su     tww1jIDGGQ'&twwA>\\;<$''
BtwwKe<rf   c                    dg}t        | j                  | j                  dd |f      }t         || j                        | j                  dd       t         || j                  d   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d	
       y )Nr)   g       @r4   r$  rj   rT   r2   r)   r   FrU   rV   r  r$  )rM   r   rO   s      rP   test_quadratic_derivzTestInterp.test_quadratic_deriv+  s    i tww1tSkJ$''
DGG%eDdggbk1s1vayu55	

 tww1sDkJ$''
DGG%eDdggaj!c!fQie%%	
rf   c           	      2   d}dgdg}}t        | j                  | j                  |||f      }t         || j                        | j                  dd       t        t	        j
                   || j                  d   d       || j                  d	   d      g      t	        j
                  |d   d   |d   d   g      dd       d
gd
g}}t        | j                  | j                  |||f      }t         || j                        | j                  dd       y )Nr6   r)   r:   )r)   r;   rG  rj   rT   r   r)   r2   r4   r   )r
   rd   r   r   rF   rs   )rM   r/   der_lder_rrO   s        rP   test_cubic_derivzTestInterp.test_cubic_deriv<  s      y7)utwwUENK$''
DGG%eD

Adggaj!$4aQ6G#HI

E!HQKq!#=>UQV	X x&utwwUENK$''
DGG%eDrf   c                 |   d\  }}t        j                  |      j                  t         j                        }t        j                  |      }ddg}ddg}t        |||||f      }t         ||      |dd       t        t        j                   ||d	   d
       ||d	   d      g      t        j                  |D 	cg c]  \  }}	|		 c}	}             t        t        j                   ||d   d
       ||d   d      g      t        j                  |D 	cg c]  \  }}	|		 c}	}             y c c}	}w c c}	}w )N)r   r   )r)   g      ()r4   r)   rI  )r4   r:   r$  rj   rT   r   r)   r4   r2   )rF   rJ   astyperK   rq  r
   r   rs   )
rM   r/   rN   rm   r   rO  rP  rO   r   vals
             rP   test_quintic_derivszTestInterp.test_quintic_derivsK  s   1IIaL

+FF1IF#'"q!q5%.A!ae%8

AadAJ!A$
#;<

#?IRC#?@	B

AaeQK1R5!#=>

#?IRC#?@	B $@#?s   >D2D8unstable)reasonc                     d}t        | j                  |      }ddg}t        | j                  | j                  |||d f      }t	         || j                        | j                  dd       y )Nr6   rM  )r4   r;   rG  rj   rT   )r   rd   r
   r   r   )rM   r/   r-   rO  rO   s        rP   test_cubic_deriv_unstablez$TestInterp.test_cubic_deriv_unstableX  s[     DGGQ'"twwAt}M$''
DGG%eDrf   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      t        j                  d
      d       t         || j                  d   d      t        j                  d
      d       y )Nr4   r   r)   r2   r9   rN  rG  rj   rT   r8   rk   )rF   r   rd   r
   r   r   rs   )rM   r/   r-   rO   s       rP   test_knots_not_data_sitesz$TestInterp.test_knots_not_data_sitesg  s     EE4771:-1%7712;"-3772;.!A#&' ( twwA)/6(';= 	$''
DGG%eD$''!*a("**S/F$''"+q)2::c?Grf   c                     d}ddg}ddg}t        |||dgdgf      }t        j                  dd      }|dz  }t         ||      |dd       y )	Nr6   r8   r+   r)   r8   rM  rG  rj   rT   )r
   rF   r`   r   )rM   r/   rm   r   rO   rd   r   s          rP   test_minimum_points_and_derivz(TestInterp.test_minimum_points_and_derivv  s_     HHq!Q'WI0FG[[R U"rE:rf   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+   r4   r6   r7   r   r   r]  rG  *   )r]  r]  r+  rM   rm   r   lrs        rP   test_deriv_speczTestInterp.test_deriv_spec  s    %$A:& 	@q!wi->?	@ :& 	6q!W5	6 :& 	8q!gY7	8 :& 	1q!R0	1
 "1:& 	5q!aV4	5 	5	@ 	@	6 	6	8 	8	1 	1	5 	5s:   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   r4   )r   r   r)   r   zBad boundary conditions at 0.r  rG  )ir   zBad boundary conditions at 6.)rF   rJ   rB   rD   r
   ra  s        rP   test_deriv_order_too_largez%TestInterp.test_deriv_order_too_large  s    IIaLqDx&1:-LM 	5q!aV4	5 x'1:-LM 	5q!aV4	5 	5	5 	5
	5 	5s   A<"B<BBc                    d}| j                   }| j                  d| j                  z  z   }dgdg}}t        |||||f      }t         ||      |dd       t         ||d   d	      |d   d	   ddd
       t         ||d   d	      |d   d	   ddd
       dD ]%  }t        |||      }t         ||      |dd       ' y )Nr6   r*   )r)   y              @)r)   y      @       @rG  rj   rT   r   r)   FrJ  r2   )r   r)   r   )rd   r   r
   r   )rM   r/   rd   r   rO  rP  rO   s          rP   r  zTestInterp.test_complex  s    WWWWs477{" !zK=ur2q5%.A"rE:beQKq!5uu	
 	bfaL%(1+E	

  	?A"2rQ/AAbE2E>	?rf   c                     t        j                  d      j                  t              }t        j                  d      j                  t              }dD ]  }t	        |||      } ||        y )Nr^   r   r   )rF   rJ   rS  intr
   )rM   rm   r   r/   rO   s        rP   test_int_xyzTestInterp.test_int_xy  sX    IIbM  %IIbM  %  	A"1a1-AaD	rf   c                 |    t        j                  ddd      }|d d d   }|d d d   }dD ]  }t        |||        y )Nr2   r)   r   r   r   r   )rF   r`   r
   )rM   rd   rm   r   r/   s        rP   test_sliced_inputzTestInterp.test_sliced_input  sI    [[Q$ssGssG 	*Aq!q)	*rf   c                     t        j                  d      j                  t              }|dz  }t         j                  t         j
                  t         j
                   fD ]  }||d<   t        t        t        ||        y )Nr^   r4   r2   )	rF   rJ   rS  floatrH   rI   rB   rD   r
   rM   rm   r   zs       rP   test_check_finitezTestInterp.test_check_finite  sa    IIbM  'qD&&"&&266'* 	@AAbE*&8!Q?	@rf   )r)   r4   r6   r   c                 v    t        t        d            }|D cg c]  }|dz  	 }}t        |||       y c c}w )Nr^   r4   r   )listr   r
   )rM   r/   rm   ar   s        rP   test_list_inputzTestInterp.test_list_input  s9     rOaQT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+   r9   r:   r;   r6   r$  rj   rT   r   r2   )rF   r   rq  rd   rs  r
   r   )rM   r   rO  rP  rO   s        rP   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Orf   c                    t         j                  j                  d      }d\  }}t        j                  |j                  |            }|j                  |dddf      }t	        |||      }|j
                  j                  |dddfk(  sJ d|j                  d      fg}d|j                  d      fg}t	        |||||f	      }|j
                  j                  ||z   dz
  dddfk(  sJ y )
Nr   r6   r   r   r   r   r   r)   r   r   r   rG  )rF   rL   r   r   r
   r.   r   )	rM   r   r/   rN   rm   r   rO   d_ld_rs	            rP   test_shapeszTestInterp.test_shapes  s    ii##D)1GGCJJAJ&'JJQ1aLJ)q!Q'ssyyQ1aL((( 3::i()*3::i()*q!Qc
;ssyyQUQY1a0000rf   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                  |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)Nr6   r0  r$  rN  rS   rk   )r0  r/  rf  r4   )Nr/  r]  r1  typor)   r8   r.  r   rz  r   r   r   r   r{  rG  r/  )rF   rq  rd   r
   r   r.   rB   rD   r   rs  rL   r   r   r  )rM   r   r  r  rO  rP  r   r/   rN   rm   r   r|  r}  s                rP   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/ :& 	Atwwa@	A UU266$''?BFF477O34b"Xb"Xq5%.Iq(>@bdd/ ii##D)1GGCJJAJ&'JJQ1aLJ) 288I&'(288I&'(1a#s<1a;bdd//	A 	As   
L11L;c                 <   t         j                  j                  d      }d\  }}t        j                  |j                  |            }|j                  |      }t	        ||      }t        ||||      }t        ||||      }t        |j                  |dd       y )Nr   )r6   r   r   rj   rT   )	rF   rL   r   r   r   r
   make_interp_full_matrr   r.   )	rM   r   r/   rN   rm   r   r-   rO   r  s	            rP   test_full_matrixzTestInterp.test_full_matrix+  s    ii##D)1GGCJJAJ&'JJAJ1q!Q*"1aA.Re%8rf   c                    t         j                  j                  d      }d}t        ddd      D ]  }t	        |dz
  dz        }t        j
                  |j                  d|f            }t        d|dz         D ]x  }|d| |dfxx   t        j
                  |j                  d||z
  f            z  cc<   ||dd| fxx   t        j
                  |j                  d||z
  f            z  cc<   z |j                  ||f      }||d|| df<   |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 |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      r6       r4   r)   Nr2   r   )offsetrj   rk   )rF   rL   r   r   rj  diagflatr  r  diagonalr   r   linalgsolve)rM   r   rN   r/   r  ru  r   urlldr   rO   s               rP   test_woodburyzTestInterp.test_woodbury6  s    ii##D)q"a 	?A!a%1%FCJJ1v./A1fqj) B#A2#qr'
bkk#**aQZ*@AA
!"crc'
bkk#**aQZ*@AA
B VV,-B#%Agvgwx VV,-B#%Avgh !Q A!%!R"@A 81q5!{{1Q7Aa!eH!{{1Q7AaeH	8
 

1A/2r1a@IIOOAq1?#	?rf   N)-r  r	  r
  rF   r`   r  rd   rq  r   r!  r%  r(  rZ   rh  ri  r-  r/  r2  r6  r8  r:  r<  r>  r@  rC  rG  rK  rQ  rU  xfailrY  r[  r^  rd  rg  r  rk  rm  rr  rv  rx  r~  r  r  r  r  rf   rP   r  r    s    
RBEE	"B	B8EE [[S,/* 0* [[S,/* 0*I
S [[S"45- 6-7	>	7 [[S,/
? 0
?2 =
"EB [[j)E *EH
;5.5?**@ [[S,/& 0&P110f	9?rf   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   rF   r  rK   r   r  r%   evaluate_all_bsplslr  )rm   r   r-   r/   rN   Ar   rm  leftbbr.   s              rP   r  r  S  s     66QVV66QVVaZ!^###	A
!Qrzz*A1X 	!t1Q4<D??1d+a/D ''1dD9 !T!VDF]
	! 	AAHrf   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)   r@   )maprF   rs   r   r  rK   r   r  r%   r  dotTr  r  )rm   r   r-   r/   r}  rN   r  r   rm  r  r  r  Yr.   s                 rP   make_lsq_full_matrixr  o  s	   "**q!Qi(GAq!	A	
QA
!Qrzz*A1X 
!t1Q4<D??1d+a/D ''1dD9 !T!VDF]

! 	qssAA
qssAA
AAq!f9rf   methodnorm-eqqrc            	          e Zd Zej                  j                  d      Zd\  ZZ ej                  ej	                  e            Z
ej	                  e      Z e ej                  e
d   e
d   d      e      Zed        Zed        Zd Zed	        Zed
        Zd Zed        Zd Zed        Zed        Zed        Zed        Zed        Zej<                  j?                  d e  e!dd                  d        Z"d Z#y)TestLSQr   )r   r6   r   r2   r   c                    | j                   | j                  | j                  | j                  f\  }}}}t	        ||||      \  }}t        |||||      }t        |j                  |       |j                  j                  |j                  |z
  dz
  fk(  sJ |\  }	}
t        j                  j                  |	|d      \  }}}}t        |j                  |       y )Nr  r)   r2   )rcond)rm   r   r-   r/   r  r   r   r.   r   r   rF   r  lstsq)rM   r  rm   r   r-   r/   c0AYrO   aar   r  r   s                rP   
test_lstsqzTestLSQ.test_lstsq  s     VVTVVTVVTVV3
1a%aAq1BAq!Qv6R ssyyQVVaZ!^---- Biioob!2o6Aq!R rf   c                    | j                   | j                  | j                  | j                  f\  }}}}t	        j
                  |      }t        |||||      }t        ||||||      }t        |j                  |j                  d       t        |j                  |j                  d       |j                  |j                  k(  sJ y )Nr  wr  rj   rk   )	rm   r   r-   r/   rF   ra   r   r   r.   )	rM   r  rm   r   r-   r/   r  rO   b_ws	            rP   test_weightszTestLSQ.test_weights  s     VVTVVTVVTVV3
1aLLOAq!Qv6aAqAf=SUU/SUU/sscee||rf   c                    | j                   | j                  | j                  | j                  f\  }}}}t        j
                  j                  d      j                  |j                  d         }t        |||||d      }t        |||||d      }t        ||||d      }t        |j                  |j                  d	       t	        j                  |j                  |j                  d	      rJ y )
Nr   r   r   r  r  r  r  rj   rk   )rm   r   r-   r/   rF   rL   r  r  r   r   r   r.   r   )	rM   rm   r   r-   r/   r  b_neb_qrb_no_ws	            rP   test_weights_samezTestLSQ.test_weights_same  s    VVTVVTVVTVV3
1aII!!$'//QWWQZ/@q!QQyAq!QQt< Aq!D9U3;;vxxe<<<<rf   c                 R   | j                   | j                  | j                  | j                  f\  }}}}t        j
                  j                  d      }|j                  |dddf      }t        |||||      }|j                  j                  |j                  |z
  dz
  dddfk(  sJ y )Nr   r   r   r   r   r  r)   )rm   r-   r/   rN   rF   rL   r   r   r.   r   r   )	rM   r  rm   r-   r/   rN   r   r   rO   s	            rP   rx  zTestLSQ.test_multiple_rhs  s    VVTVVTVVTVV3
1aii##D)JJQ1aLJ)Aq!Qv6ssyyQVVAXaZAq1111rf   c           
         | j                   | j                  | j                  | j                  f\  }}}}d}t        j
                  j                  d      }|j                  ||f      }t        |||||      }	t        |      D 
cg c]  }
t        ||d d |
f   |||       }}
t	        j                  t        |      D 
cg c]  }
||
   j                   c}
      j                  }t        ||	j                  d       y c c}
w c c}
w )Nr6   r   r   r  rS   rk   )rm   r-   r/   rN   rF   rL   r   r   r   vstackr.   r  r   )rM   r  rm   r-   r/   rN   nrhsr   r   rO   r   r  coefss                rP   test_multiple_rhs_2zTestLSQ.test_multiple_rhs_2  s    VVTVVTVVTVV3
1aii##D)JJQIJ&Aq!Qv6 T{$ a1a4!Qv> $ $		E$K8q2a57789;;qss/	$8s   DDc                 6   | j                   | j                  | j                  | j                  f\  }}}}d}t        j
                  j                  ||f      }t        ||||d      }t        ||||d      }t        |j                  |j                  d       y )Nr6   r   r  r  r  rS   rk   )	rm   r-   r/   rN   rF   rL   r   r   r.   )	rM   rm   r-   r/   rN   r  r   r  b_neqs	            rP   test_multiple_rhs_3zTestLSQ.test_multiple_rhs_3  s    VVTVVTVVTVV3
1aII1d),q!Q$71a9=e4rf   c                 @   | j                   | j                  | j                  }}}| j                  dz  }t	        |||||      }t	        ||j
                  |||      }t	        ||j                  |||      }t         ||       ||      d ||      z  z   dd       y )N      ?       @r  r*   rS   rT   )rm   r-   r/   r   r   r   r   r   )	rM   r  rm   r-   r/   r>  rO   r   r   s	            rP   r  zTestLSQ.test_complex  s     &&$&&$&&a1VVx Ar1a7q"''1a?q"''1a?!d1gDG3%eLrf   c                 b   | j                   | j                  | j                  }}}| j                  dz  }t	        j
                  ||fd      }t        ||||      }t        ||j                  ||      }t        ||j                  ||      }t         ||       ||      d ||      z  z   dd       t	        j
                  ||fd      }t        ||||      }t        ||j                  ||      }t        ||j                  ||      }t         ||       ||      d ||      z  z   dd       y )Nr  r)   r  r*   rS   rT   )
rm   r-   r/   r   rF   stackr   r   r   r   )rM   rm   r-   r/   r>  rO   r   r   s           rP   test_complex_2zTestLSQ.test_complex_2  s    &&$&&$&&a1VVx XXr2hQ'Ar1a(q"''1a0q"''1a0!d1gDG3%eL XXr2hQ'Ar1a(q"''1a0q"''1a0!d1gDG3%eLrf   c                     t        j                  d      j                  t              }t        j                  d      j                  t              }t	        |d      }t        |||d|       y )Nr^   r)   r   r/   r  )rF   rJ   rS  rj  r   r   rM   r  rm   r   r-   s        rP   rk  zTestLSQ.test_int_xy   sM    IIbM  %IIbM  %AO1a1V4rf   c                    t        j                  dt         j                        }t        j                  dt         j                        }t        |d      }t	        |||d|      }t	        |j                  t              |j                  t              |j                  t              d|      }|dd  |d d z   dz  }t         ||       ||      d	       y )
Nr^   r@   r)   r   r  r2   r9   rS   rk   )rF   rJ   float32r   r   rS  ro  r   )rM   r  rm   r   r-   spl_f32spl_f64x2s           rP   test_f32_xyzTestLSQ.test_f32_xy  s    IIb

+IIb

+AO!!QQv>!HHUOQXXe_ahhuo6
 eafn#WR[u=rf   c                     t        j                  ddd      }|d d d   }|d d d   }t        |d      }t        |||d|       y )Nr2   r)   r   r6   r  )rF   r`   r   r   )rM   r  rd   rm   r   r-   s         rP   rm  zTestLSQ.test_sliced_input  sK     [[Q$ssGssGAqM1a1V4rf   c           	         t        j                  d      j                  t              }|dz  }t	        |d      }t         j
                  t         j                  t         j                   fD ]   }||d<   t        t        t        ||||       " y )N   r4   r6   r2   r  )
rF   rJ   rS  ro  r   rH   rI   rB   rD   r   )rM   r  rm   r   r-   rq  s         rP   test_checkfinitezTestLSQ.test_checkfinite  sq     IIbM  'qDAqM&&"&&266'* 	OAAbE*oq!QvN	Orf   c                     | j                   | j                  | j                  }}}|j                  d       |j                  d       |j                  d       t	        ||||       y )NFrS  )rm   r   r-   r  )rm   r   r-   rU  r   r  s        rP   rV  zTestLSQ.test_read_only*  sU     &&$&&$&&a1	


	


	


!qAf5rf   r/   r)   c                    | j                   | j                  }}t        t        j                  |d   |d   d      |      }t        ||||d      }t        ||||d      }|dd  |d d z   dz  }t         ||       ||      d	
       y )Nr   r2   r   r  r  r  r)   r9   rS   rk   )rm   r   r   rF   r`   r   r   )rM   r/   rm   r   r-   spl_norm_eqspl_qrrd   s           rP   test_qr_vs_norm_eqzTestLSQ.test_qr_vs_norm_eq3  s     vvtvv1BKK!aeQ/3%aA9E AqAd;eafn#B%@rf   c                 d   t        j                  | j                  d      }t        j                  | j                  d      }t	        | j                  | j                  | j
                  dd      }t	        ||| j
                  dd      }|dd  |d d z   dz  }t         ||       ||      d	       y )
Nr4   r6   r  r  r)   r2   r9   rS   rk   )rF   repeatrm   r   r   r-   r   )rM   rm   r   ru  spl_2rd   s         rP   test_duplicateszTestLSQ.test_duplicates>  s    IIdffa IIdffa !DI1dff$?eafn#b	5959rf   N)$r  r	  r
  rF   rL   r   r   rN   r/   r   rm   r   r   r`   r-   parametrize_lsq_methodsr  r  r  rx  r  r  r  r  rk  r  rm  r  rV  rZ   rh  ri  rt  r   r  r  r  rf   rP   r  r    sz    ))


%CDAq

1A

1AAaD!B%+Q/A! ! 
 

= 2 2 0 05 	M 	MM, 5 5 
> 
> 5 5 O O 6 6 [[S$uQ{"34A 5A:rf   r  c                   ,    e Zd ZdZd Zed        Zd Zy)PackedMatrixas  A simplified CSR format for when non-zeros in each row are consecutive.

    Assuming that each row of an `(m, nc)` matrix 1) only has `nz` non-zeros, and
    2) these non-zeros are consecutive, we only store an `(m, nz)` matrix of
    non-zeros and a 1D array of row offsets. This way, a row `i` of the original
    matrix A is ``A[i, offset[i]: offset[i] + nz]``.

    c                     || _         || _        || _        |j                  dk(  sJ |j                  dk(  sJ |j                  d   |j                  d   k(  sJ y )Nr4   r)   r   )ru  r  ncr  r   )rM   ru  r  r  s       rP   __init__zPackedMatrix.__init__R  sW    vv{{{{awwqzV\\!_,,,rf   c                 L    | j                   j                  d   | j                  fS )Nr   )ru  r   r  r   s    rP   r   zPackedMatrix.shape[  s    vv||A''rf   c                 j   t        j                  | j                        }| j                  j                  d   }t	        |j                  d         D ]_  }t        | j                  | j                  |   z
  |      }| j                  |d |f   ||| j                  |   | j                  |   |z   f<   a |S )Nr)   r   )rF   r  r   ru  r   minr  r  )rM   outnelemr   nels        rP   todensezPackedMatrix.todense_  s    hhtzz"Qsyy|$ 	JAdggA.6C:>&&DSD/C4;;q>$++a.3"6667	J 
rf   N)r  r	  r
  __doc__r  propertyr   r  r  rf   rP   r  r  I  s%    - ( (rf   r  c                 6   ddl m} | j                  }| j                  }| j                  }|j
                  \  }}|j
                  d   |k(  sJ |j                         }	|j                         }
t        ||      D ]  }||   }t        ||      D ]  }|t        ||      k\  r ( ||	|df   |	|df         \  }}}||	|df<   t        d|      D ]*  }t        |||	||f   |	||f         \  |	||f<   |	||dz
  f<   , d|	|df<   t        |
j
                  d         D ]'  }t        |||
||f   |
||f         \  |
||f<   |
||f<   )   t        t        |	j
                  d               }t        |	t        j                  |t        j                        |      }||
fS )zjThis is a python counterpart of the `_qr_reduce` routine,
    declared in interpolate/src/__fitpack.h
    r   )dlartgr)   r8   r2   r@   )scipy.linalg.lapackr  ru  r  r  r   r  r   r  fprotart  r  rF   r  int64)a_pr   startrowr  ru  r  r  r}  nzRrv  r   oir   r.   r  rc  rb  offsR_ps                       rP   _qr_reduce_pyr  h  s    + 	AZZF	BGGEAr771:??	A	
B8Q FAYr2 	FAC2J Qq!tWa1g.GAq! AadG1b\ D%+Aq!AqD'1QT7%C"!Q$1ac6DAaeH 288A;' F%+Aq"QT(Bq!tH%E"1a4"QT(F	FF* aggaj!"D
q"((4rxx8"
=C7Nrf   c                 8    | |z  ||z  z   }| |z  | |z  z   }||fS )zLGivens rotate [a, b].

    [aa] = [ c s] @ [a]
    [bb]   [-s c]   [b]

    r  )r.   r  ru  rO   r  r  s         rP   r  r    s1     A#!)B
A!Br6Mrf   c                    | j                   }|j                  \  }}| j                  }|j                  d   |j                  d   k(  sJ t        j                  |d|       }||dz
     ||dz
  df   z  ||dz
  df<   t        |dz
  dd      D ]P  }t        |||z
        }||d|df   ||dz   ||z   df   z  j                  d      }	||   |	z
  ||df   z  ||df<   R |S )zBacksubsitution solve upper triangular banded `R @ c = y.`

    `R` is in the "packed" format: `R[i, :]` is `a[i, i:i+k+1]`
    r   Nr)   .r4   r2   r  )ru  r   r  rF   r   r   r  r  )
r  r   r  r   r  r  r.   r   r  summs
             rP   fpbackr    s   
 	AGGEAr	B771:###
afART7Qr!tQwZ'AbdCiL2a4R  ."bdm!QsUD.!Aac!C%in$55:::BdTka1g-!S&		.
 Hrf   c                   *    e Zd Zd Zd Zd Zd Zd Zy)TestGivensQRc                 |    d}t        j                  |t              }|dz  dd|z   z  z   }t        ||      }||||fS )Nr6   r@   r)   )rF   rJ   ro  r   )rM   rN   r/   rm   r   r-   s         rP   _get_xytzTestGivensQR._get_xyt  sF    IIau%qD1ac7N1!Qzrf   c                 <   d}| j                  |      \  }}}}t        j                  |||      }t        j                  |j                               \  }}|j                  |z  }	|j                  \  }
}||j                  d   |z
  dz
  k(  sJ |j                  d d |dz      }t        j                  |t        j                        }|j                  j                  |
|dz         }t        |||      }|d d d f   }t        j                   ||||       t#        t        j$                  |j                         |z   |j                         |z
        t        j&                  |      d       t#        t        j$                  t)        |	|d d df   z
        t)        |	|d d df   z               t        j&                  |	      d       t        j*                  ||	      }t        j,                  |j.                  |j0                  |      }t#        ||d d df   d       y )	Nr^   r   r)   r@   rS   rk   gvIh%L=-a=)r  r   r)  r  r  r  r  r   indicesrF   ascontiguousarrayr  datart   r  r%   	qr_reducer   minimumr   absr  r  ru  r  )rM   rN   rm   r   r-   r/   a_csrqrc  qTyr}  r  r  r  r  y_c_fullc_bandeds                     rP   test_vs_fullzTestGivensQR.test_vs_full  s   ]]1%
1a %%aA. uuU]]_%1ccAg 2QWWQZ!^a''''w!A#w'%%fBHH=JJq!A#&FB'q$wZ1fb"- 	

199;?#$99;?457]]15EE	S

3sR1X~#6#&sR1X~#689;s9KRW	Y !S!??133b1AU;rf   c                    d}| j                  |      \  }}}}t        j                  |||      }|j                  \  }}||j                  d   |z
  dz
  k(  sJ |j                  d d |dz      }	t        j                  |	t
        j                        }	|j                  j                  ||dz         }
t        |
|	|      }|d d d f   }t        ||      \  }}t        j                  |
|	||       t        |j                  |j                  d       t!        |j"                  |j"                  d       |j$                  |j$                  k(  sJ t        ||d       y )	Nr^   r   r)   r@   rS   rk   F)check_dtype)r  r   r)  r   r  rF   r   r  r  rt   r  r  r%   r  r   ru  r   r  r  )rM   rN   rm   r   r-   r/   r  r}  r  r  r  r  r  RRr   s                  rP   test_py_vs_compiledz TestGivensQR.test_py_vs_compiled  s,   ]]1%
1a %%aA.2QWWQZ!^a''''w!A#w'%%fBHH=JJq!A#&FB'q$wZq"%B1fb2.acc.		188?uu}}BU+rf   c                 6   d}| j                  |      \  }}}}t        j                  d|dz   t              }t	        j
                  ||||      \  }}}	|j                  d   }
t        j                  |||      }||d d d f   z  j                         }|j                  j                  |
|dz   f      }|j                  d d |dz      j                  t        j                        }t        ||d       t!        ||       |	|j                  d   |z
  dz
  k(  sJ y )Nr^   r)   r@   r   rS   rk   )r  rF   rJ   ro  r%   data_matrixr   r   r)  tocsrr  rt   r  rS  r  r   r   )rM   rN   rm   r   r-   r/   r  r  r  r  r}  r  a_wA_offset_s                  rP   test_data_matrixzTestGivensQR.test_data_matrix  s   ]]1%
1aIIa1E* ,,Q1a862GGAJ%%aA.qDz!((*XXq!A#h'++g1g&--bhh72E*(QWWQZ!^a''''rf   c                 n   d}| j                  |      \  }}}}t        j                  ||dz  f   }t        j                  |||t        j
                  |            \  }}}t        |||      }	t        j                  ||||       t        |	|      }
t        j                  |||      }t        ||
d       y )Nr^   r4   rj   rk   )
r  rF   r   r%   r  ra   r  r  r  r   )rM   rN   rm   r   r-   r/   r  r  r  r  r.   r   s               rP   test_fpbackzTestGivensQR.test_fpback  s    ]]1%
1aEE!QT'N ,,Q1bll1oF62FB'1fb!,1aL__QA&AE*rf   N)r  r	  r
  r  r  r  r  r  r  rf   rP   r  r    s    !<F,6("+rf   r  c                     t         j                  j                  t         j                  j                  t         j                  j	                  t
                    d|       S )Nr  )ospathra  abspathdirname__file__)basenames    rP   	data_filer     s8    77<<(AB* *rf   c                   `    e Zd Zd Zd Zd Zej                  j                  d      d        Z	y)TestSmoothingSplinec                 0   t         j                  j                  d      }d}t        j                  |j	                  |      dz  dz
        }|dz  t        j
                  d|z        z  |dz  z   |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   r7   r4   r6   r8   r   r)   r2   r   z)``x`` and ``y`` length must be at least 5r  )rF   rL   r   r   r&  rq  normalrB   rD   r   rt   r  rJ   r  rZ   r   )rM   r   rN   rm   r   x_duplexception_messages          rP   test_invalid_inputz&TestSmoothingSpline.test_invalid_input$  s   ii##D)GGC%%a(1,q01qD266!a%= 1a4'#**Ra*@@ :& 	,!!QqrU+	,:& 	,!!AB%+	,:& 	6!!))Aq/15	6 :& 	.!!DbD'1-	. 1Iq	:& 	-!&!,	- IIaLGGAJG]]:->? 	(!!Q'	( 	(+	, 	,	, 	,	6 	6	. 	.	- 	-	( 	(sH   G:G!G(G4H 8HGG%(G14G= H	Hc                     t        j                  t        d            5 }|d   }|d   }|d   }ddd        t              |      }t	        |d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.npzrm   r   y_GCVSPLNg-C6?F)rU   rV   r  )rF   loadr   r   r   )rM   r  rm   r   r)  y_comprs         rP   test_compare_with_GCVSPLz,TestSmoothingSpline.test_compare_with_GCVSPLC  sq    R WWY|,- 	(S	AS	AJ'H	( .'1-a0 	4US	( 	(s   AA#c                    t         j                  j                  d      }d}t        j                  |j	                  |      dz  dz
        }|dz  t        j
                  d|z        z  |dz  z   |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   r7   r4   r6   r8   r   )lamr0  rG  r   r2   rS   rk   N)rF   rL   r   r   r&  rq  r$  r   r
   r`   r   )rM   r   rN   rm   r   
spline_GCVspline_interpgrids           rP   test_non_regularized_casez-TestSmoothingSpline.test_non_regularized_case{  s     ii##D)GGC%%a(1,q01qD266!a%= 1a4'#**Ra*@@*1aR8
*1aIF{{1Q42A.
4(%d+"	$rf   r4   c                 J   t         j                  j                  d      }d}t        j                  |j	                  |      dz  dz
        }|dz  t        j
                  d|z        z  |dz  z   |j                  dd|      z   }t        ||      }|j                  t        d      d	      D ]u  }t        j                  |      }d
||<   t        |||      }t         |||         ||   z
        }	t         |||         ||   z
        }
|	|
k  sdt        d|	dd|
d       y )Nr   r   r7   r4   r6   r8   r   r^   r   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )rF   rL   r   r   r&  rq  r$  r   choicer   r  r  rD   )rM   r   rN   rm   r   r  indr  spl_worigweighteds              rP   test_weighted_smoothing_splinez2TestSmoothingSpline.test_weighted_smoothing_spline  s.    ii##D)GGC%%a(1,q01qD266!a%= 1a4'#**Ra*@@#Aq) ::eCjr:2 	3C
AAcF)!Q2E s1S6{QsV+,D53=1S612Hh  $CCG)3$,R="2 3 3	3rf   N)
r  r	  r
  r'  r,  r2  rZ   rh  	fail_slowr9  r  rf   rP   r"  r"     s6    (>6Tp$& [[13 3rf   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              }t        j                  |      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tyrm   r   s
      rP   r  zbspline2.<locals>.<genexpr>  sU      7E"I7&( Bi!Aq"b/)AaBO; 7; 7s   ?A)r(  r  r   rF   rs   )r   r-   r.   r/   nxr  r?  r@  rA  rm   r   s     ``  @@@@@rP   bspline2rC    s    DAqFB	R1qB!A#II	R1qB!A#II
 7 7b	7 7C::c?rf   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+   r8   r  r  s         rP   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7Nrf   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  rE  r  s     rP   r  zbspline.<locals>.<genexpr>  s$     6qta1am#6r  r  r  s   ```` rP   r:  r:    sD    A
QA1H3q6Q;''6U1X666rf   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     rP   r  z&NdBSpline0.__init__.<locals>.<genexpr>  s     6bx~~b)6s   !c              3   R   K   | ]  }t        j                  |t                ! yw)r@   N)rF   rs   ro  )r  tis     rP   r  z&NdBSpline0.__init__.<locals>.<genexpr>  s     ?rrzz"E22?s   %'N)r(  r   rC   r  r/   r-   r.   )rM   r-   r.   r/   r  s        rP   r  zNdBSpline0.__init__  sx     1vs177|###	F
 6A66?Q??  	T	A	s   A( (A:9A:c                 b   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 t	        j                  |      S c c}w c c}w )Nnoner)   r   )r(  r-   r   r/   rF   r  r  	itertoolsproductr.   prodr  rs   )rM   rm   r  r   r  tdxdr/   resultitersidxterms               rP   __call__zNdBSpline0.__call__  s   466{1v~~ JtOt 
	4AVVAY!Bq	A RU{!r2.2!ad8r/R!QZ/////Q4191B!!333
	4 !H
 <A$KHqqtdffQi'12HH$$e, 	C66#;38;*@./ +,AaD$&&)SVTVVAY*O *@ "A ADdNF	 zz&!! I*@s    ,F'5F,Nr6   )r  r	  r
  r  r\  r  rf   rP   rI  rI    s    8"rf   rI  c                      e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z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ej(                  j:                  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  rj   rk   r   )	rF   rL   r  r   r  r   r   r   r   )
rM   r   rN   r/   n_trr-   r.   rO   nbxis
             rP   test_1DzTestNdBSpline.test_1D	  s    ii##E*1GGCKKQUQYK/0KKaYK'Aq!tQ"[[b[!2ag;"E	+"QW+$$!aggaj(AAAArf   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   r6   r   r4   rF   rJ   r
   r-   r.   rM   rm   r   r  y_1ru  t2r  s           rP   make_2d_casezTestNdBSpline.make_2d_case	  s    IIaLqD A+dQqSj"1cQ/eeUWWUU1d7^eggdAg..2qyrf   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   r6   r   r   r   r4   )rF   rJ   r
   r-   r.   r/   rg  s           rP   make_2d_mixedzTestNdBSpline.make_2d_mixed*	  s    IIaLqD A+IIaL3dQqSj"1cQ/eeUWWUU1d7^eggdAg..2suuegg%%rf   c                    g d}| j                         \  }}}|D cg c]  \  }}|dz  |dz  d|z  z   z   }}}t        t        j                  |D cg c]  }t	        ||||       c}      t        j                  |      d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   r=   )r=   r)   )r   r   r6   r4   Frj   r	  rU   r   rk   r  )r7   r6   r4   r   r   )r7   r6   )r2   r4   )rj  r   rF   rs   rC  r   r   r(  rL   r  r  rt   r  ravel)rM   rc  ri  r  r/   rm   r   targetr   bspl2r   rX  s               rP   test_2D_separablezTestNdBSpline.test_2D_separable9	  sX   /%%'	B467&1a!Q$!Q$1*%77 	

b#IHRR$;#IJ

6*$)"	$ "bA&Ry3r7+---b	U	, ii##E*[[i[(1,r||v%%% zz'"$$111qs
+%	9- 8 $Js   E%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   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   dd       y c c}}w )Nr4   rn  r6   ro  r   r7   r7   rj   rk   r2   FgvIh%,=rp  r   r   r4   r4   )r4   r4   )	rj  rF   r   r   r   r   r.   rs   rt   )rM   r  rc  rm   r   rr  ri  r  r/   c2_4r   bspl2_4rX  
val_singlec2_22bspl2_22s                   rP   test_2D_separable_2z!TestNdBSpline.test_2D_separable_2U	  s   /467&1a!Q$!Q$1*%77%%'	Byy"b"b)*B*)Yr2q)"-
||t####q(u	6
 r{  BHHRL"$5		8N$NNNNbjj&8D&A$)"	$
 \*R!,"||v%%%$j1$j139>	@ ""Sb!HJJ$4$4TU$;;< 	= <bjj&8D$&G$)"	$E 8s   Gc                    g d}|D cg c]  \  }}|dz  |dz  d|z  z   z   }}}|D cg c]
  }|d|z  z    }}| j                         \  }}}|dz  }t        j                  ||||f      }	d}
t        ||	d      } ||
      } t        |||      |
      }|j                  dk(  sJ t        ||gd	z  d
       y c c}}w c c}w )Nrn  r6   r4   y               @r  ro  r   rv  r7   rj   rk   )rj  rF   r   r   r   r   )rM   rc  rm   r   rr  r-   ri  r  r/   rx  r   ry  rX  rz  s                 rP   test_2D_separable_2_complexz)TestNdBSpline.test_2D_separable_2_complex	  s    /467&1a!Q$!Q$1*%77$*+q!bd(++%%'	B6]yy"b"b)*B*)Yr2q)"-
||t####q(u	6 8+s
   B>C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  r6   r   r   r   r   r7   r)   r   )r+   r+   rj   rk   r)   r   r4   皙?g? @)rF   rL   r  r   r   r  r   r   r   rC  r   )	rM   r   r/   r@  rA  r.   r  rc  r   s	            rP   test_2D_randomzTestNdBSpline.test_2D_random	  sA   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?r  )r=   g333333@)r  r  r6   r4   r   rj   rk   )rl  r   r   r(  r   )
rM   ri  r  kxkyrc  rm   r   rr  rs  s
             rP   test_2D_mixedzTestNdBSpline.test_2D_mixed	  s    ++-BB1467&1a!Q$!Q$1*%7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   rf  r   r6   r4   rj   rk   r)   r)   )r   r   )r2   r   )r2   r   r)   )rl  r   r   rB   rD   )
rM   ri  r  r  r  rc  rs  r   rm   r   s
             rP   test_2D_derivativez TestNdBSpline.test_2D_derivative	  sa   ++-BB1"bRH-B6";=>41a1a41a4!A#:.>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  )r4   r6   r   r   r   r6   r   r7   r)   r  r  r   rj   rk   )rF   rL   r  r   r   r  r   r   r   rI  r   rM   r   r  r  r@  rA  r.   rc  rs  bspl2_0r  s              rP   test_2D_mixed_randomz"TestNdBSpline.test_2D_mixed_random	  s.   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2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   r6   r   r4   rj   rk   )rF   rJ   r
   r.   r   r-   r/   r   rS  rT  r   anyr   rt   r   )rM   rm   r   spl_xspl_yr   rv   valuesrgiru  rO   rc  bxis                rP   test_tx_neq_tyzTestNdBSpline.test_tx_neq_ty	  sM   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Aq!f9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   r6   r   r4   r)   rf  )
rM   rm   r   r  rh  ru  y_2r  ri  r  s
             rP   make_3d_casezTestNdBSpline.make_3d_case	  s    IIaLqD A+dQqSj"1cQ/dQqSj1n"1cQ/eeUWWegg&eeAtTM"ggdAtm$%ggdD!m$% 2qyrf   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  r6   r?   r   r   r6   r4   r)   r   )r?   rj   rk   )	rF   rL   r  r  r  r   zipr   r   )rM   r   rm   r   rq  rr  t3c3r/   bspl3r   rc  rX  s                rP   test_3D_separablezTestNdBSpline.test_3D_separable	  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 )Nr6   r   r  r  r   r   )r)   r   r   r   r4   r)   rj   rk   )r4   r   r   r   )r4   r)   r   )r4   r)   r6   )r4   r)   r7   )
r  r   rF   rL   r  r  r  r   r  r(  )rM   r  r  r/   r  r   rm   r   rq  r   rc  s              rP   test_3D_derivativez TestNdBSpline.test_3D_derivative
  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  r6   r   r   r   r   r7   r)   r   )r+   r+   r)   rj   rk   r  r  g?r  gffffff?)rF   rL   r  r   r   r  r   r   rI  r   r   )rM   r   r/   r@  rA  tzr.   r  spl_0rc  r  s              rP   test_3D_randomzTestNdBSpline.test_3D_random"
  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!9%)!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  r6   r   r   r   r   r7   r)   r*   r   r  r  r  rj   rk   )rF   rL   r  r   r   r  r   r   r   r   r   r   )rM   r   r/   r@  rA  r  r.   r  r  r  rc  s              rP   test_3D_random_complexz$TestNdBSpline.test_3D_random_complex5
  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	@rf   
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 Nr6   )r/   rr   )r2   r   )r  r   rn  )r2   g            @r4   r)   rq   rj   rk   r  r   r  rF   rs   r  r   )rM   r  r  r  r  r/   r  rm   r   rq  r   rc  rr  rX  s                 rP   test_extrapolate_3D_separablez+TestNdBSpline.test_extrapolate_3D_separableH
  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  )rM   r   r  r  r/   r  r  r  rm   r   rq  r   rc  rr  rX  s                  rP   test_extrapolate_3D_separable_2z-TestNdBSpline.test_extrapolate_3D_separable_2X
  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 )Nr6   r   )r  r)   r   )r  r   rn  )r2   r   r  r4   r)   Frq   r   r2   rj   rk   )r  r   r  rF   rs   r  r   r   )rM   r  r  r/   r  rm   r   rq  r   rc  rr  rX  s               rP   #test_extrapolate_false_3D_separablez1TestNdBSpline.test_extrapolate_false_3D_separablei
  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 )Nr6   r   r  r)   r4   r   r  r  rn  r2   r  rj   rk   )	r  r   rF   rs   rH   r  r   r   r   )rM   r  r  r/   r  rm   r   rq  r   rc  rr  r   rX  s                rP   test_x_nan_3DzTestNdBSpline.test_x_nan_3Dy
  sD   %%'	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  r6   r6   r   r7      r  r2   r4   r)   r   r  r  r   rj   rk   )rF   rL   r  r   r  r   flagsc_contiguousr   r  r   r   rI  r   r  s              rP   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22	@2s   :G
c                     | j                         \  }}}t        ||d      }t        d      D ]  }d||   j                  _         d|j                  _        t        ||d      } |d       |d      k(  sJ y )Nr6   r   Frh   )r  r   r   r  	writeable)rM   r  r  r/   r  r   bspl3_s          rP   test_readonlyzTestNdBSpline.test_readonly
  sy    %%'	B"bA&q 	*A$)BqEKK!	*"2rQ'Y6)#4444rf   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)Nrh   )r7   r   r   r   gؗҜ<rk   r6   zData and knots*r  r)   r4   )
r  rF   rs   r   r)  r   r   r  rB   rD   )rM   r  r  r/   rc  dmdm1s          rP   test_design_matrixz TestNdBSpline.test_design_matrix
  s   %%'	BZZI./r2q!//B:%%b"q!Qi8xx{bhhqk)))

ckkm%@:& 	:##IrA3q59	: :->? 	9##aVHb1#a%8	9 	9	: 	:	9 	9s   D!9D-!D*-D6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      }t        |||f||	      }d
 }t        d||       y )Nr  r6   r   r   r   r   r7   r)   r   c                 L    t         j                  g dg dg df   } ||       y )Nr  r  r  )rF   r   )r   r  rc  s      rP   rY  z1TestNdBSpline.test_concurrency.<locals>.worker_fn
  s&    {&&' (B Grf   r^   )	rF   rL   r  r   r   r  r   r   r!   )	rM   r   r/   r@  rA  r  r.   r  rY  s	            rP   rZ  zTestNdBSpline.test_concurrency
  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-	 	 Is3rf   )r  r	  r
  rd  rj  rl  rt  r}  r  r  r  r  r  r  r  r  r  r  r  rZ   rh  ri  r  r  r  r  r  r  r  rj  rZ  r  rf   rP   r_  r_  		  s   B"&98($V6&$&,+2@ G(&47,G&@& [[\D$<8[[]T4L94 : 94 [[X|'DE4 F4 @ 4$@2
59 [[4 4rf   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   r6   r4   r)   r   rS   rk   r4  r   rT   )r   linearr  rj   )rF   rJ   rS  rT  r"   r   rq  r
   r.   scipy.interpolater   )rM   rm   r   r  ru  rO   rc  rv   r  r  r   RGIr  s                rP   test_2D_separable_simplez#TestMakeND.test_2D_separable_simple
  s1   IIaLIIaL31d7Q!Q$1*dAg!66!*!2!21a!89Aq!f9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                  t              }
|	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   r6   r4   r/   solver)$   r7   r7   rj   rk   rw  )r  r4   r4   )rF   rJ   rS  rT  r   r"   sslspsolverS  ro  r   r   rt   )rM   rm   r   ru  rO   rc  r  values4rv   rX  rr  values22s               rP   test_2D_separable_trailing_dimsz*TestMakeND.test_2D_separable_trailing_dims
  si   IIaLIIaL!*!2!21a!89Aq!f99 1d7Q!Q$1*dAg!66))VVVV<=Aq67aDbFFFF;<CCEJ||w&&&q!Q/U	, ??<0Aq68qEb||z)))q!Q2|45	B' :s   F	r/   )r  r  )r6   r)   )r)   r6   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   r6   r4   r  rS   rk   )	rF   rJ   rS  rT  r"   r  r  r   rq  )	rM   r/   rm   r   ru  rO   rc  r  rv   s	            rP   r  zTestMakeND.test_2D_mixed  s     IIaLIIaL3!*!2!21a!89Aq!f9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   r9   r:   r;   r  r  )r)   r4   r)   r4   r)   r)   )r)   r4   r6   r4   r)   r)   )r)   r4   r4   r4   r)   r)   )rF   r  rp  s       rP   _get_sample_2d_datazTestMakeND._get_sample_2d_data  sR    HH./HH./HH""""""	
 !Qwrf   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?r6   r)   r  r  r;   rD  r+   r6   rj   rk   r  r"   r   rF   r  r  r   rM   rm   r   rq  rv   r  rc  s          rP   test_2D_vs_RGI_linearz TestMakeND.test_2D_vs_RGI_linear  sq    **,1aAq61*%q!faAXX668 99: 	 	R#b'6rf   c                    | j                         \  }}}t        ||f|dt        j                        }t	        ||f|d      }t        j                  g dg dg      j                  }t         ||       ||      d       y )	Nr6   r  cubic_legacyr  r  r  rj   rk   	r  r"   r  r  r   rF   r  r  r   r  s          rP   test_2D_vs_RGI_cubiczTestMakeND.test_2D_vs_RGI_cubic'  sw    **,1aAq61#++>%q!faGXX668 99: 	 	R#b'6rf   r  c                     | j                         \  }}}t        ||f|d|d      }t        ||f|d      }t        j                  g dg dg      j
                  }t         ||       ||      dd	
       y )Nr6   gư>)r/   r  rV   r  r  r  r  rj   r   rT   r  )rM   r  rm   r   rq  rv   r  rc  s           rP   test_2D_vs_RGI_cubic_iterativez)TestMakeND.test_2D_vs_RGI_cubic_iterative1  sy     **,1aAq61&tD%q!faGXX668 99: 	 	R#b'DArf   c                    | j                         \  }}}t        ||f|dt        j                        }t	        ||f|d      }t        j                  g dg dg      j                  }t         ||       ||      d       y )	Nr   r  quintic_legacyr  r  r  rj   rk   r  r  s          rP   test_2D_vs_RGI_quinticz!TestMakeND.test_2D_vs_RGI_quintic@  sx    **,1aAq61#++>%q!fa8HIXX668 99: 	 	R#b'6rf   zk, meth))r)   r  )r6   r  )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  r  r  gffffff?r  r>   r  rj   rk   )
rF   rL   r  cumsumr  r"   r  r  r   r   )rM   r/   methrndmrm   r   rq  r  rv   r  rc  s              rP   test_3D_random_vs_RGIz TestMakeND.test_3D_random_vs_RGIJ  s     yy$$V,IIdlll*+IIdlll*+IIdlll*+9-Aq!9f#++F%q!QiEYY3Sw?R#b'6rf   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)   r  r  r/   r6   )r  rB   rD   r"   rF   r   )rM   rm   r   rq  solver_argss        rP   test_solver_err_not_convergedz(TestMakeND.test_solver_err_not_convergedZ  s    **,1a !n:X6 	7A6Q6+6	7 :X6 	GA		1a& 1FQF+F	G 	G	7 	7	G 	Gs   B'BBBN)r  r	  r
  r  r  rZ   rh  ri  r  r  r  r  r  gmresgcrotmkr  r  r  r  r  rf   rP   r  r  
  s    7(B4 [[S"JK> L> 77 [[X		3;;'?@B AB7 [[N77Grf   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  r4   r   z1D sequencer  )rF   rJ   rt   rZ   r   rD   _bfpcheckrM   r/   r-   rm   s       rP   test_1D_x_tzTestFpchec.test_1D_x_tg  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)Nr6   r4   r)   r?   r^   z	Need k+1*r  )	rF   rJ   dfitpackfpchecrZ   r   rD   r  r  )rM   r/   rN   r}  r-   rm   s         rP   test_condition_1zTestFpchec.test_condition_1r  s   AY]FIIaLIIaLq!Q'2---]]:[9 	 JJq!Q	  qsGaKEAIIIaLIIaLq!Q'2---]]:[9 	 JJq!Q	  	 	  	 	  	 s   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)Nr6   r   r)   r4   r   )r)   r4   r6   r7   r  r2   r   zLast k knots*r  zFirst k knots*r  r  r  r  r  rZ   r   rD   )rM   r/   r-   rm   tts        rP   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)
Nr6   r   r)   r4   r   r)   r4   r6   r  r7   r     zInternal knots*r  )r  r  r  r  rZ   r   rD   r   s       rP   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)
Nr6   r   r)   r   r  r#  zOut of bounds*r  r2   r  )rM   r/   r-   rm   rd   s        rP   test_condition_4zTestFpchec.test_condition_4  s    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)   r4   r4   )r  r  r  ri   Schoenberg-Whitney*r  )r   r   r   r  r  rZ   r   rD   r  r  r   s       rP   test_condition_5_x1xmz TestFpchec.test_condition_5_x1xm  s    q!Q'2---]]:-BC 	 JJq!Q	  q!Q'2---]]:-BC 	 JJq!Q	  	 	  	 
	  	 s   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   )r  r  r  r  r   s       rP   test_condition_5_k1zTestFpchec.test_condition_5_k1  sI    #Jq!Q'1,,,zz!Q"***rf   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)	Nr6   r   r)   r4   r   ri   r  r  r  r   s       rP   test_condition_5_1zTestFpchec.test_condition_5_1  s
   C1IOqc1Q3i'CEq!Q'2---]]:-BC 	 JJq!Q	  C1IOqc1Q3i'CEq!Q'2---]]:-BC 	 JJq!Q	  	 	  	 	  	 s   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)Nr6   r   r)   r4   r   r  r7   ri   r  r  r  r   s       rP   test_condition_5_2zTestFpchec.test_condition_5_2  s    C1IA!ac*E!GqcMq!Q'2---]]:-BC 	 JJq!Q	  E!Gq!fq!Q'1,,,zz!Q"***	  	 s   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   r4   r6   r7   r   r   r   r   )r)   r)   r)   @r  r  rn  ri   r  r  r  r   s       rP   test_condition_5_3zTestFpchec.test_condition_5_3  s`    ')q!Q'2---]]:-BC 	 JJq!Q	  	  	 s   A##A,N)r  r	  r
  r  r  r	  r  r  r  r  r  r  r  r  rf   rP   r  r  d  s4    	  *!, !> + + rf   r  c                    t        j                  | |||        }t        t        |      dz
        D cg c]  }|||   ||dz       j	                           }}||dd    }t        t        |            D ]'  }||   dz  }||xx   |z  cc<   ||dz   xx   |z  cc<   ) |dxx   |d   z  cc<   t        t	        |      t	        |      d       ||fS c c}w )z)Split the knot interval into "runs".
    r)   r2   r4   rS   rk   )rF   r  r   r(  r  r   )	rm   r-   r/   	residualsr=  r   fpartscarriescarrys	            rP   _splitr"  
  s     
AaG	$B6;CGAI6FGi1b1g&**,GFG1R!G3w<  
Qq	U	qsu
 2J)B-JCKYe<2: Hs   #Cc                 \   t        | |||      \  }}d}d}t        t        |            D ]$  }||dz      ||   z
  dkD  s||   |kD  s|}||   }& |dk(  rt        d      ||   ||dz      z   dz   dz  }	| |	   }
t	        j
                  ||
      }t        j                  |d| |
||d f   }|S )z Insert a new knot given reduals.ig}Ô%Ir)   z5Internal error, please report it to SciPy developers.r4   N)r"  r   r(  rD   rF   r  r   )rm   r-   r/   r  r  r=  idx_max	fpart_maxr   idx_newknotnew_knotidx_tt_news                rP   	_add_knotr*    s    1a+JFB GI3v; "ac7RU?Q6!9y#8Gq	I"
 $PQQ g;GAI.2q8K~HOOAx(EEE!FU)Xqy01ELrf   c                   F   e Zd Zd Zej
                  j                  dg d      d        Zd Zd Z	d Z
d Zd	 Zd
 Zd Zej
                  j                  dg d      ej
                  j                  dg d      d               Zej
                  j                   d        Zy)TestGenerateKnotsc                    t        j                  dt              }|dz  dd|z   z  z   }d}t        j                  dg|dz   z  dg|dz   z  z         }t	        ||||      } ||      |z
  d	z  }d
dlm} |j                  ||||      }t        ||||      }	t        ||	d       t	        ||||      }
 |
|      |z
  d	z  }|j                  ||||      }t        ||||      }t        ||d       y )Nr   r@   r6   r+   r)   r8   ro  )r/   r-   r4   r   _fitpack_reprorS   rk   )
rF   rJ   ro  r  r   r  r/  add_knotr*  r   )rM   rm   r   r/   r-   r  r  _frnew_tnew_t_pyspl2
residuals2new_t2	new_t2_pys                 rP   test_split_add_knotz%TestGenerateKnots.test_split_add_knot6  s    IIau%qD2q1u:HHbT1Q3Z2$!*,-aa1-VaZ!O	;Q1i0Q1i0xe4 q!qE21gkA%
a:6a:6		6rf   r/   r  c                    t        j                  dt         j                        }t        j                  |t         j                  z  dz        }t        t        |||d            d   }t        |||d      d   }t        ||d       y )Nr   r@   r   r/   r  r2   rS   rk   )	rF   rJ   rK   rq  r  rt  r   r   r   )rM   r/   rm   r   r-   r  s         rP   test_s0zTestGenerateKnots.test_s0N  sk    IIarzz*FF1RUU7191Q/04AqA#A&2E*rf   c                     d}t        j                  |      }|dz  }t        t        ||dd            }t	        |d   t        |d      d       y )Nr^   r6   r   r:  r2   rS   rk   rF   rJ   rt  r   r   r   rM   rN   rm   r   knotss        rP   	test_s0_1zTestGenerateKnots.test_s0_1W  sI    IIaLqD^AqA34b	;q!#45Arf   c                     d}t        j                  |      }|dz  }t        t        ||dd            }t	        |d   t        |d      d       y )Nr   r6   r   r:  r2   rS   rk   r=  r>  s        rP   test_s0_n20zTestGenerateKnots.test_s0_n20_  sI    IIaLqD^AqA34b	;q!#45Arf   c           
          t        j                  d      }|dz  }t        t              5  t	        t        ||ddd             d d d        y # 1 sw Y   y xY w)Nr^   r6   r   r/   r  nest)rF   rJ   rB   rD   rt  r   rM   rm   r   s      rP   test_s0_nestzTestGenerateKnots.test_s0_nestf  sJ    IIbMqD:& 	:1QR89	: 	: 	:s   AAc                    t        j                  d      }t        j                  |t         j                  z  dz        }d}t	        t        |||d            }g dg dg dg dg d	g}t        |      t        |      k(  sJ t        ||      D ]  \  }}t        ||d
        t        |||d      \  }}}t        |d   |d
       y)aY  
        To generate the `wanted` list below apply the following diff and rerun
        the test. The stdout will contain successive iterations of the `t`
        array.

$ git diff scipy/interpolate/fitpack/fpcurf.f
diff --git a/scipy/interpolate/fitpack/fpcurf.f b/scipy/interpolate/fitpack/fpcurf.f
index 1afb1900f1..d817e51ad8 100644
--- a/scipy/interpolate/fitpack/fpcurf.f
+++ b/scipy/interpolate/fitpack/fpcurf.f
@@ -216,6 +216,9 @@ c  t(j+k) <= x(i) <= t(j+k+1) and store it in fpint(j),j=1,2,...nrint.
         do 190 l=1,nplus
 c  add a new knot.
           call fpknot(x,m,t,n,fpint,nrdata,nrint,nest,1)
+          print*, l, nest, ': ', t
+          print*, "n, nmax = ", n, nmax
+
 c  if n=nmax we locate the knots as for interpolation.
           if(n.eq.nmax) go to 10
 c  test whether we cannot further increase the number of knots.
        r   r6   r   r:  )r8   r8   r8   r8   ro  ro  ro  ro  )	r8   r8   r8   r8   r;   ro  ro  ro  ro  
r8   r8   r8   r8   r9   r;   ro  ro  ro  ro  )r8   r8   r8   r8   r9   r;   r  ro  ro  ro  ro  )r8   r8   r8   r8   r9   r:   r;   rD  r   ro  ro  ro  rS   rk   r2   N)
rF   rJ   rq  r  rt  r   r(  r  r   r   )	rM   rm   r   r/   r?  wantedr-   r  r   s	            rP   test_s_switchzTestGenerateKnots.test_s_switchm  s    . IIaLFF1RUU719^AqA6726:>A	
 5zS[(((' 	/EArAr.	/ Ad+1ab	151rf   c                 `    t        t        d            }t        ||dd      }t        |       y )Nr   r  r)   )r  r/   )rt  r   r   next)rM   rm   gens      rP   rv  z!TestGenerateKnots.test_list_input  s&    qNQSA.S	rf   c           	      T   t        j                  d      }t        j                  |t         j                  z  dz        }d}t	        t        ||d|d            }t        |d   g dd	       t        t              5  t	        t        ||dd
             d d d        y # 1 sw Y   y xY w)Nr   r   r6   r^   rD  r2   rI  rS   rk   r7   )r/   rE  )	rF   rJ   rq  r  rt  r   r   rB   rD   )rM   rm   r   r  r?  s        rP   	test_nestzTestGenerateKnots.test_nest  s    IIaLFF1RUU719^AqA<=b	@u	N :& 	4123	4 	4 	4s   <BB'c           
         t        j                  d      }t        j                  |t         j                  z  dz        }t	        t
              5  t        t        ||t        j                  d                   d d d        t	        t
              5  t        t        ||t        j                  d                    d d d        y # 1 sw Y   MxY w# 1 sw Y   y xY w)Nr   r?   r  )	rF   rJ   rq  r  rB   rD   rt  r   r  rF  s      rP   r  zTestGenerateKnots.test_weights  s    IIaLFF1RUU719:& 	81		"67	8 :& 	6145	6 	6	8 	8	6 	6s   +C,CCCnpts)r  ri   r   r  )r  g{Gz?r   c                    t         j                  j                  d      }dt        j                  |j	                  |            z  }t        j
                  |t         j                  z  dz        t        j                  |dz
  dz         z   }d}t        ||||      d   }t        t        ||||            d	   }t        ||d
       y )Nr  r^   r   r   r4   r6   r:  r   r2   rS   rk   )rF   rL   r   r   r  rq  r  expr   rt  r   r   )	rM   r  rS  r  rm   r   r/   r-   r  s	            rP   test_vs_splrepz TestGenerateKnots.test_vs_splrep  s     yy$$U+rwwt|||.//FF1RUU72:!A#	!221a1"1%.Aa01"5AE*rf   c                 8   d}t        j                  |      }|dz  }t        t        ||dd            }t	               5 }|j                  t              }t        ||dd      }t        |      dk(  sJ 	 d d d        t        |d   d          y # 1 sw Y   xY w)N   r6   Jz5r:  r)   r2   r   )
rF   rJ   rt  r   r   recordRuntimeWarningr   r(  r   )rM   rN   rm   r   r?  suprc  rY   s           rP   test_s_too_smallz"TestGenerateKnots.test_s_too_small  s    IIaLqD ^AqA78  	C

>*AAe,Cq6Q;;	 	b	3q6*		 	s   5BBN)r  r	  r
  r8  rZ   rh  ri  r;  r@  rB  rG  rK  rv  rP  r  rV  rj  r]  r  rf   rP   r,  r,  5  s    70 [[S/2+ 3+BB:)2V46 [[V]3[[S.1+ 2 4+" [[+ +rf   r,  c                 Z   | j                   d   }| ||z
  dz
     | |   z
  }|d|z  z
  dz
  }| |dz   ||z
  dz
   }t        j                  |d      }|dddxx   dz  cc<   |dddxx   dz  cc<    t        | t        j                  ||z
  dz
        |      ||      }t        j
                  |dz
  |j                   d   ft              }t        d|j                   d   d      D ]"  }	||	ddf   ||	dz   ddf   z
  ||	dz  ddf<   $ |||z  |z  t        j                  |      z  z  }|S )zStraitforward way to compute the discontinuity matrix. For testing ONLY.

    This routine returns a dense matrix, while `_fitpack_repro.disc` returns
    a packed one.
    r   r)   r4   Nr   r   r@   )
r   rF   r  r   r'  emptyro  r   math	factorial)
r-   r/   rN   deltanrintrP  tiir}  matrr   s
             rP   
disc_naiverf    sD    	

Aa!eaiL1Q4E!GaKE	
1Q3qs1uB
))B
C!HH1II(266!a%!)$a(3A88U1Waggaj)7D1aggaj!$ ,!Q$!AaCF)+QT1W, 	U5[1t~~a000DKrf   c                       e Zd ZdZddZd Zy)F_densezm The r.h.s. of ``f(p) = s``, an analog of _fitpack_repro.F
    Uses full matrices, so is for tests only.
    Nc                    || _         || _        || _        || _        |t	        j
                  |t              n|| _        | j                  j                  dk(  sJ  t        |t	        j                  |j                  d   |z
  dz
        |      |      }|| j                  d d d f   z  | _        ddlm} t        |j!                  ||       j#                         | _        |j                  dk(  sJ || j                  z  }	t        j&                  |	t	        j(                  | j$                  j                  d         f   | _        || _        y )Nr@   r)   r   r.  )rm   r   r-   r/   rF   ra   ro  r  r  r   r'  r   a_denser  r/  r  discr  b_denser   r  r   r  )
rM   rm   r   r-   r/   r  r  rj  r1  r   s
             rP   r  zF_dense.__init__  s
   12au-vv{{a <'!RVVAGGAJNQ$67;A>40;#SXXa^4<<> vv{{Z%%BHHT\\%7%7%:;;<rf   c                    t        j                  | j                  | j                  |z  f      }ddlm}m}  ||d      \  }}|j                  | j                  z  }|j                  d   } ||d |d |f   |d |       }	t        | j                  |	| j                        }
t        j                  | j                  dz   |
| j                        | j                   z
  dz  z        }|
| _        || j$                  z
  S )Nr   )r  r  economic)r\  r)   r4   )rF   r  rj  rl  scipy.linalgr  r  r  r   r   r   r-   r/   r  r  rm   r   r  r  )rM   r   abr  r  r  rc  qyr  r.   r  fps               rP   r\  zF_dense.__call__  s    YYdllQ&678 	+":&1SS477]WWQZ!CRC"H+r#2w'dffa(VVDFFAITVVtvv!5 99:DFF{rf   r  )r  r	  r
  r  r  r\  r  rf   rP   rh  rh    s    ,rf   rh  c                       e 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
        Zd Zd Zy)TestMakeSplrepc                    t        j                  ddd      }t        j                  ddd      }t        t              5  t	        ||       d d d        t        t              5  t	        ddd       d d d        t        t              5  t        j
                  |j                  dddf      }t	        ||d       d d d        t        j
                  d      }t        t              5  t	        ||d	z  |d
       d d d        t        j
                  d       }t        t              5  t	        ||d	z  |d
       d d d        t        j
                  |j                  d   df      }t        t              5  t	        ||d	z  |d
       d d d        t        t              5  t	        |d d d   |d	z  d       d d d        t        t              5  t	        ||d	z  dd       d d d        t        t              5  t	        ||d	z  d       d d d        t        t              5  t	        ||d	z  d	dd       d d d        t        t              5  t	        ||d	z  dd       d d d        t        t              5  t	        t        j                  d      t        j                  d      d       d d d        y # 1 sw Y   jxY w# 1 sw Y   Qx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   oxY w# 1 sw Y   MxY w# 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   y xY w)Nr   r^   r?   r  r)   r4   r  r  r6   )r  r  r2   r=   r:  )r/   rE  r  )r  rE  r   	   )
rF   r`   rB   rD   r   r  r   r   rC   rJ   )rM   rm   r   r  s       rP   test_input_errorsz TestMakeSplrep.test_input_errors!  s   KK2r"KK2r":& 	1	 :& 	%1$	% :& 	%Aq)*A1$	%
 GGBK:& 	-1a41,	- WWR[L:& 	-1a41,	- GGQWWQZO$:& 	-1a41,	- :& 	.$B$A-	. 9% 	/1a43#.	/ :& 	'1a42&	' :& 	51a4114	5 :& 	/1a412.	/ :& 	;		!biilc:	; 	;a	 		% 	%	% 	%	- 	-
	- 	-
	- 	-	. 	.	/ 	/	' 	'	5 	5	/ 	/	; 	;s   J3"K 2K&K&K'4K4LL7L L(L455M 3J= K
KK$'K14K>LLL%(L14L= M	c                     t        j                  ddd      }t        j                  |dz  dz        dz  }d}d}t        j                  dg|dz   z  d	d
gz   dg|dz   z  z         }|||||fS )Nr   r   r?   gQ	@r4   r6   gq@H&?r)   r=   r;   )rF   r`   rq  r  )rM   rm   r   r/   r  r  s         rP   	_get_xyktzTestMakeSplrep._get_xyktX  sy    KK1b!VVAdFQJ"XXqc1Q3i3*,sAaCy89!Q2~rf   c                     ddl m} | j                         \  }}}}} |||d d d f   |||      }t        |||||      }dD ]  }	t	         ||	       ||	      d        y )Nr   Fr)   r^   r   rS   rk   ) scipy.interpolate._fitpack_repror}  rz  rh  r   )
rM   r}  rm   r   r/   r  r-   ff_dr   s
             rP   test_fitpack_FzTestMakeSplrep.test_fitpack_Fa  sj    6(1aAa1d7Q1%aAq!$ 	6AAaD#a&u5	6rf   c                    ddl m} | j                         \  }}}}}t        j                  |j
                  d   t              } |||d d d f   ||||      }t        ||||||      }	t        |||||      }
dD ]B  }t         ||       |	|      d       t        j                   |
|       |	|      d      sBJ  y )Nr   r|  r@   rR  r~  rS   rk   )
r  r}  rz  rF   rJ   r   ro  rh  r   r   )rM   r}  rm   r   r/   r  r-   r  fwfw_dr  r   s               rP   test_fitpack_F_with_weightsz*TestMakeSplrep.test_fitpack_F_with_weightsk  s    6(1aAIIaggaj.q!AtG*aA+q!Q1*aAq!$ 	@ABqE477{{3q647???	@rf   c           
         dd l mc m} t        j                  j                  d      }t        j                  ddddt        j                  |j                  d            dz  ddddf	   }t        |      d}}t        |j                  ||       j                         }t        ||      }|j                  d   |d|z  z
  dz
  k(  sJ t        ||d	       y )
Nr   r  r   r   r   r6   r4   rS   rk   )r  interpolater/  rF   rL   r  r   r   r  r(  r  rk  r  rf  r   r   )rM   r1  r   r-   rN   r/   DD_denses           rP   test_disc_matrixzTestMakeSplrep.test_disc_matrixz  s     	76ii##E*EE!Q1bggckkqk&9:1<aAqHI1vq1#((1a.)113Q"wwqzQ1Wq[(((7/rf   c                 H   | j                         \  }}}}}t        j                  dg|dz   z  ddgz   dg|dz   z  z         }t        ||||      \  }}}t	        ||k(        sJ t        ||||      }t        |d |j                  j                   |j                  d       y )	Nr   r)   r=   r;   r   r:  rS   rk   )	rz  rF   r  r   r   r   r   r.   r   )	rM   rm   r   r/   r  r  r-   r.   r  s	            rP   test_simple_vs_splrepz$TestMakeSplrep.test_simple_vs_splrep  s    )1aBXXqc1Q3i3*,sAaCy89q!qA&!A17||!Q!q)+355::E:rf   c                 b   | j                         \  }}}}}t        t        ||||            d   }t        ||||      }t        |||||      }t	        |j
                  |j
                  d       t	        |j                  |j                  d       |j                  |j                  k(  sJ y )Nr:  r2   )r-   r/   r  rS   rk   )rz  rt  r   r   r   r-   r.   r/   )	rM   rm   r   r/   r  r   r-   spl_autospl_ts	            rP   test_with_knotszTestMakeSplrep.test_with_knots  s    (1aA1Q/04q!qA.AqAa0

EGG%8

EGG%8zzUWW$$$rf   c                     d}t        j                  |      }|dz  }d}t        |||d      }|j                  j                  d   d|dz   z  k(  sJ y )Nr^   r6   r)   r:  r   r4   )rF   rJ   r   r-   r   )rM   rN   rm   r   r/   r  s         rP   test_no_internal_knotsz%TestMakeSplrep.test_no_internal_knots  sT    IIaLqD!Q!q)uu{{1~AaC(((rf   c                     d}t        j                  |      }|dz  }t        ||d      }t        ||d      }t	        |j
                  |j
                  d       y )Nr^   r6   r   rS   rk   )rF   rJ   r   r
   r   r.   )rM   rN   rm   r   r  spl_is         rP   test_default_szTestMakeSplrep.test_default_s  sM    IIaLqD!Q!$"1a1-uwwU3rf   c                    d}t        j                  |      }|dz  }t               5 }|j                  t              }t        ||dd      }t        ||dd      }t        |      dk(  sJ t        |j                  |d          t        t         j                  |j                  dg|j                  dz   z  f   |d   d	       d d d        y # 1 sw Y   y xY w)
NrX  r6   rY  r:  r4   r   r)   r  rk   )rF   rJ   r   rZ  r[  r   r   r(  r   r-   r   r   r.   r/   )rM   rN   rm   r   r\  rc  rY   r  s           rP   r]  zTestMakeSplrep.test_s_too_small  s     IIaLqD  	0C

>*AAe,Caa51Cq6Q;;CEE3q6*BEE#%%!ceeAg"67F0	0 	0 	0s   BCCc                 N   d\  }}t        j                  |      }|dz  }t        |||      }t        |||d      }|j                  j                  dk(  sJ |j                  j                  dk(  sJ t        ||dd|z   z  z   |d      }|j                  j                  dk(  sJ y )Nr^   r6   r6   r   h㈵>r:  r)   )rF   rJ   r   r.   r  )rM   rN   r/   rm   r   r  ru  r  s           rP   
test_shapezTestMakeSplrep.test_shape  s    1IIaLqD!Q!$AqA.uuzzQww||q    Aq1ac7{a48ww||q   rf   c                 z   d\  }}t        j                  |      }|dz  }t        ||dd      }t        ||dd      }|j                  j                  dk(  sJ |j                  j                  dk(  sJ |j
                  j                  d   ||z   dz   k(  sJ |j
                  j                  d   d|dz   z  k(  sJ y )Nr  r6   r   r:  r)   r4   )rF   rJ   r   r.   r  r-   r   )rM   rN   r/   rm   r   r  ru  s          rP   test_s0_vs_notzTestMakeSplrep.test_s0_vs_not  s    1IIaLqDAqA+AqA+ww||q   ww||q   ww}}Q1q519,,,ww}}Q1A;...rf   N)r  r	  r
  rx  rz  r  r  r  r  r  r  r  rZ   rh  rj  r]  r  r  r  rf   rP   rt  rt     sY    5;n6@0;
%)4 [[0 0! /rf   rt  c                       e Zd Zd
dZej
                  j                  dg d      d        Zej
                  j                  dg d      d        Zd Z	d Z
d Zy	)TestMakeSplprepc                     t        j                  |      t         j                  z  |z  }t        j                  |      t        j                  |      g}|||fS r  )rF   rJ   r  rq  rs  )rM   r}  r/   rm   r   s        rP   _get_xykzTestMakeSplprep._get_xyk  sB    IIaL255 1$VVAYq	"!Qwrf   r  r   r  gMbP?r  c           
      8   d\  }}t        j                  |      t         j                  z  |z  }t        j                  |      t        j                  |      g}ddddd}t        ||      \  \  }}}}	t        ||      \  }
}t        ||	d	       t        |
j                  |d	       t        |      ||   k(  sJ t        j                  |      j                  }t        |
j                  |d	       t         |
|       t        |||d
      |      d	       y )Nr  rX  r   rw  r^   r  rv  rS   rk   r)   r  )rF   rJ   r  rq  rs  r   r   r   r-   r(  rs   r  r.   r   )rM   r  r}  r/   rm   r   	num_knotsr-   r.   u_r  r  r   s                rP   test_simple_vs_splprepz&TestMakeSplprep.test_simple_vs_splprep  s     1IIaL255 1$VVAYq	" %u=	  Q	Aq2a1%Q 	2E* 	qu-1v1%%% ZZ]__r. 	A01aa03%	Arf   c                 |   | j                         \  }}}t        |t              sJ t        j                  |      d   dk(  sJ t        ||      \  }}t        t        j                  |      |      \  }}t        |||       t        |d   |d   d       t        |d         t        |d         k(  sJ t        |d   |d         D ]  \  }}	t        ||	d        |d   |d   k(  sJ t        j                  t        ||            t        j                  |      k(  sJ t        ||      \  }
}t        ||d       t        |
j                  |d   d       t        |
j                  j                  |d   d       |
j                  |d   k(  sJ  |
|      j                  t        j                  |      k(  sJ t        t        j                  |      |      \  }
}t        ||d       t        |
j                  |d   d       t        |
j                  j                  |d   d       |
j                  |d   k(  sJ  |
|      j                  t        j                  |      k(  sJ t!        t"              5  t        t        j                  |      j                  |       d d d        y # 1 sw Y   y xY w)Nr   r4   rv  rk   rS   r)   )r  r   rt  rF   r   r   rs   r   r(  r  r   r   r-   r.   r  r/   rB   rD   )rM   r  r   r   rY   r  tck_au_ar  r  r  s              rP   test_array_not_listz#TestMakeSplprep.test_array_not_list  sB    --/1a!T"""xx{1~""" aQRZZ]a0
s3Q'Aau53q6{c%(m+++#a&%(+ 	0FBB/	01vq!!!xxa&"((1+555a1%Q3U+uQxe4q6uua   1v||rxx{***bjjmq1Q3U+uQxe4q6uua   1v||rxx{***:& 	/AA.	/ 	/ 	/s   >+J22J;c                 t    | j                  d      \  }}}t        |      \  }}t         ||      |d       y )Nr^   r|  rS   rk   )r  r   r   )rM   rm   r   r/   r  r  s         rP   test_default_s_is_zeroz&TestMakeSplprep.test_default_s_is_zero'  s5    --"-%1aaQA.rf   c                 p   | j                  d      \  }}}t        |d      \  }}t        |d      \  }}t        ||d       t         ||      |d       t         ||      |d       |j                  |j                  k(  sJ |j                  j
                  |j                  j
                  k(  sJ y )Nr^   r|  r   rv  rS   rk   r   )r  r   r   r  r.   r   )rM   rm   r   r/   r  u_ispl_nu_ns           rP   test_s_zero_vs_near_zeroz(TestMakeSplprep.test_s_zero_vs_near_zero-  s    --"-%1a!!q)
s!!u-
sSu-c
AE2c
AD1zzUZZ'''ww}}---rf   c                    t        j                  dt              }t        t              5  t        |       d d d        t        t              5  t        |d       d d d        t        t              5  t        |d       d d d        t        |gd      \  }}t        |gd      \  }} ||      j                  dk(  sJ t         ||      |gd	       y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   pxY w)
Nr   r@   r   rv  r  r  )r)   r   rS   rk   )	rF   rJ   ro  rB   rD   r   r   r   r   )rM   rm   rY   r  r  r  s         rP   rd  zTestMakeSplprep.test_1D:  s    IIau%:& 	AJ	 :& 	!a 	! :& 	#c"	# 1#&RqcT*Q1v||v%%%A%0	 		! 	!	# 	#s#   CC$3C0C!$C-0C9Nr  )r  r	  r
  r  rZ   rh  ri  r  r  r  r  rd  r  rf   rP   r  r    se    
 [[S"67A 8A: [[S"67 / 8 /D/.1rf   r  r  )#   r6   r]  )r)   )gr  rL  rS  r`  r]  numpyrF   numpy.testingr   scipy._lib._array_apir   r   rZ   r   rB   r  r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   ro  r  r  scipy.sparse.linalgsparser  scipy.interpolate._bsplinesr   r   r   r   r   r   r   r   scipy.interpolate._fitpack_implr  _fitpack_implr   scipy._lib._utilr    scipy._lib._testutilsr!   scipy.interpolate._ndbspliner"   r#   r  r$   r  r%   r'   rl  r  r  rz   r{   r   rl   r   rX   r  r  r  r  r  rh  ri  r  r  r  r  r  r  r  r   r"  rC  r  r:  rI  r_  r  r  r"  r*  r,  rf  rh  rt  r  r  rf   rP   <module>r     s   	      + B *     
  ! !E E H G / / & 9 5 3 - &y	) y	)vM$ M$`6.&
G>H$+$_) _)D}? }?@88 !++11(Y<MN y: y:x >)X	(d+ d+N*
F3 F3V
7:" :"zG4 G4TNG NGba  a L(.a+ a+H2+ +\}/ }/@i1 i1rf   