o
    ?Hh-                    @   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(   cubic      @)r5   r   r&   r&   r1   r3   )r(   r&   r&      r3   dtype)assert_raises	TypeError
ValueErrorr   dictnperrstatenaninfarangefloat64randomr   r*   r+   r,   )selfnr,   r*   r+   b rM   e/home/air/sanwanet/gpt-api/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   foo)	_make_random_splinetckr   r*   r+   r,   pytestr   AttributeError)rJ   rL   rV   rM   rM   rN   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   r[   r8   )rC   linspacer   r   	ones_likewhererJ   xxrL   rM   rM   rN   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   +=rR   )r   rC   r\   r   B_012r   )rJ   r*   r+   r,   rL   xrM   rM   rN   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   rZ   Textrapolaterd   re   )rC   asarrayr   reshaper   r\   r   r   )rJ   r,   r*   r+   bpbsplr`   rM   rM   rN   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&   rc   c                       g | ]	}t | qS rM   _naive_eval.0rg   r+   r,   r*   rM   rN   
<listcomp>       z4TestBSpline.test_rndm_naive_eval.<locals>.<listcomp>rd   re   c                    rq   rM   )_naive_eval_2rt   rv   rM   rN   rw      rx   )rU   rV   rC   r\   r   )rJ   rL   r`   y_by_ny_n2rM   rv   rN   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&   rc   rd   re   rU   rV   rC   r\   r   r   rJ   rL   r*   r+   r,   r`   rM   rM   rN   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   rd   re   )rC   rI   RandomStatesortr   r   r*   r,   r\   r   r   )	rJ   rngrg   yrV   rL   r*   r,   r`   rM   rM   rN   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   )rU   rC   r]   r+   r\   r*   r,   r   )rJ   rL   r`   rM   rM   rN   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   )rC   rI   r   r   r   shape)
rJ   r   rK   r,   r*   r+   rL   tmtpr`   rM   rM   rN   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   rc   rd   re   )	rC   rI   r   r   r_r   r\   r   r   )rJ   r   rK   r,   r*   r+   c_padrL   b_paddtr`   rM   rM   rN   
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>rQ   rU   rV   r   )	rJ   num_parallel_threadsrL   r*   _r,   r   r   extraprM   rM   rN   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   re   r   )rJ   r   rL   r*   r   r,   rM   rM   rN   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&   rc   Trj   F)extr~   )rJ   rL   r*   r+   r,   r   r`   maskrM   rM   rN   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/   )rU   rV   rC   allisnan)rJ   rL   r*   r   r,   r`   yyrM   rM   rN   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   periodicrj   r&   r/   r   rc   )r/   r         ?r&   T)
rC   rI   r   r   r   r   r\   r   r   r   )
rJ   r   r*   r+   r,   rL   rK   r   r`   xyrM   rM   rN   test_periodic_extrap   s   
$$z TestBSpline.test_periodic_extrapc                 C   sV   t  }|j\}}}t|||f}t|| ||  d}t||||ddd d S )Nr   rd   rQ   )rU   rV   r   from_splinerC   r\   r   )rJ   rL   r*   r+   r,   ppr`   rM   rM   rN   
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/   rc   r&   dernurd   re   )	rU   rV   rC   r\   r   ranger   r   
zeros_like)rJ   rL   r*   r+   r,   r`   r   ydrM   rM   rN   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   )rC   rI   r   r   r   rl   r   allclose)	rJ   r,   r*   r   r+   rL   rg   x0x1rM   rM   rN   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*   rd   re   r   r&   r&   r1   r   r1   rZ   r&   r6   )rC   r\   r   basis_elementr   r   r*   r+   r,   B_0123r^   r_   rM   rM   rN   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   rd   re   )rU   rV   rC   r\   r   _sum_basis_elementsr   rM   rM   rN   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   rd   re   )	rU   rV   r   r+   realimagrC   r\   r   )	rJ   rL   r*   r+   r,   ccb_reb_imr`   rM   rM   rN   
test_cmplx9  s   zTestBSpline.test_cmplxc                 C   s&   t g d}t|tjsJ d S )Nr   )r   r   rC   r   rE   rJ   rL   rM   rM   rN   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=rQ   )rU   rV   r   rC   r\   r   
derivativer   )rJ   rL   r*   r+   r,   b0r`   jrM   rM   rN   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   rd   rQ   )
rU   rV   rC   r\   r   antiderivativer   c_dstackr   r   rM   rM   rN   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   Trj   Fr   r1   iii      ?r3   g      +@   r   ir4   )r   r   r   	integraterC   rl   _implr   rV   rk   r   )rJ   rL   i
period_intrM   rM   rN   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	   rk   r   r   r   r   )rJ   rg   rL   pr   r   rM   rM   rN   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&   rj   )r   r   r   
isinstancerC   ndarrayndim)rJ   rL   rk   resrM   rM   rN   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__rM   rM   rM   rN   B  s    r   )r   r&   r1   r1   )r   r   	__class__r   r   )rJ   r   rL   rM   rM   rN   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   )rC   r\   r   tuplerI   r   r   r+   r   r   r?   r   rB   r   r   r   )rJ   r   rK   r,   r*   shpos_axisr   r+   rL   xpaxb1rM   rM   rN   	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&   r:   )rC   arrayr   r   )rJ   r,   r*   r+   splspl0spl1rM   rM   rN   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&   rd   re   N)rC   rI   r   r   random_sampler	   eyelenr*   r   design_matrixtoarrayr   r+   )
rK   r,   r  r   rg   r   ro   r+   des_matr_defdes_matr_csrrM   rM   rN   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   )rJ   r  rK   r,   bcrM   rM   rN   test_design_matrix_bc_types  s   z'TestBSpline.test_design_matrix_bc_typesrk   )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   rZ   r&   r1   r   N)rC   rI   r   r  aminamaxr   r\   r  r  r   r   r	  r
  r   rW   r   rA   )rJ   rk   r  r   rg   xminxmaxr,   r*   r+   bsplinerM   rM   rN   '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   rZ   r3   r  r   r   r&   r4   rd   re   )rC   rI   r   r   r  r	   r   r   r	  r*   r
  r   r+   )rJ   r   rK   r,   rg   r   ro   r   xcycr  rM   rM   rN   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   rd   re   )r   r	  r
  r   )rJ   r*   des_matrrM   rM   rN   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   rZ   r3   r  r   r   r/   r1   )r5   r(   r6   r7   r8         @ri   )rC   rI   r   r   r  r	   r?   rA   r   r	  r*   )rJ   r   rK   r,   rg   r   ro   r*   rM   rM   rN   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&   rP   re   )rC   rI   r   r   r   r   from_power_basisr\   r   r	   r+   )	rJ   r  r   rg   r   cbro   r`   bspl_newrM   rM   rN   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"  rP   re   )rC   rI   r   r   r   r   r#  r	   r   r   r   r+   )	rJ   r  r   rg   r   r$  ro   bspl_new_realbspl_new_imagrM   rM   rN   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&   rP   re   N)rC   r   r   r#  r   r   r+   )rJ   rg   r   ro   rM   rM   rN   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writerZ   r)   )rC   r   setflagsr\   r   r   r]   )rJ   r*   r+   r`   rL   rM   rM   rN   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'  )rV   rC   r\   )r   rL   r*   r,   r`   rM   rM   rN   	worker_fn  s   z/TestBSpline.test_concurrency.<locals>.worker_fnrZ   )rU   r    )rJ   rL   r/  rM   rM   rN   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&   rZ   r*   z.datzw+)moder>   r   r+   )rU   rC   r\   	threadingget_native_idmemmapstrjoinr*   r>   r   r+   r   )rJ   tmpdirrL   r`   expectedtidt_mmc_mmrM   rM   rN   test_memmap  s   zTestBSpline.test_memmapN)2r   r   r   rO   rY   ra   rh   rp   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rW   markparametrizer   r   r  thread_unsafer  r  r  r  r!  r&  r)  r*  r.  r0  r<  rM   rM   rM   rN   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(   r:   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   rP   re   r&   r/   r   )rC   rG   sinr	   r   insert_knotr   r*   r+   r,   r   cosr   )rJ   rA  rg   r   r   spl_1fspl_1r`   y1spl_y1spl_yyspl_yy1rM   rM   rN   test_insert  s.   


