o
    i-                    @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlZd dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z  d dl!m"Z# d dl$m%  m"Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z, d dlm-Z-m.Z.m/Z/ d dl0m1  m2Z3 d dl4m5Z5 d d	l6m7Z7 d d
l8m9Z9 d dlm:Z; d dlm<Z= d dlm>Z> G dd dZ?G dd dZ@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFd^ddZGd_d"d#ZHd$d% ZIG d&d' d'ZJG d(d) d)ZKd*d+ ZLd`d,d-ZMejNOd.d/d0gZPG d1d2 d2ZQG d3d4 d4ZRdad6d7ZSd8d9 ZTd:d; ZUG d<d= d=ZVd>d? ZWG d@dA dAZXdBdC ZYdDdE ZZdFdG Z[G dHdI dIZ\G dJdK dKZ]G dLdM dMZ^G dNdO dOZ_dPdQ Z`dRdS ZaG dTdU dUZbdVdW ZcG dXdY dYZdG dZd[ d[ZeG d\d] d]ZfdS )b    N)suppress_warnings)xp_assert_equalxp_assert_close)raises)BSplineBPolyPPolymake_interp_splinemake_lsq_splinesplevsplrepsplprepsplder
splantidersprootsplintinsertCubicSpline	NdBSplinemake_smoothing_splineRegularGridInterpolator)_not_a_knot_augknt_woodbury_algorithm_periodic_knots_make_interp_per_full_matr)generate_knotsmake_splrepmake_splprep)	AxisError)_run_concurrent_barrier)make_ndbspl)	_dfitpack)	_bsplines)_dierckxc                   @   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d9d: Ze j!"d;e#d<d=d>d? Z$d@dA Z%e j!j&dBdC Z'e j!"dDg dEe j!"dFe#dGdHdI Z(dJdK Z)dLdM Z*dNdO Z+e j!"dPg dQdRdS Z,e j!"dPg dQdTdU Z-dVdW Z.dXdY Z/e j!j&dZd[ Z0d\d] Z1d^S )_TestBSplinec              	   C   s  t ttftfi tddgdgdd tjdd t ttfi tdtjgdgdd W d    n1 s6w   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j	|| d tj
d}tj|}t|||}t||j t||j ||jksJ d S )N                 ?      ?r   tckignore)invalidr   r&      r   r&   r1         r1   )        r5   r(          @      @      @)r(   r(   r(   Zcubic      @)r5   r   r&   r&   r1   r3   )r(   r&   r&      r3   dtype)assert_raises	TypeError
ValueErrorr   dictnpZerrstatenaninfarangefloat64randomr   r*   r+   r,   )selfnr,   r*   r+   b rK   _/home/kim/smarthome/.venv/lib/python3.10/site-packages/scipy/interpolate/tests/test_bsplines.py	test_ctor)   s:   &$"&"



zTestBSpline.test_ctorc                 C   s   t  }|j}t|j|d ddd t|j|d ddd |j|d ks%J tt d|_W d    d S 1 s9w   Y  d S )Nr   V瞯<atolrtolr&   r1   Zfoo)	_make_random_splinetckr   r*   r+   r,   pytestr   AttributeError)rH   rJ   rS   rK   rK   rL   test_tckL   s   "zTestBSpline.test_tckc                 C   sp   t ddd}tddgdgdd}t||t |d  tg dddgdd}t||t |d	k dd
 d S )Nr   r&   
   r7   r)   )r   ffffff?r&   r3   r4   rX   r8   )rB   linspacer   r   	ones_likewhererH   xxrJ   rK   rK   rL   test_degree_0X   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 )
Nr2   r&   r1   r3   r&   r3   2   r   r1   +=rP   )r   rB   rY   r   B_012r   )rH   r*   r+   r,   rJ   xrK   rK   rL   test_degree_1a   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 )Nr3   r   r&   r(   r6   r7   r8   r/   g      r6   rW   Textrapolatera   rb   )rB   asarrayr   reshaper   rY   r   r   )rH   r,   r*   r+   bpbsplr]   rK   rK   rL   test_bernsteinl   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&   r`   c                       g | ]	}t | qS rK   _naive_eval.0rd   r+   r,   r*   rK   rL   
<listcomp>       z4TestBSpline.test_rndm_naive_eval.<locals>.<listcomp>ra   rb   c                    rn   rK   )_naive_eval_2rq   rs   rK   rL   rt      ru   )rR   rS   rB   rY   r   )rH   rJ   r]   Zy_bZy_nZy_n2rK   rs   rL   test_rndm_naive_evalz   s   z TestBSpline.test_rndm_naive_evalc                 C   sP   t  }|j\}}}t|| || d  d}t||t||||fdd d S )Nr&   r`   ra   rb   rR   rS   rB   rY   r   r   rH   rJ   r*   r+   r,   r]   rK   rK   rL   test_rndm_splev   s   "zTestBSpline.test_rndm_splevc           	      C   s~   t jd}t |d}|d}t||}t| }|j|j}}t || || d  d}t	||t
||dd d S )N     r&   P   ra   rb   )rB   rG   RandomStatesortr   r   r*   r,   rY   r   r   )	rH   rngrd   yrS   rJ   r*   r,   r]   rK   rK   rL   test_rndm_splrep   s   

zTestBSpline.test_rndm_splrepc                 C   sP   t  }t|j|_t|j|j |j|j d  d}t||t| d S )Nr&   d   )rR   rB   rZ   r+   rY   r*   r,   r   )rH   rJ   r]   rK   rK   rL   test_rndm_unity   s   $zTestBSpline.test_rndm_unityc           
      C   s   t jd}d\}}t ||}|j|ddfd}t|||}|| || d  }}||| |d  }	||	jdksAJ d S )	Nr{      r3         sizer&   r3   r4      )r3   r4   r   r   r   )rB   rG   r~   r   r   shape)
rH   r   rI   r,   r*   r+   rJ   tmtpr]   rK   rK   rL   test_vectorization   s   zTestBSpline.test_vectorizationc                 C   s   t jd}d\}}t ||| d }||}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 )	Nr{   )!   r3   r&   r/   r   r`   ra   rb   )	rB   rG   r~   r   r_r   rY   r   r   )rH   r   rI   r,   r*   r+   Zc_padrJ   Zb_paddtr]   rK   rK   rL   
test_len_c   s   
"zTestBSpline.test_len_cc           	      C   sd   t  }|j\}}}|| || d  }}dD ]}t|||g|||d |d g|ddd qd S )Nr&   TF绽|=&.>Hz>rO   rR   rS   r   )	rH   num_parallel_threadsrJ   r*   _r,   r   r   extraprK   rK   rL   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   rb   r   )rH   r   rJ   r*   r   r,   rK   rK   rL   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&   r`   Trg   F)extrx   )rH   rJ   r*   r+   r,   r   r]   maskrK   rK   rL   test_extrap   s   $zTestBSpline.test_extrapc                 C   sJ   t  }|j\}}}|d d |d d g}||}tt|r#J d S )Nr   r&   r/   )rR   rS   rB   allisnan)rH   rJ   r*   r   r,   r]   yyrK   rK   rL   test_default_extrap   s
   zTestBSpline.test_default_extrapc           
      C   s   t jd}t |d}|d}d}t|||dd}|j|d  }|d |d	  }t || | || | d
}|| |||  || ||    }	t||t|	|||f g d}|| |||  || ||    }	t	||dd||	dd d S )Nr{      r4   r3   periodicrg   r&   r/   r   r`   )r/   r         ?r&   T)
rB   rG   r~   r   r   r   rY   r   r   r   )
rH   r   r*   r+   r,   rJ   rI   r   r]   xyrK   rK   rL   test_periodic_extrap   s   
$$z TestBSpline.test_periodic_extrapc                 C   sV   t  }|j\}}}t|||f}t|| ||  d}t||||ddd d S )Nr   ra   rO   )rR   rS   r   from_splinerB   rY   r   )rH   rJ   r*   r+   r,   ppr]   rK   rK   rL   
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 q"t|||d dt|dd d S )	Nr   r/   r`   r&   dernura   rb   )	rR   rS   rB   rY   r   ranger   r   
zeros_like)rH   rJ   r*   r+   r,   r]   r   ZydrK   rK   rL   test_derivative_rndm   s   $z TestBSpline.test_derivative_rndmc           	      C   s   d}g d}t jd}t jdd|dddf }t|||}t g d}t|||dk d |||dk d  t |d	|d
rGJ t ddg}t||d dd||d dd t ddg}t ||d dd||d ddrzJ t ||d dd||d ddrJ d S )Nr1   )r/   r/   r   r&   r&   r3   r4   r   r   r   r   r   r{   r   r   )r&   r3   r4   r   r   r   g2H@gη   @r3   r4   r&   r   )rB   rG   r~   r   r   ri   r   allclose)	rH   r,   r*   r   r+   rJ   rd   x0x1rK   rK   rL   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/   r4   r|   r   r&   r1   r3   )r*   ra   rb   r   r&   r&   r1   r   r1   rW   r&   r6   )rB   rY   r   basis_elementr   r   r*   r+   r,   B_0123r[   r\   rK   rK   rL   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&   r|   ra   rb   )rR   rS   rB   rY   r   _sum_basis_elementsry   rK   rK   rL   test_basis_element_rndm3  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&   r|   ra   rb   )	rR   rS   r   r+   realimagrB   rY   r   )	rH   rJ   r*   r+   r,   ccb_reb_imr]   rK   rK   rL   
test_cmplx9  s   zTestBSpline.test_cmplxc                 C   s&   t g d}t|tjsJ d S )Nr   )r   r   rB   r   rC   rH   rJ   rK   rK   rL   test_nanF  s   zTestBSpline.test_nanc                 C   st   t dd}|j\}}}t|||}t|| || d  d}td|D ]}| }t|||||ddd q$d S )Nr   r,   r&   r|   -q=rO   )rR   rS   r   rB   rY   r   
derivativer   )rH   rJ   r*   r+   r,   Zb0r]   jrK   rK   rL   test_derivative_methodK  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&   r|   ra   rO   )
rR   rS   rB   rY   r   antiderivativer   c_dstackr   ry   rK   rK   rL   test_antiderivative_methodT  s   


z&TestBSpline.test_antiderivative_methodc              	   C   s  t g d}t|ddtd t|ddtd t|ddtd t|ddtd t|jdddd	td t|jddd
d	td t|jddd
d	td t|jddd
d	ttdd|j d|_	|
 }t|d|d }t|dd| t|ddtd|  t|dd| t|ddtd|  t|ddt|d|d  t|ddt|d|d |d |d  t|ddt|d|d |d |d  t|ddt|d|d |d |d d|   t|ddt|d|d  t|ddt|d|d  t|ddt|d|d d|   d S )Nr0   r   r&   r         r/   r5   Trg   Fr   r1   iii      ?r3   g      +@   r   ir4   )r   r   r   	integraterB   ri   _implr   rS   rh   r   )rH   rJ   iZ
period_intrK   rK   rL   test_integralb  sF   $$,$$zTestBSpline.test_integralc                 C   sN   g d}t ||}d|_t|}dD ]\}}t|||||| qd S )Nr2   r   ))r   )r   r   )r      )r	   rh   r   r   r   r   )rH   rd   rJ   pr   r   rK   rK   rL   test_integrate_ppoly  s   


z TestBSpline.test_integrate_ppolyc                 C   sJ   t g d}dD ]}|jdd|d}t|tjsJ |jdks"J q	d S )Nr0   r   r   r&   rg   )r   r   r   
isinstancerB   Zndarrayndim)rH   rJ   rh   resrK   rK   rL   test_integrate_0D_always  s   z$TestBSpline.test_integrate_0D_alwaysc                 C   sT   G dd dt }|g d}|j|ksJ | j|ksJ | j|ks(J d S )Nc                   @   s   e Zd ZdS )z'TestBSpline.test_subclassing.<locals>.BN)__name__
__module____qualname__rK   rK   rK   rL   B  s    r   )r   r&   r1   r1   )r   r   	__class__r   r   )rH   r   rJ   rK   rK   rL   test_subclassing  s
   zTestBSpline.test_subclassingaxisr   r4   c              
   C   sv  d\}}t dd|| d }g d}|d }||| t|}t jd}|j|d}t||||d}	|	jj|| f|d |  ||d d   ksNJ |d	}
