a
    hn                    @   s"  d dl Z d dlZd dlZd dlZd dlmZmZmZ d dl	m
Z d dl	Z	d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z! d dl"m#  m Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,  m-Z. d dl/m0Z0 d dl1m2Z2 d dlm3Z3 d d	lm4Z5 G d
d dZ6G dd dZ7dd Z8dd Z9dd Z:dd Z;dd Z<dd Z=d>ddZ>d?ddZ?d d! Z@G d"d# d#ZAG d$d% d%ZBd&d' ZCd@d(d)ZDG d*d+ d+ZEd,d- ZFG d.d/ d/ZGd0d1 ZHd2d3 ZId4d5 ZJG d6d7 d7ZKG d8d9 d9ZLG d:d; d;ZMG d<d= d=ZNdS )A    N)assert_equalassert_allcloseassert_)raises)BSplineBPolyPPolymake_interp_splinemake_lsq_spline_bsplsplevsplrepsplprepsplder
splantidersprootsplintinsertCubicSpline	NdBSplinemake_smoothing_splineRegularGridInterpolator)_not_a_knot_augknt_woodbury_algorithm_periodic_knots_make_interp_per_full_matr)	AxisError)make_ndbspl)dfitpack)	_bsplinesc                   @   s  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zej !d9e"d:d;d<d= Z#d>d? Z$d@dA Z%ej !dBg dCej !dDe"dEdFdG Z&dHdI Z'dJdK Z(dLdM Z)ej !dNg dOdPdQ Z*ej !dNg dOdRdS Z+dTdU Z,dVdW Z-dXS )YTestBSplinec              	   C   s  t ttftfi tddgdgdd tjdd4 t ttfi tdtjgdgdd W d    n1 sl0    Y  t ttfi tdtjgdgdd t ttfi tddgdgdd t ttfi tdgdggdgdd t ttfi tg d	dgdd t ttfi tg d
ddgdd t ttfi tg dg ddd t ttfi tg dg ddd t ttfi tg dg ddd d\}}t	|| d }tj

|}t|||}t||j t||j t||j d S )N                 ?      ?r   tckignore)invalidr   r"      r   r"   r-         r-   )        r1   r$          @      @      @)r$   r$   r$   Zcubic      @)r1   r   r"   r"   r-   r/   )r$   r"   r"      r/   )assert_raises	TypeError
ValueErrorr   dictnpZerrstatenaninfarangerandomr   r&   r'   r   r(   )selfnr(   r&   r'   b rD   a/var/www/html/assistant/venv/lib/python3.9/site-packages/scipy/interpolate/tests/test_bsplines.py	test_ctor!   s8    B$"&"



zTestBSpline.test_ctorc                 C   s|   t  }|j}t|j|d ddd t|j|d ddd t|j|d  tt	 d|_W d    n1 sn0    Y  d S )Nr   V瞯<atolrtolr"   r-   Zfoo)
_make_random_splinetckr   r&   r'   r   r(   pytestr   AttributeError)rA   rC   rL   rD   rD   rE   test_tckD   s    zTestBSpline.test_tckc                 C   sf   t ddd}tddgdgdd}t||d tg dddgdd}t||t |d	k dd d S )
Nr   r"   
   r3   r%   r/   )r   ffffff?r"   r0   rQ   )r<   linspacer   r   whererA   xxrC   rD   rD   rE   test_degree_0P   s
    zTestBSpline.test_degree_0c                 C   s   g d}g d}d}t |||}tddd}t|d t| |d t|d   |d t|d   ||dd	 tt||||f||dd	 d S )
Nr.   r"   r-   r/   r"   r/   2   r   r-   +=rI   )r   r<   rR   r   B_012r   )rA   r&   r'   r(   rC   xrD   rD   rE   test_degree_1Y   s    8zTestBSpline.test_degree_1c                 C   s   d}t dg|d  dg|d   }t g d}t|ddddg}t|||}t ddd}t||d	d
||d	d
dd tt||||f||dd d S )Nr/   r   r"   r$   r2   r3   r4   r+   g      r2   rP   TextrapolaterY   rZ   )r<   asarrayr   reshaper   rR   r   r   )rA   r(   r&   r'   bpbsplrU   rD   rD   rE   test_bernsteind   s    "zTestBSpline.test_bernsteinc                    s   t  }|j\ t  d  d}||} fdd|D }t||dd  fdd|D }t||dd d S )Nr"   rX   c                    s   g | ]}t | qS rD   _naive_eval.0r\   r'   r(   r&   rD   rE   
<listcomp>z       z4TestBSpline.test_rndm_naive_eval.<locals>.<listcomp>rY   rZ   c                    s   g | ]}t | qS rD   )_naive_eval_2rh   rj   rD   rE   rk   }   rl   )rK   rL   r<   rR   r   )rA   rC   rU   Zy_bZy_nZy_n2rD   rj   rE   test_rndm_naive_evalr   s    z TestBSpline.test_rndm_naive_evalc                 C   sP   t  }|j\}}}t|| || d  d}t||t||||fdd d S )Nr"   rX   rY   rZ   rK   rL   r<   rR   r   r   rA   rC   r&   r'   r(   rU   rD   rD   rE   test_rndm_splev   s    zTestBSpline.test_rndm_splevc                 C   s   t jd t t jd}t jd}t||}t| }|j|j }}t || || d  d}t	||t
||dd d S )N     r"   P   rY   rZ   )r<   r@   seedsortr   r   r&   r(   rR   r   r   )rA   r\   yrL   rC   r&   r(   rU   rD   rD   rE   test_rndm_splrep   s    
zTestBSpline.test_rndm_splrepc                 C   sJ   t  }t|j|_t|j|j |j|j d  d}t||d d S )Nr"   d   r$   )rK   r<   	ones_liker'   rR   r&   r(   r   )rA   rC   rU   rD   rD   rE   test_rndm_unity   s    $zTestBSpline.test_rndm_unityc           	      C   s~   d\}}t t j|}t jj|ddfd}t|||}|| || d   }}||| t jd  }t||jd d S )N   r/         sizer"   r/   r0      )r/   r0   r   r~   r   )r<   rv   r@   r   r   shape)	rA   rB   r(   r&   r'   rC   tmtprU   rD   rD   rE   test_vectorization   s    zTestBSpline.test_vectorizationc           
      C   s   d\}}t t j|| d }t j|}t j|t j|d f }t|||t||| }}|d |d  }t |d | |d | d}	t||	||	dd t||	t|	|||fdd t||	t|	|||fdd d S )N)!   r/   r"   r+   r   rX   rY   rZ   )r<   rv   r@   r_r   rR   r   r   )
rA   rB   r(   r&   r'   Zc_padrC   Zb_paddtrU   rD   rD   rE   
test_len_c   s    zTestBSpline.test_len_cc                 C   sb   t  }|j\}}}|| || d   }}dD ].}t|||g|||d |d g|dd q.d S )Nr"   )TF绽|=&.>rZ   rK   rL   r   )rA   rC   r&   _r(   r   r   extraprD   rD   rE   test_endpoints   s    zTestBSpline.test_endpointsc                 C   sX   t  }|j\}}}t|||d | d  d |||d | d  d dd d S )Nr"   r   r   rZ   r   )rA   rC   r&   r   r(   rD   rD   rE   test_continuity   s
    :zTestBSpline.test_continuityc                 C   s   t  }|j\}}}|d |d  }t|| | || d  | d}|| |k ||| d  k @ }t||| dd||| dd t||ddt||||fdd d S )	Nr+   r   r"   rX   Tr_   F)extro   )rA   rC   r&   r'   r(   r   rU   maskrD   rD   rE   test_extrap   s    $zTestBSpline.test_extrapc                 C   sL   t  }|j\}}}|d d |d d g}||}ttt|  d S )Nr   r"   r+   )rK   rL   r   r<   allisnan)rA   rC   r&   r   r(   rU   yyrD   rD   rE   test_default_extrap   s
    zTestBSpline.test_default_extrapc           	      C   s  t jd t t jd}t jd}d}t|||dd}|j|d  }|d |d	  }t || | || | d
}|| |||  || ||    }t||t||||f g d}|| |||  || ||    }t	||dd||dd d S )Nrr      r0   r/   periodicr_   r"   r+   r   rX   )r+   r         ?r"   T)
r<   r@   ru   rv   r   r   rR   r   r   r   )	rA   r&   r'   r(   rC   rB   r   rU   xyrD   rD   rE   test_periodic_extrap   s    $$z TestBSpline.test_periodic_extrapc                 C   sV   t  }|j\}}}t|||f}t|| ||  d}t||||ddd d S )Nry   rY   rH   )rK   rL   r   from_spliner<   rR   r   )rA   rC   r&   r'   r(   pprU   rD   rD   rE   
test_ppoly   s
    zTestBSpline.test_ppolyc                 C   s   t  }|j\}}}t|d |d d}tj||f }td|d D ].}t||||f|d}t||||ddd qDt|||d dddd d S )	Nr   r+   rX   r"   dernurY   rZ   )rK   rL   r<   rR   r   ranger   r   )rA   rC   r&   r'   r(   rU   r   ZydrD   rD   rE   test_derivative_rndm   s    z TestBSpline.test_derivative_rndmc              
   C   s4  d}g d}t jd t jddt jdddf }t|||}t g d}t|||dk d |||dk d  tt |d	|d
  t ddg}t||d dd||d dd t ddg}tt 	t ||d dd||d dd  tt 	t ||d dd||d dd  d S )Nr-   )r+   r+   r   r"   r"   r/   r0   r~   r~   r~   r   r   rr   r   r   )r"   r/   r0   r~   r~   r   g2H@gη   @r/   r0   r"   r   )
r<   r@   ru   r   r   ra   r   r   Zallcloser   )rA   r(   r&   r'   rC   r\   x0x1rD   rD   rE   test_derivative_jumps  s*    
z!TestBSpline.test_derivative_jumpsc                 C   s   t ddd}tjg dd}t||t||j|j|jfdd t||t	|dd tjg dd}t d	d
d}t||t 
|dk || d| d
 dd d S )Nr+   r0   rs   r   r"   r-   r/   )r&   rY   rZ   r   r"   r"   r-   r   r-   rP   r"   r2   )r<   rR   r   basis_elementr   r   r&   r'   r(   B_0123rS   rT   rD   rD   rE   test_basis_element_quadratic  s    z(TestBSpline.test_basis_element_quadraticc                 C   sN   t  }|j\}}}t|| || d  d}t||t||||dd d S )Nr"   rs   rY   rZ   )rK   rL   r<   rR   r   _sum_basis_elementsrp   rD   rD   rE   test_basis_element_rndm*  s    z#TestBSpline.test_basis_element_rndmc           	      C   s   t  }|j\}}}|d }t|||}t||jj|}t||jj|}t|| || d  d}t||j||dd t||j||dd d S )Ny      ?      @r"   rs   rY   rZ   )	rK   rL   r   r'   realimagr<   rR   r   )	rA   rC   r&   r'   r(   ccb_reb_imrU   rD   rD   rE   
