U
    Gvf                     @   sj  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 d dlmZ d dlmZmZm Z m!Z!m"Z" d dl#m$  m%Z& d dl'Z'G dd dZ(dd	 Z)d
d Z*dd Z+dd Z,dd Z-dd Z.d*ddZ/d+ddZ0dd Z1G dd dZ2G dd dZ3d d! Z4d,d"d#Z5G d$d% d%Z6d&d' Z7G d(d) d)Z8dS )-    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make_smoothing_spline)_not_a_knot_augknt_woodbury_algorithm_periodic_knots_make_interp_per_full_matrc                   @   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 !dBdCdDdEgej !dFe"dGdHdI Z&dJdK Z'dLdM Z(dNdO Z)ej !dPdQdRdEdSgdTdU Z*ej !dPdQdRdEdSgdVdW Z+dXdY Z,dZS )[TestBSplinec              	   C   s  t ttftftddgdgdd tjdd& t ttftdtjgdgdd W 5 Q R X t ttftdtjgdgdd t ttftddgdgdd t ttftdgdggdgdd t ttftddd	gdgdd t ttftddd	d
dgddgd	d t ttftddddddgdddgdd t ttftddddddgdddgdd t ttftddddd	d
gdddgd	d d\}}t	|| d }tj

|}t|||}t||j t||j t||j d S )N                 ?      ?r   tckignore)invalid                        @      @      @Zcubic      @)   r'   )assert_raises	TypeError
ValueErrorr   dictnpZerrstatenaninfarangerandomr   r    r!   r   r"   )selfnr"   r    r!   b r;   I/tmp/pip-unpacked-wheel-96ln3f52/scipy/interpolate/tests/test_bsplines.py	test_ctor   s8    * " zTestBSpline.test_ctorc              	   C   sh   t  }|j}t|j|d ddd t|j|d ddd t|j|d  tt	 d|_W 5 Q R X d S )Nr   V瞯<atolrtolr   r&   Zfoo)
_make_random_splinetckr   r    r!   r   r"   pytestr   AttributeError)r8   r:   rC   r;   r;   r<   test_tck8   s    zTestBSpline.test_tckc                 C   sh   t ddd}tddgdgdd}t||d tdddgddgdd}t||t |dk dd d S )	Nr   r   
   r+   r   r'   gffffff?r(   )r3   linspacer   r   wherer8   xxr:   r;   r;   r<   test_degree_0D   s
    zTestBSpline.test_degree_0c                 C   s   dddddg}dddg}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(   2   +=r@   )r   r3   rH   r   B_012r   )r8   r    r!   r"   r:   xr;   r;   r<   test_degree_1M   s    