|	|
j|d | |
j ||d d   kskJ |j	 d |j	fD ]}t
ttfi t||||d
 qtt||||d t||||ddt||||d t||||ddfD ]
}|j|	jksJ qd S )Nr   r   r&   r   r   r   r4   r{   r   r   r   )r*   r+   r,   r   r1   )rB   rY   r   tuplerG   r~   r   r+   r   r   r>   r   rA   r   r   r   )rH   r   rI   r,   r*   shZpos_axisr   r+   rJ   xpaxb1rK   rK   rL   	test_axis  s.   2
0
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 )
Nr1   )r   r&   r1   r3   r4   r   r   )r/   r1   r   r/   )r1   r   r&   r/   r   r   r&   r9   )rB   arrayr   r   )rH   r,   r*   r+   splZspl0Zspl1rK   rK   rL   test_neg_axis  s   zTestBSpline.test_neg_axisc                 C   sh   dd }d}d}dD ]}|||| q
t dddD ]}|||d qd	}t dd
D ]}|||d q)d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 || d d }|| d d }|dkr%|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.
            r{   (   r|   r   r/   r   r,   bc_typer&   ra   rb   N)rB   rG   r~   r   random_sampler	   eyelenr*   r   design_matrixtoarrayr   r+   )
rI   r,   r   r   rd   r   rl   r+   Zdes_matr_defdes_matr_csrrK   rK   rL   run_design_matrix_tests  s    zHTestBSpline.test_design_matrix_bc_types.<locals>.run_design_matrix_testsr;   r3   clampednaturalr   r1   
not-a-knotr   r   r   N)r   )rH   r   rI   r,   bcrK   rK   rL   test_design_matrix_bc_types  s   z'TestBSpline.test_design_matrix_bc_typesrh   )FTr   degreer   c              	   C   sH  t jd}|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}|stt t
|||| W d   dS 1 sw   Y  dS t|
|t
||||  dS )z;Test that design_matrix(x) is equivalent to BSpline(..)(x).r{   rW   r&   r1   r   N)rB   rG   r~   r   ZaminZamaxr   rY   r   r   r   r   r   r   r   rT   r   r@   )rH   rh   r  r   rd   ZxminZxmaxr,   r*   r+   bsplinerK   rK   rL   'test_design_matrix_same_as_BSpline_call  s,   ""z3TestBSpline.test_design_matrix_same_as_BSpline_callc                 C   s   t jd}d}d}t ||d d }||d d }t|||d}tddD ]"}|d | }|d | }	t||j	|
 }
t|
|j |	d	d
 q+d S )Nr{   rW   r3   r   r|   r   r&   r4   ra   rb   )rB   rG   r~   r   r   r	   r   r   r   r*   r   r   r+   )rH   r   rI   r,   rd   r   rl   r   Zxcycr   rK   rK   rL   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(   r6   r7   r8   r8   r8   r6   r3   )g      ?gmਪ?gK}\UU?r5   ra   rb   )r   r   r   r   )rH   r*   Zdes_matrrK   rK   rL   test_design_matrix_t_shapes'  s   
z'TestBSpline.test_design_matrix_t_shapesc                 C   s   t jd}d}d}t ||d d }||d d }t|||d}tt t	||j
d d d | W d    n1 sBw   Y  d}g d	}g d
}tt t	||| W d    d S 1 shw   Y  d S )Nr{   rW   r3   r   r|   r   r/   r1   )r5   r(   r6   r7   r8         @rf   )rB   rG   r~   r   r   r	   r>   r@   r   r   r*   )rH   r   rI   r,   rd   r   rl   r*   rK   rK   rL   test_design_matrix_asserts/  s   

"z&TestBSpline.test_design_matrix_assertsr   )r   r   r   r  c           	      C   s   t jd}t |d}|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 )
Nr{   r|   r   r   r/   r   r&   rN   rb   )rB   rG   r~   r   r   r   from_power_basisrY   r   r	   r+   )	rH   r   r   rd   r   cbrl   r]   Zbspl_newrK   rK   rL   test_from_power_basisA  s   
z!TestBSpline.test_from_power_basisc           	      C   s   t jd}t |d}|d|dd  }|dkr$|d |d< t|||d}tj||d}t||j|d}t||j	|d}t
|j|jd|j  dd	 d S )
Nr{   r|   r'   r   r   r/   r  rN   rb   )rB   rG   r~   r   r   r   r  r	   r   r   r   r+   )	rH   r   r   rd   r   r  rl   Zbspl_new_realZbspl_new_imagrK   rK   rL   test_from_power_basis_complexP  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]
        r2   )r&   r&   r&   r&   r&   r   r  )r(   r&   r&   r&   r&   r&   r&   rN   rb   N)rB   r   r   r  r   r   r+   )rH   rd   r   rl   rK   rK   rL   test_from_power_basis_exmp^  s   z&TestBSpline.test_from_power_basis_exmpc                 C   sv   t ddg}t dg}|jdd |jdd t ddd}|jdd t||dd}t||t |d  d S )Nr   r&   r7   FwriterW   r)   )rB   r   setflagsrY   r   r   rZ   )rH   r*   r+   r]   rJ   rK   rK   rL   test_read_onlyq  s   zTestBSpline.test_read_onlyc                 C   s   t  }dd }td|| d S )Nc                 S   s4   |j \}} }t|| || d  d}|| d S )Nr&   i'  )rS   rB   rY   )r   rJ   r*   r,   r]   rK   rK   rL   	worker_fn  s   z/TestBSpline.test_concurrency.<locals>.worker_fnrW   )rR   r    )rH   rJ   r  rK   rK   rL   test_concurrency~  s   zTestBSpline.test_concurrencyc                 C   s   t  }tddd}||}t }tjt|d| dd|jj	|jj
d}|j|d d < tjt|d| dd|jj	|jj
d}|j|d d < ||_||_t||| d S )	Nr   r&   rW   r*   z.datzw+)moder=   r   r+   )rR   rB   rY   	threadingget_native_idZmemmapstrjoinr*   r=   r   r+   r   )rH   ZtmpdirrJ   r]   expectedtidZt_mmZc_mmrK   rK   rL   test_memmap  s   zTestBSpline.test_memmapN)2r   r   r   rM   rV   r^   re   rm   rw   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rT   markparametrizer   r   r   thread_unsafer  r  r  r	  r  r  r  r  r  r  r  rK   rK   rK   rL   r%   '   sd    #	

	(



*


r%   c                   @   s   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	ejdddgdd Z
dd Zdd ZdS )
TestInsertxval)r5   r(   r9   r4         @      @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r|n|d d }t j
|d|dd  |d d   f }t|
|||dd d S )	Nr   r3   r   rN   rb   r&   r/   r   )rB   rE   sinr	   r   insert_knotr   r*   r+   r,   r   cosr   )rH   r$  rd   r   r   spl_1fspl_1r]   y1Zspl_y1Zspl_yyZspl_yy1rK   rK   rL   test_insert  s.   


"&

&zTestInsert.test_insertzxval, m))r5   r1   )r(   r3   )r   r   )r4   r1   )r&  r1   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rB|n|d d }t j
|d	|dd  |d d   f }t||||dd d S )
Nr   r3   r   mrN   rb   r&   r/   r   )rB   rE   r'  r	   r   r(  r   r*   r+   r,   r   )	rH   r$  r/  rd   r   r   r*  r+  r]   rK   rK   rL   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  r:   r&   r   r3   r1   )lowhighr   r2  r3  r   rN   rb   )rB   rG   default_rngr   uniformr   r(  r   )
rH   r   rI   r,   r*   r+   r   xvr+  r]   rK   rK   rL   test_insert_random  s    
"zTestInsert.test_insert_randomr7  )	r   皙?r6   r8         @      @      @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   r3   r   rh   r   TperrN   rb   r&   r{   r   r   )   r4  )rB   rE   r'  r   r   r(  r   rS   r   r*   r+   rG   r5  r6  r   )rH   r7  rd   r   rS   r   r+  tfcfr,   r]   rK   rK   rL   test_insert_periodic  s   

,"zTestInsert.test_insert_periodicrh   Nr   c                 C   s   t dd t j }t |t |}}t||d|  dd}||_t||dd}||_t||dd}||_d}||}	||}
||}t|	j	|
j	dd t|	j	|j	dd t|	j
|
j
d|j
  dd d S )	Nr   r1   r'   r3   r         @rN   rb   )rB   rE   pir'  r)  r	   rh   r(  r   r*   r+   )rH   rh   rd   Zy_reZy_imr   spl_respl_imr7  r+  Zspl_1reZspl_1imrK   rK   rL   test_complex  s   


 zTestInsert.test_complexc                 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 sEw   Y  tt || W d    d S 1 s_w   Y  d S )NrC  r3   r   r&   r1   r3   r4   r   r   r   rg   Tr=  )	rB   r   onesr   r   r>   r@   r   r(  )rH   r7  r,   r*   r+   r   rK   rK   rL   +test_insert_periodic_too_few_internal_knots  s   *

"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 s<w   Y  tt |d W d    n1 sUw   Y  tt |jddd W d    d S 1 sqw   Y  d S )	Nr3   r   r&   rH  r   r/   r   r.  )rB   r   rI  r   r   r>   r@   r(  )rH   r,   r*   r+   r   rK   rK   rL   test_insert_no_extrap"  s   *


"z TestInsert.test_insert_no_extrap)r   r   r   rT   r   r!  r-  r0  r8  rB  rG  rJ  rK  rK   rK   rK   rL   r#    s    
 


r#  c               	   C   sf   d	dd} dD ])}t |d}tt|D ]\}}| || td|d D ]
}| |||dd q$qqd S )
Nr   ra   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   r9  r   r&   r/   zder = z  k = )rP   rQ   err_msg)rS   rB   uniquer   r   r   r,   )	rJ   r   r   rP   rQ   r*   r+   r,   rd   rK   rK   rL   check_splev6  s   
8
z,test_knots_multiplicity.<locals>.check_splevr&   r1   r3   r4   r   r   r&   r   )r   ra   ra   )rR   	enumerate_make_multiplesr   )rN  r,   rJ   r   r   r   rK   rK   rL   test_knots_multiplicity2  s   



rR  c                 C      |dkr|| |   kr||d  k rdS  dS |||  || kr%d}n| ||  |||  ||   t | |d || }||| d  ||d  krRd}|| S ||| 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(   r5   _naive_Brd   r,   r   r*   c1c2rK   rK   rL   rU  I  s   (2FrU  c                    s    kr	nt d    kr"d  ks%J  J kr1t k s3J 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 NrT  )rr   r   r+   r   r,   r*   rd   rK   rL   	<genexpr>f  s   , z_naive_eval.<locals>.<genexpr>r   )rB   searchsortedr   sumr   )rd   r*   r+   r,   rK   rZ  rL   rp   \  s   ((rp   c                    st   t d  }|d ksJ t  |ksJ    kr'| ks*J  J t fddt|D S )z'Naive B-spline evaluation, another way.r&   c                 3   &    | ]} | t | V  qd S rY  rT  rr   r   r+   r,   r*   rd   rK   rL   r[  o     $ z _naive_eval_2.<locals>.<genexpr>r   r]  r   rd   r*   r+   r,   rI   rK   r`  rL   rv   i  s
   $ rv   c                 C   s~   t ||d  }||d ksJ t ||ksJ d}t|D ]}tj|||| d  dd| }||| t| 7 }q|S )Nr&   r5   r1   Frg   )r   r   r   r   rB   Z
nan_to_num)rd   r*   r+   r,   rI   sr   rJ   rK   rK   rL   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   r1   r&   c                 S      dS )Nr5   rK   rd   rK   rK   rL   <lambda>      zB_012.<locals>.<lambda>c                 S   s   | S rY  rK   rf  rK   rK   rL   rg    rh  c                 S   s   d|  S Nr6   rK   rf  rK   rK   rL   rg    s    )rB   
atleast_1d	piecewiserf  rK   rK   rL   rc   }  s   
rc   c                 C   s   t | } | dk | dk| dk @ | dkg}|dkr$dd dd dd g}n|dkr4dd d	d d
d g}ntd| t | ||}|S )z0A quadratic B-spline function B(x | 0, 1, 2, 3).r&   r1   r   c                 S   s   | |  d S ri  rK   rf  rK   rK   rL   rg    s    zB_0123.<locals>.<lambda>c                 S   s   d| d d  S )Ng      ?r   r1   rK   rf  rK   rK   rL   rg        c                 S   s   d|  d d S )Nr7   r1   rK   rf  rK   rK   rL   rg    rl  c                 S   re  Nr(   rK   rf  rK   rK   rL   rg    rh  c                 S   re  )Ng       rK   rf  rK   rK   rL   rg    rh  c                 S   re  rm  rK   rf  rK   rK   rL   rg    rh  znever be here: der=)rB   rj  r@   rk  )rd   r   ZcondsfuncspiecesrK   rK   rL   r     s   
r   #   r3   c                 C   s<   t jd}t || | d }|| }t|||S )N{   r&   )rB   rG   r~   r   r   Zconstruct_fast)rI   r,   r   r*   r+   rK   rK   rL   rR     s   
rR   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   )rJ   r+   r,   t1rK   rK   rL   rQ    s   