test_cmplx0  s    zTestBSpline.test_cmplxc                 C   s&   t g d}tt|tj d S )Nr   )r   r   r   r<   r   r=   rA   rC   rD   rD   rE   test_nan=  s    zTestBSpline.test_nanc                 C   st   t dd}|j\}}}t|||}t|| || d  d}td|D ]&}| }t|||||ddd qHd S )Nr   r(   r"   rs   -q=rH   )rK   rL   r   r<   rR   r   
derivativer   )rA   rC   r&   r'   r(   Zb0rU   jrD   rD   rE   test_derivative_methodB  s    
z"TestBSpline.test_derivative_methodc                 C   s   t  }|j\}}}t|| || d  d}t|  |||ddd tj|||f }t||f}t	|||}t|  |||ddd d S )Nr"   rs   rY   rH   )
rK   rL   r<   rR   r   antiderivativer   c_dstackr   rp   rD   rD   rE   test_antiderivative_methodK  s    

z&TestBSpline.test_antiderivative_methodc                 C   s>  t g d}t|ddd t|ddd t|ddd t|ddd t|jddddd t|jddd	dd t|jddd	dd t|jddd	dtdd|j d
|_| }|d|d }t|dd| t|ddd|  t|dd| t|ddd|  t|dd|d|d  t|dd|d|d |d |d  t|dd|d|d |d |d  t|dd|d|d |d |d d|   t|dd|d|d  t|dd|d|d  t|dd|d|d d|   d S )Nr,   r   r"   r         r+   Tr_   Fr   r-   iii      ?r/   g      +@   r~   ir0   )	r   r   r   	integrate_implr   rL   r`   r   )rA   rC   iZ
period_intrD   rD   rE   test_integralY  s:    .&zTestBSpline.test_integralc                 C   sN   g d}t ||}d|_t|}dD ]"\}}t|||||| q&d S )Nr.   r   ))r   )r   r   )r      )r	   r`   r   r   r   r   )rA   r\   rC   pr   r   rD   rD   rE   test_integrate_ppoly~  s    


z TestBSpline.test_integrate_ppolyc                 C   sN   G dd dt }|g d}t|j| t| j| t| j| d S )Nc                   @   s   e Zd ZdS )z'TestBSpline.test_subclassing.<locals>.BN)__name__
__module____qualname__rD   rD   rD   rE   B  s   r   )r   r"   r-   r-   )r   r   r   	__class__r   r   )rA   r   rC   rD   rD   rE   test_subclassing  s
    zTestBSpline.test_subclassingaxisr   r0   c              
   C   sf  d\}}t dd|| d }g d}|d }||| t jj|d}t||||d}t|jj|| g|d |  ||d d    t jd}	t||	j|d | t|	j ||d d    |j	 d |j	fD ]"}
t
ttfi t||||
d	 qt||||d t||||dd
t||||d t||||dd
fD ]}t|j|j qLd S )Nr|   r   r"   r~   r   r   r0   r   r   r   )r&   r'   r(   r   r-   )r<   rR   r   r@   r   r   r'   r   listndimr8   r   r;   r   r   r   )rA   r   rB   r(   r&   shZpos_axisr'   rC   xpaxb1rD   rD   rE   	test_axis  s0    $
$
zTestBSpline.test_axisc                 C   sp   d}g d}t g dg dg}t|||dd}t||d |}t||d |}t|d	|d	|d	g d S )
Nr-   )r   r"   r-   r/   r0   r   r~   )r+   r-   r   r+   )r-   r   r"   r+   r   r   r"   r5   )r<   arrayr   r   )rA   r(   r&   r'   splZspl0Zspl1rD   rD   rE   test_neg_axis  s    zTestBSpline.test_neg_axisc                 C   sh   dd }d}d}dD ]}|||| qt dddD ]}|||d q2d	}t dd
D ]}|||d qRdS )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           	      S   s   t jd t t j| d d }t j| d d }|dkrN|d |d< t||||d}t t|j| d }t	|j|||}t	
||j| }t||j |d	d
 t||d	d
 dS )zY
            To avoid repetition of code the following function is provided.
            rr   (   rs   r   r+   r   r(   bc_typer"   rY   rZ   N)r<   r@   ru   rv   random_sampler	   eyelenr&   r   design_matrixtoarrayr   r'   )	rB   r(   r   r\   rw   rd   r'   Zdes_matr_defdes_matr_csrrD   rD   rE   run_design_matrix_tests  s    zHTestBSpline.test_design_matrix_bc_types.<locals>.run_design_matrix_testsr7   r/   clampednaturalr   r-   
not-a-knotr   r   r   N)r   )rA   r   rB   r(   bcrD   rD   rE   test_design_matrix_bc_types  s    z'TestBSpline.test_design_matrix_bc_typesr`   )FTr   degreer   c           
   	   C   sJ  t jd t jd|d  }t |t | }}|}t jt |d |d |t ||d|d  t |d |d |f }t t	|| d }t
||||}	t|	|t
||||  t |d |d |d |d g}|s(tt  t
|||| W d   n1 s0    Y  nt|	|t
||||  dS )z;Test that design_matrix(x) is equivalent to BSpline(..)(x).rr   rP   r"   r-   r   N)r<   r@   ru   r   ZaminZamaxr   rR   r   r   r   r   r   r   r   rM   r   r:   )
rA   r`   r   r\   ZxminZxmaxr(   r&   r'   bsplinerD   rD   rE   'test_design_matrix_same_as_BSpline_call  s*    "2z3TestBSpline.test_design_matrix_same_as_BSpline_callc           
      C   s   t jd d}d}t t j|d d }t j|d d }t|||d}tddD ]D}|d | }|d | }t||j	|
 }	t|	|j |d	d
 qZd S )Nrr   rP   r/   r   rs   r   r"   r0   rY   rZ   )r<   r@   ru   rv   r   r	   r   r   r   r&   r   r   r'   )
rA   rB   r(   r\   rw   rd   r   Zxcycr   rD   rD   rE   test_design_matrix_x_shapes  s    z'TestBSpline.test_design_matrix_x_shapesc                 C   s2   g d}t d|d }t|g dgdd d S )N)r$   r$   r$   r2   r3   r4   r4   r4   r2   r/   )g      ?gmਪ?gK}\UU?r1   rY   rZ   )r   r   r   r   )rA   r&   Zdes_matrrD   rD   rE   test_design_matrix_t_shapes  s    z'TestBSpline.test_design_matrix_t_shapesc                 C   s   t jd d}d}t t j|d d }t j|d d }t|||d}tt* t	||j
d d d | W d    n1 s0    Y  d}g d	}g d
}tt t	||| W d    n1 s0    Y  d S )Nrr   rP   r/   r   rs   r   r+   r-   )r1   r$   r2   r3   r4         @r^   )r<   r@   ru   rv   r   r	   r8   r:   r   r   r&   )rA   rB   r(   r\   rw   rd   r&   rD   rD   rE   test_design_matrix_asserts  s    
8
z&TestBSpline.test_design_matrix_assertsr   )r   r   r   r   c                 C   s   t jd t t jd}t jd}|dkr>|d |d< t|||d}tj||d}t ddd}t||||dd	 t	|||d}t|j
|j
dd	 d S )
Nrr   rs   r   r   r+   r   r"   rG   rZ   )r<   r@   ru   rv   r   r   from_power_basisrR   r   r	   r'   )rA   r   r\   rw   cbrd   rU   Zbspl_newrD   rD   rE   test_from_power_basis,  s    z!TestBSpline.test_from_power_basisc                 C   s   t jd t t jd}t jdt jdd  }|dkrN|d |d< t|||d}tj||d}t||j|d}t||j	|d}t
|jj|jd|j  j t|j|jd|j  dd	 d S )
Nrr   rs   r#   r   r   r+   r   rG   rZ   )r<   r@   ru   rv   r   r   r   r	   r   r   r   r'   dtyper   )rA   r   r\   rw   r   rd   Zbspl_new_realZbspl_new_imagrD   rD   rE   test_from_power_basis_complex;  s"    
z)TestBSpline.test_from_power_basis_complexc                 C   sL   t g d}t g d}tjt||dddd}t|jg ddd dS )	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]
        r.   )r"   r"   r"   r"   r"   r   r   )r"   r"   r"   r"   r"   r"   r"   rG   rZ   N)r<   r   r   r   r   r   r'   )rA   r\   rw   rd   rD   rD   rE   test_from_power_basis_exmpL  s    z&TestBSpline.test_from_power_basis_exmpc                 C   sl   t ddg}t dg}|jdd |jdd t ddd}|jdd t||dd}t||d d S )	Nr   r"   r3   FwriterP   r%   r/   )r<   r   setflagsrR   r   r   )rA   r&   r'   rU   rC   rD   rD   rE   test_read_only_  s    zTestBSpline.test_read_onlyN).r   r   r   rF   rO   rV   r]   re   rn   rq   rx   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   markparametrizer   r   r   r   r   r   r   r   r   r   r  r  rD   rD   rD   rE   r!      sX   #				%


*

r!   c                   @   sr   e Zd Zejdg ddd Zejdg ddd Zd	d
 Zejdg ddd Z	dd Z
dd ZdS )
TestInsertxval)r1   r$   r5   r0         @      @c                 C   s  t d}t |d }t||dd}t||}||}t|j|jdd t|j|jd |j	 d  dd ||d kr~|n
|d d }t j
|d|dd  |d d   f }t||||dd t |d }t||dd}	t|t j||f dd}
|
|}t|j|jdd t|jt j||j|	|jf dd ||d krR|n
|d d }t j
|d|dd  |d d   f }t|
|||dd d S )	Nr   r/   r   rG   rZ   r"   r+   r   )r<   r?   sinr	   r   insert_knotr   r&   r'   r(   r   cosr   )rA   r	  r\   rw   r   spl_1fspl_1rU   y1Zspl_y1Zspl_yyZspl_yy1rD   rD   rE   test_inserto  s.    


"&

&zTestInsert.test_insertzxval, m))r1   r-   )r$   r/   )r   r   )r0   r-   )r  r-   c           	      C   s   t d}t |d }t||dd}t|||d}|||}t|j|jdd t|j|jd |j	 d  dd ||d kr|n
|d d }t j
|d	|dd  |d d   f }t||||dd d S )
Nr   r/   r   mrG   rZ   r"   r+   r   )r<   r?   r  r	   r   r  r   r&   r'   r(   r   )	rA   r	  r  r\   rw   r   r  r  rU   rD   rD   rE   test_insert_multi  s    
"&zTestInsert.test_insert_multic           
      C   s   t jd}d\}}t |j|| d d}|j|ddfd}t|||}|j||d  || d  d}||}|j||d  || d  dd	}	t||	||	d
d d S )N90  r6   r"   r   r/   r-   )lowhighr   r  r  r   rG   rZ   )r<   r@   default_rngrv   uniformr   r  r   )
rA   rngrB   r(   r&   r'   r   xvr  rU   rD   rD   rE   test_insert_random  s     
"zTestInsert.test_insert_randomr  )	r   皙?r2   r4         @      @      @gffffff@r  c                 C   s   t d}t |d }t||dd}t|ddi}||}t||jdd\}}}	t|j	|dd	 t|j
d |	 d
  |d |	 d
  dd	 t jdjdddd}
t||
t|
|||	fdd	 d S )Nr   r/   r   r`   r   TperrG   rZ   r"   rr   r   r   )   r  )r<   r?   r  r   r   r  r   rL   r   r&   r'   r@   r  r  r   )rA   r  r\   rw   rL   r   r  tfcfr(   rU   rD   rD   rE   test_insert_periodic  s    