"&

&zTestInsert.test_insertzxval, m))r5   r1   )r(   r3   )r   r   )r4   r1   )rC  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   mrP   re   r&   r/   r   )rC   rG   rD  r	   r   rE  r   r*   r+   r,   r   )	rJ   rA  rO  rg   r   r   rG  rH  r`   rM   rM   rN   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   rR  rS  r   rP   re   )rC   rI   default_rngr   uniformr   rE  r   )
rJ   r   rK   r,   r*   r+   r   xvrH  r`   rM   rM   rN   test_insert_random  s    
"zTestInsert.test_insert_randomrW  )	r   皙?r6   r8         @      @      @gffffff@rC  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   rk   r   TperrP   re   r&   r   r   r   )   rT  )rC   rG   rD  r   r   rE  r   rV   r   r*   r+   rI   rU  rV  r   )rJ   rW  rg   r   rV   r   rH  tfcfr,   r`   rM   rM   rN   test_insert_periodic  s   

,"zTestInsert.test_insert_periodicrk   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         @rP   re   )rC   rG   pirD  rF  r	   rk   rE  r   r*   r+   )rJ   rk   rg   y_rey_imr   spl_respl_imrW  rH  spl_1respl_1imrM   rM   rN   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   rj   Tr]  )	rC   r   onesr  r   r?   rA   r   rE  )rJ   rW  r,   r*   r+   r   rM   rM   rN   +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&   rl  r   r/   r   rN  )rC   r   rm  r  r   r?   rA   rE  )rJ   r,   r*   r+   r   rM   rM   rN   test_insert_no_extrap"  s   *


"z TestInsert.test_insert_no_extrap)r   r   r   rW   r=  r>  rM  rP  rX  rb  rk  rn  ro  rM   rM   rM   rN   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   rd   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   rY  r   r&   r/   zder = z  k = )rR   rS   err_msg)rV   rC   uniquer   r   r   r,   )	rL   r   r   rR   rS   r*   r+   r,   rg   rM   rM   rN   check_splev6  s   
8
z,test_knots_multiplicity.<locals>.check_splevr&   r1   r3   r4   r   r   r&   r   )r   rd   rd   )rU   	enumerate_make_multiplesr   )rr  r,   rL   r   r   r   rM   rM   rN   test_knots_multiplicity2  s   



rv  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rg   r,   r   r*   c1c2rM   rM   rN   ry  I  s   (2Fry  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 Nrx  )ru   r   r+   r   r,   r*   rg   rM   rN   	<genexpr>f  s   , z_naive_eval.<locals>.<genexpr>r   )rC   searchsortedr  sumr   )rg   r*   r+   r,   rM   r~  rN   rs   \  s   ((rs   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 r}  rx  ru   r   r+   r,   r*   rg   rM   rN   r  o     $ z _naive_eval_2.<locals>.<genexpr>r  r  r   rg   r*   r+   r,   rK   rM   r  rN   ry   i  s
   $ ry   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   Frj   )r  r   r   r   rC   
nan_to_num)rg   r*   r+   r,   rK   sr   rL   rM   rM   rN   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   rM   rg   rM   rM   rN   <lambda>      zB_012.<locals>.<lambda>c                 S   s   | S r}  rM   r  rM   rM   rN   r    r  c                 S   s   d|  S Nr6   rM   r  rM   rM   rN   r    s    )rC   
atleast_1d	piecewiser  rM   rM   rN   rf   }  s   
rf   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 r  rM   r  rM   rM   rN   r    s    zB_0123.<locals>.<lambda>c                 S   s   d| d d  S )Ng      ?r   r1   rM   r  rM   rM   rN   r        c                 S   s   d|  d d S )Nr7   r1   rM   r  rM   rM   rN   r    r  c                 S   r  Nr(   rM   r  rM   rM   rN   r    r  c                 S   r  )Ng       rM   r  rM   rM   rN   r    r  c                 S   r  r  rM   r  rM   rM   rN   r    r  znever be here: der=)rC   r  rA   r  )rg   r   condsfuncspiecesrM   rM   rN   r     s   
r   #   r3   c                 C   s<   t jd}t || | d }|| }t|||S )N{   r&   )rC   rI   r   r   r   construct_fast)rK   r,   r   r*   r+   rM   rM   rN   rU     s   
rU   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   )rL   r+   r,   t1rM   rM   rN   ru    s   