rQ  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   r8   r?  rt  )rB   rY   rD  r)  r	   r*   r+   r,   rS   r]   r   rJ   xnewr   r   rX  r   b2)rH   r]   r   rJ   rX  rK   rK   rL   setup_method  s   

zTestInterop.setup_methodc                    s  | j | j| j} }tt|  |ddd tt| j |ddd tt fdd|D  |ddd tt	dd t|| W d    n1 sPw   Y  t
td|jjd }|j|}|j||jf}ttt|||||ddd d S )	NrN   rO   c                    s   g | ]}t | qS rK   )r   rq   rJ   rK   rL   rt         z*TestInterop.test_splev.<locals>.<listcomp>zCalling splev.. with BSplinematchr&   r   )rx  rJ   ry  r   r   rS   rB   ri   r>   r@   r   r   r+   r   	transposer*   r,   )rH   rx  ry  r   r   rS   rK   r{  rL   
test_splev  s&   




zTestInterop.test_splevc                 C   s   | j | j}}t||}t||\}}}t|d |dd t|d |dd |d |ks/J t||dd\}}}}t|d |dd t|d |dd |d |ksTJ t||}	t||	dd t| }
t||
|dd d S )Nr   rN   rb   r&   r1   T)full_output)r]   r   r   r   r   r   r   )rH   rd   r   rS   r*   r+   r,   Ztck_fr   r   rJ   rK   rK   rL   test_splrep  s   

zTestInterop.test_splrepc                 C   s  | j | j}}tj||f }tt t|| W d    n1 s"w   Y  tt t|| W d    n1 s<w   Y  ttdd t|d d |d d  W d    n1 s_w   Y  ttdd t|d d |d d  W d    d S 1 sw   Y  d S )Nm > k must holdr}  r3   )	r]   r   rB   r   r>   r@   r   r   r?   )rH   rd   r   y2rK   rK   rL   test_splrep_errors  s   