,zTestInsert.test_insert_periodicc                 C   s   d}d}t dg|d  g d dg|d   }t t|| d }t|||dd}tt$ t||||fd	d
 W d    n1 s0    Y  tt || W d    n1 s0    Y  d S )N      @r/   r   r"   r-   r/   r0   r   r   r   r_   Tr#  )	r<   r   onesr   r   r8   r:   r   r  )rA   r  r(   r&   r'   r   rD   rD   rE   +test_insert_periodic_too_few_internal_knots  s    *
2
z6TestInsert.test_insert_periodic_too_few_internal_knotsc                 C   s   d}t dg|d  g d dg|d   }t t|| d }t|||}tt |d W d    n1 sx0    Y  tt |d W d    n1 s0    Y  tt |jddd W d    n1 s0    Y  d S )	Nr/   r   r"   r*  r   r+   r   r  )r<   r   r+  r   r   r8   r:   r  )rA   r(   r&   r'   r   rD   rD   rE   test_insert_no_extrap  s    *
(
(
z TestInsert.test_insert_no_extrapN)r   r   r   rM   r  r  r  r  r  r(  r,  r-  rD   rD   rD   rE   r  m  s   
 

r  c               	   C   sf   d	dd} dD ]R}t |d}tt|D ]6\}}| || td|d D ]}| |||dd qHq(qd S )
Nr   rY   c           	   	   S   s   | j \}}}t|}tj|d d d|dd  |d d   |d d f }tt||||f|| ||||d| d| j d d S )	Nr   r  r   r"   r+   zder = z  k = )rI   rJ   err_msg)rL   r<   uniquer   r   r   r(   )	rC   r   r   rI   rJ   r&   r'   r(   r\   rD   rD   rE   check_splev  s    
8z,test_knots_multiplicity.<locals>.check_splev)r"   r-   r/   r0   r   r   r"   r   )r   rY   rY   )rK   	enumerate_make_multiplesr   )r0  r(   rC   r   r   r   rD   rD   rE   test_knots_multiplicity  s    



r3  c                 C   s   |dkr4|| |   kr(||d  k r0n ndS dS |||  || krNd}n2| ||  |||  ||   t | |d || }||| d  ||d  krd}nF||| d  |  ||| d  ||d    t | |d |d | }|| 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$   r1   _naive_Br\   r(   r   r&   c1c2rD   rD   rE   r5    s    ,2Fr5  c                    s    krnt d    krBd  ksHn J kr`t k sdJ t fddtdd D S )z=
    Naive B-spline evaluation. Useful only for testing!
    r"   c                 3   s,   | ]$} |  t |  V  qd S Nr4  )ri   r   r'   r   r(   r&   r\   rD   rE   	<genexpr>  rl   z_naive_eval.<locals>.<genexpr>r   )r<   searchsortedr   sumr   )r\   r&   r'   r(   rD   r:  rE   rg     s    &rg   c                    sr   t d  }|d ks J t  |ks0J    krL| ksRn J t fddt|D S )z'Naive B-spline evaluation, another way.r"   c                 3   s$   | ]} | t | V  qd S r9  r4  ri   r   r'   r(   r&   r\   rD   rE   r;  #  rl   z _naive_eval_2.<locals>.<genexpr>r   r=  r   r\   r&   r'   r(   rB   rD   r?  rE   rm     s
    "rm   c                 C   s~   t ||d  }||d ks J t ||ks0J d}t|D ]<}tj|||| d  dd| }||| t| 7 }q<|S )Nr"   r1   r-   Fr_   )r   r   r   r   r<   Z
nan_to_num)r\   r&   r'   r(   rB   sr   rC   rD   rD   rE   r   &  s    "r   c                 C   sT   t | } t | | dk | dkB | dk| dk @ | dk| dk@ gdd dd dd gS )z+ A linear B-spline function B(x | 0, 1, 2).r   r-   r"   c                 S   s   dS )Nr1   rD   r\   rD   rD   rE   <lambda>7  rl   zB_012.<locals>.<lambda>c                 S   s   | S r9  rD   rC  rD   rD   rE   rD  7  rl   c                 S   s   d|  S Nr2   rD   rC  rD   rD   rE   rD  7  rl   )r<   
atleast_1d	piecewiserC  rD   rD   rE   r[   1  s    
r[   c                 C   s   t | } | dk | dk| dk @ | dkg}|dkrHdd dd dd g}n,|dkrhdd d	d d
d g}ntd| t | ||}|S )z0A quadratic B-spline function B(x | 0, 1, 2, 3).r"   r-   r   c                 S   s   | |  d S rE  rD   rC  rD   rD   rE   rD  ?  rl   zB_0123.<locals>.<lambda>c                 S   s   d| d d  S )Ng      ?r   r-   rD   rC  rD   rD   rE   rD  @  rl   c                 S   s   d|  d d S )Nr3   r-   rD   rC  rD   rD   rE   rD  A  rl   c                 S   s   dS Nr$   rD   rC  rD   rD   rE   rD  C  rl   c                 S   s   dS )Ng       rD   rC  rD   rD   rE   rD  D  rl   c                 S   s   dS rH  rD   rC  rD   rD   rE   rD  E  rl   znever be here: der=%s)r<   rF  r:   rG  )r\   r   ZcondsfuncspiecesrD   rD   rE   r   :  s    
r   #   r/   c                 C   s@   t jd t t j| | d }t j| }t|||S )N{   r"   )r<   r@   ru   rv   r   Zconstruct_fast)rB   r(   r&   r'   rD   rD   rE   rK   L  s    rK   c                 c   s   | j | j }}| j }|d |dd< |d |d< t|||V  | j }|d |d|d < t|||V  | j }|d || d d< t|||V  dS )	zIncrease knot multiplicity.         r}   r   Nr"   r+   )r'   r(   r&   copyr   )rC   r'   r(   t1rD   rD   rE   r2  S  s    


r2  c                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )TestInteropc                 C   s   t ddt j d}t |}t||}|j|j|jf| _|||  | _	| _
| _t ddt j d| _t j|j|j|jf }t ||f| _t|j| j|j| _d S )Nr   r4   r%  rO  )r<   rR   pir  r	   r&   r'   r(   rL   rU   r   rC   xnewr   r   r8  r   b2)rA   rU   r   rC   r8  rD   rD   rE   setup_methodi  s    

zTestInterop.setup_methodc                    s   | j | j| j  } }tt|  |ddd tt| j |ddd t fdd|D  |ddd ttdd t|| W d    n1 s0    Y  tt	d|j
jd }|j
|}|j||jf}tt|||||ddd d S )	NrG   rH   c                    s   g | ]}t | qS rD   )r   rh   rC   rD   rE   rk     rl   z*TestInterop.test_splev.<locals>.<listcomp>zCalling splev.. with BSplinematchr"   r   )rT  rC   rU  r   r   rL   r8   r:   tupler   r'   r   	transposer&   r(   )rA   rT  rU  r   r   rL   rD   rW  rE   
test_splevv  s$    



(
zTestInterop.test_splevc                 C   s   | j | j }}t||}t||\}}}t|d |dd t|d |dd t|d | t||dd\}}}}t|d |dd t|d |dd t|d | t||}	t||	dd t| }
t||
|dd d S )Nr   rG   rZ   r"   r-   T)full_output)rU   r   r   r   r   r   r   r   )rA   r\   rw   rL   r&   r'   r(   Ztck_fr   r   rC   rD   rD   rE   test_splrep  s    

zTestInterop.test_splrepc                 C   s  | j | j }}tj||f }tt t|| W d    n1 sD0    Y  tt t|| W d    n1 sx0    Y  ttdd* t|d d |d d  W d    n1 s0    Y  ttdd, t|d d |d d  W d    n1 s0    Y  d S )Nm > k must holdrX  r/   )	rU   r   r<   r   r8   r:   r   r   r9   )rA   r\   rw   y2rD   rD   rE   test_splrep_errors  s    
(
*8zTestInterop.test_splrep_errorsc           	      C   s   t dd}t|\}}t|\}}t||dd tt|||dd tt|||dd t|ddd\\}}}}}t||dd tt|||dd d S )Nr   r/   r   rG   rZ   r   T)rB  r^  )r<   r?   rb   r   r   r   r   )	rA   r\   rC   urL   u1Zb_fZu_fr   rD   rD   rE   test_splprep  s    zTestInterop.test_splprepc                 C   s  t dd}ttdd t| W d    n1 s:0    Y  ttdd t| W d    n1 sp0    Y  t jdddd}ttd	d t|g W d    n1 s0    Y  ttd	d t|g W d    n1 s0    Y  g d
}ttdd t|g W d    n1 s.0    Y  ttdd t|g W d    n1 sh0    Y  g d}g d}ttdd  t|gd |g  W d    n1 s0    Y  d S )N<   r   ztoo many values to unpackrX  r   r   r/   )numr`  ) >Iri   >Krj  zInvalid inputs)r"   r/   r-   r0   )r   g333333?g?r"   )	r<   r?   rb   r8   r:   r   r   rR   r9   )rA   r\   rd  rD   rD   rE   test_splprep_errors  s&    &((**,zTestInterop.test_splprep_errorsc                 C   s   | j | j }}tg dtj }tt||ddd tt|j|j|j	f|ddd t
tdd t|dd W d    n1 s0    Y  |jdd	d
}tt|j||j	fdd}t|jd t|| d
dd d S )N)r   r   r5   r)  gHz>rH   zCalling sproot.. with BSplinerX  rX   )Zmestr"   r-   r   )r/   r-   r0   r   rZ   )rC   rU  r<   r   rS  r   r   r&   r'   r(   r8   r:   r\  ra   r   r   )rA   rC   rU  rootsc2rZrrrD   rD   rE   test_sproot  s     *zTestInterop.test_sprootc                 C   s   | j | j }}ttdd|tdd|jdd ttdd||dddd ttdd tdd| W d    n1 sz0    Y  |j	ddd}t
tdd|j||jf}t|jd t|tdd|dd d S )	Nr   r"   rY   rZ   zCalling splint.. with BSplinerX  r-   r/   r-   )rC   rU  r   r   rL   r   r8   r:   r'   r\  r<   ra   r&   r(   r   r   )rA   rC   rU  rm  ZintegrrD   rD   rE   test_splint  s    *zTestInterop.test_splintc              	   C   s   | j | jfD ]}t|jt|j }|dkrVtj|jt|f|jjdd   f |_dD ]v}t	|}t
	|j|j|jf}t|j|d dd t|j|d dd t|j|d  tt|t tt|t qZqd S Nr   r"   rW   rG   rZ   r-   )rC   rU  r   r&   r'   r<   r   zerosr   r   r   r(   r   r   r   