ru  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_  r  )rC   r\   rd  rF  r	   r*   r+   r,   rV   r`   r   rL   xnewr   r   r|  r   b2)rJ   r`   r   rL   r|  rM   rM   rN   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 )	NrP   rQ   c                    s   g | ]}t | qS rM   )r   rt   rL   rM   rN   rw         z*TestInterop.test_splev.<locals>.<listcomp>zCalling splev.. with BSplinematchr&   r   )r  rL   r  r   r   rV   rC   rl   r?   rA   r   r   r+   r   	transposer*   r,   )rJ   r  r  r   r   rV   rM   r  rN   
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   rP   re   r&   r1   T)full_output)r`   r   r   r   r   r   r   )rJ   rg   r   rV   r*   r+   r,   tck_fr   r   rL   rM   rM   rN   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   rC   r   r?   rA   r   r   r@   )rJ   rg   r   y2rM   rM   rN   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   rP   re   r   T)r  r  )	rC   rG   rH   rm   r   r   r   rl   r   )	rJ   rg   rL   urV   u1b_fu_fr   rM   rM   rN   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&   )	rC   rG   rm   r?   rA   r   r   r\   r@   )rJ   rg   r  rM   rM   rN   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   r:   rc  r   rQ   zCalling sproot.. with BSpliner  rc   )mestr&   r1   r   )r3   r1   r4   r   re   )rL   r  rC   r   rd  r   r   r*   r+   r,   r?   rA   r  rl   r   r   )rJ   rL   r  rootsc2rrrrM   rM   rN   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&   rd   F)rR   check_0dzCalling splint.. with BSpliner  r1   r3   r1   )rR   check_shape)rL   r  r   r   rV   r   r?   rA   r+   r  rC   rl   r*   r,   r   )rJ   rL   r  r  integrrM   rM   rN   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&   rb   rP   re   r1   )rL   r  r  r*   r+   r  rC   r   zerosr   r   r   r,   r   r   r   r   rJ   rL   ctb_crK   bdtck_drM   rM   rN   test_splderV     
$zTestInterop.test_splderc              	   C   r  r  )rL   r  r  r*   r+   r  rC   r   r  r   r   r   r,   r   r   r   r   r  rM   rM   rN   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&   rP   re   r  r   )rL   r  r`   r*   r   r   r+   r,   r   r   r   r   r   r   r   r  rC   rl   )rJ   rL   r  r`   r   tnbntck_nr   r   tck_n2bn2rM   rM   rN   rM  x  s$   "


zTestInterop.test_insertN)r   r   r   r  r  r  r  r  r  r  r  r  r  rM  rM   rM   rM   rN   r    s    r  c                   @   s  e Zd Zeddej ZeeZdd Z	dd Z
dd Zejd	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 )Nr:   r   )r?   r@   r	   r`   r   rJ   rM   rM   rN   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   rd   rQ   r/   r,   r   r	   r`   r   r   r   rM   rM   rN   test_order_0     zTestInterp.test_order_0c                 C   r  )Nr&   r   rd   rQ   r/   r  r  r   rM   rM   rN   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?   rA   r	   rJ   r,   rg   r   rM   rM   rN   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?   rA   r	   rC   rl   rm   r  rM   rM   rN   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   rd   rQ   r  )rJ   r,   rL   rM   rM   rN   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  rd   rQ   r&   r   r   r/   dy=re   r,   r  r   )r	   r`   r   r   r   )rJ   rL   r   rM   rM   rN   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   rZ   r   r/   r   r   r  rd   re   )rC   rI   r   r   r  r	   r   )rJ   r,   rK   r   rg   r   rL   rM   rM   rN   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  rd   re   )r`   r   rC   rI   r   r  rd  r   r  rD  rF  r	   r   r   )rJ   rK   r   rg   r   rL   r   rM   rM   rN   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  )rC   rI   r   r   r  r?   rA   r	   )rJ   r   r,   rK   rg   r   rM   rM   rN   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   )	rC   rI   r   r   r  r  r?   rA   r	   )rJ   r   r,   rK   rg   r   r*   rM   rM   rN   test_periodic_knots_exception  s   

"z(TestInterp.test_periodic_knots_exceptionrl  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,   rd   re   r&   r   r   r   )r	   r`   r   r   r   r   r   )rJ   r,   rL   rV   r   r   rM   rM   rN   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"  rd   re   r   rZ   r   r/   r   )
r	   r`   r   r   r   rC   rI   r   r   r  )rJ   rL   cubr   rK   rg   r   rM   rM   rN   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 r}  rr   r  rv   rM   rN   r  (  s    z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>rd   re   )r	   r`   r   r   r   rC   	vectorizer   )rJ   rL   r   rM   rv   rN   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  rd   rQ   r/   r&   r   FrR   rS   r  r  )rJ   r   rL   rM   rM   rN   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"  rd   rQ   r   r&   r/   r1   r   )r	   r`   r   r   rC   rl   )rJ   r,   der_lder_rrL   rM   rM   rN   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  rd   rQ   r   r&   r1   c                 S      g | ]\}}|qS rM   rM   ru   r   valrM   rM   rN   rw   T      z2TestInterp.test_quintic_derivs.<locals>.<listcomp>r/   c                 S   r  rM   rM   r  rM   rM   rN   rw   V  r  )rC   rG   astyperH   rD  r	   r   rl   )rJ   r,   rK   rg   r   r  r  rL   rM   rM   rN   test_quintic_derivsK  s   
""zTestInterp.test_quintic_derivs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"  rd   rQ   )r   r`   r	   r   r   )rJ   r,   r*   r  rL   rM   rM   rN   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"  rd   rQ   r5   re   )rC   r   r`   r	   r   r   rl   )rJ   r,   r*   rL   rM   rM   rN   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"  rd   rQ   )r	   rC   r\   r   )rJ   r,   rg   r   rL   r`   r   rM   rM   rN   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  rJ   rg   r   lrrM   rM   rN   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.)rC   rG   r?   rA   r	   r  rM   rM   rN   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"  rd   rQ   r   r&   Fr  r/   )r   r&   r   )r`   r   r	   r   )rJ   r,   r`   r   r  r  rL   rM   rM   rN   rk    s    zTestInterp.test_complexc                 C   sD   t dt}t dt}dD ]}t|||d}|| qd S )NrZ   r   r   )rC   rG   r  intr	   )rJ   rg   r   r,   rL   rM   rM   rN   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   )rC   r\   r	   )rJ   r`   rg   r   r,   rM   rM   rN   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 )NrZ   r1   r/   )	rC   rG   r  floatrE   rF   r?   rA   r	   rJ   rg   r   zrM   rM   rN   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 )NrZ   c                 S   s   g | ]}|d  qS )r1   rM   )ru   arM   rM   rN   rw     r  z.TestInterp.test_list_input.<locals>.<listcomp>r   )listr   r	   r  rM   rM   rN   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  rd   rQ   r   r/   )rC   r   rD  r`   rF  r	   r   )rJ   r   r  r  rL   rM   rM   rN   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"  )rC   rI   r   r   r	   r+   r   )	rJ   r   r,   rK   rg   r   rL   d_ld_rrM   rM   rN   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  rP   re   )r  r  r	  r1   )Nr  r  r  typor&   r5   r  r   r  r   r   r   r   r  r"  r  )rC   rD  r`   r	   r   r+   r?   rA   r   rF  rI   r   r   r  )rJ   r   r   r  r  r  r   r,   rK   rg   r   r  r  rM   rM   rN   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   rd   rQ   )	rC   rI   r   r   r   r	   make_interp_full_matrr   r+   )	rJ   r   r,   rK   rg   r   r*   rL   ra  rM   rM   rN   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   )offsetrd   re   )rC   rI   r   r   r  diagflatr  rt  diagonalr   r   linalgsolve)rJ   r   rK   r,   r!  r  r   urlldr   rL   rM   rM   rN   test_woodbury6  s,   24
zTestInterp.test_woodburyN)-r   r   r   rC   r\   rd  r`   rD  r   r  r  r  rW   r=  r>  r  r  r  r  r  r  r  r  r  r  r  r  r  r  xfailr   r  r  r  r
  rk  r  r  r  r  r  r  r  r  r)  rM   rM   rM   rN   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   rC   r  rH   r   r  r$   evaluate_all_bsplslr%  )rg   r   r*   r,   rK   Ar   rA  leftbbr+   rM   rM   rN   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=   )maprC   rl   r   r  rH   r   r  r$   r+  dotTr,  r%  )rg   r   r*   r,   rO  rK   r-  r   rA  r.  r/  r   Yr+   rM   rM   rN   make_lsq_full_matrixo  s   r4  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r5  r&   r/   )rcond)rg   r   r*   r,   r4  r
   r   r+   r   r   rC   r$  lstsq)rJ   r5  rg   r   r*   r,   c0AYrL   aar   r{  r   rM   rM   rN   
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 )Nr9  wr5  rd   re   )	rg   r   r*   r,   rC   r]   r
   r   r+   )	rJ   r5  rg   r   r*   r,   rA  rL   b_wrM   rM   rN   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   r6  r@  r7  r9  rd   re   )rg   r   r*   r,   rC   rI   rU  rV  r   r
   r   r+   r   )	rJ   rg   r   r*   r,   rA  b_neb_qrb_no_wrM   rM   rN   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   r9  r&   )rg   r*   r,   rK   rC   rI   r   r
   r+   r   r   )	rJ   r5  rg   r*   r,   rK   r   r   rL   rM   rM   rN   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   r9  c              	      s*   g | ]}t d d |f  dqS )Nr9  )r
   r  )r,   r5  r*   rg   r   rM   rN   rw     s    "z/TestLSQ.test_multiple_rhs_2.<locals>.<listcomp>c                    s   g | ]} | j qS rM   )r+   r  )r/  rM   rN   rw     r  rP   re   )rg   r*   r,   rK   rC   rI   r   r
   r   vstackr2  r   r+   )rJ   r5  rK   nrhsr   rL   coefsrM   )r/  r,   r5  r*   rg   r   rN   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   r7  r9  r6  rP   re   )	rg   r*   r,   rK   rC   rI   r
   r   r+   )	rJ   rg   r*   r,   rK   rI  r   rE  b_neqrM   rM   rN   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      ?       @r9  r'   rP   rQ   )rg   r*   r,   r   r
   r   r   r   )	rJ   r5  rg   r*   r,   r  rL   r   r   rM   rM   rN   rk    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 )NrN  r&   r   r'   rP   rQ   )
rg   r*   r,   r   rC   stackr
   r   r   r   )rJ   rg   r*   r,   r  rL   r   r   rM   rM   rN   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 )NrZ   r&   r   r,   r5  )rC   rG   r  r  r   r
   rJ   r5  rg   r   r*   rM   rM   rN   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 )
NrZ   r=   r&   r   rQ  r/   r6   rP   re   )rC   rG   float32r   r
   r  r  r   )rJ   r5  rg   r   r*   spl_f32spl_f64x2rM   rM   rN   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   rQ  )rC   r\   r   r
   )rJ   r5  r`   rg   r   r*   rM   rM   rN   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/   r9  )