8 zTestBSpline.test_degree_1c                 C   s   d}t dg|d  dg|d   }t ddddg}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   r*   r+   r,   r%   g      rG   TextrapolaterN   rO   )r3   asarrayr   reshaper   rH   r   r   )r8   r"   r    r!   ZbpbsplrK   r;   r;   r<   test_bernsteinX   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   rM   c                    s   g | ]}t | qS r;   _naive_eval.0rQ   r!   r"   r    r;   r<   
<listcomp>n   s     z4TestBSpline.test_rndm_naive_eval.<locals>.<listcomp>rN   rO   c                    s   g | ]}t | qS r;   )_naive_eval_2r[   r]   r;   r<   r^   q   s     )rB   rC   r3   rH   r   )r8   r:   rK   Zy_bZy_nZy_n2r;   r]   r<   test_rndm_naive_evalf   s    z TestBSpline.test_rndm_naive_evalc                 C   sP   t  }|j\}}}t|| || d  d}t||t||||fdd d S )Nr   rM   rN   rO   rB   rC   r3   rH   r   r   r8   r:   r    r!   r"   rK   r;   r;   r<   test_rndm_splevt   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   rN   rO   )r3   r7   seedsortr   r   r    r"   rH   r   r   )r8   rQ   yrC   r:   r    r"   rK   r;   r;   r<   test_rndm_splrepz   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   )rB   r3   	ones_liker!   rH   r    r"   r   )r8   r:   rK   r;   r;   r<   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'   r(      )r'   r(   ru   rp   rq   )r3   rh   r7   r   r   shape)	r8   r9   r"   r    r!   r:   tmtprK   r;   r;   r<   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   rM   rN   rO   )r3   rh   r7   r_r   rH   r   r   )
r8   r9   r"   r    r!   Zc_padr:   Zb_paddtrK   r;   r;   r<   
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绽|=&.>rO   rB   rC   r   )r8   r:   r    _r"   rw   rx   Zextrapr;   r;   r<   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   rO   r   )r8   r:   r    r   r"   r;   r;   r<   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   rM   TrS   F)extra   )r8   r:   r    r!   r"   r|   rK   maskr;   r;   r<   test_extrap   s    $zTestBSpline.test_extrapc                 C   sL   t  }|j\}}}|d d |d d g}||}ttt|  d S )Nr   r   r%   )rB   rC   r   r3   allisnan)r8   r:   r    r   r"   rK   yyr;   r;   r<   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 dd	ddg}|| |||  || ||    }t	||dd||dd d S )Nrd      r(   r'   periodicrS   r   r%   r   rM         ?T)
r3   r7   rg   rh   r   rs   rH   r   r   r   )	r8   r    r!   r"   r:   r9   r|   rK   Zxyr;   r;   r<   test_periodic_extrap   s    $$z TestBSpline.test_periodic_extrapc                 C   sV   t  }|j\}}}t|||f}t|| ||  d}t||||ddd d S )Nrk   rN   r?   )rB   rC   r   from_spliner3   rH   r   )r8   r:   r    r!   r"   pprK   r;   r;   r<   
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%   rM   r   dernurN   rO   )rB   rC   r3   rH   r{   ranger   r   )r8   r:   r    r!   r"   rK   r   Zydr;   r;   r<   test_derivative_rndm   s    z TestBSpline.test_derivative_rndmc                 C   sL  d}ddddddddddddg}t jd	 t jddt jd
ddf }t|||}t ddddg}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(   rp   rq   rd   ru   r~   g2H@gη   @r   )
r3   r7   rg   r{   r   rU   r   r   Zallcloser   )r8   r"   r    r!   r:   rQ   x0x1r;   r;   r<   test_derivative_jumps   s*    
z!TestBSpline.test_derivative_jumpsc                 C   s   t ddd}tjddddgd}t||t||j|j|jfd	d
 t||t	|d	d
 tjddddgd}t ddd}t||t 
|dk || d| d d	d
 d S )Nr%   r(   re   r   r   r&   r'   )r    rN   rO   rG   r*   )r3   rH   r   basis_elementr   r   r    r!   r"   B_0123rI   rJ   r;   r;   r<   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   re   rN   rO   )rB   rC   r3   rH   r   _sum_basis_elementsrb   r;   r;   r<   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   re   rN   rO   )	rB   rC   r   r!   realimagr3   rH   r   )	r8   r:   r    r!   r"   ccb_reb_imrK   r;   r;   r<   
test_cmplx$  s    zTestBSpline.test_cmplxc                 C   s*   t ddddg}tt|tj d S )Nr   r   r&   )r   r   r   r3   r   r4   r8   r:   r;   r;   r<   test_nan1  s    zTestBSpline.test_nanc                 C   st   t dd}|j\}}}t|||}t|| || d  d}td|D ]&}| }t|||||ddd qHd S )Nru   r"   r   re   -q=r?   )rB   rC   r   r3   rH   r   
derivativer   )r8   r:   r    r!   r"   Zb0rK   jr;   r;   r<   test_derivative_method6  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   re   rN   r?   )
rB   rC   r3   rH   r   antiderivativer   c_dstackr   rb   r;   r;   r<   test_antiderivative_method?  s         z&TestBSpline.test_antiderivative_methodc                 C   s@  t dddg}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   g      r%   TrS   Fr   iii      ?r'   g      +@   rp   ir(   )	r   r   r   	integrate_implr   rC   rT   r   )r8   r:   iZ
period_intr;   r;   r<   test_integralM  s:    .&zTestBSpline.test_integralc                 C   sT   dddddg}t ||}d|_t|}dD ]"\}}t|||||| q,d S )Nr   r   r&   r'   r(   r   ))r   )r   ru   )r      )r	   rT   r   r   r   r   )r8   rQ   r:   pr   r   r;   r;   r<   test_integrate_ppolyr  s    