isinstancer   r[  rA   rC   ctrB   ZbdZtck_drD   rD   rE   test_splder	  s    *zTestInterop.test_splderc              	   C   s   | j | jfD ]}t|jt|j }|dkrVtj|jt|f|jjdd   f |_dD ]v}t	|}t
	|j|j|jf}t|j|d dd t|j|d dd t|j|d  tt|t tt|t qZqd S rq  )rC   rU  r   r&   r'   r<   r   rr  r   r   r   r(   r   r   r   rs  r   r[  rt  rD   rD   rE   test_splantider  s    *zTestInterop.test_splantiderc                 C   s$  | j | j| j  }}}|jjd }d|j| |j|d    }t||t||j|j|jf }}tt	||t	||dd t
t|t t
t|t tt|jj}|j|dd  d }	t||j|	|jf}
t||}ttt	||
ddd||dd t
t|t t
t|
t d S )Nr-   r   r"   rG   rZ   rZ  r   )rC   rU  rU   r&   r   r   r'   r(   r   r   r   rs  r   r[  r   r   r\  r<   ra   )rA   rC   rU  rU   r   tnZbnZtck_nr   r   Ztck_n2Zbn2rD   rD   rE   r  )  s$    "


zTestInterop.test_insertN)r   r   r   rV  r]  r_  rb  rf  rk  rn  rp  rv  rw  r  rD   rD   rD   rE   rR  e  s   rR  c                   @   s  e Zd Zeddej ZeeZdd Z	dd Z
dd Zejd	g d
dd Zejd	g d
dd Zdd Zdd Zejd	g ddd Zdd Zdd Zdd Zejd	g ddd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zejjd)d*d+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%ejd	g d;d<d= Z&d>d? Z'd@dA Z(dBdC Z)dDdE Z*dFdG Z+dHS )I
TestInterpr1   r2   c                 C   s>   t t" t| j| jdd W d    n1 s00    Y  d S )Nr5   r   )r8   r9   r	   rU   r   )rA   rD   rD   rE   test_non_int_orderK  s    
zTestInterp.test_non_int_orderc                 C   sZ   t | j| jdd}t|| j| jddd t | j| jddd}t|| j| jddd d S )Nr   r   rY   rH   r+   r(   r   r	   rU   r   r   r   rD   rD   rE   test_order_0O  s    zTestInterp.test_order_0c                 C   sZ   t | j| jdd}t|| j| jddd t | j| jddd}t|| j| jddd d S )Nr"   r   rY   rH   r+   r{  r|  r   rD   rD   rE   test_linearU  s    zTestInterp.test_linearr(   r   c                 C   sN   g d}g d}t tdd t|||d W d    n1 s@0    Y  d S )Nr   r"   r-   r/   r0   r   )r   r"   r-   r/   r0   r   r~   r   zShapes of xrX  r   r8   r:   r	   rA   r(   r\   rw   rD   rD   rE   test_incompatible_x_y[  s    z TestInterp.test_incompatible_x_yc                 C   s   g d}g d}t tdd t|||d W d    n1 s@0    Y  g d}t tdd t|||d W d    n1 s0    Y  g d}t|d}t tdd t|||d W d    n1 s0    Y  d S )	N)r   r"   r"   r-   r/   r0   r  zx to not have duplicatesrX  r   )r   r-   r"   r/   r0   r   zExpect x to be a 1D strictly)r"   r+   )r8   r:   r	   r<   ra   rb   r  rD   rD   rE   test_broken_xb  s    ,,zTestInterp.test_broken_xc                 C   s6   dD ],}t | j| j|}t|| j| jddd qd S )Nrc  rY   rH   r|  )rA   r(   rC   rD   rD   rE   test_not_a_knotr  s    zTestInterp.test_not_a_knotc                 C   s   t | j| jddd}t|| j| jddd tddD ].}t|| jd |d|| jd	 |dd
d q6t | j| jddd	d}t|| j| jddd tddD ].}t|| jd |d|| jd	 |dd
d qd S )Nr   r   r   rY   rH   r"   r   r   r+   dy=rZ   r(   r   r   )r	   rU   r   r   r   )rA   rC   r   rD   rD   rE   test_periodicw  s    ,zTestInterp.test_periodic)r-   r/   r0   r   r~   r   c                 C   sh   d}t jd t t j|d }t j|d }|d |d< t|||dd}t|||d	d
 d S )Nr   rr   rP   ry   r+   r   r   r   rY   rZ   )r<   r@   ru   rv   r   r	   r   )rA   r(   rB   r\   rw   rC   rD   rD   rE   test_periodic_random  s    zTestInterp.test_periodic_randomc                 C   s   | j jd }tjd tj|d tj }t|}d|d< dtj |d< td|f}t	||d< t
||d< t||dddd	}t|D ]&}t||| |d d |f d
d qt||d ||d d
d d S )Nr   rr   r-   r1   r+   r"   r   r   r  rY   rZ   )rU   r   r<   r@   ru   r   rS  rv   rr  r  r  r	   r   r   )rA   rB   r\   rw   rC   r   rD   rD   rE   test_periodic_axis  s    
$zTestInterp.test_periodic_axisc                 C   s~   t jd d}d}t t j|}t j|}|d d |d< tt  t|||dd W d    n1 sp0    Y  d S )	Nrr   r   r   r+   r"   r   r   r   )r<   r@   ru   rv   r   r8   r:   r	   )rA   r(   rB   r\   rw   rD   rD   rE   test_periodic_points_exception  s    
z)TestInterp.test_periodic_points_exceptionc                 C   s   t jd d}d}t t j|}t j|}t |d|  }tt  t||||d W d    n1 sr0    Y  d S )Nrr   r/   r   r-   r   )	r<   r@   ru   rv   r   rr  r8   r:   r	   )rA   r(   rB   r\   rw   r&   rD   rD   rE   test_periodic_knots_exception  s    
z(TestInterp.test_periodic_knots_exceptionr*  c                 C   s   t | j| j|dd}t| j| jd|d}t| j|}t||| jdd td|D ],}t| j||d}t||| j|d	d
d qRd S )Nr   r   T)r$  r(   rY   rZ   r"   r   r   r   )r	   rU   r   r   r   r   r   )rA   r(   rC   rL   r   r   rD   rD   rE   test_periodic_splev  s    zTestInterp.test_periodic_splevc                 C   s   t | j| jddd}t| j| jdd}t|| j|| jdd d}ttj|d }tj|d }|d	 |d
< t ||ddd}t||dd}t||||dd d S )Nr/   r   r   r   rY   rZ   rP   ry   r+   r   )	r	   rU   r   r   r   r<   rv   r@   r   )rA   rC   ZcubrB   r\   rw   rD   rD   rE   test_periodic_cubic  s    zTestInterp.test_periodic_cubicc                    sj   dt | j| jdd}t| jt| j| j t fdd}t|| j|| jdd d S )Nr/   r   r   c                    s   t |  S r9  rf   rC  rj   rD   rE   rD    rl   z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>rY   rZ   )r	   rU   r   r   r   r<   Z	vectorizer   )rA   rC   r   rD   rj   rE   test_periodic_full_matrix  s    z$TestInterp.test_periodic_full_matrixc                 C   s   dg}t | j| jdd |fd}t|| j| jddd t|| jd d|d d ddd t | j| jd|d fd}t|| j| jddd t|| jd d|d d ddd d S )	Nr"   g       @r-   r   rY   rH   r+   r"   r   r|  )rA   r   rC   rD   rD   rE   test_quadratic_deriv  s    $zTestInterp.test_quadratic_derivc                 C   s   d}dgdg }}t | j| j|||fd}t|| j| jddd t|| jd d|| jd	 dg|d d |d d gddd d
gd
g }}t | j| j|||fd}t|| j| jddd d S )Nr/   r"   r3   )r"   r4   r   rY   rH   r   r"   r+   r-   r   r|  )rA   r(   der_lder_rrC   rD   rD   rE   test_cubic_deriv  s     zTestInterp.test_cubic_derivc                 C   s   d\}}t |t j}t |}ddg}ddg}t|||||fd}t|||ddd t||d	 d
||d	 dgdd |D  t||d d
||d dgdd |D  d S )N)r   r   )r"   g      ()r-   r"   r  )r-   r3   r   rY   rH   r   r"   r-   c                 S   s   g | ]\}}|qS rD   rD   ri   r   valrD   rD   rE   rk      rl   z2TestInterp.test_quintic_derivs.<locals>.<listcomp>r+   c                 S   s   g | ]\}}|qS rD   rD   r  rD   rD   rE   rk     rl   )r<   r?   astypefloat64r  r	   r   )rA   r(   rB   r\   rw   r  r  rC   rD   rD   rE   test_quintic_derivs  s    
zTestInterp.test_quintic_derivsZunstable)reasonc                 C   sN   d}t | j|}ddg}t| j| j|||d fd}t|| j| jddd d S )Nr/   r  )r-   r4   r   rY   rH   )r   rU   r	   r   r   )rA   r(   r&   r  rC   rD   rD   rE   test_cubic_deriv_unstable  s
    z$TestInterp.test_cubic_deriv_unstablec                 C   s   d}t j| jd f|d  | jdd  | jd d  d | jd f|d  f }t| j| j||dgdgfd}t|| j| jddd	 t|| jd d|| jd dgd