rC   rG   r  r  r   rE   rF   r?   rA   r
   )rJ   r5  rg   r   r*   r  rM   rM   rN   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+  )rg   r   r*   r5  )rg   r   r*   r-  r
   rR  rM   rM   rN   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   r6  rQ  r7  r&   r6   rP   re   )rg   r   r   rC   r\   r
   r   )rJ   r,   rg   r   r*   spl_norm_eqspl_qrr`   rM   rM   rN   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   r7  rQ  r&   r/   r6   rP   re   )rC   repeatrg   r   r
   r*   r   )rJ   rg   r   rH  spl_2r`   rM   rM   rN   test_duplicates>  s   zTestLSQ.test_duplicatesN)$r   r   r   rC   rI   r   r   rK   r,   r   rg   r   r   r\   r*   parametrize_lsq_methodsr?  rC  rG  r  rK  rM  rk  rP  r  rW  r  rY  r.  rW   r=  r>  r  r   r\  r_  rM   rM   rM   rN   r8    s@    








	




r8  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   )rJ   r  r!  rb  rM   rM   rN   __init__R  s   zPackedMatrix.__init__c                 C   s   | j jd | jfS )Nr   )r  r   rb  r  rM   rM   rN   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   )rC   r  r   r  r   minrb  r!  )rJ   outnelemr   nelrM   rM   rN   todense_  s   0zPackedMatrix.todenseN)r   r   r   __doc__rc  propertyr   rh  rM   rM   rM   rN   ra  I  s    	
ra  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=   )scipy.linalg.lapackrk  r  r!  rb  r   r  r   rd  fprotar  ra  rC   r   int64)a_pr   startrowrk  r  r!  rb  rO  nzRrI  r   oir   r+   r  r  r  offsR_prM   rM   rN   _qr_reduce_pyh  s2   
 84rv  c                 C   s*   | | ||  }| | | |  }||fS )zLGivens rotate [a, b].

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

    rM   )r+   r  r  rL   r>  r/  rM   rM   rN   rm    s   rm  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   rb  rC   r   r   rd  r  )