"zTestInterop.test_splrep_errorsc           	      C   s   t jdt jdd}t|\}}t|\}}t||dd tt t|||dd tt t|||dd t|ddd\\}}}}}t||dd tt t|||dd d S )	Nr   r<   r3   r   rN   rb   r   T)rd  r  )	rB   rE   rF   rj   r   r   r   ri   r   )	rH   rd   rJ   urS   u1Zb_fZu_fr   rK   rK   rL   test_splprep  s   zTestInterop.test_splprepc                 C   s  t dd}ttdd t| W d    n1 sw   Y  ttdd t| W d    n1 s8w   Y  t jdddd}ttd	d t|g W d    n1 s[w   Y  ttd	d t|g W d    n1 sww   Y  g d
}ttdd t|g W d    n1 sw   Y  ttdd t|g W d    n1 sw   Y  g d}g d}ttdd t|gd |g  W d    d S 1 sw   Y  d S )N<   r   ztoo many values to unpackr}  r   r   r3   )numr  ) >Ir   >Kr  zInvalid inputs)r&   r3   r1   r4   )r   g333333?g?r&   )	rB   rE   rj   r>   r@   r   r   rY   r?   )rH   rd   r  rK   rK   rL   test_splprep_errors  s4   
"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 sBw   Y  |jdd	d
}tt|j||j	fdd}|jdksdJ t|| t|dd d S )N)r   r   r9   rC  r   rO   zCalling sproot.. with BSpliner}  r`   )Zmestr&   r1   r   )r3   r1   r4   r   rb   )rJ   ry  rB   r   rD  r   r   r*   r+   r,   r>   r@   r  ri   r   r   )rH   rJ   ry  rootsc2rZrrrK   rK   rL   test_sproot1  s    zTestInterop.test_sprootc                 C   s   | j | j}}ttdd|tdd|jddd ttdd||ddddd ttdd tdd| W d    n1 s?w   Y  |j	ddd}t
tdd|j||jf}|jd	ksaJ t|tdd|ddd
 d S )Nr   r&   ra   F)rP   check_0dzCalling splint.. with BSpliner}  r1   r3   r1   )rP   check_shape)rJ   ry  r   r   rS   r   r>   r@   r+   r  rB   ri   r*   r,   r   )rH   rJ   ry  r  ZintegrrK   rK   rL   test_splintB  s    
zTestInterop.test_splintc              	   C      | j | jfD ]g}t|jt|j }|j }|dkr-tj|t|f|j	dd   f }dD ]=}t
|}t
|j ||jf}t|j|d dd t|j|d dd |j|d ks^J t|tseJ t|tslJ q/qd S Nr   r&   r_   rN   rb   r1   )rJ   ry  r   r*   r+   ru  rB   r   zerosr   r   r   r,   r   r   r   r   rH   rJ   ctZb_crI   ZbdZtck_drK   rK   rL   test_splderV     
$zTestInterop.test_splderc              	   C   r  r  )rJ   ry  r   r*   r+   ru  rB   r   r  r   r   r   r,   r   r   r   r   r  rK   rK   rL   test_splantiderg  r  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sDJ t
|tsKJ tt|jj}|j|dd  d }	t||j|	|jf}
t||}ttt	||
ddd||dd t
|tsJ t
|
tsJ d S )Nr1   r   r&   rN   rb   r  r   )rJ   ry  r]   r*   r   r   r+   r,   r   r   r   r   r   r   r   r  rB   ri   )rH   rJ   ry  r]   r   tnZbnZtck_nr   r   Ztck_n2Zbn2rK   rK   rL   r-  x  s$   "


zTestInterop.test_insertN)r   r   r   rz  r  r  r  r  r  r  r  r  r  r-  rK   rK   rK   rL   rw    s    rw  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%d;d< Z&ejd	g d=d>d? Z'd@dA Z(dBdC Z)dDdE Z*dFdG Z+dHdI Z,dJS )K
TestInterpr5   r6   c                 C   s@   t t t| j| jdd W d    d S 1 sw   Y  d S )Nr9   r   )r>   r?   r	   r]   r   rH   rK   rK   rL   test_non_int_order  s   
"zTestInterp.test_non_int_orderc                 C   Z   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   ra   rO   r/   r,   r   r	   r]   r   r   r   rK   rK   rL   test_order_0     zTestInterp.test_order_0c                 C   r  )Nr&   r   ra   rO   r/   r  r  r   rK   rK   rL   test_linear  r  zTestInterp.test_linearr,   r   c                 C   sP   g d}g d}t tdd t|||d W d    d S 1 s!w   Y  d S )Nr   r&   r1   r3   r4   r   )r   r&   r1   r3   r4   r   r   r   zShapes of xr}  r   r>   r@   r	   rH   r,   rd   r   rK   rK   rL   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 w   Y  g d}t tdd t|||d W d    n1 sAw   Y  g d}t|d}t tdd t|||d W d    d S 1 skw   Y  d S )	N)r   r&   r&   r1   r3   r4   r  zx to not have duplicatesr}  r   )r   r1   r&   r3   r4   r   zExpect x to be a 1D strictly)r&   r/   )r>   r@   r	   rB   ri   rj   r  rK   rK   rL   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 )Nr1   r3   r4   r   r   r   ra   rO   r  )rH   r,   rJ   rK   rK   rL   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 qt | 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 qOd S )Nr   r   r   ra   rO   r&   r   r   r/   dy=rb   r,   r   r   )r	   r]   r   r   r   )rH   rJ   r   rK   rK   rL   test_periodic  s   ,,zTestInterp.test_periodicr  c                 C   sd   d}t jd}t ||d }||d }|d |d< t|||dd}t|||d	d
 d S )Nr   r{   rW   r   r/   r   r   r   ra   rb   )rB   rG   r~   r   r   r	   r   )rH   r,   rI   r   rd   r   rJ   rK   rK   rL   test_periodic_random  s   zTestInterp.test_periodic_randomc                 C   s   | j jd }tjd}||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 qHt||d ||d d
d d S )Nr   r{   r1   r5   r/   r&   r   r   r  ra   rb   )r]   r   rB   rG   r~   r   rD  r   r  r'  r)  r	   r   r   )rH   rI   r   rd   r   rJ   r   rK   rK   rL   test_periodic_axis  s   
$"zTestInterp.test_periodic_axisc                 C   s|   t jd}d}d}t ||}||}|d d |d< tt t|||dd W d    d S 1 s7w   Y  d S )	Nr{   r   r   r/   r&   r   r   r   )rB   rG   r~   r   r   r>   r@   r	   )rH   r   r,   rI   rd   r   rK   rK   rL   test_periodic_points_exception  s   

"z)TestInterp.test_periodic_points_exceptionc                 C   s~   t jd}d}d}t ||}||}t |d|  }tt t||||d W d    d S 1 s8w   Y  d S )Nr{   r3   r   r1   r   )	rB   rG   r~   r   r   r  r>   r@   r	   )rH   r   r,   rI   rd   r   r*   rK   rK   rL   test_periodic_knots_exception  s   

"z(TestInterp.test_periodic_knots_exceptionrH  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 q)d S )Nr   r   T)r>  r,   ra   rb   r&   r   r   r   )r	   r]   r   r   r   r   r   )rH   r,   rJ   rS   r   r   rK   rK   rL   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 tjd}d}t|	|d }|	|d	 }|d
 |d< t ||ddd}t||dd}t||||dd d S )Nr3   r   r   r  ra   rb   r{   rW   r   r/   r   )
r	   r]   r   r   r   rB   rG   r~   r   r   )rH   rJ   Zcubr   rI   rd   r   rK   rK   rL   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 )Nr3   r   r   c                    s   t |  S rY  ro   rf  rs   rK   rL   rg  (  s    z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>ra   rb   )r	   r]   r   r   r   rB   Z	vectorizer   )rH   rJ   r   rK   rs   rL   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	d
 t | j| jd|d fd}t|| j| jddd t|| jd d|d d ddd	d
 d S )Nr&   g       @r1   r   ra   rO   r/   r&   r   FrP   rQ   r  r  )rH   r   rJ   rK   rK   rL   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t|| jd d|| jd	 dgt|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 )Nr3   r&   r7   )r&   r8   r  ra   rO   r   r&   r/   r1   r   )r	   r]   r   r   rB   ri   )rH   r,   der_lder_rrJ   rK   rK   rL   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t ||d	 d
||d	 dgt dd |D  tt ||d d
||d dgt dd |D  d S )N)r   r   )r&   g      ()r1   r&   r  )r1   r7   r   ra   rO   r   r&   r1   c                 S      g | ]\}}|qS rK   rK   rr   r   valrK   rK   rL   rt   T      z2TestInterp.test_quintic_derivs.<locals>.<listcomp>r/   c                 S   r  rK   rK   r  rK   rK   rL   rt   V  r  )rB   rE   astyperF   r'  r	   r   ri   )rH   r,   rI   rd   r   r  r  rJ   rK   rK   rL   test_quintic_derivsK  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 )Nr3   r  )r1   r8   r  ra   rO   )r   r]   r	   r   r   )rH   r,   r*   r  rJ   rK   rK   rL   test_cubic_deriv_unstableX  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t d
dd t|| jd dt d
dd d S )Nr1   r   r&   r/   r6   r  r  ra   rO   r5   rb   )rB   r   r]   r	   r   r   ri   )rH   r,   r*   rJ   rK   rK   rL   test_knots_not_data_sitesg  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 )	Nr3   r5   r(   r&   r5   r  r  ra   rO   )r	   rB   rY   r   )rH   r,   rd   r   rJ   r]   r   rK   rK   rL   test_minimum_points_and_derivv  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w   Y  t t t||dd W d    n1 s:w   Y  t t t||dgd W d    n1 sVw   Y  t t t||dd W d    n1 sqw   Y  d\}}t t t||||fd W d    d S 1 sw   Y  d S )N)r(   r1   r3   r4   r   r   r  r  *   )r  r  r  rH   rd   r   lrrK   rK   rL   test_deriv_spec  s"   




"zTestInterp.test_deriv_specc                 C   s   t d}|d }dgdg}}ttdd t||||fd W d    n1 s*w   Y  dgdg}}ttd	d t||||fd W d    d S 1 sQw   Y  d S )
Nr   r1   )r   r   r&   r   zBad boundary conditions at 0.r}  r  )ir   zBad boundary conditions at 6.)rB   rE   r>   r@   r	   r  rK   rK   rL   test_deriv_order_too_large  s   
"z%TestInterp.test_deriv_order_too_largec                 C   s   d}| j }| jd| j  }dgdg}}t|||||fd}t|||ddd t||d d	|d d	 ddd
d t||d d	|d d	 ddd
d dD ]}t|||d}t|||ddd qNd S )Nr3   r'   )r&   y              @)r&   y      @       @r  ra   rO   r   r&   Fr  r/   )r   r&   r   )r]   r   r	   r   )rH   r,   r]   r   r  r  rJ   rK   rK   rL   rG    s    zTestInterp.test_complexc                 C   sD   t dt}t dt}dD ]}t|||d}|| qd S )NrW   r   r   )rB   rE   r  intr	   )rH   rd   r   r,   rJ   rK   rK   rL   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&   r   r   r   r   )rB   rY   r	   )rH   r]   rd   r   r,   rK   rK   rL   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 )NrW   r1   r/   )	rB   rE   r  floatrC   rD   r>   r@   r	   rH   rd   r   zrK   rK   rL   test_check_finite  s   zTestInterp.test_check_finite)r&   r1   r3   r   c                 C   s,   t td}dd |D }t|||d d S )NrW   c                 S   s   g | ]}|d  qS )r1   rK   )rr   arK   rK   rL   rt     r  z.TestInterp.test_list_input.<locals>.<listcomp>r   )listr   r	   r  rK   rK   rL   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(   r6   r7   r8   r3   r   ra   rO   r   r/   )rB   r   r'  r]   r)  r	   r   )rH   r   r  r  rJ   rK   rK   rL   test_multiple_rhs  s   $(zTestInterp.test_multiple_rhsc           	      C   s   t jd}d\}}t |j|d}|j|dddfd}t|||}|jj|dddfks/J d|dfg}d|dfg}t|||||fd	}|jj|| d dddfksYJ d S )
Nr{   r3   r   r   r   r   r   r&   r   r   r   r  )rB   rG   r~   r   r	   r+   r   )	rH   r   r,   rI   rd   r   rJ   d_ld_rrK   rK   rL   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 d    n1 sw   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 |j
|d}	|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 )Nr3   r   r   r  rN   rb   )r   r   r  r1   )Nr   r  r  Ztypor&   r5   r   r{   r  r   r   r   r   r  r  r   )rB   r'  r]   r	   r   r+   r>   r@   r   r)  rG   r~   r   r  )rH   r   r   ry  r  r  r   r,   rI   rd   r   r  r  rK   rK   rL   test_string_aliases  sJ   




zTestInterp.test_string_aliasesc           	      C   sn   t jd}d\}}t |j|d}|j|d}t||}t||||}t||||}t|j|ddd d S )Nr{   )r3   r   r   ra   rO   )	rB   rG   r~   r   r   r	   make_interp_full_matrr   r+   )	rH   r   r,   rI   rd   r   r*   rJ   rA  rK   rK   rL   test_full_matrix+  s   
zTestInterp.test_full_matrixc                 C   s  t jd}d}tdddD ]}t|d d }t |d|f}td|d D ]4}|d| |df  t |d|| f7  < ||dd| f  t |d|| f7  < q)|||f}||d|| df< |||f}||| dd|f< t ||f}	tt|| d dD ]#\}}
|
d	k rt j||
d
|	|d|
f< qt j||
d
|	||
df< q||}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.
        r{      r3       r1   r&   Nr/   r   )offsetra   rb   )rB   rG   r~   r   r  Zdiagflatr  rP  Zdiagonalr   r   linalgsolve)rH   r   rI   r,   r  r  r   urZlldr   rJ   rK   rK   rL   test_woodbury6  s,   24
zTestInterp.test_woodburyN)-r   r   r   rB   rY   rD  r]   r'  r   r  r  r  rT   r   r!  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Zxfailr  r  r  r  r  rG  r  r  r  r  r  r  r  r  r  rK   rK   rK   rL   r    sR    









	

3r  c                 C   s   | j |j ksJ |j | j | d ksJ | j }tj||ftjd}t|D ]+}| | }||| kr4|}nt||d }t||||}	|	|||| |d f< q%t	||}
|
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   rB   r  rF   r   r\  r$   evaluate_all_bsplslr  )rd   r   r*   r,   rI   Ar   r$  leftbbr+   rK   rK   rL   r  S  s   r  c                 C   s   t tj| ||f\} }}| j}|j| d }tj||ftjd}t|D ]+}| | }||| kr3|}	nt||d }	t	||||	}
|
|||	| |	d f< q$t
|j|}t
|j|}t||}|||ffS )z,Make the least-square spline, full matrices.r&   r<   )maprB   ri   r   r  rF   r   r\  r$   r  dotTr  r  )rd   r   r*   r,   r/  rI   r  r   r$  r  r  r   Yr+   rK   rK   rL   make_lsq_full_matrixo  s   r  methodnorm-eqqrc                   @   s  e Zd ZejdZd\ZZe	eeZ
eeZeee
d e
d deZedd Zedd	 Zd
d Zedd Zedd Zdd Zedd Zdd Zedd Zedd Zedd Zedd Zedd Zejd e e!d!dd"d# Z"d$d% Z#d&S )'TestLSQr{   )r   r3   r   r/   r   c                 C   s   | j | j| j| jf\}}}}t||||\}}t|||||d}t|j| |jj|j	| d fks4J |\}	}
t
jj|	|dd\}}}}t|j| d S )Nr  r&   r/   )Zrcond)rd   r   r*   r,   r  r
   r   r+   r   r   rB   r  Zlstsq)rH   r  rd   r   r*   r,   Zc0ZAYrJ   aar   rW  r   rK   rK   rL   
test_lstsq  s   zTestLSQ.test_lstsqc           	      C   s   | j | j| j| jf\}}}}t|}t|||||d}t||||||d}t|j|jdd t|j|jdd |j|jks@J d S )Nr  wr  ra   rb   )	rd   r   r*   r,   rB   rZ   r
   r   r+   )	rH   r  rd   r   r*   r,   r  rJ   Zb_wrK   rK   rL   test_weights  s   
zTestLSQ.test_weightsc           	      C   s   | j | j| j| jf\}}}}tjdj|jd d}t	|||||dd}t	|||||dd}t	||||dd}t
|j|jdd	 tj|j|jdd	rMJ d S )
Nr{   r   r   r  r   r  r  ra   rb   )rd   r   r*   r,   rB   rG   r5  r6  r   r
   r   r+   r   )	rH   rd   r   r*   r,   r  Zb_neb_qrZb_no_wrK   rK   rL   test_weights_same  s   zTestLSQ.test_weights_samec           	      C   st   | j | j| j| jf\}}}}tjd}|j|dddfd}t|||||d}|jj	|j
| d dddfks8J d S )Nr{   r   r   r   r   r  r&   )rd   r*   r,   rI   rB   rG   r~   r
   r+   r   r   )	rH   r  rd   r*   r,   rI   r   r   rJ   rK   rK   rL   r    s
   &zTestLSQ.test_multiple_rhsc                    s   | j | j| j| jf\}d}tjd}|j||fdtd}fddt|D  t	 fddt|D j
}t||jdd	 d S )
Nr3   r{   r   r  c              	      s*   g | ]}t d d |f  dqS )Nr  )r
   r_  )r,   r  r*   rd   r   rK   rL   rt     s    "z/TestLSQ.test_multiple_rhs_2.<locals>.<listcomp>c                    s   g | ]} | j qS rK   )r+   r_  )r  rK   rL   rt     r|  rN   rb   )rd   r*   r,   rI   rB   rG   r~   r
   r   vstackr  r   r+   )rH   r  rI   nrhsr   rJ   ZcoefsrK   )r  r,   r  r*   rd   r   rL   test_multiple_rhs_2  s   zTestLSQ.test_multiple_rhs_2c           	      C   sl   | j | j| j| jf\}}}}d}tjj||fd}t||||dd}t||||dd}t|j|jdd d S )Nr3   r   r  r  r  rN   rb   )	rd   r*   r,   rI   rB   rG   r
   r   r+   )	rH   rd   r*   r,   rI   r  r   r  Zb_neqrK   rK   rL   test_multiple_rhs_3  s   zTestLSQ.test_multiple_rhs_3c           	      C   s   | j | j| j}}}| jd }t|||||d}t||j|||d}t||j|||d}t||||d||  ddd d S )N      ?       @r  r'   rN   rO   )rd   r*   r,   r   r
   r   r   r   )	rH   r  rd   r*   r,   r  rJ   r   r   rK   rK   rL   rG    s   
(zTestLSQ.test_complexc                 C   s   | j | j| j}}}| jd }tj||fdd}t||||}t||j||}t||j||}t	||||d||  ddd tj||fdd}t||||}t||j||}t||j||}t	||||d||  ddd d S )Nr	  r&   r   r'   rN   rO   )
rd   r*   r,   r   rB   stackr
   r   r   r   )rH   rd   r*   r,   r  rJ   r   r   rK   rK   rL   test_complex_2  s   
$(zTestLSQ.test_complex_2c                 C   sB   t dt}t dt}t|dd}t|||d|d d S )NrW   r&   r   r,   r  )rB   rE   r  r  r   r
   rH   r  rd   r   r*   rK   rK   rL   r     s   zTestLSQ.test_int_xyc                 C   s   t jdt jd}t jdt jd}t|dd}t|||d|d}t|t|t|td|d}|dd  |d d  d }t||||dd	 d S )
NrW   r<   r&   r   r  r/   r6   rN   rb   )rB   rE   Zfloat32r   r
   r  r  r   )rH   r  rd   r   r*   Zspl_f32Zspl_f64Zx2rK   rK   rL   test_f32_xy  s   zTestLSQ.test_f32_xyc                 C   sJ   t ddd}|d d d }|d d d }t|d}t|||d|d d S )Nr/   r&   r   r3   r  )rB   rY   r   r
   )rH   r  r]   rd   r   r*   rK   rK   rL   r    s
   
zTestLSQ.test_sliced_inputc              	   C   sZ   t dt}|d }t|d}t jt jt j fD ]}||d< ttt	||||d qd S )N   r1   r3   r/   r  )
rB   rE   r  r  r   rC   rD   r>   r@   r
   )rH   r  rd   r   r*   r  rK   rK   rL   test_checkfinite  s   
zTestLSQ.test_checkfinitec                 C   sN   | j | j| j}}}|jdd |jdd |jdd t||||d d S )NFr  )rd   r   r*   r  )rd   r   r*   r  r
   r  rK   rK   rL   r  *  s
   zTestLSQ.test_read_onlyr,   r&   c                 C   s   | j | j}}tt|d |d d|}t||||dd}t||||dd}|dd  |d d  d }t||||d	d
 d S )Nr   r/   r   r  r  r  r&   r6   rN   rb   )rd   r   r   rB   rY   r
   r   )rH   r,   rd   r   r*   Zspl_norm_eqZspl_qrr]   rK   rK   rL   test_qr_vs_norm_eq3  s   zTestLSQ.test_qr_vs_norm_eqc                 C   s~   t | jd}t | jd}t| j| j| jddd}t||| jddd}|dd  |d d  d }t||||dd	 d S )
Nr1   r3   r  r  r&   r/   r6   rN   rb   )rB   repeatrd   r   r
   r*   r   )rH   rd   r   r+  spl_2r]   rK   rK   rL   test_duplicates>  s   zTestLSQ.test_duplicatesN)$r   r   r   rB   rG   r~   r   rI   r,   r   rd   r   r   rY   r*   parametrize_lsq_methodsr  r  r  r  r  r  rG  r  r  r  r  r  r  rT   r   r!  r  r   r  r  rK   rK   rK   rL   r    s@    








	




r  c                   @   s,   e Zd ZdZdd Zedd Zdd ZdS )	PackedMatrixas  A simplified CSR format for when non-zeros in each row are consecutive.

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

    c                 C   sJ   || _ || _|| _|jdksJ |jdksJ |jd |jd ks#J d S )Nr1   r&   r   )r  r  ncr   r   )rH   r  r  r  rK   rK   rL   __init__R  s   zPackedMatrix.__init__c                 C   s   | j jd | jfS )Nr   )r  r   r  r  rK   rK   rL   r   [  s   zPackedMatrix.shapec                 C   st   t | j}| jjd }t|jd D ]$}t| j| j|  |}| j|d |f ||| j| | j| | f< q|S )Nr&   r   )rB   r  r   r  r   minr  r  )rH   outZnelemr   nelrK   rK   rL   todense_  s   0zPackedMatrix.todenseN)r   r   r   __doc__r  propertyr   r  rK   rK   rK   rL   r  I  s    	
r  r&   c              
   C   sz  ddl m} | j}| j}| j}|j\}}|jd |ksJ | }	| }
t||D ]y}|| }t||D ]m}|t||kr@ nc||	|df |	|df \}}}||	|df< td|D ]}t	|||	||f |	||f \|	||f< |	||d f< q[d|	|df< t|
jd D ]}t	|||
||f |
||f \|
||f< |
||f< qq5q*t
t|	jd }t|	tj|tjd|}||
fS )zjThis is a python counterpart of the `_qr_reduce` routine,
    declared in interpolate/src/__fitpack.h
    r   )dlartgr&   r5   r/   r<   )Zscipy.linalg.lapackr  r  r  r  r   ru  r   r  fprotar  r  rB   r   int64)Za_pr   Zstartrowr  r  r  r  r/  nzRr,  r   Zoir   r+   rd  r  r  ZoffsR_prK   rK   rL   _qr_reduce_pyh  s2   
 84r%  c                 C   s*   | | ||  }| | | |  }||fS )zLGivens rotate [a, b].

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

    rK   )r+   rd  r  rJ   r  r  rK   rK   rL   r     s   r   c           
      C   s   | j }|j\}}| j}|jd |jd ksJ t|d| }||d  ||d df  ||d df< t|d ddD ]2}t||| }||d|df ||d || df  jdd}	|| |	 ||df  ||df< q<|S )zBacksubsitution solve upper triangular banded `R @ c = y.`

    `R` is in the "packed" format: `R[i, :]` is `a[i, i:i+k+1]`
    r   Nr&   .r1   r/   r   )r  r   r  rB   r   r   r  r]  )
r$  r   r#  r   r"  r  r+   r   r  ZsummrK   rK   rL   fpback  s   
(2"r&  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TestGivensQRc                 C   s<   d}t j|td}|d dd|   }t||}||||fS )Nr3   r<   r&   )rB   rE   r  r   )rH   rI   r,   rd   r   r*   rK   rK   rL   _get_xyt  s
   
zTestGivensQR._get_xytc              	   C   sr  d}|  |\}}}}t|||}t| \}}|j| }	|j\}
}||jd | d ks2J |jd d |d  }t	j
|t	jd}|j|
|d }t|||}|d d d f }t|||| tt	| | | | t	|dd tt	t|	|d d df  t|	|d d df  t	|	dd t||	}t|j|j|}t||d d df dd d S )	NrW   r   r&   r<   rN   rb   gvIh%L=-a=)r(  r   r   r  r  r  r  r   indicesrB   ascontiguousarrayr!  datarj   r  r$   	qr_reducer   minimumr   absr  r&  r  r  )rH   rI   rd   r   r*   r,   a_csrqr  ZqTyr/  r  r  r  r#  y_Zc_fullZc_bandedrK   rK   rL   test_vs_full  s4   




zTestGivensQR.test_vs_fullc                 C   s   d}|  |\}}}}t|||}|j\}}||jd | d ks$J |jd d |d  }	tj|	tjd}	|j	||d }
t
|
|	|}|d d d f }t||\}}t|
|	|| t|j|jdd t|j|jdd |j|jksvJ t||dd d S )	NrW   r   r&   r<   rN   rb   F)check_dtype)r(  r   r   r   r*  rB   r+  r!  r,  rj   r  r%  r$   r-  r   r  r   r  r  )rH   rI   rd   r   r*   r,   r0  r/  r  r  r  r#  r2  ZRRr   rK   rK   rL   test_py_vs_compiled  s    
z TestGivensQR.test_py_vs_compiledc                 C   s   d}|  |\}}}}tjd|d td}t||||\}}}	|jd }
t|||}||d d d f  	 }|j
|
|d f}|jd d |d  tj}t||dd t|| |	|jd | d ksiJ d S )NrW   r&   r<   r   rN   rb   )r(  rB   rE   r  r$   data_matrixr   r   r   Ztocsrr,  rj   r*  r  r!  r   r   )rH   rI   rd   r   r*   r,   r  r  r  r  r/  r0  Za_wZA_Zoffset_rK   rK   rL   test_data_matrix  s   

zTestGivensQR.test_data_matrixc                 C   s   d}|  |\}}}}tj||d f }t|||t|\}}}t|||}	t|||| t|	|}
t|||}t	||
dd d S )NrW   r1   ra   rb   )
r(  rB   r   r$   r6  rZ   r  r-  r&  r   )rH   rI   rd   r   r*   r,   r  r  r  r#  r+   r   rK   rK   rL   test_fpback  s   
zTestGivensQR.test_fpbackN)r   r   r   r(  r3  r5  r7  r8  rK   rK   rK   rL   r'    s    #r'  c                 C   s    t jt jt jtd| S )Nr,  )ospathr  abspathdirname__file__)basenamerK   rK   rL   	data_file  s   r?  c                   @   s8   e Zd Zdd Zdd Zdd Zejddd	 Z	d
S )TestSmoothingSplinec                 C   s  t jd}d}t ||d d }|d t d|  |d  |dd| }tt t	||dd   W d    n1 sBw   Y  tt t	|dd  | W d    n1 s_w   Y  tt t	|
d|| W d    n1 s|w   Y  tt t	|d d d	 | W d    n1 sw   Y  t |}|d |d
< tt t	|| W d    n1 sw   Y  t d}t d}d}tjt|d t	|| W d    d S 1 sw   Y  d S )Nr{   r   r4   r1   r3   r5   r   r&   r/   r   z)``x`` and ``y`` length must be at least 5r}  )rB   rG   r~   r   r   r'  normalr>   r@   r   rj   ru  rE   rI  rT   r   )rH   r   rI   rd   r   Zx_duplZexception_messagerK   rK   rL   test_invalid_input$  s6   ,







"z&TestSmoothingSpline.test_invalid_inputc                 C   sj   t td}|d }|d }|d }W d   n1 sw   Y  t|||}t||d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.npzrd   r   y_GCVSPLNg-C6?F)rP   rQ   r4  )rB   loadr?  r   r   )rH   r,  rd   r   rC  Zy_comprrK   rK   rL   test_compare_with_GCVSPLC  s   )
z,TestSmoothingSpline.test_compare_with_GCVSPLc                 C   s   t jd}d}t ||d d }|d t d|  |d  |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.
        r{   r   r4   r1   r3   r5   r   )Zlamr   r  r   r/   rN   rb   N)rB   rG   r~   r   r   r'  rA  r   r	   rY   r   )rH   r   rI   rd   r   Z
spline_GCVZspline_interpgridrK   rK   rL   test_non_regularized_case{  s   ,
z-TestSmoothingSpline.test_non_regularized_caser1   c                 C   s   t jd}d}t ||d d }|d t d|  |d  |dd| }t||}|jt	ddd	D ]9}t 
|}d
||< t|||}t||| ||  }	t||| ||  }
|	|
k rqtd|	dd|
dq8d S )Nr{   r   r4   r1   r3   r5   r   rW   r   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )rB   rG   r~   r   r   r'  rA  r   choicer   rI  r/  r@   )rH   r   rI   rd   r   r   indr  Zspl_worigZweightedrK   rK   rL   test_weighted_smoothing_spline  s&   ,

z2TestSmoothingSpline.test_weighted_smoothing_splineN)
r   r   r   rB  rE  rG  rT   r   Z	fail_slowrK  rK   rK   rK   rL   r@     s    8
r@  c                    s   | \|\t  d }|d ksJ t  d d ks(J t fddt|D }t|S )z-A naive 2D tensort product spline evaluation.r&   c                 3   sF    | ]}t D ]} ||f t| t| V  qqd S rY  )r   r   )rr   ixZiyr+   r,   nytxtyrd   r   rK   rL   r[    s    2zbspline2.<locals>.<genexpr>)r   r]  r   rB   ri   )r   r*   r+   r,   nxr   rK   rM  rL   bspline2  s   
rR  c                 C   rS  )Nr   r&   r(   r5   r   rV  rK   rK   rL   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   r^  rY  rS  r_  r`  rK   rL   r[    ra  zbspline.<locals>.<genexpr>rb  rc  rK   r`  rL   r    s    r  c                   @   s   e Zd ZdddZdd ZdS )
NdBSpline0r3   c                 C   sv   t |}|t |jksJ zt | W n ty!   |f| }Y nw 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 rY  )operatorindex)rr   ZkirK   rK   rL   r[    s    z&NdBSpline0.__init__.<locals>.<genexpr>c                 s   s    | ]
}t j|td V  qdS )r<   N)rB   ri   r  )rr   tirK   rK   rL   r[    s    N)r   r   r?   r   r,   r*   r+   )rH   r*   r+   r,   r   rK   rK   rL   r    s   
zNdBSpline0.__init__c           
         s>  t j}t |ksJ dg|  t|D ]P}j| | }}j| }||| kr2| |< n
t||d  |< | |  |  krQ| | d  ksTJ  J  | |krd | t || k sfJ qt  d} fddt|D }tj| D ]j	 t
fddt|D  }	||	7 }q~t|S )Nnoner&   r   c                    s,   g | ]}t  | j|   | d  qS r&   )r   r,   rr   r  )r   rH   rK   rL   rt   	     , z'NdBSpline0.__call__.<locals>.<listcomp>c                    s.   g | ]}t | j|  | j| qS rK   )r   r,   r*   rZ  )idxrH   rd   rK   rL   rt   	  s    &)r   r*   r   r,   rB   r\  r   	itertoolsproductr+   prodri   )
rH   rd   r   r  tdZxdr,   resultZiterstermrK   )r   r\  rH   rd   rL   __call__  s(   



0&


zNdBSpline0.__call__Nr3   )r   r   r   r  rc  rK   rK   rK   rL   rT    s    
rT  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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d0d1 Zd2d3 Zd4d5 Zejjd6d7 Zd"S )8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s\J d S )
Nr1  r:   r   r&   r   rt  ra   rb   r   )	rB   rG   r5  r   r6  r   r   r   r   )
rH   r   rI   r,   Zn_trr*   r+   rJ   nbxirK   rK   rL   test_1D	  s   2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   r3   r   r1   rB   rE   r	   r*   r+   rH   rd   r   r   y_1r+  t2rX  rK   rK   rL   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   r3   r   r   r   r1   )rB   rE   r	   r*   r+   r,   rj  rK   rK   rL   make_2d_mixed*	  s   
$zTestNdBSpline.make_2d_mixedc                    s   g d}|   \ dd |D }tt fdd|D t|ddd t dd	}||jt|fks<J t|||dd
 tjd}|j	ddd }||}|jdks^J |
dj\}}t| |d |d d|   dd
 d S )Nr   r9   )r9   r&   )r   r   c                 S   (   g | ]\}}|d  |d  d|   qS r  rK   rr   rd   r   rK   rK   rL   rt   <	     ( z3TestNdBSpline.test_2D_separable.<locals>.<listcomp>c                    rn   rK   rR  rr   r   rX  r,   rl  rK   rL   rt   ?	  ru   Fra   r  rP   r3   r   rb   r1  )r4   r3   r1   r   r   )r4   r3   )r/   r1   r1   )rm  r   rB   ri   r   r   r   rG   r5  r6  rj   r  ravel)rH   rg  targetbspl2r   ra  rd   r   rK   rv  rL   test_2D_separable9	  s*   
zTestNdBSpline.test_2D_separablec                 C   s  d}g d}dd |D }|   \}}}t||||f}d}t||dd}	|	|}
t||||}|
jdks9J t|
|gd	 d
d |	|jt|d d |	jj|d   ks[J t|	|t|d d d f ddd |d}t||dd}||}
|
jdksJ t|
||g||ggd
d ||jt|d d |jj|d   ksJ t||t|d d d d f ddd d S )Nr1   ro  c                 S   rq  r  rK   rr  rK   rK   rL   rt   Y	  rs  z5TestNdBSpline.test_2D_separable_2.<locals>.<listcomp>rp  r3   r   r4   r4   ra   rb   r/   FgvIh%,=rw  r   r   r1   r1   )r1   r1   )	rm  rB   r   r   r   r   r+   ri   rj   )rH   r   rg  ry  rl  rX  r,   c2_4r   bspl2_4ra  
val_singleZc2_22Zbspl2_22rK   rK   rL   test_2D_separable_2U	  sF   
0
 
z!TestNdBSpline.test_2D_separable_2c                 C   s   g d}dd |D }dd |D }|   \}}}|d }t||||f}d}t||dd}||}	t||||}
|	jd	ksBJ t|	|
gd
 dd d S )Nro  c                 S   rq  r  rK   rr  rK   rK   rL   rt   	  rs  z=TestNdBSpline.test_2D_separable_2_complex.<locals>.<listcomp>c                 S   s   g | ]}|d |  qS )y               @rK   )rr   r*   rK   rK   rL   rt   	      r	  rp  r3   r   r|  r4   ra   rb   )rm  rB   r   r   r   r   )rH   rg  ry  rl  rX  r,   r~  r   r  ra  r  rK   rK   rL   test_2D_separable_2_complex	  s   

z)TestNdBSpline.test_2D_separable_2_complexc              
      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 )Nr1  r3   r   r   r   r   r4   r&   r   )r(   r(   ra   rb   r&   r   r1   皙?g? @c                    s   g | ]}t |f qS rK   rt  ru  r+   r,   rO  rP  rK   rL   rt   	  s    z0TestNdBSpline.test_2D_random.<locals>.<listcomp>)rB   rG   r5  r   r   r6  r   r   r   rR  r   )rH   r   r   rg  rK   r  rL   test_2D_random	  s"   ..$

zTestNdBSpline.test_2D_randomc                 C   sf   |   \}}}}g d}dd |D }t||||fd}||jt|fks(J t|||dd d S )N)ffffff?r:  )r9   g333333@)r:  rC  c                 S   (   g | ]\}}|d  |d d|   qS r  rK   rr  rK   rK   rL   rt   	  rs  z/TestNdBSpline.test_2D_mixed.<locals>.<listcomp>r   ra   rb   )rn  r   r   r   r   )rH   rl  rX  kxkyrg  ry  rz  rK   rK   rL   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 s`w   Y  tt ||dd}W d    d S 1 s{w   Y  d S )Nr  r   r  r   c                 S   s,   g | ]\}}d |d  |d d|   qS r  rK   rr  rK   rK   rL   rt   	  r[  z4TestNdBSpline.test_2D_derivative.<locals>.<listcomp>ra   rb   r&   r&   c                 S   s(   g | ]\}}d |d  d| d  qS r  rK   rr  rK   rK   rL   rt   	  rs  )r   r   c                 S   r  r  rK   rr  rK   rK   rL   rt   	  rs  )r/   r   )r/   r   r&   )rn  r   r   r>   r@   )rH   rl  rX  r  r  rg  rz  r   rK   rK   rL   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 )Nr1  )r1   r3   r   r   r   r3   r   r4   r&   r  r  r   c                       g | ]} |qS rK   rK   rr   r   Zbspl2_0rK   rL   rt   	  r  z6TestNdBSpline.test_2D_mixed_random.<locals>.<listcomp>ra   rb   )rB   rG   r5  r   r   r6  r   r   r   rT  r   	rH   r   r  r  rO  rP  r+   rg  rz  rK   r  rL   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 
|
 ryJ t|