d
gdd d S )Nr-   r   r"   r+   r2   r  r   rY   rH   r1   rZ   )r<   r   rU   r	   r   r   )rA   r(   r&   rC   rD   rD   rE   test_knots_not_data_sites  s    
&z$TestInterp.test_knots_not_data_sitesc                 C   sX   d}ddg}ddg}t |||dgdgfd}tdd}|d }t|||ddd d S )	Nr/   r1   r$   r"   r1   r  r   rY   rH   )r	   r<   rR   r   )rA   r(   r\   rw   rC   rU   r   rD   rD   rE   test_minimum_points_and_deriv"  s    z(TestInterp.test_minimum_points_and_derivc                 C   s4  g d }}t t$ t||dgd fd W d    n1 s>0    Y  t t t||dd W d    n1 st0    Y  t t  t||dgd W d    n1 s0    Y  t t t||dd W d    n1 s0    Y  d\}}t t" t||||fd W d    n1 s&0    Y  d S )N)r$   r-   r/   r0   r   r~   r  r   *   )r  r  r  )rA   r\   rw   lrrD   rD   rE   test_deriv_spec.  s    
2
,
.
,
zTestInterp.test_deriv_specc                 C   s   d}| j }| jd| j  }dgdg }}t|||||fd}t|||ddd t||d d	||d
 d	g|d d	 |d d	 gddd dD ]&}t|||d}t|||ddd qd S )Nr/   r#   )r"   y              @)r"   y      @       @r   rY   rH   r   r"   r+   )r   r"   r   )rU   r   r	   r   )rA   r(   rU   r   r  r  rC   rD   rD   rE   test_complexE  s    zTestInterp.test_complexc                 C   sD   t dt}t dt}dD ]}t|||d}|| q$d S )NrP   r   r   )r<   r?   r  intr	   )rA   r\   rw   r(   rC   rD   rD   rE   test_int_xyV  s
    zTestInterp.test_int_xyc                 C   sF   t ddd}|d d d }|d d d }dD ]}t|||d q.d S )Nr+   r"   ry   r   r   r   )r<   rR   r	   )rA   rU   r\   rw   r(   rD   rD   rE   test_sliced_input`  s
    zTestInterp.test_sliced_inputc                 C   sJ   t dt}|d }t jt jt j fD ]}||d< ttt|| q*d S )NrP   r-   r+   )	r<   r?   r  floatr=   r>   r8   r:   r	   rA   r\   rw   zrD   rD   rE   test_check_finitej  s
    zTestInterp.test_check_finite)r"   r-   r/   r   c                 C   s,   t td}dd |D }t|||d d S )NrP   c                 S   s   g | ]}|d  qS )r-   rD   )ri   arD   rD   rE   rk   w  rl   z.TestInterp.test_list_input.<locals>.<listcomp>r   )r   r   r	   r  rD   rD   rE   test_list_inputs  s    zTestInterp.test_list_inputc                 C   s   t jt | jt | jf }dddgfg}dddgfg}t| j|d||fd}t|| j|ddd	 t|| jd
 d|d
 d ddd	 t|| jd d|d
 d ddd	 d S )Nr"   r$   r2   r3   r4   r/   r   rY   rH   r   r+   )r<   r   r  rU   r  r	   r   )rA   r   r  r  rC   rD   rD   rE   test_multiple_rhsz  s    $zTestInterp.test_multiple_rhsc                 C   s   t jd d\}}t t jj|d}t jj|dddfd}t|||}t|jj|dddf dt jdfg}dt jdfg}t|||||fd	}t|jj|| d dddf d S )
Nrr   r/   r}   r   r   r~   r   r"   r   r~   r   r   )r<   r@   ru   rv   r	   r   r'   r   )rA   r(   rB   r\   rw   rC   d_ld_rrD   rD   rE   test_shapes  s    zTestInterp.test_shapesc                 C   sB  t | j}t| j|ddd}t| j|ddgdgfd}t|j|jdd t| j|ddd}t| j|ddgdgfd}t|j|jdd t| j|d	d
d}t| j|d	d dgfd}t|j|jdd t| j|ddd}t| j|dd d}t|j|jdd tt" t| j|ddd W d    n1 s,0    Y  t jt | jt 	| jf }dddgfg}d	ddgfg}t| j|d||fd}t| j|ddd}t|j|jdd t j
d d\}}t t j
j
|d}t j
j
|dddfd}	dt dfg}
dt dfg}t||	||
|fd}t||	|dd}t|j|jdd d S )Nr/   r   r   r  rG   rZ   )r   r   r"   r   r-   )Nr   r  r   Ztypor"   r1   r   rr   r  r   r   r~   r   r  r   r   )r<   r  rU   r	   r   r'   r8   r:   r   r  r@   ru   rv   rr  )rA   r   r   rU  r  r  r(   rB   r\   rw   r  r  rD   rD   rE   test_string_aliases  sH    



2
zTestInterp.test_string_aliasesc                 C   sr   t jd d\}}t t jj|d}t jj|d}t||}t||||}t||||}t|j|ddd d S )Nrr   )r/   r   r   rY   rH   )	r<   r@   ru   rv   r   r	   make_interp_full_matrr   r'   )rA   r(   rB   r\   rw   r&   rC   r'  rD   rD   rE   test_full_matrix  s    
zTestInterp.test_full_matrixc                 C   s  t jd d}tdddD ]}t|d d }t t jd|f}td|d D ]l}|d| |df  t t jd|| f7  < ||dd| f  t t jd|| f7  < qVt j||f}||d|| df< t j||f}||| dd|f< t ||f}tt|| d dD ]J\}}	|	d	k rbt j||	d
||d|	f< nt j||	d
|||	df< q4t j|}
t	t
||||
|t j||
dd qdS )z
        Random elements in diagonal matrix with blocks in the
        left lower and right upper corners checking the
        implementation of Woodbury algorithm.
        rr      r/       r-   r"   Nr+   r   )offsetrY   rZ   )r<   r@   ru   r   r  Zdiagflatrr  r1  Zdiagonalr   r   linalgsolve)rA   rB   r(   r  r  r   urZlldr   rC   rD   rD   rE   test_woodbury  s*    46
zTestInterp.test_woodburyN),r   r   r   r<   rR   rS  rU   r  r   rz  r}  r~  rM   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Zxfailr  r  r  r  r  r  r  r  r  r  r  r  r  r  rD   rD   rD   rE   ry  D  sN   









	

3ry  c                 C   s   | j |j ksJ |j | j | d ks(J | j }tj||ftjd}t|D ]V}| | }||| krh|}nt||d }t||||}	|	|||| |d f< qJt	||}
|
S )zAssemble an spline order k with knots t to interpolate
    y(x) using full matrices.
    Not-a-knot BC only.

    This routine is here for testing only (even though it's functional).
    r"   r   )
r   r<   rr  r  r   r<  r   evaluate_all_bsplslr  )r\   rw   r&   r(   rB   Ar   r	  leftbbr'   rD   rD   rE   r    s    r  c                 C   s   t tj| ||f\} }}| j}|j| d }tj||ftjd}t|D ]V}| | }||| krf|}	nt||d }	t	||||	}
|
|||	| |	d f< qHt
|j|}t
|j|}t||}|||ffS )z,Make the least-square spline, full matrices.r"   r  )mapr<   ra   r   rr  r  r   r<  r   r  dotTr  r  )r\   rw   r&   r(   r  rB   r  r   r	  r  r  r   Yr'   rD   rD   rE   make_lsq_full_matrix
  s    r  c                   @   s   e Zd Zejd d\ZZeejeZ	ejeZ
eee	d e	d deZdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd ZdS )TestLSQrr   )r   r/   r   r+   r   c                 C   s   | j | j| j| jf\}}}}t||||\}}t||||}t|j| t|jj	|j
| d f |\}}	tjj||dd\}
}}}t|j|
 d S )Nr"   r+   )Zrcond)r\   rw   r&   r(   r  r
   r   r'   r   r   r   r<   r  Zlstsq)rA   r\   rw   r&   r(   Zc0ZAYrC   Zaar   r7  r   rD   rD   rE   
test_lstsq0  s    zTestLSQ.test_lstsqc                 C   s|   | j | j| j| jf\}}}}t|}t||||}t|||||d}t|j|jdd t|j|jdd t	|j|j d S )N)wrY   rZ   )
r\   rw   r&   r(   r<   rz   r
   r   r'   r   )rA   r\   rw   r&   r(   r  rC   Zb_wrD   rD   rE   test_weights?  s    
zTestLSQ.test_weightsc                 C   sd   | j | j| j| jf\}}}}tjj|dddfd}t||||}t|jj	|j
| d dddf d S )Nr   r~   r   r   r"   )r\   r&   r(   rB   r<   r@   r
   r   r'   r   r   )rA   r\   r&   r(   rB   rw   rC   rD   rD   rE   r  K  s    zTestLSQ.test_multiple_rhsc                 C   sv   | j | j| j  }}}| jd }t||||}t||j||}t||j||}t||||d||  ddd d S )Ny      ?       @r#   rG   rH   )r\   r&   r(   rw   r
   r   r   r   )rA   r\   r&   r(   r   rC   r   r   rD   rD   rE   r  R  s    
zTestLSQ.test_complexc                 C   s@   t dt}t dt}t|dd}t|||dd d S )NrP   r"   r   )r<   r?   r  r  r   r
   rA   r\   rw   r&   rD   rD   rE   r  ]  s    zTestLSQ.test_int_xyc                 C   sH   t ddd}|d d d }|d d d }t|d}t|||dd d S )Nr+   r"   ry   r/   r   )r<   rR   r   r
   )rA   rU   r\   rw   r&   rD   rD   rE   r  d  s
    
zTestLSQ.test_sliced_inputc                 C   sV   t dt}|d }t|d}t jt jt j fD ]}||d< ttt	||| q4d S )N   r-   r/   r+   )
r<   r?   r  r  r   r=   r>   r8   r:   r
   )rA   r\   rw   r&   r  rD   rD   rE   test_checkfinitem  s    
zTestLSQ.test_checkfinitec                 C   sL   | j | j| j  }}}|jdd |jdd |jdd t|||d d S )NFr  )r\   rw   r&   )r\   rw   r&   r  r
   r  rD   rD   rE   r  w  s
    zTestLSQ.test_read_onlyN)r   r   r   r<   r@   ru   rB   r(   rv   r\   rw   r   rR   r&   r  r  r  r  r  r  r  r  rD   rD   rD   rE   r  &  s   	
r  c                 C   s    t jt jt jtd| S )Ndata)ospathjoinabspathdirname__file__)basenamerD   rD   rE   	data_file  s    r  c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestSmoothingSplinec                 C   s  t jd d}t t j|d d }|d t d|  |d  t jdd| }tt" t	||dd   W d    n1 s0    Y  tt" t	|dd  | W d    n1 s0    Y  tt" t	|
d|| W d    n1 s0    Y  tt$ t	|d d d	 | W d    n1 s:0    Y  t |}|d |d
< tt t	|| W d    n1 s0    Y  t d}t d}d}tjt|d t	|| W d    n1 s0    Y  d S )Nrr   ry   r0   r-   r/   r1   r   r"   r+   r   z)``x`` and ``y`` length must be at least 5rX  )r<   r@   ru   rv   r   r  normalr8   r:   r   rb   rP  r?   r+  rM   r   )rA   rB   r\   rw   Zx_duplZexception_messagerD   rD   rE   test_invalid_input  s*    .
0
0
0
4