z TestBSpline.test_integrate_ppolyc                 C   sR   G dd dt }|ddddg}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__r;   r;   r;   r<   B  s   r   r   r   r&   )r   r   r   	__class__r   r   )r8   r   r:   r;   r;   r<   test_subclassing}  s
    zTestBSpline.test_subclassingaxisr   r(   c              	   C   sf  d\}}t dd|| d }dddg}|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 jtft||||
d qt||||d	 t||||d	dt||||d	 t||||d	dfD ]}t|j|j qLd S )Nrn   r   r   rp   rq   r   r(   rr   r   rt   )r    r!   r"   r   r&   )r3   rH   r   r7   r   r   r!   rv   listndimr/   Z	AxisErrorr2   r   r   r   )r8   r   r9   r"   r    shZpos_axisr!   r:   ZxpZaxb1r;   r;   r<   	test_axis  s0    
$
$
zTestBSpline.test_axisc                 C   s   d}dddddddg}t ddddgddd	dgg}t|||dd
}t||d |}t||d |}t|d|d|dg d S )Nr&   r   r   r'   r(   ru   rp   r%   r   r-   )r3   arrayr   r   )r8   r"   r    r!   splZspl0Zspl1r;   r;   r<   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.
            rd   (   re   r   r%   r   r"   bc_typer   rN   rO   N)r3   r7   rg   rh   random_sampler	   eyelenr    r   design_matrixtoarrayr   r!   )	r9   r"   r   rQ   ri   rW   r!   Zdes_matr_defdes_matr_csrr;   r;   r<   run_design_matrix_tests  s    zHTestBSpline.test_design_matrix_bc_types.<locals>.run_design_matrix_testsr.   r'   clampednaturalr   r&   
not-a-knotru   rq   r   N)r   )r8   r   r9   r"   Zbcr;   r;   r<   test_design_matrix_bc_types  s    z'TestBSpline.test_design_matrix_bc_typesrT   FTr   degreeru   c           
   	   C   s4  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 5 Q R X nt|	|t
||||  dS )z;Test that design_matrix(x) is equivalent to BSpline(..)(x).rd   rG   r   r&   r   N)r3   r7   rg   r   ZaminZamaxr{   rH   r   r   r   r   r   r   r   rD   r   r1   )
r8   rT   r   rQ   ZxminZxmaxr"   r    r!   Zbspliner;   r;   r<   'test_design_matrix_same_as_BSpline_call  s,     "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 )Nrd   rG   r'   r   re   r   r   r(   rN   rO   )r3   r7   rg   rh   r   r	   r   r   r   r    r   r   r!   )
r8   r9   r"   rQ   ri   rW   r   Zxcycr   r;   r;   r<   test_design_matrix_x_shapes  s    z'TestBSpline.test_design_matrix_x_shapesc                 C   sB   ddddddddg}t d|d }t|dddd	ggd
d d S )Nr   r*   r+   r,   r'   g      ?gmਪ?gK}\UU?r)   rN   rO   )r   r   r   r   )r8   r    Zdes_matrr;   r;   r<   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 5 Q R X d}d	d
ddddg}d
dddg}tt t	||| W 5 Q R X d S )Nrd   rG   r'   r   re   r   r%   r&   r)   r   r*   r+   r,   g      @)r3   r7   rg   rh   r   r	   r/   r1   r   r   r    )r8   r9   r"   rQ   ri   rW   r    r;   r;   r<   test_design_matrix_asserts  s    
$
z&TestBSpline.test_design_matrix_assertsr   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 )
Nrd   re   r   r   r%   r   r   r>   rO   )r3   r7   rg   rh   r   r   from_power_basisrH   r   r	   r!   )r8   r   rQ   ri   cbrW   rK   Zbspl_newr;   r;   r<   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 )
Nrd   re   r   r   r   r%   r   r>   rO   )r3   r7   rg   rh   r   r   r   r	   r   r   r   r!   dtyper   )r8   r   rQ   ri   r   rW   Zbspl_new_realZbspl_new_imagr;   r;   r<   test_from_power_basis_complex/  s"    
z)TestBSpline.test_from_power_basis_complexc              	   C   sb   t dddddg}t dddddg}tjt||dddd}t|jdddddddg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>   rO   N)r3   r   r   r   r   r   r!   )r8   rQ   ri   rW   r;   r;   r<   test_from_power_basis_exmp@  s    z&TestBSpline.test_from_power_basis_exmpN)-r   r   r   r=   rF   rL   rR   rX   r`   rc   rj   rm   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rD   markparametrizer   r   r   r   r   r   r   r   r   r   r   r;   r;   r;   r<   r      sb   #				%


* 
 
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   rN   c           	      S   s   | j \}}}t|}tj|d d d|dd  |d d   |d d f }tt||||f|| ||||d|| jf d d S )Nr   g?r   r   r%   zder = %s  k = %s)r@   rA   err_msg)rC   r3   uniquer{   r   r   r"   )	r:   r   r   r@   rA   r    r!   r"   rQ   r;   r;   r<   check_splevX  s    
8  z,test_knots_multiplicity.<locals>.check_splev)r   r&   r'   r(   ru   r   r   r   )r   rN   rN   )rB   	enumerate_make_multiplesr   )r   r"   r:   r   r   r   r;   r;   r<   test_knots_multiplicityT  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 )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   r)   _naive_B)rQ   r"   r   r    c1c2r;   r;   r<   r   k  s    ,2Fr   c                    s    krnt d    krBd  ksHn tkr`t k sdt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 Nr   )r\   r   r!   r   r"   r    rQ   r;   r<   	<genexpr>  s     z_naive_eval.<locals>.<genexpr>r   )r3   searchsortedAssertionErrorr   sumr   )rQ   r    r!   r"   r;   r   r<   rZ   ~  s    &rZ   c                    sr   t d  }|d ks tt  |ks0t   krL| ksRn tt fddt|D S )z'Naive B-spline evaluation, another way.r   c                 3   s$   | ]} | t | V  qd S r   r   )r\   r   r!   r"   r    rQ   r;   r<   r     s     z _naive_eval_2.<locals>.<genexpr>)r   r   r   r   )rQ   r    r!   r"   r9   r;   r   r<   r_     s
    "r_   c                 C   s~   t ||d  }||d ks tt ||ks0td}t|D ]<}tj|||| d  dd| }||| t| 7 }q<|S )Nr   r)   r&   FrS   )r   r   r   r   r   r3   Z