||	d	d
 t|
|j|d	d
 d S )Nr   r   r   r3   r   r1   c                 S      g | ]\}}||fqS rK   rK   rr   r  rJ   rK   rK   rL   rt   	  r  z0TestNdBSpline.test_tx_neq_ty.<locals>.<listcomp>ra   rb   )rB   rE   r	   r+   r   r*   r,   r   r]  r^  r   anyr   rj   r   )rH   rd   r   spl_xspl_yr   rl   valuesrgirg  ZbxirK   rK   rL   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   r3   r   r1   r&   ri  )
rH   rd   r   r   rk  r+  Zy_2r  rl  rX  rK   rK   rL   make_3d_case	  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sKJ t||dd d S )Nr1  r3   r;   r   r   r3   r1   r&   r   c                 S      g | ]}|qS rK   rK   rr   r   rK   rK   rL   rt   
  rl  z3TestNdBSpline.test_3D_separable.<locals>.<listcomp>)r;   ra   rb   )	rB   rG   r5  r6  r  r   zipr   r   )rH   r   rd   r   r  ry  t3c3r,   bspl3rg  ra  rK   rK   rL   test_3D_separable	  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 )Nr3   r   r1  r  r   r   c                 S   r  rK   rK   r  rK   rK   rL   rt   
  rl  z4TestNdBSpline.test_3D_derivative.<locals>.<listcomp>)r&   r   r   r   r1   r&   ra   rb   )r1   r   r   r   )r1   r&   r   )r1   r&   r3   )r1   r&   r4   )