*

z&TestSmoothingSpline.test_invalid_inputc                 C   sh   t td(}|d }|d }|d }W d   n1 s<0    Y  t|||}t||ddd dS )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.npzr\   rw   y_GCVSPLNg-C6?rH   )r<   loadr  r   r   )rA   r  r\   rw   r  Zy_comprrD   rD   rE   test_compare_with_GCVSPL  s    )&z,TestSmoothingSpline.test_compare_with_GCVSPLc                 C   s   t jd d}t t j|d d }|d t d|  |d  t jdd| }t||dd}t||dd	d
}t 	|d |d d| }t
||||dd dS )z
        In case the regularization parameter is 0, the resulting spline
        is an interpolation spline with natural boundary conditions.
        rr   ry   r0   r-   r/   r1   r   )Zlamr   r   r   r+   rG   rZ   N)r<   r@   ru   rv   r   r  r  r   r	   rR   r   )rA   rB   r\   rw   Z
spline_GCVZspline_interpgridrD   rD   rE   test_non_regularized_case  s    .z-TestSmoothingSpline.test_non_regularized_casec           
      C   s   t jd d}t t j|d d }|d t d|  |d  t jdd| }t||}t jjt	ddd	D ]r}t 
|}d
||< t|||}t||| ||  }t||| ||  }	||	k rvtd|dd|	dqvd S )Nrr   ry   r0   r-   r/   r1   r   rP   r   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )r<   r@   ru   rv   r   r  r  r   choicer   r+  absr:   )
rA   rB   r\   rw   r   indr  Zspl_worigZweightedrD   rD   rE   test_weighted_smoothing_spline  s"    .

z2TestSmoothingSpline.test_weighted_smoothing_splineN)r   r   r   r  r  r  r  rD   rD   rD   rE   r    s   6r  c                    sv   | \|\t  d }|d ks0J t  d d ksPJ t fddt|D S )z-A naive 2D tensort product spline evaluation.r"   c                 3   sD   | ]<}t D ].} ||f t| t| V  qqd S r9  )r   r   )ri   ZixZiyr'   r(   nytxtyr\   rw   rD   rE   r;    s   zbspline2.<locals>.<genexpr>r@  )r   r&   r'   r(   nxrD   r  rE   bspline2  s    r  c                 C   s   |dkr4|| |   kr(||d  k r0n ndS dS |||  || krNd}n2| ||  |||  ||   t | |d || }||| d  ||d  krd}nF||| d  |  ||| d  ||d    t | |d |d | }|| S )Nr   r"   r$   r1   r   r6  rD   rD   rE   r     s    ,2Fr   c                    sL   t  d }|d kr(t  |ks,J t fddt|D S )Nr"   c                 3   s$   | ]} | t | V  qd S r9  r  r>  r?  rD   rE   r;  *  rl   zbspline.<locals>.<genexpr>r@  rA  rD   r?  rE   r   '  s    r   c                   @   s   e Zd ZdddZdd ZdS )
NdBSpline0r/   c                 C   sv   t |}|t |jksJ zt | W n tyB   |f| }Y n0 tdd |D | _tdd |D | _|| _dS )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                 s   s   | ]}t |V  qd S r9  )operatorindex)ri   ZkirD   rD   rE   r;  F  rl   z&NdBSpline0.__init__.<locals>.<genexpr>c                 s   s   | ]}t j|td V  qdS )r  N)r<   ra   r  )ri   tirD   rD   rE   r;  G  rl   N)r   r   r9   r[  r(   r&   r'   )rA   r&   r'   r(   r   rD   rD   rE   __init__.  s    zNdBSpline0.__init__c           
         s6  t j}t |ksJ dg|  t|D ]}j| |  }}j| }||| krd| |< nt||d  |< | |  |  kr| | d  ksn J  | |krƈ | t || k s,J q,t  d} fddt|D }tj| D ]6j	 t
fddt|D  }	||	7 }q|S )Nnoner"   r   c                    s,   g | ]$}t  | j|   | d  qS )r"   )r   r(   ri   r  )r   rA   rD   rE   rk   b  rl   z'NdBSpline0.__call__.<locals>.<listcomp>c                    s.   g | ]&}t | j|  | j| qS rD   )r   r(   r&   r  )idxrA   r\   rD   rE   rk   d  s   )r   r&   r   r(   r<   r<  r[  	itertoolsproductr'   prod)
rA   r\   r   r  tdZxdr(   resultZiterstermrD   )r   r  rA   r\   rE   __call__J  s(    



.&

zNdBSpline0.__call__N)r/   )r   r   r   r  r  rD   rD   rD   rE   r  -  s   
r  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zejdd d!gejd"d d!gd#d$ Zejd%d&d'gd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd S )4TestNdBSplinec           
      C   s   t jd}d\}}d}t |j|| d d}|j||fd}t|||}t|f||}|jdd}	t||	d d d f ||	dd ||	d d d f j|	jd	 |jd fksJ d S )
Nr  r6   r   r"   r   rO  rY   rZ   r   )	r<   r@   r  rv   r  r   r   r   r   )
rA   r  rB   r(   Zn_trr&   r'   rC   nbxirD   rD   rE   test_1Dl  s    zTestNdBSpline.test_1Dc                 C   sx   t d}|d }t||dd}|d d|  }t||dd}|j|jf}|jd d d f |jd d d f  }||dfS )Nr~   r/   r   r-   r<   r?   r	   r&   r'   rA   r\   rw   r   y_1r  t2r8  rD   rD   rE   make_2d_case}  s    
$zTestNdBSpline.make_2d_casec                 C   s   t d}|d }t||dd}t dd }|d d|  }t||dd}|j|jf}|jd d d f |jd d d f  }|||j|jfS )Nr~   r/   r   r   r   r-   )r<   r?   r	   r&   r'   r(   r  rD   rD   rE   make_2d_mixed  s    
$zTestNdBSpline.make_2d_mixedc                    s   g d}|   \ dd |D }t fdd|D |dd t dd}||jt|fksjJ t|||dd tjd	}|jd
dd }||}|jdksJ |	dj
\}}t| |d |d d|   dd d S )Nr   r5   )r5   r"   )r   r   c                 S   s(   g | ] \}}|d  |d  d|   qS ro  rD   ri   r\   rw   rD   rD   rE   rk     rl   z3TestNdBSpline.test_2D_separable.<locals>.<listcomp>c                    s   g | ]}t | qS rD   r  ri   r   r8  r(   r  rD   rE   rk     rl   rY   rZ   r/   r   r  )r0   r/   r-   r   r   )r0   r/   )r+   r-   r-   )r  r   r   r   r   r<   r@   r  r  rb   r  ravel)rA   r   targetbspl2r  r  r\   rw   rD   r  rE   test_2D_separable  s(    zTestNdBSpline.test_2D_separablec                 C   s  d}g d}dd |D }|   \}}}t||||f}d}t||dd}	|	|}
t||||}|
jdksrJ t|
|gd	 d
d |	|jt|d d |	jj|d   ksJ t|	|t|d d d f  ddd |d}t||dd}||}
|
jdksJ t|
||g||ggd
d ||jt|d d |jj|d   ksZJ t||t|d d d d f  ddd d S )Nr-   r  c                 S   s(   g | ] \}}|d  |d  d|   qS ro  rD   r
  rD   rD   rE   rk     rl   z5TestNdBSpline.test_2D_separable_2.<locals>.<listcomp>r	  r/   r   )r0   r0   rY   rZ   r+   r   gvIh%,=r~   r~   r-   r-   )r-   r-   )	r  r<   r   r   r   r   r'   ra   rb   )rA   r   r   r  r  r8  r(   Zc2_4r   Zbspl2_4r  Z
val_singleZc2_22Zbspl2_22rD   rD   rE   test_2D_separable_2  sB    
0
 
 z!TestNdBSpline.test_2D_separable_2c              
      s  t jd}dt jddddt |jddd ddddf	 t jddddt |jddd ddddf	 |jj d j d fd tf d	}d
}t||t	|f dd t j
g dg df }t|| fdd|D dd d S )Nr  r/   r   r   r   r   r0   r"   r   )r$   r$   rY   rZ   r"   r   r-   皙?g? @c                    s   g | ]}t |f qS rD   r  r  r'   r(   r  r  rD   rE   rk     rl   z0TestNdBSpline.test_2D_random.<locals>.<listcomp>)r<   r@   r  r   rv   r  r   r   r   r  r   )rA   r  r   r   rD   r  rE   test_2D_random  s"    ..$
zTestNdBSpline.test_2D_randomc                 C   sf   |   \}}}}g d}dd |D }t||||fd}||jt|fksPJ t|||dd d S )N)ffffff?r   )r5   g333333@)r   r)  c                 S   s(   g | ] \}}|d  |d d|   qS ro  rD   r
  rD   rD   rE   rk     rl   z/TestNdBSpline.test_2D_mixed.<locals>.<listcomp>r   rY   rZ   )r  r   r   r   r   )rA   r  r8  kxkyr   r  r  rD   rD   rE   test_2D_mixed  s    zTestNdBSpline.test_2D_mixedc                 C   s  |   \}}}}g d}t||||fd}||dd}t|dd |D dd ||d	d}t|d
d |D dd ||dd}t|dd |D dd tt ||dd}W d    n1 s0    Y  tt ||dd}W d    n1 s0    Y  d S )Nr  r   r  r   c                 S   s,   g | ]$\}}d |d  |d d|   qS ro  rD   r
  rD   rD   rE   rk      rl   z4TestNdBSpline.test_2D_derivative.<locals>.<listcomp>rY   rZ   r"   r"   c                 S   s(   g | ] \}}d |d  d| d  qS ro  rD   r
  rD   rD   rE   rk     rl   )r   r   c                 S   s(   g | ] \}}|d  |d d|   qS ro  rD   r
  rD   rD   rE   rk     rl   )r+   r   )r+   r   r"   )r  r   r   r8   r:   )rA   r  r8  r  r  r   r  r   rD   rD   rE   test_2D_derivative  s&    
*
z TestNdBSpline.test_2D_derivativec           	   
      s   t jd}d\}}t jddddt |jddd ddddf	 }t jddddt |jddd ddddf	 }|j|j| d	 |j| d	 fd}t jg d