nan_to_num)rQ   r    r!   r"   r9   sr   r:   r;   r;   r<   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 )Nr)   r;   rQ   r;   r;   r<   <lambda>      zB_012.<locals>.<lambda>c                 S   s   | S r   r;   r   r;   r;   r<   r     r   c                 S   s   d|  S Nr*   r;   r   r;   r;   r<   r     r   )r3   
atleast_1d	piecewiser   r;   r;   r<   rP     s    
rP   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 r   r;   r   r;   r;   r<   r     r   zB_0123.<locals>.<lambda>c                 S   s   d| d d  S )Ng      ?r   r&   r;   r   r;   r;   r<   r     r   c                 S   s   d|  d d S )Nr+   r&   r;   r   r;   r;   r<   r     r   c                 S   s   dS Nr   r;   r   r;   r;   r<   r     r   c                 S   s   dS )Ng       r;   r   r;   r;   r<   r     r   c                 S   s   dS r  r;   r   r;   r;   r<   r     r   znever be here: der=%s)r3   r  r1   r  )rQ   r   Zcondsfuncspiecesr;   r;   r<   r     s    
r   #   r'   c                 C   s@   t jd t t j| | d }t j| }t|||S )N{   r   )r3   r7   rg   rh   r   Zconstruct_fast)r9   r"   r    r!   r;   r;   r<   rB     s    rB   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.         ro   r   Nr   r%   )r!   r"   r    copyr   )r:   r!   r"   t1r;   r;   r<   r     s    


r   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   r,   )   r
  )r3   rH   picosr	   r    r!   r"   rC   rK   r   r:   xnewr   r   r   r   b2)r8   rK   r   r:   r   r;   r;   r<   setup_method  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 5 Q R X tt	d|j