r  r   rB   rG   r5  r6  r  r   r  r   )
rH   r  r  r,   r  r   rd   r   r  rg  rK   rK   rL   test_3D_derivative
  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 )Nr1  r3   r   r   r   r   r4   r&   r   )r(   r(   r&   ra   rb   r  r  g?r  gffffff?c                    r  rK   rK   r  spl_0rK   rL   rt   3
  r  z0TestNdBSpline.test_3D_random.<locals>.<listcomp>)rB   rG   r5  r   r   r6  r   r   rT  r   r   )	rH   r   r,   rO  rP  tzr+   r   rg  rK   r  rL   test_3D_random"
  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 )Nr1  r3   r   r   r   r   r4   r&   r'   r   r  r  r  ra   rb   )rB   rG   r5  r   r   r6  r   r   r   r   r   r   )rH   r   r,   rO  rP  r  r+   r   rE  rF  rg  rK   rK   rL   test_3D_random_complex5
  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 )Nr3   r,   rh   r/   r   r   r   r%  r/   g            @c                 S   r  rK   rK   r  rK   rK   rL   rt   R
  rl  z?TestNdBSpline.test_extrapolate_3D_separable.<locals>.<listcomp>r1   r&   rg   ra   rb   r  r   r  rB   ri   r  r   )rH   r  r  r  r  r,   r  rd   r   r  rg  ry  ra  rK   rK   rL   test_extrapolate_3D_separableH
  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 )Nr3   r  r  r  r  c                 S   r  rK   rK   r  rK   rK   rL   rt   c
  rl  zATestNdBSpline.test_extrapolate_3D_separable_2.<locals>.<listcomp>r1   r&   rg   ra   rb   r  )rH   r   r  r  r,   r  r  r  rd   r   r  rg  ry  ra  rK   rK   rL   test_extrapolate_3D_separable_2X
  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 sXJ t|
d saJ t|
d	d |	d	d dd d S )Nr3   r   )r  r&   r   )r   r   r%  )r/   r   r  c                 S   r  rK   rK   r  rK   rK   rL   rt   q
  rl  zETestNdBSpline.test_extrapolate_false_3D_separable.<locals>.<listcomp>r1   r&   Frg   r   r/   ra   rb   )r  r   r  rB   ri   r  r   r   )rH   r  r  r,   r  rd   r   r  rg  ry  ra  rK   rK   rL   #test_extrapolate_false_3D_separablei
  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||
  szJ t||	dd d S )Nr3   r   r  r&   r1   r   r   rC  r%  r/   r  c                 S   r  rK   rK   r  rK   rK   rL   rt   
  rl  z/TestNdBSpline.test_x_nan_3D.<locals>.<listcomp>ra   rb   )	r  r   rB   ri   rC   r  r   r   r   )rH   r  r  r,   r  rd   r   r  rg  ry  r   ra  rK   rK   rL   test_x_nan_3Dy
  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rOJ |d d d jjrZJ |j|jd | d	 |jd | d	 fd
}|j	}|jjryJ 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 )Nr1  r3   r3   r   r4      r4  r/   r1   r&   r   r  r  r   c                    r  rK   rK   r  r  rK   rL   rt   
  r  z7TestNdBSpline.test_non_c_contiguous.<locals>.<listcomp>ra   rb   )rB   rG   r5  r   r6  r   flagsc_contiguousr   r  r   r   rT  r   r  rK   r  rL   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s0J d S )Nr3   r   Fr_   )r  r   r   r  Z	writeable)rH   r  r  r,   r  r   Zbspl3_rK   rK   rL   test_readonly
  s   zTestNdBSpline.test_readonlyc                 C   s  |   \}}}tg dg dg}t||||||}t|||||g}|jd |jd ks3J t| | dd tt	 tg d||gd  W d    n1 sYw   Y  tt	dd td	d
gg||gd  W d    d S 1 s}w   Y  d S )Nr_   )r4   r   r   r   gؗҜ<rb   r3   zData and knots*r}  r&   r1   )
r  rB   ri   r   r   r   r   r  r>   r@   )rH   r  r  r,   rg  dmZdm1rK   rK   rL   test_design_matrix
  s   
"z TestNdBSpline.test_design_matrixc           	   
   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}t|||f||d	}d
d }td|| d S )Nr1  r3   r   r   r   r   r4   r&   r   c                 S   s(   t jg dg dg df }|| d S )Nr  r  r  )rB   r   )r   r   rg  rK   rK   rL   r  
  s
   
z1TestNdBSpline.test_concurrency.<locals>.worker_fnrW   )	rB   rG   r5  r   r   r6  r   r   r    )	rH   r   r,   rO  rP  r  r+   r   r  rK   rK   rL   r  
  s   ...0zTestNdBSpline.test_concurrency)r   r   r   rh  rm  rn  r{  r  r  r  r  r  r  r  r  r  r  r  r  rT   r   r!  r  r  r  r  r  r  r  r"  r  rK   rK   rK   rL   re  		  s:    +	
re  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   r3   r1   c                 S   r  rK   rK   r  rK   rK   rL   rt   
  r  z7TestMakeND.test_2D_separable_simple.<locals>.<listcomp>r&   r   rN   rb   r  r   rO   )r   linearr  ra   )rB   rE   r]  r^  r!   r   rx  r	   r+   scipy.interpolater   )rH   rd   r   r  rg  rl   r  r  r   ZRGIr  rK   rK   rL   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t	}|j
dksXJ t|ddd|d	d
 |d}	t||f|	dtjd}||}|j
dksJ t|dddd|dd	d
 d S )Nr   c                 S   r  rK   rK   r  rK   rK   rL   rt   
  r  z>TestMakeND.test_2D_separable_trailing_dims.<locals>.<listcomp>r3   r1   r,   solver)$   r4   r4   ra   rb   r}  )r  r1   r1   )rB   rE   r]  r^  r   r!   sslspsolver  r  r   r   rj   )
rH   rd   r   rg  r  Zvalues4rl   ra  ry  Zvalues22rK   rK   rL   test_2D_separable_trailing_dims
  s&   

0


z*TestMakeND.test_2D_separable_trailing_dimsr,   )r  r  )r3   r&   )r&   r3   r  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   r  rK   rK   r  rK   rK   rL   rt     r  z,TestMakeND.test_2D_mixed.<locals>.<listcomp>r3   r1   r  rN   rb   )	rB   rE   r]  r^  r!   r  r  r   rx  )rH   r,   rd   r   rg  r  rl   rK   rK   rL   r    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   r6   r7   r8   r;  r<  )r&   r1   r&   r1   r&   r&   )r&   r1   r3   r1   r&   r&   )r&   r1   r1   r1   r&   r&   )rB   r   r  rK   rK   rL   _get_sample_2d_data  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   r  r  r&   gffffff@g333333@r   ffffff
@333333?r3   r&   r  r  r8   r
  r(   r3   ra   rb   r  r!   r   rB   r   r  r   rH   rd   r   r  rl   r  rg  rK   rK   rL   test_2D_vs_RGI_linear  s   
z TestMakeND.test_2D_vs_RGI_linearc                 C   h   |   \}}}t||f|dtjd}t||f|dd}tg dg dgj}t||||dd d S )	Nr3   r  cubic_legacyr  r  r  ra   rb   	r  r!   r  r  r   rB   r   r  r   r  rK   rK   rL   test_2D_vs_RGI_cubic'     
zTestMakeND.test_2D_vs_RGI_cubicr  c                 C   sj   |   \}}}t||f|d|dd}t||f|dd}tg dg dgj}t||||dd	d
 d S )Nr3   gư>)r,   r  rQ   r  r  r  r  ra   r   rO   r  )rH   r  rd   r   r  rl   r  rg  rK   rK   rL   test_2D_vs_RGI_cubic_iterative1  s   