g df }t||f|||fd}t	||f|||fd t
|| fdd|D dd d S )Nr  )r-   r/   r   r   r   r/   r   r0   r"   r  r  r   c                    s   g | ]} |qS rD   rD   ri   r   Zbspl2_0rD   rE   rk      rl   z6TestNdBSpline.test_2D_mixed_random.<locals>.<listcomp>rY   rZ   )r<   r@   r  r   rv   r  r   r   r   r  r   	rA   r  r  r  r  r  r'   r   r  rD   r"  rE   test_2D_mixed_random  s    ..$
z"TestNdBSpline.test_2D_mixed_randomc                 C   s  t d}t dd }t||d dd}t||d d|  dd}|jd d d f |jd d d f  }t|j|jf||j|jf}|d d d d f |d d|  d d d f  }t||f|}dd t	||D }	||	}
t 
|
 rJ t|
||	d	d
 t|
|j|d	d
 d S )Nr~   r   r   r/   r   r-   c                 S   s   g | ]\}}||fqS rD   rD   ri   r  rC   rD   rD   rE   rk   /  rl   z0TestNdBSpline.test_tx_neq_ty.<locals>.<listcomp>rY   rZ   )r<   r?   r	   r'   r   r&   r(   r   r  r  r   anyr   rb   r   )rA   r\   rw   spl_xspl_yr   rd   valuesrgir   ZbxirD   rD   rE   test_tx_neq_ty"  s    
$0zTestNdBSpline.test_tx_neq_tyc           
      C   s   t d}|d }t||dd}|d d|  }t||dd}|d d|  d }t||dd}|j|j|jf}|jd d d d f |jd d d d f  |jd d d d f  }	||	dfS )Nr~   r/   r   r-   r"   r  )
rA   r\   rw   r   r  r  Zy_2Zspl_2r  r8  rD   rD   rE   make_3d_case6  s    
zTestNdBSpline.make_3d_casec                 C   s   t jd}|jddd \}}}|d |d d|   |d d|  d  }|  \}}}t||dd}	d	d
 t|||D }
|	|
}|jdksJ t||dd d S )Nr  r/   r7   r   r   r/   r-   r"   r   c                 S   s   g | ]}|qS rD   rD   ri   r   rD   rD   rE   rk   Q  rl   z3TestNdBSpline.test_3D_separable.<locals>.<listcomp>)r7   rY   rZ   )	r<   r@   r  r  r,  r   zipr   r   )rA   r  r\   rw   r  r  t3c3r(   bspl3r   r  rD   rD   rE   test_3D_separableI  s    ,zTestNdBSpline.test_3D_separablec           
      C   sd  |   \}}}t||dd}tjd}|jddd \}}}dd t|||D }	t||	d	d
d|d  |d d|   |d d|  d  dd t||	dd
d| |d d|   |d d|  d  dd t||	dd
d| d|d  d  |d d|  d  dd t||	dd
d| d|d  d  d dd t||	dd
tt	|	dd d S )Nr/   r   r  r-  r   r   c                 S   s   g | ]}|qS rD   rD   r.  rD   rD   rE   rk   [  rl   z4TestNdBSpline.test_3D_derivative.<locals>.<listcomp>)r"   r   r   r   r-   r"   rY   rZ   )r-   r   r   r~   )r-   r"   r   )r-   r"   r/   )r-   r"   r0   )
r,  r   r<   r@   r  r  r/  r   rr  r   )
rA   r0  r1  r(   r2  r  r\   rw   r  r   rD   rD   rE   test_3D_derivativeV  s(    0,,z TestNdBSpline.test_3D_derivativec           	   
      sL  t jd}d}t jddddt |jddd ddddf	 }t jddddt |jddd ddddf	 }t jddddt |jddd ddddf	 }|j|j| d |j| d |j| d fd}t|||f||d	}t|||f||d	 d
}t	|| |dd t j
g dg dg df }t	|| fdd|D dd d S )Nr  r/   r   r   r   r   r0   r"   r   )r$   r$   r"   rY   rZ   r  r  g?r  gffffff?c                    s   g | ]} |qS rD   rD   r!  Zspl_0rD   rE   rk   }  rl   z0TestNdBSpline.test_3D_random.<locals>.<listcomp>)r<   r@   r  r   rv   r  r   r   r  r   r   )	rA   r  r(   r  r  tzr'   r   r   rD   r6  rE   test_3D_randoml  s    ...0
zTestNdBSpline.test_3D_randomc              
   C   s  t jd}d}t jddddt |jddd ddddf	 }t jddddt |jddd ddddf	 }t jddddt |jddd ddddf	 }|j|j| d |j| d |j| d fd|j|j| d |j| d |j| d fdd	  }t|||f||d
}t|||f|j|d
}t|||f|j	|d
}	t j
g dg dg df }
t||
||
d	|	|
  dd d S )Nr  r/   r   r   r   r   r0   r"   r#   r   r  r  r5  rY   rZ   )r<   r@   r  r   rv   r  r   r   r   r   r   r   )rA   r  r(   r  r  r7  r'   r   Zspl_reZspl_imr   rD   rD   rE   test_3D_random_complex  s$    ....2
z$TestNdBSpline.test_3D_random_complex
cls_extrapNTcall_extrapc                 C   s   |   \}}}t||d|d}g dg dg d  }}}	ttj|||	f\}}}	dd t|||	D }
|d |d d|   |	d d|	  d	  }||
|d
}t||dd d S )Nr/   r(   r`   r+   r   r   r   r
  r+   g            @c                 S   s   g | ]}|qS rD   rD   r.  rD   rD   rE   rk     rl   z?TestNdBSpline.test_extrapolate_3D_separable.<locals>.<listcomp>r-   r"   r_   rY   rZ   r,  r   r  r<   ra   r/  r   )rA   r:  r;  r0  r1  r(   r2  r\   rw   r  r   r  r  rD   rD   rE   test_extrapolate_3D_separable  s    ,z+TestNdBSpline.test_extrapolate_3D_separabler   )FT)TNc                 C   s   |   \}}}|\}}t||d|d}g dg dg d  }}	}
ttj||	|
f\}}	}
dd t||	|
D }|d |	d d|	   |
d d|
  d	  }|||d
}t||dd d S )Nr/   r<  r=  r?  r@  c                 S   s   g | ]}|qS rD   rD   r.  rD   rD   rE   rk     rl   zATestNdBSpline.test_extrapolate_3D_separable_2.<locals>.<listcomp>r-   r"   r_   rY   rZ   rB  )rA   r   r0  r1  r(   r:  r;  r2  r\   rw   r  r   r  r  rD   rD   rE   test_extrapolate_3D_separable_2  s    ,z-TestNdBSpline.test_extrapolate_3D_separable_2c                 C   s   |   \}}}t||dd}g dg dg d  }}}ttj|||f\}}}dd t|||D }|d |d d|   |d d|  d	  }	||d
d}
t|
d sJ t|
d sJ t|
d	d |	d	d dd d S )Nr/   r   )r>  r"   r   )r   r   r
  )r+   r   rA  c                 S   s   g | ]}|qS rD   rD   r.  rD   rD   rE   rk     rl   zETestNdBSpline.test_extrapolate_false_3D_separable.<locals>.<listcomp>r-   r"   Fr_   r   r+   rY   rZ   )r,  r   r  r<   ra   r/  r   r   )rA   r0  r1  r(   r2  r\   rw   r  r   r  r  rD   rD   rE   #test_extrapolate_false_3D_separable  s    ,z1TestNdBSpline.test_extrapolate_false_3D_separablec              	   C   s  |   \}}}t||dd}tddtjdddtjg}tdddtjdd	d	g}td
dddtjddg}dd t|||D }|d |d d|   |d d|  d  }	t|t|B t|B }
tj|	|
< ||}t||
  sJ t||	dd d S )Nr/   r   r>  r"   r-   r   r   r)  r
  r+   rA  c                 S   s   g | ]}|qS rD   rD   r.  rD   rD   rE   rk     rl   z/TestNdBSpline.test_x_nan_3D.<locals>.<listcomp>rY   rZ   )	r,  r   r<   ra   r=   r/  r   r   r   )rA   r0  r1  r(   r2  r\   rw   r  r   r  r   r  rD   rD   rE   test_x_nan_3D  s    ,
zTestNdBSpline.test_x_nan_3Dc           	         s  t jd}d\}}t |jdddd}t j|d f| ||d f| f }t |jdddd}t j|d f| ||d f| f }|d d d jjrJ |d d d jjrJ |j|jd | d	 |jd | d	 fd
}|j	}|jjrJ t j
g dg df }t|d d d |d d d f|||fd}t|d d d |d d d f|||fd t|| fdd|D dd d S )Nr  r/   r/   r   r0      r  r+   r-   r"   r   r  r  r   c                    s   g | ]} |qS rD   rD   r!  r"  rD   rE   rk     rl   z7TestNdBSpline.test_non_c_contiguous.<locals>.<listcomp>rY   rZ   )r<   r@   r  rv   r  r   flagsc_contiguousr   r  r   r   r  r   r#  rD   r"  rE   test_non_c_contiguous  s&    $$,
**z#TestNdBSpline.test_non_c_contiguousc                 C   sd   |   \}}}t||dd}tdD ]}d|| j_q$d|j_t||dd}|d|dks`J d S )Nr/   r   FrW   )r,  r   r   rI  Z	writeable)rA   r0  r1  r(   r2  r   Zbspl3_rD   rD   rE   test_readonly  s    zTestNdBSpline.test_readonlyc                 C   s  |   \}}}tg dg dg}t||||||}t|||||g}|jd |jd ksfJ t| | dd tt	( tg d||gd  W d    n1 s0    Y  tt	dd* td	d
gg||gd  W d    n1 s0    Y  d S )NrW   )r0   r   r~   r   gؗҜ<rZ   r/   zData and knots*rX  r"   r-   )
r,  r<   ra   r   r   r   r   Ztodenser8   r:   )rA   r0  r1  r(   r   dmZdm1rD   rD   rE   test_design_matrix  s    
6z TestNdBSpline.test_design_matrix)r   r   r   r  r  r  r  r  r  r  r   r$  r+  r,  r3  r4  r8  r9  rM   r  r  rC  rD  rE  rF  rK  rL  rN  rD   rD   rD   rE   r  j  s2   (	
r  c                   @   s   e Zd Zdd Zdd Zejdg ddd Zd	d
 Z	dd Z
dd Zejdejejgdd Zdd Zejdg ddd Zdd ZdS )
TestMakeNDc                 C   s   t d}t dd }|d d d f d |d d|  d d d f  }dd t||D }t||f|dd}t||| d	d
 t||d dd}t||d d|  dd}|jd d d f |jd d d f  }t||jddd ddl	m
}	 |	||f|dd}
t|
|||dd
 d S )Nr~   r   r/   r-   c                 S   s   g | ]\}}||fqS rD   rD   r%  rD   rD   rE   rk   	  rl   z7TestMakeND.test_2D_separable_simple.<locals>.<listcomp>r"   r   rG   rZ   r  r   rH   )r   linearmethodrY   )r<   r?   r  r  r   r   r  r	   r'   scipy.interpolater   )rA   r\   rw   r)  r   rd   r'  r(  r   ZRGIr*  rD   rD   rE   test_2D_separable_simple	  s    