ru  r   rr  r   rq  rb  r+   r   rg  summrM   rM   rN   fpback  s   
(2"rx  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&   )rC   rG   r  r   )rJ   rK   r,   rg   r   r*   rM   rM   rN   _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 )	NrZ   r   r&   r=   rP   re   gvIh%L=-a=)rz  r   r	  r,  r7  rh  r2  r   indicesrC   ascontiguousarrayrn  datarm   ra  r$   	qr_reducer   minimumr   absr%  rx  r  rb  )rJ   rK   rg   r   r*   r,   a_csrqr  qTyrO  rb  r!  r-  rr  y_c_fullc_bandedrM   rM   rN   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 )	NrZ   r   r&   r=   rP   re   F)check_dtype)rz  r   r	  r   r|  rC   r}  rn  r~  rm   ra  rv  r$   r  r   r  r   r!  rb  )rJ   rK   rg   r   r*   r,   r  rO  rb  r!  r-  rr  r  RRr   rM   rM   rN   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 )NrZ   r&   r=   r   rP   re   )rz  rC   rG   r  r$   data_matrixr   r   r	  tocsrr~  rm   r|  r  rn  r   r   )rJ   rK   rg   r   r*   r,   rA  r-  r!  rb  rO  r  a_wA_offset_rM   rM   rN   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 )NrZ   r1   rd   re   )
rz  rC   r   r$   r  r]   ra  r  rx  r   )rJ   rK   rg   r   r*   r,   r-  r!  rb  rr  r+   r   rM   rM   rN   test_fpback  s   
zTestGivensQR.test_fpbackN)r   r   r   rz  r  r  r  r  rM   rM   rM   rN   ry    s    #ry  c                 C   s    t jt jt jtd| S )Nr~  )ospathr6  abspathdirname__file__)basenamerM   rM   rN   	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  )rC   rI   r   r   r  rD  normalr?   rA   r   rm   r  rG   rm  rW   r   )rJ   r   rK   rg   r   x_duplexception_messagerM   rM   rN   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.npzrg   r   y_GCVSPLNg-C6?F)rR   rS   r  )rC   loadr  r   r   )rJ   r~  rg   r   r  y_comprrM   rM   rN   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   )lamr  r"  r   r/   rP   re   N)rC   rI   r   r   r  rD  r  r   r	   r\   r   )rJ   r   rK   rg   r   
spline_GCVspline_interpgridrM   rM   rN   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   rZ   r   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )rC   rI   r   r   r  rD  r  r   choicer   rm  r  rA   )rJ   r   rK   rg   r   r   indrA  spl_worigweightedrM   rM   rN   test_weighted_smoothing_spline  s&   ,

z2TestSmoothingSpline.test_weighted_smoothing_splineN)
r   r   r   r  r  r  rW   r=  	fail_slowr  rM   rM   rM   rN   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 r}  )r   r   )ru   ixiyr+   r,   nytxtyrg   r   rM   rN   r    s    2zbspline2.<locals>.<genexpr>)r  r  r   rC   rl   )r   r*   r+   r,   nxr   rM   r  rN   bspline2  s   
r  c                 C   rw  )Nr   r&   r(   r5   r   rz  rM   rM   rN   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  r}  r  r  r  rM   rN   r    r  zbspline.<locals>.<genexpr>r  r  rM   r  rN   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 r}  )operatorindex)ru   kirM   rM   rN   r    s    z&NdBSpline0.__init__.<locals>.<genexpr>c                 s   s    | ]
}t j|td V  qdS )r=   N)rC   rl   r  )ru   tirM   rM   rN   r    s    N)r  r   r@   r   r,   r*   r+   )rJ   r*   r+   r,   r   rM   rM   rN   rc    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,   ru   r(  )r   rJ   rM   rN   rw   	     , z'NdBSpline0.__call__.<locals>.<listcomp>c                    s.   g | ]}t | j|  | j| qS rM   )r   r,   r*   r  )idxrJ   rg   rM   rN   rw   	  s    &)r  r*   r   r,   rC   r  r   	itertoolsproductr+   prodrl   )
rJ   rg   r   r(  tdxdr,   resultiterstermrM   )r   r  rJ   rg   rN   __call__  s(   



0&


zNdBSpline0.__call__Nr3   )r   r   r   rc  r  rM   rM   rM   rN   r    s    
r  c                   @   s
  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Z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 )
NrQ  r;   r   r&   r   r  rd   re   r   )	rC   rI   rU  r   rV  r   r   r   r   )
rJ   r   rK   r,   n_trr*   r+   rL   nbxirM   rM   rN   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   rC   rG   r	   r*   r+   rJ   rg   r   r   y_1rH  t2r|  rM   rM   rN   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   )rC   rG   r	   r*   r+   r,   r  rM   rM   rN   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   r:   )r:   r&   )r   r   c                 S   (   g | ]\}}|d  |d  d|   qS r  rM   ru   rg   r   rM   rM   rN   rw   <	     ( z3TestNdBSpline.test_2D_separable.<locals>.<listcomp>c                    rq   rM   r  ru   r   r|  r,   r  rM   rN   rw   ?	  rx   Frd   r  rR   r3   r   re   rQ  )r4   r3   r1   r   r   )r4   r3   )r/   r1   r1   )r  r   rC   rl   r   r   r  rI   rU  rV  rm   r2  ravel)rJ   r  targetbspl2r   r  rg   r   rM   r  rN   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   r  c                 S   r  r  rM   r  rM   rM   rN   rw   Y	  r  z5TestNdBSpline.test_2D_separable_2.<locals>.<listcomp>r  r3   r   r4   r4   rd   re   r/   FgvIh%,=r  r   r   r1   r1   )r1   r1   )	r  rC   r   r   r   r   r+   rl   rm   )rJ   r   r  r  r  r|  r,   c2_4r   bspl2_4r  
val_singlec2_22bspl2_22rM   rM   rN   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 )Nr  c                 S   r  r  rM   r  rM   rM   rN   rw   	  r  z=TestNdBSpline.test_2D_separable_2_complex.<locals>.<listcomp>c                 S   s   g | ]}|d |  qS )y               @rM   )ru   r*   rM   rM   rN   rw   	      rN  r  r3   r   r  r4   rd   re   )r  rC   r   r   r   r   )rJ   r  r  r  r|  r,   r  r   r  r  r  rM   rM   rN   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 )NrQ  r3   r   r   r   r   r4   r&   r   )r(   r(   rd   re   r&   r   r1   皙?g? @c                    s   g | ]}t |f qS rM   r  r  r+   r,   r  r  rM   rN   rw   	  s    z0TestNdBSpline.test_2D_random.<locals>.<listcomp>)rC   rI   rU  r   r   rV  r   r   r   r  r   )rJ   r   r   r  rM   r  rN   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?rZ  )r:   g333333@)rZ  rc  c                 S   (   g | ]\}}|d  |d d|   qS r  rM   r  rM   rM   rN   rw   	  r  z/TestNdBSpline.test_2D_mixed.<locals>.<listcomp>r   rd   re   )r  r   r   r  r   )rJ   r  r|  kxkyr  r  r  rM   rM   rN   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  rM   r  rM   rM   rN   rw   	  r  z4TestNdBSpline.test_2D_derivative.<locals>.<listcomp>rd   re   r&   r&   c                 S   s(   g | ]\}}d |d  d| d  qS r  rM   r  rM   rM   rN   rw   	  r  )r   r   c                 S   r  r  rM   r  rM   rM   rN   rw   	  r  )r/   r   )r/   r   r&   )r  r   r   r?   rA   )rJ   r  r|  r  r  r  r  r   rM   rM   rN   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 )NrQ  )r1   r3   r   r   r   r3   r   r4   r&   r  r  r   c                       g | ]} |qS rM   rM   ru   r   bspl2_0rM   rN   rw   	  r  z6TestNdBSpline.test_2D_mixed_random.<locals>.<listcomp>rd   re   )rC   rI   rU  r   r   rV  r   r   r   r  r   	rJ   r   r  r  r  r  r+   r  r  rM   r  rN   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 rM   rM   ru   r  rL   rM   rM   rN   rw   	  r  z0TestNdBSpline.test_tx_neq_ty.<locals>.<listcomp>rd   re   )rC   rG   r	   r+   r   r*   r,   r   r  r  r   anyr   rm   r   )rJ   rg   r   spl_xspl_yr   ro   valuesrgir  bxirM   rM   rN   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&   r  )
rJ   rg   r   r   r  rH  y_2r^  r  r|  rM   rM   rN   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 )NrQ  r3   r<   r   r   r3   r1   r&   r   c                 S      g | ]}|qS rM   rM   ru   r   rM   rM   rN   rw   
  r  z3TestNdBSpline.test_3D_separable.<locals>.<listcomp>)r<   rd   re   )	rC   rI   rU  rV  r  r   zipr   r   )rJ   r   rg   r   r  r  t3c3r,   bspl3r  r  rM   rM   rN   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   rQ  r  r   r   c                 S   r  rM   rM   r  rM   rM   rN   rw   
  r  z4TestNdBSpline.test_3D_derivative.<locals>.<listcomp>)r&   r   r   r   r1   r&   rd   re   )r1   r   r   r   )r1   r&   r   )r1   r&   r3   )r1   r&   r4   )