z)TestMakeND.test_2D_vs_RGI_cubic_iterativec                 C   r  )	Nr   r  quintic_legacyr  r  r  ra   rb   r  r  rK   rK   rL   test_2D_vs_RGI_quintic@  r  z!TestMakeND.test_2D_vs_RGI_quinticzk, meth))r&   r  )r3   r  )r   r  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   r  r  gffffff?r  r:   r4  ra   rb   )
rB   rG   r5  Zcumsumr6  r!   r  r  r   r   )rH   r,   methrndmrd   r   r  r  rl   r  rg  rK   rK   rL   test_3D_random_vs_RGIJ  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 s)w   Y  ttdd t||ft||ffddi| W d    d S 1 sRw   Y  d S )Nmaxiterr&   r  r}  r,   r3   )r  r>   r@   r!   rB   r   )rH   rd   r   r  Zsolver_argsrK   rK   rL   test_solver_err_not_convergedZ  s   &"z(TestMakeND.test_solver_err_not_convergedN)r   r   r   r  r  rT   r   r!  r  r  r  r  r  ZgmresZgcrotmkr  r  r  r  rK   rK   rK   rL   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S )
TestFpchecc                 C   s   d}t ddd}t d}tjtdd t||| W d    n1 s)w   Y  tjtdd t||| W d    d S 1 sHw   Y  d S )Nr&   r  r1   r   z1D sequencer}  )rB   rE   rj   rT   r   r@   _bfpcheckrH   r,   r*   rd   rK   rK   rL   test_1D_x_tg  s   
"zTestFpchec.test_1D_x_tc                 C   s
  d}d|d  d }|d }t |}t |}t|||dks#J tjtdd t||| W d    n1 s<w   Y  d|d  d }|| d }t |}t |}t|||dksdJ tjtdd t||| W d    d S 1 s~w   Y  d S )Nr3   r1   r&   r;   rW   z	Need k+1*r}  )	rB   rE   dfitpackfpchecrT   r   r@   r  r  )rH   r,   rI   r/  r*   rd   rK   rK   rL   test_condition_1r  s"   



"zTestFpchec.test_condition_1c                 C   s,  d}dg|d  dg dg|d   }g d}t |||dks"J t|||d u s-J | }|d |d< t |||dksBJ tjtd	d
 t||| W d    n1 s[w   Y  | }|d |d< t |||dksuJ tjtdd
 t||| W d    d S 1 sw   Y  d S )Nr3   r   r&   r1   r   )r&   r1   r3   r4   r:  r/   r|   zLast k knots*r}  zFirst k knots*r  r  r  r  ru  rT   r   r@   )rH   r,   r*   rd   ttrK   rK   rL   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s#J t|||d u s.J dg|d  ddg dg|d   }t |||dksKJ tjtdd	 t||| W d    d S 1 sew   Y  d S )
Nr3   r   r&   r1   r   r&   r1   r3   rC  r4   r:     zInternal knots*r}  )r  r  r  r  rT   r   r@   r  rK   rK   rL   test_condition_3  s   $$"zTestFpchec.test_condition_3c                 C   sn  d}dg|d  dg|d   }g d}t |||dksJ t|||d u s*J | }|d |d< t |||dks?J t|||d u sJJ | }|d d |d< t |||dksaJ tjtdd t||| W d    n1 szw   Y  | }|d	 d |d	< t |||dksJ tjtdd t||| W d    d S 1 sw   Y  d S )
Nr3   r   r&   r   r  r   zOut of bounds*r}  r/   r  )rH   r,   r*   rd   r]   rK   rK   rL   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.w   Y  g d}t |||dksBJ tjtdd t||| W d    d S 1 s\w   Y  d S )Nr&   )r   r   r&   r1   r1   )r  r  r  r`   Schoenberg-Whitney*r}  )r   r   r   r  r  rT   r   r@   r  r  r  rK   rK   rL   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  r  r  r  r  rK   rK   rL   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s#J tjtdd t||| W d    n1 s<w   Y  dg|d  dg dg|d   }dgd }t |||dksbJ tjtdd t||| W d    d S 1 s|w   Y  d S )	Nr3   r   r&   r1   r   r`   r  r}  r  r  rK   rK   rL   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s'J tjtd	d
 t||| W d    n1 s@w   Y  dgd ddg }t |||dksYJ t|||d u sdJ d S )Nr3   r   r&   r1   r   r  r4   r`   r  r}  r  r  rK   rK   rL   test_condition_5_2  s   $zTestFpchec.test_condition_5_2c                 C   sl   d}g d}g d}t |||dksJ tjtdd t||| W d    d S 1 s/w   Y  d S )Nr&   )	r   r   r1   r3   r4   r   r   r   r   )r&   r&   r&   @r  r  r%  r`   r  r}  r  r  rK   rK   rL   test_condition_5_3  s   "zTestFpchec.test_condition_5_3N)r   r   r   r  r  r  r  r  r  r  r  r  r  rK   rK   rK   rL   r  d  s    r  c                    s   t | |||    fddtt d D } dd  }tt|D ]}|| d }||  |7  < ||d   |8  < q)|d  d 7  < tt|tdd | fS )z)Split the knot interval into "runs".
    c                    s(   g | ]} |  |d      qS rY  )r]  r_  rL  	residualsrK   rL   rt     rs  z_split.<locals>.<listcomp>r&   r/   r1   rN   rb   )rB   r\  r   r   r   r]  )rd   r*   r,   r  fpartsZcarriesr   ZcarryrK   r  rL   _split
  s    r  c                 C   s   t | |||\}}d}d}tt|D ]}||d  ||  dkr-|| |kr-|}|| }q|dkr6td|| ||d   d d }	| |	 }
t||
}tj|d| |
||d f }|S )z Insert a new knot given reduals.ig}Ô%Ir&   z5Internal error, please report it to SciPy developers.r1   N)r  r   r   r@   rB   r\  r   )rd   r*   r,   r  r  rL  Zidx_maxZ	fpart_maxr   Zidx_newknotZnew_knotZidx_tZt_newrK   rK   rL   	_add_knot  s   $ r  c                   @   s   e Z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dd Zdd Zejdg dejdg ddd Zejjdd ZdS )TestGenerateKnotsc                 C   s   t jdtd}|d dd|   }d}t dg|d  dg|d   }t||||d}||| d	 }d
dlm} |||||}t||||}	t	||	dd t||||d}
|
|| d	 }|||||}t||||}t	||dd d S )Nr   r<   r3   r(   r&   r5   r&  )r,   r*   r1   r   _fitpack_reprorN   rb   )
rB   rE   r  r   r
   r  r  Zadd_knotr  r   )rH   rd   r   r,   r*   r   r  _frZnew_tZnew_t_pyZspl2Z
residuals2Znew_t2Z	new_t2_pyrK   rK   rL   test_split_add_knot6  s   "z%TestGenerateKnots.test_split_add_knotr,   rO  c                 C   sb   t jdt jd}t |t j d }tt|||ddd }t|||ddd }t||dd d S )Nr   r<   r   r,   rd  r/   rN   rb   )	rB   rE   rF   r'  rD  r  r   r   r   )rH   r,   rd   r   r*   r  rK   rK   rL   test_s0N  s
   zTestGenerateKnots.test_s0c                 C   F   d}t |}|d }tt||ddd}t|d t|ddd d S )NrW   r3   r   r  r/   rN   rb   rB   rE   r  r   r   r   rH   rI   rd   r   knotsrK   rK   rL   	test_s0_1W  s
   
zTestGenerateKnots.test_s0_1c                 C   r  )Nr|   r3   r   r  r/   rN   rb   r  r  rK   rK   rL   test_s0_n20_  s
   
zTestGenerateKnots.test_s0_n20c              	   C   sV   t d}|d }tt tt||dddd W d    d S 1 s$w   Y  d S )NrW   r3   r   r,   rd  nest)rB   rE   r>   r@   r  r   rH   rd   r   rK   rK   rL   test_s0_nestf  s
   

"zTestGenerateKnots.test_s0_nestc           	      C   s   t d}t |t j d }d}tt|||dd}g dg dg dg dg d	g}t|t|ks6J t||D ]\}}t||d
d q;t	|||dd\}}}t|d |d
d dS )aY  
        To generate the `wanted` list below apply the following diff and rerun
        the test. The stdout will contain successive iterations of the `t`
        array.

$ git diff scipy/interpolate/fitpack/fpcurf.f
diff --git a/scipy/interpolate/fitpack/fpcurf.f b/scipy/interpolate/fitpack/fpcurf.f
index 1afb1900f1..d817e51ad8 100644
--- a/scipy/interpolate/fitpack/fpcurf.f
+++ b/scipy/interpolate/fitpack/fpcurf.f
@@ -216,6 +216,9 @@ c  t(j+k) <= x(i) <= t(j+k+1) and store it in fpint(j),j=1,2,...nrint.
         do 190 l=1,nplus
 c  add a new knot.
           call fpknot(x,m,t,n,fpint,nrdata,nrint,nest,1)
+          print*, l, nest, ': ', t
+          print*, "n, nmax = ", n, nmax
+
 c  if n=nmax we locate the knots as for interpolation.
           if(n.eq.nmax) go to 10
 c  test whether we cannot further increase the number of knots.
        r   r3   r   r  )r5   r5   r5   r5   r&  r&  r&  r&  )	r5   r5   r5   r5   r8   r&  r&  r&  r&  
r5   r5   r5   r5   r6   r8   r&  r&  r&  r&  )r5   r5   r5   r5   r6   r8   r<  r&  r&  r&  r&  )r5   r5   r5   r5   r6   r7   r8   r
  r   r&  r&  r&  rN   rb   r/   N)
rB   rE   r'  rD  r  r   r   r  r   r   )	rH   rd   r   r,   r	  wantedr*   r  r   rK   rK   rL   test_s_switchm  s   
zTestGenerateKnots.test_s_switchc                 C   s(   t td}t||ddd}t| d S )Nr   r9  r&   )rd  r,   )r  r   r   next)rH   rd   genrK   rK   rL   r    s   z!TestGenerateKnots.test_list_inputc                 C   s   t d}t |t j d }d}tt||d|dd}t|d g ddd	 tt tt||dd
d W d    d S 1 sAw   Y  d S )Nr   r   r3   rW   r  r/   r  rN   rb   r4   )r,   r  )	rB   rE   r'  rD  r  r   r   r>   r@   )rH   rd   r   rd  r	  rK   rK   rL   	test_nest  s   

"zTestGenerateKnots.test_nestc                 C   s   t d}t |t j d }tt tt||t dd W d    n1 s*w   Y  tt tt||t d d W d    d S 1 sLw   Y  d S )Nr   r;   r  )	rB   rE   r'  rD  r>   r@   r  r   rI  r  rK   rK   rL   r    s   


"zTestGenerateKnots.test_weightsnpts)r  r`   r   rd  )r9  g{Gz?r   c           	      C   s   t jd}dt |j|d }t |t j d t |d d   }d}t||||dd }t	t
||||dd	 }t||d
d d S )Nr1  rW   r   r   r1   r3   r  r   r/   rN   rb   )rB   rG   r~   r   r6  r'  rD  expr   r  r   r   )	rH   rd  r  r  rd   r   r,   r*   r  rK   rK   rL   test_vs_splrep  s   	(z TestGenerateKnots.test_vs_splrepc                 C   s   d}t |}|d }tt||ddd}t }|t}t||ddd}t|dks.J W d    n1 s8w   Y  t	|d |d  d S )N   r3   Jz5r  r&   r/   r   )
rB   rE   r  r   r   recordRuntimeWarningr   r   r   )rH   rI   rd   r   r	  supr  rS   rK   rK   rL   test_s_too_small  s   