jd }|j
|}|j||jf}tt|||||ddd d S )	Nr>   r?   c                    s   g | ]}t | qS r;   )r   r[   r:   r;   r<   r^     s     z*TestInterop.test_splev.<locals>.<listcomp>zCalling splev.. with BSplinematchr   r   )r  r:   r  r   r   rC   r/   r1   tupler   r!   r   	transposer    r"   )r8   r  r  r   r   rC   r;   r  r<   
test_splev  s4    
      
  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   r>   rO   r   r&   T)full_output)rK   r   r   r   r   r   r   r   )r8   rQ   ri   rC   r    r!   r"   Ztck_fr   r   r:   r;   r;   r<   test_splrep  s    

zTestInterop.test_splrepc              	   C   s   | j | j }}tj||f }tt t|| W 5 Q R X tt t|| W 5 Q R X ttdd  t|d d |d d  W 5 Q R X ttdd" t|d d |d d  W 5 Q R X d S )Nm > k must holdr  r'   )	rK   r   r3   r   r/   r1   r   r   r0   )r8   rQ   ri   y2r;   r;   r<   test_splrep_errors  s    

$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'   ru   r>   rO   r   T)r   r  )r3   r6   rV   r   r   r   r   )	r8   rQ   r:   urC   u1Zb_fZu_fr   r;   r;   r<   test_splprep'  s    zTestInterop.test_splprepc              	   C   s>  t dd}ttdd t| W 5 Q R X ttdd t| W 5 Q R X t jdddd}ttd	d t|g W 5 Q R X ttd	d t|g W 5 Q R X d
d
ddg}ttdd t|g W 5 Q R X ttdd t|g W 5 Q R X ddddg}ddddg}ttdd t|gd |g  W 5 Q R X d S )N<   rt   ztoo many values to unpackr  r   r   r'   )numr  g >Ig >KzInvalid inputsr   r&   r(   g333333?g?)	r3   r6   rV   r/   r1   r   r   rH   r0   )r8   rQ   r!  r;   r;   r<   test_splprep_errors6  s&    zTestInterop.test_splprep_errorsc              	   C   s   | j | j }}tddddgtj }tt||ddd tt|j|j|j	f|ddd t
tdd t|d	d
 W 5 Q R X |jddd}tt|j||j	fd	d
}t|jd t|| ddd d S )Nr   r   r-   g      @gHz>r?   zCalling sproot.. with BSpliner  rM   )Zmestr   r&   r   )r'   r&   r(   r   rO   )r:   r  r3   r   r  r   r   r    r!   r"   r/   r1   r  rU   r   rv   )r8   r:   r  rootsc2rrrr;   r;   r<   test_sprootS  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 5 Q R X |j	ddd}t
tdd|j||jf}t|jd t|tdd|dd d S )	Nr   r   rN   rO   zCalling splint.. with BSpliner  r&   )r'   r&   )r:   r  r   r   rC   r   r/   r1   r!   r  r3   rU   r    r"   r   rv   )r8   r:   r  r(  Zintegrr;   r;   r<   test_splintd  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   )r   r&   r'   r>   rO   r&   )r:   r  r   r    r!   r3   r{   zerosrv   r   r   r"   r   r   r   
isinstancer   r  r8   r:   ctr9   ZbdZtck_dr;   r;   r<   test_splderw  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 r,  )r:   r  r   r    r!   r3   r{   r-  rv   r   r   r"   r   r   r   r.  r   r  r/  r;   r;   r<   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   r>   rO   r  r   )r:   r  rK   r    rs   r   r!   r"   r   r   r   r.  r   r  r   r   r  r3   rU   )r8   r:   r  rK   r   tnZbnZtck_nr   r   Ztck_n2Zbn2r;   r;   r<   test_insert  s(    "
 
 zTestInterop.test_insertN)r   r   r   r  r  r  r  r#  r&  r*  r+  r1  r2  r4  r;   r;   r;   r<   r    s   r  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	d