r  r   rC   rI   rU  rV  r  r   r  r  )
rJ   r  r  r,   r  r   rg   r   r  r  rM   rM   rN   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 )NrQ  r3   r   r   r   r   r4   r&   r   )r(   r(   r&   rd   re   r  r  g?r  gffffff?c                    r  rM   rM   r  spl_0rM   rN   rw   3
  r  z0TestNdBSpline.test_3D_random.<locals>.<listcomp>)rC   rI   rU  r   r   rV  r   r   r  r   r   )	rJ   r   r,   r  r  tzr+   r   r  rM   r  rN   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 )NrQ  r3   r   r   r   r   r4   r&   r'   r   r  r  r  rd   re   )rC   rI   rU  r   r   rV  r   r   r   r   r   r   )rJ   r   r,   r  r  r  r+   r   rg  rh  r  rM   rM   rN   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,   rk   r/   r   r   r   rB  r/   g            @c                 S   r  rM   rM   r  rM   rM   rN   rw   R
  r  z?TestNdBSpline.test_extrapolate_3D_separable.<locals>.<listcomp>r1   r&   rj   rd   re   r  r   r0  rC   rl   r  r   )rJ   r  r  r  r  r,   r  rg   r   r  r  r  r  rM   rM   rN   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  rM   rM   r  rM   rM   rN   rw   c
  r  zATestNdBSpline.test_extrapolate_3D_separable_2.<locals>.<listcomp>r1   r&   rj   rd   re   r$  )rJ   r   r  r  r,   r  r  r  rg   r   r  r  r  r  rM   rM   rN   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   rB  )r/   r   r#  c                 S   r  rM   rM   r  rM   rM   rN   rw   q
  r  zETestNdBSpline.test_extrapolate_false_3D_separable.<locals>.<listcomp>r1   r&   Frj   r   r/   rd   re   )r  r   r0  rC   rl   r  r   r   )rJ   r  r  r,   r  rg   r   r  r  r  r  rM   rM   rN   #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  rB  r/   r#  c                 S   r  rM   rM   r  rM   rM   rN   rw   
  r  z/TestNdBSpline.test_x_nan_3D.<locals>.<listcomp>rd   re   )	r  r   rC   rl   rE   r  r   r   r   )rJ   r  r  r,   r  rg   r   r  r  r  r   r  rM   rM   rN   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 )NrQ  r3   r3   r   r4      rT  r/   r1   r&   r   r  r  r   c                    r  rM   rM   r  r  rM   rN   rw   
  r  z7TestNdBSpline.test_non_c_contiguous.<locals>.<listcomp>rd   re   )rC   rI   rU  r   rV  r   flagsc_contiguousr   r2  r   r   r  r   r   rM   r  rN   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   Frb   )r  r   r   r+  	writeable)rJ   r  r  r,   r  r   bspl3_rM   rM   rN   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 )Nrb   )r4   r   r   r   gؗҜ<re   r3   zData and knots*r  r&   r1   )
r  rC   rl   r   r	  r   r   rh  r?   rA   )rJ   r  r  r,   r  dmdm1rM   rM   rN   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 )NrQ  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  )rC   r   )r   r   r  rM   rM   rN   r/  
  s
   
z1TestNdBSpline.test_concurrency.<locals>.worker_fnrZ   )	rC   rI   rU  r   r   rV  r   r   r    )	rJ   r   r,   r  r  r  r+   r   r/  rM   rM   rN   r0  
  s   ...0zTestNdBSpline.test_concurrency)r   r   r   r  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  rW   r=  r>  r%  r&  r'  r(  r-  r0  r3  r?  r0  rM   rM   rM   rN   r  		  s:    +	
r  c                   @   s   e Zd Zdd Zdd Zejdg ddd Zd	d
 Z	dd Z