z"TestGenerateKnots.test_s_too_smallN)r   r   r   r  rT   r   r!  r  r
  r  r  r  r  r  r  r  r"  r  rK   rK   rK   rL   r  5  s     
+
r  c           
      C   s*  | j d }| || d  | |  }|d|  d }| |d || d  }t|d}|ddd  d7  < |ddd  d8  < t| t|| d |||d}tj|d |j d ftd}td|j d dD ]}	||	ddf ||	d ddf  ||	d ddf< qi||| | t	| 9 }|S )zStraitforward way to compute the discontinuity matrix. For testing ONLY.

    This routine returns a dense matrix, while `_fitpack_repro.disc` returns
    a packed one.
    r   r&   r1   Nr   r   r<   )
r   rB   r  r   r   emptyr  r   math	factorial)
r*   r,   rI   deltaZnrintrW  Ztiir/  Zmatrr   rK   rK   rL   
disc_naive  s   
"6r$  c                   @   s"   e Zd ZdZdddZdd ZdS )F_densezm The r.h.s. of ``f(p) = s``, an analog of _fitpack_repro.F
    Uses full matrices, so is for tests only.
    Nc           
      C   s   || _ || _|| _|| _|d u rtj|tdn|| _| jjdks"J t	|t
|jd | d ||}|| jd d d f  | _ddlm} t|||  | _|jdksXJ || j }	tj|	t| jjd f | _|| _d S )Nr<   r&   r   r   )rd   r   r*   r,   rB   rZ   r  r  r   r   r   r   a_denser  r  r  discr  b_denser   r  r   rd  )
rH   rd   r   r*   r,   rd  r  r&  r  r   rK   rK   rL   r    s   $

zF_dense.__init__c                 C   s   t | j| j| f}ddlm}m} ||dd\}}|j| j }|j	d }||d |d |f |d | }	t
| j|	| j}
t | jd |
| j| j d  }|
| _|| j S )Nr   )r  r  Zeconomic)r  r&   r1   )rB   r  r&  r(  scipy.linalgr  r  r  r   r   r   r*   r,   r]  r  rd   r   r   rd  )rH   r   abr  r  r1  r  Zqyr  r+   r   fprK   rK   rL   rc    s   
"$
zF_dense.__call__rY  )r   r   r   r  r  rc  rK   rK   rK   rL   r%    s    
r%  c                   @   st   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ejjdd Zdd Zdd ZdS )TestMakeSplrepc                 C   s2  t ddd}t ddd}tt t|| W d    n1 s"w   Y  tt tdddd W d    n1 s=w   Y  tt t |jdddf}t||dd W d    n1 sbw   Y  t d}tt t||d	 |dd
 W d    n1 sw   Y  t d }tt t||d	 |dd
 W d    n1 sw   Y  t |jd df}tt t||d	 |dd
 W d    n1 sw   Y  tt t|d d d |d	 dd W d    n1 sw   Y  tt t||d	 ddd W d    n	1 sw   Y  tt t||d	 dd W d    n	1 s0w   Y  tt t||d	 d	ddd W d    n	1 sPw   Y  tt t||d	 ddd W d    n	1 sow   Y  tt tt 	dt 	ddd W d    d S 1 sw   Y  d S )Nr   rW   r;   r  r&   r1   r9  rd  r3   )r  rd  r/   r9   r  )r,   r  rd  )rd  r  r   	   )
rB   rY   r>   r@   r   rI  r   r   r?   rE   )rH   rd   r   r  rK   rK   rL   test_input_errors!  sT   












$z TestMakeSplrep.test_input_errorsc                 C   sd   t ddd}t |d d d }d}d}t dg|d  d	d
g dg|d   }|||||fS )Nr   r   r;   gQ	@r1   r3   gq@H&?r&   r9   r8   )rB   rY   r'  r   )rH   rd   r   r,   rd  r  rK   rK   rL   	_get_xyktX  s   *zTestMakeSplrep._get_xyktc           
      C   sn   ddl m} |  \}}}}}|||d d d f |||}t|||||}dD ]}	t||	||	dd q'd S )Nr   Fr&   rW   r   rN   rb   ) scipy.interpolate._fitpack_repror2  r0  r%  r   )
rH   r2  rd   r   r,   rd  r*   ff_dr   rK   rK   rL   test_fitpack_Fa  s   zTestMakeSplrep.test_fitpack_Fc                 C   s   ddl m} |  \}}}}}tj|jd td}|||d d d f ||||d}t||||||d}	t|||||}
dD ]}t|||	|dd tj	|
||	|ddrXJ q=d S )Nr   r1  r<   r  r3  rN   rb   )
r4  r2  r0  rB   rE   r   r  r%  r   r   )rH   r2  rd   r   r,   rd  r*   r  fwZfw_dr6  r   rK   rK   rL   test_fitpack_F_with_weightsk  s    z*TestMakeSplrep.test_fitpack_F_with_weightsc              
   C   s   dd l m  m} tjd}tjddddt|jddd ddddf	 }t	|d}}t
|||  }t||}|jd |d|  d ksKJ t||dd	 d S )
Nr   r1  r   r   r   r3   r1   rN   rb   )r4  interpolater  rB   rG   r5  r   r   r6  r   r  r'  r  r$  r   r   )rH   r  r   r*   rI   r,   DZD_denserK   rK   rL   test_disc_matrixz  s   .
zTestMakeSplrep.test_disc_matrixc           	      C   s   |   \}}}}}tdg|d  ddg dg|d   }t||||d\}}}t||ks1J t||||d}t|d |jj |jdd d S )	Nr   r&   r9   r8   r   r  rN   rb   )	r0  rB   r   r   r   r   r   r+   r   )	rH   rd   r   r,   rd  r  r*   r+   r   rK   rK   rL   test_simple_vs_splrep  s   * z$TestMakeSplrep.test_simple_vs_splrepc           	      C   s   |   \}}}}}tt||||dd }t||||d}t|||||d}t|j|jdd t|j|jdd |j|jks@J d S )Nr  r/   )r*   r,   rd  rN   rb   )r0  r  r   r   r   r*   r+   r,   )	rH   rd   r   r,   rd  r   r*   Zspl_autoZspl_trK   rK   rL   test_with_knots  s   zTestMakeSplrep.test_with_knotsc                 C   sJ   d}t |}|d }d}t|||dd}|jjd d|d  ks#J d S )NrW   r3   r&   r  r   r1   )rB   rE   r   r*   r   )rH   rI   rd   r   r,   r   rK   rK   rL   test_no_internal_knots  s   
 z%TestMakeSplrep.test_no_internal_knotsc                 C   sH   d}t |}|d }t||dd}t||dd}t|j|jdd d S )NrW   r3   r   rN   rb   )rB   rE   r   r	   r   r+   )rH   rI   rd   r   r   spl_irK   rK   rL   test_default_s  s   
zTestMakeSplrep.test_default_sc                 C   s   d}t |}|d }t C}|t}t||ddd}t||ddd}t|dks,J t|j	|d  t
t j|jdg|jd  f |d dd	 W d    d S 1 sTw   Y  d S )
Nr  r3   r  r  r1   r   r&   r)  rb   )rB   rE   r   r  r  r   r   r   r   r*   r   r   r+   r,   )rH   rI   rd   r   r  r  rS   r   rK   rK   rL   r    s   

"zTestMakeSplrep.test_s_too_smallc                 C   s   d\}}t |}|d }t|||d}t|||dd}|jjdks$J |jjdks,J t||dd|   |dd}|jjdksBJ d S )NrW   r3   r3   r   h㈵>r  r&   )rB   rE   r   r+   r   )rH   rI   r,   rd   r   r   r+  r  rK   rK   rL   
test_shape  s   
zTestMakeSplrep.test_shapec                 C   s   d\}}t |}|d }t||ddd}t||ddd}|jjdks%J |jjdks-J |jjd || d ks;J |jjd d|d  ksIJ d S )NrB  r3   r   r  r&   r1   )rB   rE   r   r+   r   r*   r   )rH   rI   r,   rd   r   r  r+  rK   rK   rL   test_s0_vs_not  s   
 zTestMakeSplrep.test_s0_vs_notN)r   r   r   r/  r0  r7  r9  r<  r=  r>  r?  rA  rT   r   r"  r  rD  rE  rK   rK   rK   rL   r,     s    7	

		
r,  c                   @   sb   e Zd Zd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
dd ZdS )TestMakeSplpreprW   r3   c                 C   s2   t |t j | }t |t |g}|||fS rY  )rB   rE   rD  r'  r)  )rH   r/  r,   rd   r   rK   rK   rL   _get_xyk  s   
zTestMakeSplprep._get_xykrd  r   r9  gMbP?rC  c                 C   s   d\}}t |t j | }t |t |g}ddddd}t||d\\}}}}	t||d\}
}t||	dd	 t|
j|dd	 t	||| ksKJ t 
|j}t|
j|dd	 t|
|t|||d
d|dd	 d S )NrB  r  r   r.  rW   rH  r-  rN   rb   r&   r   )rB   rE   rD  r'  r)  r   r   r   r*   r   ri   r  r+   r   )rH   rd  r/  r,   rd   r   Z	num_knotsr*   r+   u_r   r  r   rK   rK   rL   test_simple_vs_splprep  s   
z&TestMakeSplprep.test_simple_vs_splprepc                 C   s"  |   \}}}t|tsJ t|d dksJ t||d\}}tt||d\}}t|||d t|d |d dd t|d t|d ksLJ t	|d |d D ]\}}	t||	dd qU|d |d kskJ tt
||t|kszJ t||d\}
}t||dd t|
j|d dd t|
jj|d dd |
j|d ksJ |
|jt|ksJ tt||d\}
}t||dd t|
j|d dd t|
jj|d dd |
j|d ksJ |
|jt|ksJ tt tt|j|d W d    d S 1 s
w   Y  d S )Nr   r1   r-  rb   rN   r&   )rG  r   r  rB   r   r   ri   r   r   r  r   r   r*   r+   r  r,   r>   r@   )rH   rd  r   r   rS   r  Ztck_aZu_arW  rX  r   rK   rK   rL   test_array_not_list  s6   
$z#TestMakeSplprep.test_array_not_listc                 C   s4   | j dd\}}}t|\}}t|||dd d S )NrW   r.  rN   rb   )rG  r   r   )rH   rd   r   r,   r   r  rK   rK   rL   test_default_s_is_zero'  s   z&TestMakeSplprep.test_default_s_is_zeroc                 C   s   | j dd\}}}t|dd\}}t|dd\}}t||dd t|||dd t|||dd |j|jks:J |jj|jjksDJ d S )NrW   r.  r   r-  rN   rb   r   )rG  r   r   r   r+   r   )rH   rd   r   r,   r@  Zu_iZspl_nZu_nrK   rK   rL   test_s_zero_vs_near_zero-  s   z(TestMakeSplprep.test_s_zero_vs_near_zeroc                 C   s   t jdtd}tt t| W d    n1 sw   Y  tt t|dd W d    n1 s4w   Y  tt t|dd W d    n1 sNw   Y  t|gdd\}}t|gdd\}}||jdksnJ t|||gdd	 d S )
Nr   r<   r   r-  r9  rC  )r&   r   rN   rb   )	rB   rE   r  r>   r@   r   r   r   r   )rH   rd   rS   rI  r   r  rK   rK   rL   rh  :  s   



zTestMakeSplprep.test_1DNrB  )r   r   r   rG  rT   r   r!  rJ  rK  rL  rM  rh  rK   rK   rK   rL   rF    s    


"rF  r  )rp  r3   rd  rY  )gr9  rU  r]  r!  r  numpyrB   Znumpy.testingr   Zscipy._lib._array_apir   r   rT   r   r>   r  r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r)  r  r  Zscipy.sparse.linalgsparser  Zscipy.interpolate._bsplinesr   r   r   r   r   r   r   r   Zscipy.interpolate._fitpack_implr:  Z_fitpack_implr   Zscipy._lib._utilr   Zscipy._lib._testutilsr    Zscipy.interpolate._ndbspliner!   r"   r  r#   r  r$   r%   r#  rR  rU  rp   rv   r   rc   r   rR   rQ  rw  r  r  r  r   r!  r  r  r  r%  r   r&  r'  r?  r@  rR  r   r  rT  re  r  r  r  r  r  r$  r%  r,  rF  rK   rK   rK   rL   <module>   s    L     	
	
 c   C
 =
,g =   M  ' %. A