dddgdd Zejd	d
dddgdd Zdd Zdd Zejd	ddddddgdd Zdd Zdd Zd d! Zejd	ddddgd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zejjd.d/d0d1 Zd2d3 Zd4d5 Z d6d7 Z!d8d9 Z"d:d; Z#d<d= Z$d>d? Z%ejd	ddddgd@dA Z&dBdC Z'dDdE Z(dFdG Z)dHdI Z*dJdK Z+dLS )M
TestInterpr)   r*   c              	   C   s*   t t t| j| jdd W 5 Q R X d S )Nr-   r   )r/   r0   r	   rK   r   )r8   r;   r;   r<   test_non_int_order  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   rN   r?   r%   r"   r   r	   rK   r   r   r   r;   r;   r<   test_order_0  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   rN   r?   r%   r7  r8  r   r;   r;   r<   test_linear  s    zTestInterp.test_linearr"   r   r   r&   r'   c              	   C   sN   ddddddg}ddddddddg}t td	d
 t|||d W 5 Q R X d S )Nr   r   r&   r'   r(   ru   rp   rq   zShapes of xr  r   r/   r1   r	   r8   r"   rQ   ri   r;   r;   r<   test_incompatible_x_y  s    z TestInterp.test_incompatible_x_yc              	   C   s   ddddddg}ddddddg}t tdd t|||d	 W 5 Q R X ddddddg}t td
d t|||d	 W 5 Q R X ddddddg}t|d}t td
d t|||d	 W 5 Q R X d S )Nr   r   r&   r'   r(   ru   zx to not have duplicatesr  r   zExpect x to be a 1D strictly)r   r%   )r/   r1   r	   r3   rU   rV   r<  r;   r;   r<   test_broken_x  s    zTestInterp.test_broken_xc                 C   s6   dD ],}t | j| j|}t|| j| jddd qd S )Nr   rN   r?   r8  )r8   r"   r:   r;   r;   r<   test_not_a_knot  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 )Nru   r   r   rN   r?   r   r   r   r%   gdy=rO   r"   r   r   )r	   rK   r   r   r   )r8   r:   r   r;   r;   r<   test_periodic  s    ,zTestInterp.test_periodicr(   ru   rp   rq   c                 C   sh   d}t jd t t j|d }t j|d }|d |d< t|||dd}t|||d	d
 d S )Nru   rd   rG   rk   r%   r   r   r   rN   rO   )r3   r7   rg   rh   r   r	   r   )r8   r"   r9   rQ   ri   r:   r;   r;   r<   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   rd   r&   r)   r%   r   ru   r   r@  rN   rO   )rK   rv   r3   r7   rg   r   r  rh   r-  sinr  r	   r   r   )r8   r9   rQ   ri   r:   r   r;   r;   r<   test_periodic_axis  s    