dd Zejdejejgdd Zdd Zejdg ddd Zdd ZdS )
TestMakeNDc                 C   s   t d}t dd }|d d d f d |d d|  d d d f  }dd t||D }t||f|dd}t||| d	d
 t||d dd}t||d d|  dd}|jd d d f |jd d d f  }t||jddd ddl	m
}	 |	||f|dd}
t|
|||dd
 d S )Nr   r   r3   r1   c                 S   r  rM   rM   r  rM   rM   rN   rw   
  r  z7TestMakeND.test_2D_separable_simple.<locals>.<listcomp>r&   r   rP   re   r  r   rQ   )r   linearr9  rd   )rC   rG   r  r  r!   r   r  r	   r+   scipy.interpolater   )rJ   rg   r   r  r  ro   r  r  r   RGIr  rM   rM   rN   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  rM   rM   r  rM   rM   rN   rw   
  r  z>TestMakeND.test_2D_separable_trailing_dims.<locals>.<listcomp>r3   r1   r,   solver)$   r4   r4   rd   re   r  )r;  r1   r1   )rC   rG   r  r  r   r!   sslspsolver  r  r   r   rm   )
rJ   rg   r   r  r  values4ro   r  r  values22rM   rM   rN   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  rM   rM   r  rM   rM   rN   rw     r  z,TestMakeND.test_2D_mixed.<locals>.<listcomp>r3   r1   r9  rP   re   )	rC   rG   r  r  r!   r<  r=  r   r  )rJ   r,   rg   r   r  r  ro   rM   rM   rN   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&   )rC   r   r  rM   rM   rN   _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   r5  r9  r&   gffffff@g333333@r   ffffff
@333333?r3   r&   rC  rD  r8   r   r(   r3   rd   re   rA  r!   r   rC   r   r2  r   rJ   rg   r   r  ro   r  r  rM   rM   rN   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   r9  cubic_legacyr9  rB  rE  rd   re   	rA  r!   r<  r=  r   rC   r   r2  r   rG  rM   rM   rN   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:  rS   rJ  r9  rB  rE  rd   r   rQ   rF  )rJ   r:  rg   r   r  ro   r  r  rM   rM   rN   test_2D_vs_RGI_cubic_iterative1  s   
z)TestMakeND.test_2D_vs_RGI_cubic_iterativec                 C   rI  )	Nr   r9  quintic_legacyr9  rB  rE  rd   re   rK  rG  rM   rM   rN   test_2D_vs_RGI_quintic@  rM  z!TestMakeND.test_2D_vs_RGI_quinticzk, meth))r&   r5  )r3   rJ  )r   rO  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   r9  r9  gffffff?r  r;   rT  rd   re   )
rC   rI   rU  cumsumrV  r!   r<  r=  r   r   )rJ   r,   methrndmrg   r   r  r  ro   r  r  rM   rM   rN   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   )rA  r?   rA   r!   rC   r   )rJ   rg   r   r  solver_argsrM   rM   rN   test_solver_err_not_convergedZ  s   &"z(TestMakeND.test_solver_err_not_convergedN)r   r   r   r8  r@  rW   r=  r>  r  rA  rH  rL  r<  gmresgcrotmkrN  rP  rT  rW  rM   rM   rM   rN   r4  
  s     






r4  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&   rX  r1   r   z1D sequencer  )rC   rG   rm   rW   r   rA   _bfpcheckrJ   r,   r*   rg   rM   rM   rN   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<   rZ   z	Need k+1*r  )	rC   rG   dfitpackfpchecrW   r   rA   r[  r\  )rJ   r,   rK   rO  r*   rg   rM   rM   rN   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   rZ  r/   r   zLast k knots*r  zFirst k knots*r_  r`  r[  r\  r  rW   r   rA   )rJ   r,   r*   rg   ttrM   rM   rN   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   rZ     zInternal knots*r  )r_  r`  r[  r\  rW   r   rA   r]  rM   rM   rN   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   re  r  zOut of bounds*r  r/   rb  )rJ   r,   r*   rg   r`   rM   rM   rN   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  rc   Schoenberg-Whitney*r  )r   r   r   r_  r`  rW   r   rA   r[  r\  r]  rM   rM   rN   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]  rM   rM   rN   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   rc   ri  r  rj  r]  rM   rM   rN   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   rc   ri  r  rj  r]  rM   rM   rN   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&   @ro  ro  rB  rc   ri  r  rj  r]  rM   rM   rN   test_condition_5_3  s   "zTestFpchec.test_condition_5_3N)r   r   r   r^  ra  rd  rg  rh  rk  rl  rm  rn  rp  rM   rM   rM   rN   rZ  d  s    rZ  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 r  )r  r  r  	residualsrM   rN   rw     r  z_split.<locals>.<listcomp>r&   r/   r1   rP   re   )rC   r  r   r  r   r  )rg   r*   r,   rr  fpartscarriesr   carryrM   rq  rN   _split
  s    rv  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)rv  r   r  rA   rC   r  r   )rg   r*   r,   rr  rs  r  idx_max	fpart_maxr   idx_newknotnew_knotidx_tt_newrM   rM   rN   	_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   rC  )r,   r*   r1   r   _fitpack_reprorP   re   )
rC   rG   r  r   r
   r6  r  add_knotr}  r   )rJ   rg   r   r,   r*   r   rr  _frnew_tnew_t_pyspl2
residuals2new_t2	new_t2_pyrM   rM   rN   test_split_add_knot6  s   "z%TestGenerateKnots.test_split_add_knotr,   rs  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,   r  r/   rP   re   )	rC   rG   rH   rD  rd  r  r   r   r   )rJ   r,   rg   r   r*   rc  rM   rM   rN   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 )NrZ   r3   r   r  r/   rP   re   rC   rG   r  r   r   r   rJ   rK   rg   r   knotsrM   rM   rN   	test_s0_1W  s
   
zTestGenerateKnots.test_s0_1c                 C   r  )Nr   r3   r   r  r/   rP   re   r  r  rM   rM   rN   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 )NrZ   r3   r   r,   r  nest)rC   rG   r?   rA   r  r   rJ   rg   r   rM   rM   rN   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   rC  rC  rC  rC  )	r5   r5   r5   r5   r8   rC  rC  rC  rC  
r5   r5   r5   r5   r6   r8   rC  rC  rC  rC  )r5   r5   r5   r5   r6   r8   r\  rC  rC  rC  rC  )r5   r5   r5   r5   r6   r7   r8   r   r   rC  rC  rC  rP   re   r/   N)
rC   rG   rD  rd  r  r   r  r  r   r   )	rJ   rg   r   r,   r  wantedr*   rc  r   rM   rM   rN   test_s_switchm  s   
zTestGenerateKnots.test_s_switchc                 C   s(   t td}t||ddd}t| d S )Nr   rY  r&   )r  r,   )r  r   r   next)rJ   rg   genrM   rM   rN   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   rZ   r  r/   r  rP   re   r4   )r,   r  )	rC   rG   rD  rd  r  r   r   r?   rA   )rJ   rg   r   r  r  rM   rM   rN   	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<   rA  )	rC   rG   rD  rd  r?   rA   r  r   rm  r  rM   rM   rN   rC    s   