0$z#TestMakeND.test_2D_separable_simplec           
      C   s  t d}t d}dd t||D }|d d d f d |d d|  d d d f  }t ||||f}t||f|dtjd}||}t ||||f}|jdksJ t	|
ddd|d	d
 |
d}	t||f|	dtjd}||}|jdksJ t	|
dddd|
dd	d
 d S )Nr~   c                 S   s   g | ]\}}||fqS rD   rD   r%  rD   rD   rE   rk   #	  rl   z>TestMakeND.test_2D_separable_trailing_dims.<locals>.<listcomp>r/   r-   r(   solver)$   r0   r0   rY   rZ   r  )rW  r-   r-   )r<   r?   r  r  r   r   sslspsolver   r   rb   )
rA   r\   rw   r   r)  Zvalues4rd   r  r  Zvalues22rD   rD   rE   test_2D_separable_trailing_dims	  s&    

0

z*TestMakeND.test_2D_separable_trailing_dimsr(   )rG  r  )r/   r"   )r"   r/   rc  c                 C   s   t d}t dd }dd t||D }|d d d d f |d d|  d d d f  }t||f||tjd}t||| d	d
 d S )Nr~   r   r   c                 S   s   g | ]\}}||fqS rD   rD   r%  rD   rD   rE   rk   >	  rl   z,TestMakeND.test_2D_mixed.<locals>.<listcomp>r/   r-   rU  rG   rZ   )	r<   r?   r  r  r   rX  rY  r   r  )rA   r(   r\   rw   r   r)  rd   rD   rD   rE   r  9	  s    
0zTestMakeND.test_2D_mixedc              	   C   sT   t g d}t g d}t g dg dg dg dg dg dg}|||fS )N)r   r2   r3   r4   r!  r"  )r"   r-   r"   r-   r"   r"   )r"   r-   r/   r-   r"   r"   )r"   r-   r-   r-   r"   r"   )r<   r   r  rD   rD   rE   _get_sample_2d_dataD	  s    
zTestMakeND._get_sample_2d_datac                 C   sd   |   \}}}t||f|dd}t||f|dd}tg dg dgj}t||||dd d S )	Nr"   r   rP  rQ  r"   gffffff@g333333@r   ffffff
@333333?r/   r"   r]  r^  r4   r   r$   r/   rY   rZ   r[  r   r   r<   r   r  r   rA   r\   rw   r  rd   r*  r   rD   rD   rE   test_2D_vs_RGI_linearT	  s    
z TestMakeND.test_2D_vs_RGI_linearc                 C   sh   |   \}}}t||f|dtjd}t||f|dd}tg dg dgj}t||||dd d S )	Nr/   rU  cubic_legacyrQ  r\  r_  rY   rZ   	r[  r   rX  rY  r   r<   r   r  r   ra  rD   rD   rE   test_2D_vs_RGI_cubic^	  s    
zTestMakeND.test_2D_vs_RGI_cubicrV  c                 C   sh   |   \}}}t||f|d|dd}t||f|dd}tg dg dgj}t||||dd	 d S )
Nr/   gư>)r(   rV  rJ   rc  rQ  r\  r_  rY   rZ   r`  )rA   rV  r\   rw   r  rd   r*  r   rD   rD   rE   test_2D_vs_RGI_cubic_iterativeh	  s    
z)TestMakeND.test_2D_vs_RGI_cubic_iterativec                 C   sh   |   \}}}t||f|dtjd}t||f|dd}tg dg dgj}t||||dd d S )	Nr   rU  quintic_legacyrQ  r\  r_  rY   rZ   rd  ra  rD   rD   rE   test_2D_vs_RGI_quinticw	  s    
z!TestMakeND.test_2D_vs_RGI_quinticzk, meth))r"   rP  )r/   rc  )r   rg  c                 C   s   t jd}t |jdd}t |jdd}t |jdd}|jdd}t|||f||tjd}t|||f||d}	t jjd	d
dd}
t	||
|	|
dd d S )Ni@ r~   r   r   r   r   rU  rQ  gffffff?r  r6   r  rY   rZ   )
r<   r@   r  Zcumsumr  r   rX  rY  r   r   )rA   r(   methZrndmr\   rw   r  r)  rd   r*  r   rD   rD   rE   test_3D_random_vs_RGI	  s    z TestMakeND.test_3D_random_vs_RGIc                 C   s   |   \}}}ddi}ttdd* t||f|fddi| W d    n1 sR0    Y  ttdd4 t||ft||ffddi| W d    n1 s0    Y  d S )Nmaxiterr"   rV  rX  r(   r/   )r[  r8   r:   r   r<   r   )rA   r\   rw   r  Zsolver_argsrD   rD   rE   test_solver_err_not_converged	  s    8z(TestMakeND.test_solver_err_not_convergedN)r   r   r   rT  rZ  rM   r  r  r  r[  rb  re  rX  ZgmresZgcrotmkrf  rh  rj  rl  rD   rD   rD   rE   rO  
	  s   






rO  c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )
TestFpchecc                 C   s   d}t ddd}t d}tjtdd t||| W d    n1 sR0    Y  tjtdd t||| W d    n1 s0    Y  d S )Nr"   r  r-   r~   z1D sequencerX  )r<   r?   rb   rM   r   r:   _bfpcheckrA   r(   r&   r\   rD   rD   rE   test_1D_x_t	  s    
,zTestFpchec.test_1D_x_tc                 C   s  d}d|d  d }|d }t |}t |}t|||dksFJ tjtdd t||| W d    n1 sx0    Y  d|d  d }|| d }t |}t |}t|||dksJ tjtdd t||| W d    n1 s0    Y  d S )Nr/   r-   r"   r7   rP   z	Need k+1*rX  )	r<   r?   r   fpchecrM   r   r:   rn  ro  )rA   r(   rB   r  r&   r\   rD   rD   rE   test_condition_1	  s    

,

zTestFpchec.test_condition_1c                 C   s,  d}dg|d  dg dg|d   }g d}t |||dksDJ t|||d u sZJ | }|d |d< t |||dksJ tjtd	d
 t||| W d    n1 s0    Y  | }|d |d< t |||dksJ tjtdd
 t||| W d    n1 s0    Y  d S )Nr/   r   r"   r-   r   )r"   r-   r/   r0   r   r+   rs   zLast k knots*rX  zFirst k knots*r   rr  rn  ro  rP  rM   r   r:   )rA   r(   r&   r\   ttrD   rD   rE   test_condition_2	  s    ",zTestFpchec.test_condition_2c                 C   s   d}dg|d  ddg dg|d   }g d}t |||dksFJ t|||d u s\J dg|d  ddg dg|d   }t |||dksJ tjtdd	 t||| W d    n1 s0    Y  d S )
Nr/   r   r"   r-   r   r"   r-   r/   r)  r0   r      zInternal knots*rX  )r   rr  rn  ro  rM   r   r:   rp  rD   rD   rE   test_condition_3	  s    $$zTestFpchec.test_condition_3c                 C   sp  d}dg|d  dg|d   }g d}t |||dks>J t|||d u sTJ | }|d |d< t |||dks~J t|||d u sJ | }|d d |d< t |||dksJ tjtdd t||| W d    n1 s0    Y  | }|d	 d |d	< t |||dks.J tjtdd t||| W d    n1 sb0    Y  d S )
Nr/   r   r"   r   rw  r   zOut of bounds*rX  r+   rt  )rA   r(   r&   r\   rU   rD   rD   rE   test_condition_4	  s&    ,zTestFpchec.test_condition_4c                 C   s   d}g d}g d}t |||dks*J tjtdd t||| W d    n1 s\0    Y  g d}t |||dksJ tjtdd t||| W d    n1 s0    Y  d S )Nr"   )r   r   r"   r-   r-   )r  r  r  rX   Schoenberg-Whitney*rX  )r   r   r   r   rr  rM   r   r:   rn  ro  rp  rD   rD   rE   test_condition_5_x1xm 
  s    ,z TestFpchec.test_condition_5_x1xmc                 C   sD   d}g d}ddg}t |||dks*J t|||d u s@J d S )Nr"   )r   r   r"   r"   r   g333333?r   )r   rr  rn  ro  rp  rD   rD   rE   test_condition_5_k1
  s
    zTestFpchec.test_condition_5_k1c                 C   s  d}dg|d  dg dg|d   }dgd }t |||dksFJ tjtdd t||| W d    n1 sx0    Y  dg|d  dg dg|d   }dgd }t |||dksJ tjtdd t||| W d    n1 s0    Y  d S )	Nr/   r   r"   r-   r   rX   r{  rX  r|  rp  rD   rD   rE   test_condition_5_1
  s    "
,"
zTestFpchec.test_condition_5_1c                 C   s   d}dg|d  ddg dg|d   }dgd dg }t |||dksNJ tjtd	d
 t||| W d    n1 s0    Y  dgd ddg }t |||dksJ t|||d u sJ d S )Nr/   r   r"   r-   r   r  r0   rX   r{  rX  r|  rp  rD   rD   rE   test_condition_5_2%
  s    $,zTestFpchec.test_condition_5_2c                 C   sj   d}g d}g d}t |||dks*J tjtdd t||| W d    n1 s\0    Y  d S )Nr"   )	r   r   r-   r/   r0   r   r~   r   r   )r"   r"   r"   @r  r  r
  rX   r{  rX  r|  rp  rD   rD   rE   test_condition_5_34
  s    zTestFpchec.test_condition_5_3N)r   r   r   rq  rs  rv  ry  rz  r}  r~  r  r  r  rD   rD   rD   rE   rm  	  s   rm  )r   )rK  r/   )r/   )Or  r  r  numpyr<   Znumpy.testingr   r   r   rM   r   r8   rS  r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscipy.linalgr  r  Zscipy.sparse.linalgsparserX  Zscipy.interpolate._bsplinesr   r   r   r   r   Zscipy.interpolate._fitpack_implZinterpolateZ_fitpack_implr   Zscipy._lib._utilr   Zscipy.interpolate._ndbspliner   r   r    rn  r!   r  r3  r5  rg   rm   r   r[   r   rK   r2  rR  ry  r  r  r  r  r  r  r   r   r  r  rO  rm  rD   rD   rD   rE   <module>   sj   P    Ry		

 `   -
Z 	=   # 