$zTestInterp.test_periodic_axisc              	   C   sj   t jd d}d}t t j|}t j|}|d d |d< tt t|||dd W 5 Q R X d S )	Nrd   ru   r   r%   r   r   r   r   )r3   r7   rg   rh   r   r/   r1   r	   )r8   r"   r9   rQ   ri   r;   r;   r<   test_periodic_points_exception  s    
z)TestInterp.test_periodic_points_exceptionc              	   C   sl   t jd d}d}t t j|}t j|}t |d|  }tt t||||d W 5 Q R X d S )Nrd   r'   rq   r&   r   )	r3   r7   rg   rh   r   r-  r/   r1   r	   )r8   r"   r9   rQ   ri   r    r;   r;   r<   test_periodic_knots_exception  s    
z(TestInterp.test_periodic_knots_exceptionc                 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)Zperr"   rN   rO   r   r   r   r~   )r	   rK   r   r   r   r   r   )r8   r"   r:   rC   r   r   r;   r;   r<   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   rN   rO   rG   rk   r%   r   )	r	   rK   r   r   r   r3   rh   r7   r   )r8   r:   Zcubr9   rQ   ri   r;   r;   r<   test_periodic_cubic0  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 r   rY   r   r]   r;   r<   r   F  r   z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>rN   rO   )r	   rK   r   r   r   r3   Z	vectorizer   )r8   r:   r   r;   r]   r<   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   rN   r?   r%   r   r   r8  )r8   r   r:   r;   r;   r<   test_quadratic_derivI  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   r+   )r   r,   r   rN   r?   r   r   r%   r&   r   r8  )r8   r"   der_lder_rr:   r;   r;   r<   test_cubic_derivV  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)ru   rq   )r   g      ()r&   r   rJ  )r&   r+   r   rN   r?   r   r   r&   c                 S   s   g | ]\}}|qS r;   r;   r\   r   valr;   r;   r<   r^   n  s     z2TestInterp.test_quintic_derivs.<locals>.<listcomp>r%   c                 S   s   g | ]\}}|qS r;   r;   rQ  r;   r;   r<   r^   p  s     )r3   r6   astypefloat_rC  r	   r   )r8   r"   r9   rQ   ri   rN  rO  r:   r;   r;   r<   test_quintic_derivse  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'   rL  )r&   r,   r   rN   r?   )r   rK   r	   r   r   )r8   r"   r    rN  r:   r;   r;   r<   test_cubic_deriv_unstabler  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%   r*   rM  r   rN   r?   r)   rO   )r3   r{   rK   r	   r   r   )r8   r"   r    r:   r;   r;   r<   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'   r)   r   r   r)   rL  r   rN   r?   )r	   r3   rH   r   )r8   r"   rQ   ri   r:   rK   r   r;   r;   r<   test_minimum_points_and_deriv  s    z(TestInterp.test_minimum_points_and_derivc              	   C   s   ddddddg }}t t t||dgd fd W 5 Q R X t t t||dd W 5 Q R X t t t||dgd W 5 Q R X t t t||d	d W 5 Q R X d
\}}t t t||||fd W 5 Q R X d S )Nr   r&   r'   r(   ru   rp   rY  r   *   )rY  rY  r;  )r8   rQ   ri   lrr;   r;   r<   test_deriv_spec  s    




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   rN   r?   r   r   r%   )r   r   r   )rK   r   r	   r   )r8   r"   rK   r   rN  rO  r:   r;   r;   r<   test_complex  s      zTestInterp.test_complexc                 C   sH   t dt j}t dt j}dD ]}t|||d}|| q(d S )NrG   r   r   r&   r'   r   )r3   r6   rS  int_r	   )r8   rQ   ri   r"   r:   r;   r;   r<   test_int_xy  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   rk   ru   r`  r   )r3   rH   r	   )r8   rK   rQ   ri   r"   r;   r;   r<   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 )NrG   r&   r%   )	r3   r6   rS  floatr4   r5   r/   r1   r	   )r8   rQ   ri   zr;   r;   r<   test_check_finite  s
    zTestInterp.test_check_finitec                 C   s,   t td}dd |D }t|||d d S )NrG   c                 S   s   g | ]}|d  qS )r&   r;   )r\   ar;   r;   r<   r^     s     z.TestInterp.test_list_input.<locals>.<listcomp>r   )r   r   r	   r<  r;   r;   r<   test_list_input  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   r*   r+   r,   r'   r   rN   r?   r   r%   )r3   r   rC  rK   r  r	   r   )r8   r   rN  rO  r:   r;   r;   r<   test_multiple_rhs  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 )
Nrd   r'   ro   rr   ru   rp   rq   r   ru   rp   rq   r   )r3   r7   rg   rh   r	   r   r!   rv   )r8   r"   r9   rQ   ri   r:   d_ld_rr;   r;   r<   test_shapes  s    zTestInterp.test_shapesc              	   C   s,  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 5 Q R X 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   rM  r>   rO   )r   r   )r   r   r&   )Nr   rY  r   Ztypor   r)   r   rd   rj  rr   ru   rp   rq   rk  r   r   )r3   rC  rK   r	   r   r!   r/   r1   r   r  r7   rg   rh   r-  )r8   r   r   r  rN  rO  r"   r9   rQ   ri   rl  rm  r;   r;   r<   test_string_aliases  sH    




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 )Nrd   )r'   rq   rr   rN   r?   )	r3   r7   rg   rh   r   r	   make_interp_full_matrr   r!   )r8   r"   r9   rQ   ri   r    r:   cfr;   r;   r<   test_full_matrix4  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.
        rd      r'       r&   r   Nr%   r   )offsetrN   rO   )r3   r7   rg   r   intZdiagflatr-  r   Zdiagonalr   r   linalgsolve)r8   r9   r"   ru  rg  r   urZlldr   r:   r;   r;   r<   test_woodbury?  s,    46
 zTestInterp.test_woodburyN),r   r   r   r3   rH   r  rK   rC  r   r6  r9  r:  rD   r   r   r=  r>  r?  rA  rB  rD  rE  rF  rG  rH  rI  rK  rP  rU  ZxfailrW  rX  rZ  r^  r_  rb  rc  rf  rh  ri  rn  ro  rr  r{  r;   r;   r;   r<   r5    sN   









	

3r5  c                 C   s   | j |j kst|j | j | d ks(t| 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   )rs   r   r3   r-  rT  r   r   r   evaluate_all_bsplslrx  )rQ   ri   r    r"   r9   Ar   xvalleftbbr!   r;   r;   r<   rp  \  s    rp  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|  )mapr3   rU   rs   r-  rT  r   r   r   r}  dotTr~  rx  )rQ   ri   r    r"   mr9   r  r   r  r  r  r   Yr!   r;   r;   r<   make_lsq_full_matrixx  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S )TestLSQrd   )r   r'   r   r%   rq   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)rQ   ri   r    r"   r  r
   r   r!   r   rv   rs   r3   rw  Zlstsq)r8   rQ   ri   r    r"   Zc0ZAYr:   Zaar   r   r   r;   r;   r<   
test_lstsq  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)wrN   rO   )
rQ   ri   r    r"   r3   rl   r
   r   r!   r   )r8   rQ   ri   r    r"   r  r:   Zb_wr;   r;   r<   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 )Nru   rp   rq   rr   r   )rQ   r    r"   r9   r3   r7   r
   r   r!   rv   rs   )r8   rQ   r    r"   r9   ri   r:   r;   r;   r<   ri    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   r>   r?   )rQ   r    r"   ri   r
   r   r   r   )r8   rQ   r    r"   r   r:   r   r   r;   r;   r<   r_    s    
zTestLSQ.test_complexc                 C   sD   t dt j}t dt j}t|dd}t|||dd d S )NrG   r   r   )r3   r6   rS  ra  r   r
   )r8   rQ   ri   r    r;   r;   r<   rb    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   rk   r'   r   )r3   rH   r   r
   )r8   rK   rQ   ri   r    r;   r;   r<   rc    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%   )
r3   r6   rS  rd  r   r4   r5   r/   r1   r
   )r8   rQ   ri   r    re  r;   r;   r<   test_checkfinite  s    
zTestLSQ.test_checkfiniteN)r   r   r   r3   r7   rg   r9   r"   rh   rQ   ri   r   rH   r    r  r  ri  r_  rb  rc  r  r;   r;   r;   r<   r    s   	r  c                 C   s    t jt jt jtd| S )Ndata)ospathjoinabspathdirname__file__)basenamer;   r;   r<   	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 5 Q R X tt t	|dd  | W 5 Q R X tt t	|
d|| W 5 Q R X tt t	|d d d	 | W 5 Q R X t |}|d |d
< tt t	|| W 5 Q R X d S )Nrd   rk   r(   r&   r'   r)   r   r   r%   r   )r3   r7   rg   rh   r   rC  normalr/   r1   r   rV   r  )r8   r9   rQ   ri   Zx_duplr;   r;   r<   test_invalid_input  s     .





z&TestSmoothingSpline.test_invalid_inputc                 C   sH   t td}|d }|d }|d }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.npzrQ   ri   y_GCVSPLg-C6?r?   N)r3   loadr  r   r   )r8   r  rQ   ri   r  Zy_comprr;   r;   r<   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.
        rd   rk   r(   r&   r'   r)   r   )Zlamr   r   r   r%   r>   rO   N)r3   r7   rg   rh   r   rC  r  r   r	   rH   r   )r8   r9   rQ   ri   Z
spline_GCVZspline_interpZgridr;   r;   r<   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 )Nrd   rk   r(   r&   r'   r)   r   rG   rr   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )r3   r7   rg   rh   r   rC  r  r   choicer   Zonesabsr1   )
r8   r9   rQ   ri   r   indr  Zspl_worigZweightedr;   r;   r<   test_weighted_smoothing_splineP  s    .

z2TestSmoothingSpline.test_weighted_smoothing_splineN)r   r   r   r  r  r  r  r;   r;   r;   r<   r    s   6r  )r   )r  r'   )r'   )9Znumpyr3   Znumpy.testingr   r   r   rD   r   r/   Zscipy.interpolater   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Zscipy.linalgrw  r~  Zscipy.interpolate._bsplinesr   r   r   r   r   Zscipy.interpolate._fitpack_implZinterpolateZ_fitpack_implr   r  r   r   r   rZ   r_   r   rP   r   rB   r   r  r5  rp  r  r  r  r  r;   r;   r;   r<   <module>   sB   H    E		

 `   -
R