"zTestGenerateKnots.test_weightsnpts)rf  rc   r   r  )rY  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 )NrQ  rZ   r   r   r1   r3   r  r   r/   rP   re   )rC   rI   r   r   rV  rD  rd  expr   r  r   r   )	rJ   r  r  rS  rg   r   r,   r*   rc  rM   rM   rN   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   )
rC   rG   r  r   r   recordRuntimeWarningr   r  r   )rJ   rK   rg   r   r  supr  rV   rM   rM   rN   test_s_too_small  s   

z"TestGenerateKnots.test_s_too_smallN)r   r   r   r  rW   r=  r>  r  r  r  r  r  r  r  rC  r  r?  r  rM   rM   rM   rN   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   rC   r]  r   r  emptyr  r   math	factorial)
r*   r,   rK   deltanrintr  tiirO  matrr   rM   rM   rN   
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  )rg   r   r*   r,   rC   r]   r  rA  r   r   r  r   a_denser6  r  ra  discrh  b_denser   r  r   r  )
rJ   rg   r   r*   r,   r  rA  r  r  r   rM   rM   rN   rc    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   )r7  r%  economic)r1  r&   r1   )rC   rH  r  r  scipy.linalgr7  r%  r2  r   r   r   r*   r,   r  rA  rg   r   r   r  )rJ   r   abr7  r%  r  r  qyrb  r+   r   fprM   rM   rN   r    s   
"$
zF_dense.__call__r}  )r   r   r   ri  rc  r  rM   rM   rM   rN   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   rZ   r<   rX  r&   r1   rY  r  r3   )rA  r  r/   r:   r  )r,   r  r  )r  r  r   	   )
rC   r\   r?   rA   r   rm  r   r   r@   rG   )rJ   rg   r   rA  rM   rM   rN   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&   r:   r8   )rC   r\   rD  r   )rJ   rg   r   r,   r  rc  rM   rM   rN   	_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&   rZ   r   rP   re   ) scipy.interpolate._fitpack_repror  r  r  r   )
rJ   r  rg   r   r,   r  r*   ff_dr   rM   rM   rN   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   r  r=   r  r  rP   re   )
r  r  r  rC   rG   r   r  r  r   r   )rJ   r  rg   r   r,   r  r*   rA  fwfw_dr  r   rM   rM   rN   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   rQ  r   r   r   r3   r1   rP   re   )r  interpolater  rC   rI   rU  r   r   rV  r  ra  r  rh  r  r   r   )rJ   r  r   r*   rK   r,   DD_denserM   rM   rN   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&   r:   r8   r   r  rP   re   )	r  rC   r   r   r   r   r   r+   r   )	rJ   rg   r   r,   r  rc  r*   r+   r   rM   rM   rN   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,   r  rP   re   )r  r  r   r   r   r*   r+   r,   )	rJ   rg   r   r,   r  r   r*   spl_autospl_trM   rM   rN   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 )NrZ   r3   r&   r  r   r1   )rC   rG   r   r*   r   )rJ   rK   rg   r   r,   r   rM   rM   rN   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 )NrZ   r3   r   rP   re   )rC   rG   r   r	   r   r+   )rJ   rK   rg   r   r   spl_irM   rM   rN   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{  re   )rC   rG   r   r  r  r   r   r  r   r*   r   r   r+   r,   )rJ   rK   rg   r   r  r  rV   r   rM   rM   rN   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rZ   r3   r3   r   h㈵>r  r&   )rC   rG   r   r+   r   )rJ   rK   r,   rg   r   r   rH  r^  rM   rM   rN   
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 )Nr  r3   r   r  r&   r1   )rC   rG   r   r+   r   r*   r   )rJ   rK   r,   rg   r   r  rH  rM   rM   rN   test_s0_vs_not  s   
 zTestMakeSplrep.test_s0_vs_notN)r   r   r   r  r  r  r  r  r  r  r  r  rW   r=  r?  r  r  r  rM   rM   rM   rN   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 )TestMakeSplpreprZ   r3   c                 C   s2   t |t j | }t |t |g}|||fS r}  )rC   rG   rd  rD  rF  )rJ   rO  r,   rg   r   rM   rM   rN   _get_xyk  s   
zTestMakeSplprep._get_xykr  r   rY  gMbP?r  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 )Nr  r  r   r  rZ   r  r  rP   re   r&   r   )rC   rG   rd  rD  rF  r   r   r   r*   r  rl   r2  r+   r   )rJ   r  rO  r,   rg   r   	num_knotsr*   r+   u_r   r  r   rM   rM   rN   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  re   rP   r&   )r  r   r  rC   r   r   rl   r   r  r  r   r   r*   r+   r2  r,   r?   rA   )rJ   r  r   r   rV   r  tck_au_ar{  r|  r   rM   rM   rN   test_array_not_list  s6   
$z#TestMakeSplprep.test_array_not_listc                 C   s4   | j dd\}}}t|\}}t|||dd d S )NrZ   rN  rP   re   )r  r   r   )rJ   rg   r   r,   r   r  rM   rM   rN   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 )NrZ   rN  r   r  rP   re   r   )r  r   r   r   r+   r   )rJ   rg   r   r,   r  u_ispl_nu_nrM   rM   rN   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  rY  r  )r&   r   rP   re   )	rC   rG   r  r?   rA   r   r   r   r   )rJ   rg   rV   r  r   r  rM   rM   rN   r  :  s   



zTestMakeSplprep.test_1DNr  )r   r   r   r  rW   r=  r>  r  r  r  r  r  rM   rM   rM   rN   r    s    


"r  r  )r  r3   r  r  )gr  r  r  r  r2  numpyrC   numpy.testingr   scipy._lib._array_apir   r   rW   r   r?   r6  r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r  r$  r,  scipy.sparse.linalgsparser<  scipy.interpolate._bsplinesr   r   r   r   r   r   r   r   scipy.interpolate._fitpack_implr  _fitpack_implr   scipy._lib._utilr   scipy._lib._testutilsr    scipy.interpolate._ndbspliner!   r"   r_  r#   r[  r$   r%   r@  rv  ry  rs   ry   r   rf   r   rU   ru  r  r  r  r4  r=  r>  r`  r8  ra  rv  rm  rx  ry  r  r  r  r   r  r  r  r4  rZ  rv  r}  r~  r  r  r  r  rM   rM   rM   rN   <module>   s    L     	
	
 c   C
 =
,g =   M  ' %. A