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

|}t|||}t||j t||j t||j d S )N                 ?      ?r   tckignore)invalidr   r"      r   r"   r-         r-   )        r1   r$          @      @      @)r$   r$   r$   cubic      @)r1   r   r"   r"   r-   r/   )r$   r"   r"      r/   )assert_raises	TypeError
ValueErrorr   dictnperrstatenaninfarangerandomr   r&   r'   r   r(   )selfnr(   r&   r'   b rF   e/var/www/html/Trade-python/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 t|j|d  tt	 d|_W d    d S 1 s8w   Y  d S )Nr   V瞯<atolrtolr"   r-   foo)
_make_random_splinetckr   r&   r'   r   r(   pytestr   AttributeError)rC   rE   rO   rF   rF   rG   test_tckD   s   "zTestBSpline.test_tckc                 C   sf   t ddd}tddgdgdd}t||d tg dddgdd}t||t |d	k dd d S )
Nr   r"   
   r3   r%   r/   )r   ffffff?r"   r0   rT   )r=   linspacer   r   whererC   xxrE   rF   rF   rG   test_degree_0P   s
    zTestBSpline.test_degree_0c                 C   s   g d}g d}d}t |||}tddd}t|d t| |d t|d   |d t|d   ||dd	 tt||||f||dd	 d S )
Nr.   r"   r-   r/   r"   r/   2   r   r-   +=rK   )r   r=   rU   r   B_012r   )rC   r&   r'   r(   rE   xrF   rF   rG   test_degree_1Y   s   8"zTestBSpline.test_degree_1c                 C   s   d}t dg|d  dg|d   }t g d}t|ddddg}t|||}t ddd}t||d	d
||d	d
dd tt||||f||dd d S )Nr/   r   r"   r$   r2   r3   r4   r+   g      r2   rS   Textrapolater\   r]   )r=   asarrayr   reshaper   rU   r   r   )rC   r(   r&   r'   bpbsplrX   rF   rF   rG   test_bernsteind   s   "
zTestBSpline.test_bernsteinc                    s   t  }|j\ t  d  d}||} fdd|D }t||dd  fdd|D }t||dd d S )Nr"   r[   c                       g | ]	}t | qS rF   _naive_eval.0r_   r'   r(   r&   rF   rG   
<listcomp>z       z4TestBSpline.test_rndm_naive_eval.<locals>.<listcomp>r\   r]   c                    ri   rF   )_naive_eval_2rl   rn   rF   rG   ro   }   rp   )rN   rO   r=   rU   r   )rC   rE   rX   y_by_ny_n2rF   rn   rG   test_rndm_naive_evalr   s   z TestBSpline.test_rndm_naive_evalc                 C   sP   t  }|j\}}}t|| || d  d}t||t||||fdd d S )Nr"   r[   r\   r]   rN   rO   r=   rU   r   r   rC   rE   r&   r'   r(   rX   rF   rF   rG   test_rndm_splev   s   "zTestBSpline.test_rndm_splevc                 C   s   t jd t t jd}t jd}t||}t| }|j|j}}t || || d  d}t	||t
||dd d S )N     r"   P   r\   r]   )r=   rB   seedsortr   r   r&   r(   rU   r   r   )rC   r_   yrO   rE   r&   r(   rX   rF   rF   rG   test_rndm_splrep   s   
zTestBSpline.test_rndm_splrepc                 C   sJ   t  }t|j|_t|j|j |j|j d  d}t||d d S )Nr"   d   r$   )rN   r=   	ones_liker'   rU   r&   r(   r   )rC   rE   rX   rF   rF   rG   test_rndm_unity   s   $zTestBSpline.test_rndm_unityc           	      C   s~   d\}}t t j|}t jj|ddfd}t|||}|| || d  }}||| t jd  }t||jd d S )N   r/         sizer"   r/   r0      )r/   r0   r   r   r   )r=   r}   rB   r   r   shape)	rC   rD   r(   r&   r'   rE   tmtprX   rF   rF   rG   test_vectorization   s   zTestBSpline.test_vectorizationc           
      C   s   d\}}t t j|| d }t j|}t j|t j|d f }t|||t|||}}|d |d  }t |d | |d | d}	t||	||	dd t||	t|	|||fdd t||	t|	|||fdd d S )N)!   r/   r"   r+   r   r[   r\   r]   )r=   r}   rB   r_r   rU   r   r   )
rC   rD   r(   r&   r'   c_padrE   b_paddtrX   rF   rF   rG   
test_len_c   s   "zTestBSpline.test_len_cc                 C   sb   t  }|j\}}}|| || d  }}dD ]}t|||g|||d |d g|dd qd S )Nr"   )TF绽|=&.>r]   rN   rO   r   )rC   rE   r&   _r(   r   r   extraprF   rF   rG   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   r]   r   )rC   rE   r&   r   r(   rF   rF   rG   test_continuity   s
   :
zTestBSpline.test_continuityc                 C   s   t  }|j\}}}|d |d  }t|| | || d  | d}|| |k ||| d  k @ }t||| dd||| dd t||ddt||||fdd d S )	Nr+   r   r"   r[   Trb   F)extrv   )rC   rE   r&   r'   r(   r   rX   maskrF   rF   rG   test_extrap   s   $zTestBSpline.test_extrapc                 C   sL   t  }|j\}}}|d d |d d g}||}ttt|  d S )Nr   r"   r+   )rN   rO   r   r=   allisnan)rC   rE   r&   r   r(   rX   yyrF   rF   rG   test_default_extrap   s
   zTestBSpline.test_default_extrapc           	      C   s  t jd t t jd}t jd}d}t|||dd}|j|d  }|d |d	  }t || | || | d
}|| |||  || ||    }t||t||||f g d}|| |||  || ||    }t	||dd||dd d S )Nry      r0   r/   periodicrb   r"   r+   r   r[   )r+   r         ?r"   T)
r=   rB   r|   r}   r   r   rU   r   r   r   )	rC   r&   r'   r(   rE   rD   r   rX   xyrF   rF   rG   test_periodic_extrap   s   $$z TestBSpline.test_periodic_extrapc                 C   sV   t  }|j\}}}t|||f}t|| ||  d}t||||ddd d S )Nr   r\   rJ   )rN   rO   r   from_spliner=   rU   r   )rC   rE   r&   r'   r(   pprX   rF   rF   rG   
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ddd d S )	Nr   r+   r[   r"   dernur\   r]   )rN   rO   r=   rU   r   ranger   r   )rC   rE   r&   r'   r(   rX   r   ydrF   rF   rG   test_derivative_rndm   s   z TestBSpline.test_derivative_rndmc              
   C   s4  d}g d}t jd t jddt jdddf }t|||}t g d}t|||dk d |||dk d  tt |d	|d
  t ddg}t||d dd||d dd t ddg}tt 	t ||d dd||d dd  tt 	t ||d dd||d dd  d S )Nr-   )r+   r+   r   r"   r"   r/   r0   r   r   r   r   r   ry   r   r   )r"   r/   r0   r   r   r   g2H@gη   @r/   r0   r"   r   )
r=   rB   r|   r   r   rd   r   r   allcloser   )rC   r(   r&   r'   rE   r_   x0x1rF   rF   rG   test_derivative_jumps  s*   
z!TestBSpline.test_derivative_jumpsc                 C   s   t ddd}tjg dd}t||t||j|j|jfdd t||t	|dd tjg dd}t d	d
d}t||t 
|dk || d| d
 dd d S )Nr+   r0   rz   r   r"   r-   r/   )r&   r\   r]   r   r"   r"   r-   r   r-   rS   r"   r2   )r=   rU   r   basis_elementr   r   r&   r'   r(   B_0123rV   rW   rF   rF   rG   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"   rz   r\   r]   )rN   rO   r=   rU   r   _sum_basis_elementsrw   rF   rF   rG   test_basis_element_rndm*  s    z#TestBSpline.test_basis_element_rndmc           	      C   s   t  }|j\}}}|d }t|||}t||jj|}t||jj|}t|| || d  d}t||j||dd t||j||dd d S )Ny      ?      @r"   rz   r\   r]   )	rN   rO   r   r'   realimagr=   rU   r   )	rC   rE   r&   r'   r(   ccb_reb_imrX   rF   rF   rG   
test_cmplx0  s   zTestBSpline.test_cmplxc                 C   s&   t g d}tt|tj d S )Nr   )r   r   r   r=   r   r?   rC   rE   rF   rF   rG   test_nan=  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"   rz   -q=rJ   )rN   rO   r   r=   rU   r   
derivativer   )rC   rE   r&   r'   r(   b0rX   jrF   rF   rG   test_derivative_methodB  s   
z"TestBSpline.test_derivative_methodc                 C   s   t  }|j\}}}t|| || d  d}t|  |||ddd tj|||f }t||f}t	|||}t|  |||ddd d S )Nr"   rz   r\   rJ   )
rN   rO   r=   rU   r   antiderivativer   c_dstackr   rw   rF   rF   rG   test_antiderivative_methodK  s   


z&TestBSpline.test_antiderivative_methodc                 C   s>  t g d}t|ddd t|ddd t|ddd t|ddd t|jddddd t|jddd	dd t|jddd	dd t|jddd	dtdd|j d
|_| }|d|d }t|dd| t|ddd|  t|dd| t|ddd|  t|dd|d|d  t|dd|d|d |d |d  t|dd|d|d |d |d  t|dd|d|d |d |d d|   t|dd|d|d  t|dd|d|d  t|dd|d|d d|   d S )Nr,   r   r"   r         r+   Trb   Fr   r-   iii      ?r/   g      +@   r   ir0   )	r   r   r   	integrate_implr   rO   rc   r   )rC   rE   i
period_intrF   rF   rG   test_integralY  s:   .&*zTestBSpline.test_integralc                 C   sN   g d}t ||}d|_t|}dD ]\}}t|||||| qd S )Nr.   r   ))r   )r   r   )r      )r	   rc   r   r   r   r   )rC   r_   rE   pr   r   rF   rF   rG   test_integrate_ppoly~  s   


z TestBSpline.test_integrate_ppolyc                 C   sN   G dd dt }|g d}t|j| t| j| t| j| d S )Nc                   @   s   e Zd ZdS )z'TestBSpline.test_subclassing.<locals>.BN)__name__
__module____qualname__rF   rF   rF   rG   B  s    r   )r   r"   r-   r-   )r   r   r   	__class__r   r   )rC   r   rE   rF   rF   rG   test_subclassing  s
   zTestBSpline.test_subclassingaxisr   r0   c              
   C   sd  d\}}t dd|| d }g d}|d }||| t jj|d}t||||d}t|jj|| g|d |  ||d d    t jd}	t||	j|d | t|	j ||d d    |j	 d |j	fD ]}
t
ttfi t||||
d	 qlt||||d t||||dd
t||||d t||||dd
fD ]	}t|j|j qd S )Nr   r   r"   r   r   r   r0   r   r   r   )r&   r'   r(   r   r-   )r=   rU   r   rB   r   r   r'   r   listndimr9   r   r<   r   r   r   )rC   r   rD   r(   r&   shpos_axisr'   rE   xpaxb1rF   rF   rG   	test_axis  s2   $
$
zTestBSpline.test_axisc                 C   sp   d}g d}t g dg dg}t|||dd}t||d |}t||d |}t|d	|d	|d	g d S )
Nr-   )r   r"   r-   r/   r0   r   r   )r+   r-   r   r+   )r-   r   r"   r+   r   r   r"   r6   )r=   arrayr   r   )rC   r(   r&   r'   splspl0spl1rF   rF   rG   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 t j| d d }t j| 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.
            ry   (   rz   r   r+   r   r(   bc_typer"   r\   r]   N)r=   rB   r|   r}   random_sampler	   eyelenr&   r   design_matrixtoarrayr   r'   )	rD   r(   r   r_   r~   rg   r'   des_matr_defdes_matr_csrrF   rF   rG   run_design_matrix_tests  s    zHTestBSpline.test_design_matrix_bc_types.<locals>.run_design_matrix_testsr8   r/   clampednaturalr   r-   
not-a-knotr   r   r   N)r   )rC   r   rD   r(   bcrF   rF   rG   test_design_matrix_bc_types  s   z'TestBSpline.test_design_matrix_bc_typesrc   )FTr   degreer   c           
   	   C   sJ  t jd t jd|d  }t |t |}}|}t jt |d |d |t ||d|d  t |d |d |f }t t	|| d }t
||||}	t|	|t
||||  t |d |d |d |d g}|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).ry   rS   r"   r-   r   N)r=   rB   r|   r   aminamaxr   rU   r   r   r   r   r   r   r   rP   r   r;   )
rC   rc   r  r_   xminxmaxr(   r&   r'   bsplinerF   rF   rG   'test_design_matrix_same_as_BSpline_call  s,   ""z3TestBSpline.test_design_matrix_same_as_BSpline_callc           
      C   s   t jd d}d}t t j|d d }t j|d d }t|||d}tddD ]"}|d | }|d | }t||j	|
 }	t|	|j |d	d
 q-d S )Nry   rS   r/   r   rz   r   r"   r0   r\   r]   )r=   rB   r|   r}   r   r	   r   r   r   r&   r   r   r'   )
rC   rD   r(   r_   r~   rg   r   xcycr   rF   rF   rG   test_design_matrix_x_shapes  s"   z'TestBSpline.test_design_matrix_x_shapesc                 C   s2   g d}t d|d }t|g dgdd d S )N)r$   r$   r$   r2   r3   r4   r4   r4   r2   r/   )g      ?gmਪ?gK}\UU?r1   r\   r]   )r   r   r   r   )rC   r&   des_matrrF   rF   rG   test_design_matrix_t_shapes  s   
z'TestBSpline.test_design_matrix_t_shapesc                 C   s   t jd d}d}t t j|d d }t j|d d }t|||d}tt t	||j
d d d | W d    n1 sDw   Y  d}g d	}g d
}tt t	||| W d    d S 1 sjw   Y  d S )Nry   rS   r/   r   rz   r   r+   r-   )r1   r$   r2   r3   r4         @ra   )r=   rB   r|   r}   r   r	   r9   r;   r   r   r&   )rC   rD   r(   r_   r~   rg   r&   rF   rF   rG   test_design_matrix_asserts  s   

"z&TestBSpline.test_design_matrix_assertsr   )r   r   r   r  c                 C   s   t jd t t jd}t jd}|dkr|d |d< t|||d}tj||d}t ddd}t||||dd	 t	|||d}t|j
|j
dd	 d S )
Nry   rz   r   r   r+   r   r"   rI   r]   )r=   rB   r|   r}   r   r   from_power_basisrU   r   r	   r'   )rC   r   r_   r~   cbrg   rX   bspl_newrF   rF   rG   test_from_power_basis,  s   z!TestBSpline.test_from_power_basisc                 C   s   t jd t t jd}t jdt jdd  }|dkr'|d |d< t|||d}tj||d}t||j|d}t||j	|d}t
|jj|jd|j  j t|j|jd|j  dd	 d S )
Nry   rz   r#   r   r   r+   r  rI   r]   )r=   rB   r|   r}   r   r   r  r	   r   r   r   r'   dtyper   )rC   r   r_   r~   r  rg   bspl_new_realbspl_new_imagrF   rF   rG   test_from_power_basis_complex;  s&   

z)TestBSpline.test_from_power_basis_complexc                 C   sL   t g d}t g d}tjt||dddd}t|jg ddd dS )	a}  
        For x = [0, 1, 2, 3, 4] and y = [1, 1, 1, 1, 1]
        the coefficients of Cubic Spline in the power basis:

        $[[0, 0, 0, 0, 0],\$
        $[0, 0, 0, 0, 0],\$
        $[0, 0, 0, 0, 0],\$
        $[1, 1, 1, 1, 1]]$

        It could be shown explicitly that coefficients of the interpolating
        function in B-spline basis are c = [1, 1, 1, 1, 1, 1, 1]
        r.   )r"   r"   r"   r"   r"   r   r  )r"   r"   r"   r"   r"   r"   r"   rI   r]   N)r=   r   r   r  r   r   r'   )rC   r_   r~   rg   rF   rF   rG   test_from_power_basis_exmpL  s   z&TestBSpline.test_from_power_basis_exmpc                 C   sl   t ddg}t dg}|jdd |jdd t ddd}|jdd t||dd}t||d d S )	Nr   r"   r3   FwriterS   r%   r/   )r=   r   setflagsrU   r   r   )rC   r&   r'   rX   rE   rF   rF   rG   test_read_only_  s   zTestBSpline.test_read_onlyN).r   r   r   rH   rR   rY   r`   rh   ru   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rP   markparametrizer   r   r   r  r
  r  r  r  r  r  r  r  rF   rF   rF   rG   r!      sZ    #				%


*

r!   c                   @   sr   e Zd Zejdg ddd Zejdg ddd Zd	d
 Zejdg ddd Z	dd Z
dd ZdS )
TestInsertxval)r1   r$   r6   r0         @      @c                 C   s  t d}t |d }t||dd}t||}||}t|j|jdd t|j|jd |j	 d  dd ||d kr?|n|d d }t j
|d|dd  |d d   f }t||||dd t |d }t||dd}	t|t j||f dd}
|
|}t|j|jdd t|jt j||j|	|jf dd ||d kr|n|d d }t j
|d|dd  |d d   f }t|
|||dd d S )	Nr   r/   r   rI   r]   r"   r+   r   )r=   rA   sinr	   r   insert_knotr   r&   r'   r(   r   cosr   )rC   r#  r_   r~   r   spl_1fspl_1rX   y1spl_y1spl_yyspl_yy1rF   rF   rG   test_inserto  s.   


"&

&zTestInsert.test_insertzxval, m))r1   r-   )r$   r/   )r   r   )r0   r-   )r%  r-   c           	      C   s   t d}t |d }t||dd}t|||d}|||}t|j|jdd t|j|jd |j	 d  dd ||d krB|n|d d }t j
|d	|dd  |d d   f }t||||dd d S )
Nr   r/   r   mrI   r]   r"   r+   r   )r=   rA   r&  r	   r   r'  r   r&   r'   r(   r   )	rC   r#  r1  r_   r~   r   r)  r*  rX   rF   rF   rG   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  r7   r"   r   r/   r-   )lowhighr   r4  r5  r   rI   r]   )r=   rB   default_rngr}   uniformr   r'  r   )
rC   rngrD   r(   r&   r'   r   xvr*  rX   rF   rF   rG   test_insert_random  s    
"zTestInsert.test_insert_randomr:  )	r   皙?r2   r4         @      @      @gffffff@r%  c                 C   s   t d}t |d }t||dd}t|ddi}||}t||jdd\}}}	t|j	|dd	 t|j
d |	 d
  |d |	 d
  dd	 t jdjdddd}
t||
t|
|||	fdd	 d S )Nr   r/   r   rc   r   TperrI   r]   r"   ry   r   r   )   r6  )r=   rA   r&  r   r   r'  r   rO   r   r&   r'   rB   r7  r8  r   )rC   r:  r_   r~   rO   r   r*  tfcfr(   rX   rF   rF   rG   test_insert_periodic  s   

,"zTestInsert.test_insert_periodicc                 C   s   d}d}t dg|d  g d dg|d   }t t|| d }t|||dd}tt t||||fd	d
 W d    n1 sEw   Y  tt || W d    d S 1 s_w   Y  d S )N      @r/   r   r"   r-   r/   r0   r   r   r   rb   Tr@  )	r=   r   onesr   r   r9   r;   r   r'  )rC   r:  r(   r&   r'   r   rF   rF   rG   +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 )	Nr/   r   r"   rG  r   r+   r   r0  )r=   r   rH  r   r   r9   r;   r'  )rC   r(   r&   r'   r   rF   rF   rG   test_insert_no_extrap  s   *


"z TestInsert.test_insert_no_extrapN)r   r   r   rP   r   r!  r/  r2  r;  rE  rI  rJ  rF   rF   rF   rG   r"  m  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   r\   c           	   	   S   s   | j \}}}t|}tj|d d d|dd  |d d   |d d f }tt||||f|| ||||d| d| j d d S )	Nr   r<  r   r"   r+   zder = z  k = )rK   rL   err_msg)rO   r=   uniquer   r   r   r(   )	rE   r   r   rK   rL   r&   r'   r(   r_   rF   rF   rG   check_splev  s   
8
z,test_knots_multiplicity.<locals>.check_splev)r"   r-   r/   r0   r   r   r"   r   )r   r\   r\   )rN   	enumerate_make_multiplesr   )rM  r(   rE   r   r   r   rF   rF   rG   test_knots_multiplicity  s   



rP  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$   r1   _naive_Br_   r(   r   r&   c1c2rF   rF   rG   rS    s   (2FrS  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 NrR  )rm   r   r'   r   r(   r&   r_   rF   rG   	<genexpr>  s   , z_naive_eval.<locals>.<genexpr>r   )r=   searchsortedr   sumr   )r_   r&   r'   r(   rF   rX  rG   rk     s   ((rk   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 rW  rR  rm   r   r'   r(   r&   r_   rF   rG   rY  #     $ z _naive_eval_2.<locals>.<genexpr>r   r[  r   r_   r&   r'   r(   rD   rF   r^  rG   rq     s
   $ rq   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"   r1   r-   Frb   )r   r   r   r   r=   
nan_to_num)r_   r&   r'   r(   rD   sr   rE   rF   rF   rG   r   &  s   "r   c                 C   sT   t | } t | | dk | dkB | dk| dk @ | dk| dk@ gdd dd dd gS )z+ A linear B-spline function B(x | 0, 1, 2).r   r-   r"   c                 S      dS )Nr1   rF   r_   rF   rF   rG   <lambda>7      zB_012.<locals>.<lambda>c                 S   s   | S rW  rF   re  rF   rF   rG   rf  7  rg  c                 S   s   d|  S Nr2   rF   re  rF   rF   rG   rf  7  s    )r=   
atleast_1d	piecewisere  rF   rF   rG   r^   1  s   
r^   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"   r-   r   c                 S   s   | |  d S rh  rF   re  rF   rF   rG   rf  ?  s    zB_0123.<locals>.<lambda>c                 S   s   d| d d  S )Ng      ?r   r-   rF   re  rF   rF   rG   rf  @      c                 S   s   d|  d d S )Nr3   r-   rF   re  rF   rF   rG   rf  A  rk  c                 S   rd  Nr$   rF   re  rF   rF   rG   rf  C  rg  c                 S   rd  )Ng       rF   re  rF   rF   rG   rf  D  rg  c                 S   rd  rl  rF   re  rF   rF   rG   rf  E  rg  znever be here: der=%s)r=   ri  r;   rj  )r_   r   condsfuncspiecesrF   rF   rG   r   :  s   
r   #   r/   c                 C   s@   t jd t t j| | d }t j| }t|||S )N{   r"   )r=   rB   r|   r}   r   construct_fast)rD   r(   r&   r'   rF   rF   rG   rN   L  s   rN   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   )rE   r'   r(   t1rF   rF   rG   rO  S  s   


rO  c                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )TestInteropc                 C   s   t ddt j d}t |}t||}|j|j|jf| _|||| _	| _
| _t ddt j d| _t j|j|j|jf }t ||f| _t|j| j|j| _d S )Nr   r4   rB  ru  )r=   rU   pir(  r	   r&   r'   r(   rO   rX   r   rE   xnewr   r   rV  r   b2)rC   rX   r   rE   rV  rF   rF   rG   setup_methodi  s   

zTestInterop.setup_methodc                    s   | j | j| j} }tt|  |ddd tt| j |ddd t fdd|D  |ddd ttdd t|| W d    n1 sMw   Y  tt	d|j
jd }|j
|}|j||jf}tt|||||ddd d S )	NrI   rJ   c                    s   g | ]}t | qS rF   )r   rl   rE   rF   rG   ro     s    z*TestInterop.test_splev.<locals>.<listcomp>zCalling splev.. with BSplinematchr"   r   )rz  rE   r{  r   r   rO   r9   r;   tupler   r'   r   	transposer&   r(   )rC   rz  r{  r   r   rO   rF   r}  rG   
test_splevv  s&   





zTestInterop.test_splevc                 C   s   | j | j}}t||}t||\}}}t|d |dd t|d |dd t|d | t||dd\}}}}t|d |dd t|d |dd t|d | t||}	t||	dd t| }
t||
|dd d S )Nr   rI   r]   r"   r-   T)full_output)rX   r   r   r   r   r   r   r   )rC   r_   r~   rO   r&   r'   r(   tck_fr   r   rE   rF   rF   rG   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~  r/   )	rX   r   r=   r   r9   r;   r   r   r:   )rC   r_   r~   y2rF   rF   rG   test_splrep_errors  s   

"zTestInterop.test_splrep_errorsc           	      C   s   t dd}t|\}}t|\}}t||dd tt|||dd tt|||dd t|ddd\\}}}}}t||dd tt|||dd d S )Nr   r/   r   rI   r]   r   T)rc  r  )r=   rA   re   r   r   r   r   )	rC   r_   rE   urO   u1b_fu_fr   rF   rF   rG   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   r/   )numr  ) >Ir   >Kr  zInvalid inputs)r"   r/   r-   r0   )r   g333333?g?r"   )	r=   rA   re   r9   r;   r   r   rU   r:   )rC   r_   r  rF   rF   rG   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}t|jd t|| d
dd d S )N)r   r   r6   rF  gHz>rJ   zCalling sproot.. with BSpliner~  r[   )mestr"   r-   r   )r/   r-   r0   r   r]   )rE   r{  r=   r   ry  r   r   r&   r'   r(   r9   r;   r  rd   r   r   )rC   rE   r{  rootsc2rrrrF   rF   rG   test_sproot  s    zTestInterop.test_sprootc                 C   s   | j | j}}ttdd|tdd|jdd ttdd||dddd ttdd tdd| W d    n1 s=w   Y  |j	ddd}t
tdd|j||jf}t|jd t|tdd|dd d S )	Nr   r"   r\   r]   zCalling splint.. with BSpliner~  r-   r/   r-   )rE   r{  r   r   rO   r   r9   r;   r'   r  r=   rd   r&   r(   r   r   )rC   rE   r{  r  integrrF   rF   rG   test_splint  s    
zTestInterop.test_splintc              	   C      | j | jfD ]c}t|jt|j }|dkr+tj|jt|f|jjdd   f |_dD ];}t	|}t
	|j|j|jf}t|j|d dd t|j|d dd t|j|d  tt|t tt|t q-qd S Nr   r"   rZ   rI   r]   r-   )rE   r{  r   r&   r'   r=   r   zerosr   r   r   r(   r   r   r   
isinstancer   r  rC   rE   ctrD   bdtck_drF   rF   rG   test_splder	     *zTestInterop.test_splderc              	   C   r  r  )rE   r{  r   r&   r'   r=   r   r  r   r   r   r(   r   r   r   r  r   r  r  rF   rF   rG   test_splantider  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|t t
t|t tt|jj}|j|dd  d }	t||j|	|jf}
t||}ttt	||
ddd||dd t
t|t t
t|
t d S )Nr-   r   r"   rI   r]   r  r   )rE   r{  rX   r&   r   r   r'   r(   r   r   r   r  r   r  r   r   r  r=   rd   )rC   rE   r{  rX   r   tnbntck_nr   r   tck_n2bn2rF   rF   rG   r/  )  s$   "


zTestInterop.test_insertN)r   r   r   r|  r  r  r  r  r  r  r  r  r  r/  rF   rF   rF   rG   rx  e  s    rx  c                   @   s  e Zd Zeddej ZeeZdd Z	dd Z
dd Zejd	g d
dd Zejd	g d
dd Zdd Zdd Zejd	g ddd Zdd Zdd Zdd Zejd	g ddd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zejjd)d*d+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"d5d6 Z#d7d8 Z$d9d: Z%ejd	g d;d<d= Z&d>d? Z'd@dA Z(dBdC Z)dDdE Z*dFdG Z+dHS )I
TestInterpr1   r2   c                 C   s@   t t t| j| jdd W d    d S 1 sw   Y  d S )Nr6   r   )r9   r:   r	   rX   r   )rC   rF   rF   rG   test_non_int_orderK  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   r\   rJ   r+   r(   r   r	   rX   r   r   r   rF   rF   rG   test_order_0O     zTestInterp.test_order_0c                 C   r  )Nr"   r   r\   rJ   r+   r  r  r   rF   rF   rG   test_linearU  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"   r-   r/   r0   r   )r   r"   r-   r/   r0   r   r   r   zShapes of xr~  r   r9   r;   r	   rC   r(   r_   r~   rF   rF   rG   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"   r-   r/   r0   r  zx to not have duplicatesr~  r   )r   r-   r"   r/   r0   r   zExpect x to be a 1D strictly)r"   r+   )r9   r;   r	   r=   rd   re   r  rF   rF   rG   test_broken_xb  s   "zTestInterp.test_broken_xc                 C   s6   dD ]}t | j| j|}t|| j| jddd qd S )Nr  r\   rJ   r  )rC   r(   rE   rF   rF   rG   test_not_a_knotr  s   zTestInterp.test_not_a_knotc                 C   s   t | j| jddd}t|| j| jddd tddD ]}t|| jd |d|| jd	 |dd
d 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   r\   rJ   r"   r   r   r+   dy=r]   r(   r   r   )r	   rX   r   r   r   )rC   rE   r   rF   rF   rG   test_periodicw  s   ,,zTestInterp.test_periodic)r-   r/   r0   r   r   r   c                 C   sh   d}t jd t t j|d }t j|d }|d |d< t|||dd}t|||d	d
 d S )Nr   ry   rS   r   r+   r   r   r   r\   r]   )r=   rB   r|   r}   r   r	   r   )rC   r(   rD   r_   r~   rE   rF   rF   rG   test_periodic_random  s   zTestInterp.test_periodic_randomc                 C   s   | j jd }tjd tj|d tj }t|}d|d< dtj |d< td|f}t	||d< t
||d< t||dddd	}t|D ]}t||| |d d |f d
d qIt||d ||d d
d d S )Nr   ry   r-   r1   r+   r"   r   r   r  r\   r]   )rX   r   r=   rB   r|   r   ry  r}   r  r&  r(  r	   r   r   )rC   rD   r_   r~   rE   r   rF   rF   rG   test_periodic_axis  s   
$"zTestInterp.test_periodic_axisc                 C   s   t jd d}d}t t j|}t j|}|d d |d< tt t|||dd W d    d S 1 s9w   Y  d S )	Nry   r   r   r+   r"   r   r   r   )r=   rB   r|   r}   r   r9   r;   r	   )rC   r(   rD   r_   r~   rF   rF   rG   test_periodic_points_exception  s   
"z)TestInterp.test_periodic_points_exceptionc                 C   s   t jd d}d}t t j|}t j|}t |d|  }tt t||||d W d    d S 1 s:w   Y  d S )Nry   r/   r   r-   r   )	r=   rB   r|   r}   r   r  r9   r;   r	   )rC   r(   rD   r_   r~   r&   rF   rF   rG   test_periodic_knots_exception  s   
"z(TestInterp.test_periodic_knots_exceptionrG  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)rA  r(   r\   r]   r"   r   r   r   )r	   rX   r   r   r   r   r   )rC   r(   rE   rO   r   r   rF   rF   rG   test_periodic_splev  s   zTestInterp.test_periodic_splevc                 C   s   t | j| jddd}t| j| jdd}t|| j|| jdd d}ttj|d }tj|d }|d	 |d
< t ||ddd}t||dd}t||||dd d S )Nr/   r   r   r  r\   r]   rS   r   r+   r   )	r	   rX   r   r   r   r=   r}   rB   r   )rC   rE   cubrD   r_   r~   rF   rF   rG   test_periodic_cubic  s   zTestInterp.test_periodic_cubicc                    sj   dt | j| jdd}t| jt| j| j t fdd}t|| j|| jdd d S )Nr/   r   r   c                    s   t |  S rW  rj   re  rn   rF   rG   rf    s    z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>r\   r]   )r	   rX   r   r   r   r=   	vectorizer   )rC   rE   r   rF   rn   rG   test_periodic_full_matrix  s   z$TestInterp.test_periodic_full_matrixc                 C   s   dg}t | j| jdd |fd}t|| j| jddd t|| jd d|d d ddd t | j| jd|d fd}t|| j| jddd t|| jd d|d d ddd d S )	Nr"   g       @r-   r   r\   rJ   r+   r"   r   r  )rC   r   rE   rF   rF   rG   test_quadratic_deriv  s   $(zTestInterp.test_quadratic_derivc                 C   s   d}dgdg}}t | j| j|||fd}t|| j| jddd t|| jd d|| jd	 dg|d d |d d gddd d
gd
g}}t | j| j|||fd}t|| j| jddd d S )Nr/   r"   r3   )r"   r4   r  r\   rJ   r   r"   r+   r-   r   r  )rC   r(   der_lder_rrE   rF   rF   rG   test_cubic_deriv  s    zTestInterp.test_cubic_derivc                 C   s   d\}}t |t j}t |}ddg}ddg}t|||||fd}t|||ddd t||d	 d
||d	 dgdd |D  t||d d
||d dgdd |D  d S )N)r   r   )r"   g      ()r-   r"   r  )r-   r3   r   r\   rJ   r   r"   r-   c                 S      g | ]\}}|qS rF   rF   rm   r   valrF   rF   rG   ro          z2TestInterp.test_quintic_derivs.<locals>.<listcomp>r+   c                 S   r  rF   rF   r  rF   rF   rG   ro     r  )r=   rA   astypefloat64r&  r	   r   )rC   r(   rD   r_   r~   r  r  rE   rF   rF   rG   test_quintic_derivs  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 )Nr/   r  )r-   r4   r  r\   rJ   )r   rX   r	   r   r   )rC   r(   r&   r  rE   rF   rF   rG   test_cubic_deriv_unstable  s
   z$TestInterp.test_cubic_deriv_unstablec                 C   s   d}t j| jd f|d  | jdd  | jd d  d | jd f|d  f }t| j| j||dgdgfd}t|| j| jddd	 t|| jd d|| jd dgd
d
gdd d S )Nr-   r   r"   r+   r2   r  r  r\   rJ   r1   r]   )r=   r   rX   r	   r   r   )rC   r(   r&   rE   rF   rF   rG   test_knots_not_data_sites  s   
&
z$TestInterp.test_knots_not_data_sitesc                 C   sX   d}ddg}ddg}t |||dgdgfd}tdd}|d }t|||ddd d S )	Nr/   r1   r$   r"   r1   r  r  r\   rJ   )r	   r=   rU   r   )rC   r(   r_   r~   rE   rX   r   rF   rF   rG   test_minimum_points_and_deriv"  s   z(TestInterp.test_minimum_points_and_derivc                 C   s4  g d }}t t t||dgd fd W d    n1 s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$   r-   r/   r0   r   r   r  r  *   )r  r  r  )rC   r_   r~   lrrF   rF   rG   test_deriv_spec.  s"   




"zTestInterp.test_deriv_specc                 C   s   d}| j }| jd| j  }dgdg}}t|||||fd}t|||ddd t||d d	||d
 d	g|d d	 |d d	 gddd dD ]}t|||d}t|||ddd qHd S )Nr/   r#   )r"   y              @)r"   y      @       @r  r\   rJ   r   r"   r+   )r   r"   r   )rX   r   r	   r   )rC   r(   rX   r   r  r  rE   rF   rF   rG   test_complexE  s   zTestInterp.test_complexc                 C   sD   t dt}t dt}dD ]}t|||d}|| qd S )NrS   r   r   )r=   rA   r  intr	   )rC   r_   r~   r(   rE   rF   rF   rG   test_int_xyV  s   
zTestInterp.test_int_xyc                 C   sF   t ddd}|d d d }|d d d }dD ]	}t|||d qd S )Nr+   r"   r   r   r   r   )r=   rU   r	   )rC   rX   r_   r~   r(   rF   rF   rG   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 )NrS   r-   r+   )	r=   rA   r  floatr?   r@   r9   r;   r	   rC   r_   r~   zrF   rF   rG   test_check_finitej  s   zTestInterp.test_check_finite)r"   r-   r/   r   c                 C   s,   t td}dd |D }t|||d d S )NrS   c                 S   s   g | ]}|d  qS )r-   rF   )rm   arF   rF   rG   ro   w  r  z.TestInterp.test_list_input.<locals>.<listcomp>r   )r   r   r	   r  rF   rF   rG   test_list_inputs  s   zTestInterp.test_list_inputc                 C   s   t jt | jt | jf }dddgfg}dddgfg}t| j|d||fd}t|| j|ddd	 t|| jd
 d|d
 d ddd	 t|| jd d|d
 d ddd	 d S )Nr"   r$   r2   r3   r4   r/   r   r\   rJ   r   r+   )r=   r   r&  rX   r(  r	   r   )rC   r   r  r  rE   rF   rF   rG   test_multiple_rhsz  s   $(zTestInterp.test_multiple_rhsc                 C   s   t jd d\}}t t jj|d}t jj|dddfd}t|||}t|jj|dddf dt jdfg}dt jdfg}t|||||fd	}t|jj|| d dddf d S )
Nry   r/   r   r   r   r   r   r"   r   r   r   r  )r=   rB   r|   r}   r	   r   r'   r   )rC   r(   rD   r_   r~   rE   d_ld_rrF   rF   rG   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 t j
j
|d}t j
j
|dddfd}	dt dfg}
dt dfg}t||	||
|fd}t||	|dd}t|j|jdd d S )Nr/   r   r   r  rI   r]   )r   r   r"   r   r-   )Nr   r  r  typor"   r1   r   ry   r  r   r   r   r   r  r  r   )r=   r&  rX   r	   r   r'   r9   r;   r   r(  rB   r|   r}   r  )rC   r   r   r{  r  r  r(   rD   r_   r~   r  r  rF   rF   rG   test_string_aliases  sJ   




zTestInterp.test_string_aliasesc                 C   sr   t jd d\}}t t jj|d}t jj|d}t||}t||||}t||||}t|j|ddd d S )Nry   )r/   r   r   r\   rJ   )	r=   rB   r|   r}   r   r	   make_interp_full_matrr   r'   )rC   r(   rD   r_   r~   r&   rE   rD  rF   rF   rG   test_full_matrix  s   
zTestInterp.test_full_matrixc                 C   s  t jd d}tdddD ]}t|d d }t t jd|f}td|d D ]6}|d| |df  t t jd|| f7  < ||dd| f  t t jd|| f7  < q*t j||f}||d|| df< t j||f}||| dd|f< t ||f}tt|| d dD ]#\}}	|	d	k rt j||	d
||d|	f< qt j||	d
|||	df< qt j|}
t	t
||||
|t j||
dd qdS )z
        Random elements in diagonal matrix with blocks in the
        left lower and right upper corners checking the
        implementation of Woodbury algorithm.
        ry      r/       r-   r"   Nr+   r   )offsetr\   r]   )r=   rB   r|   r   r  diagflatr  rN  diagonalr   r   linalgsolve)rC   rD   r(   r  r  r   urlldr   rE   rF   rF   rG   test_woodbury  s,   46zTestInterp.test_woodburyN),r   r   r   r=   rU   ry  rX   r&  r   r  r  r  rP   r   r!  r  r  r  r  r  r  r  r  r  r  r  r  r  r  xfailr  r  r  r  r  r  r  r  r  r  r  r  r  r  rF   rF   rF   rG   r  D  sP    









	

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   r=   r  r  r   rZ  r   evaluate_all_bsplslr  )r_   r~   r&   r(   rD   Ar   r#  leftbbr'   rF   rF   rG   r    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   )mapr=   rd   r   r  r  r   rZ  r   r  dotTr  r  )r_   r~   r&   r(   r1  rD   r  r   r#  r  r  r   Yr'   rF   rF   rG   make_lsq_full_matrix
  s   r
  c                   @   s   e Zd Zejd d\ZZeejeZ	ejeZ
eee	d e	d deZdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd ZdS )TestLSQry   )r   r/   r   r+   r   c                 C   s   | j | j| j| jf\}}}}t||||\}}t||||}t|j| t|jj	|j
| d f |\}}	tjj||dd\}
}}}t|j|
 d S )Nr"   r+   )rcond)r_   r~   r&   r(   r
  r
   r   r'   r   r   r   r=   r  lstsq)rC   r_   r~   r&   r(   c0AYrE   aar   rU  r   rF   rF   rG   
test_lstsq0  s   zTestLSQ.test_lstsqc                 C   s|   | j | j| j| jf\}}}}t|}t||||}t|||||d}t|j|jdd t|j|jdd t	|j|j d S )N)wr\   r]   )
r_   r~   r&   r(   r=   r   r
   r   r'   r   )rC   r_   r~   r&   r(   r  rE   b_wrF   rF   rG   test_weights?  s   
zTestLSQ.test_weightsc                 C   sd   | j | j| j| jf\}}}}tjj|dddfd}t||||}t|jj	|j
| d dddf d S )Nr   r   r   r   r"   )r_   r&   r(   rD   r=   rB   r
   r   r'   r   r   )rC   r_   r&   r(   rD   r~   rE   rF   rF   rG   r  K  s   $zTestLSQ.test_multiple_rhsc                 C   sv   | j | j| j}}}| jd }t||||}t||j||}t||j||}t||||d||  ddd d S )Ny      ?       @r#   rI   rJ   )r_   r&   r(   r~   r
   r   r   r   )rC   r_   r&   r(   r  rE   r   r   rF   rF   rG   r  R  s   
(zTestLSQ.test_complexc                 C   s@   t dt}t dt}t|dd}t|||dd d S )NrS   r"   r   )r=   rA   r  r  r   r
   rC   r_   r~   r&   rF   rF   rG   r  ]  s   zTestLSQ.test_int_xyc                 C   sH   t ddd}|d d d }|d d d }t|d}t|||dd d S )Nr+   r"   r   r/   r   )r=   rU   r   r
   )rC   rX   r_   r~   r&   rF   rF   rG   r  d  s
   
zTestLSQ.test_sliced_inputc                 C   sV   t dt}|d }t|d}t jt jt j fD ]}||d< ttt	||| qd S )N   r-   r/   r+   )
r=   rA   r  r  r   r?   r@   r9   r;   r
   )rC   r_   r~   r&   r  rF   rF   rG   test_checkfinitem  s   
zTestLSQ.test_checkfinitec                 C   sL   | j | j| j}}}|jdd |jdd |jdd t|||d d S )NFr  )r_   r~   r&   )r_   r~   r&   r  r
   r  rF   rF   rG   r  w  s
   zTestLSQ.test_read_onlyN)r   r   r   r=   rB   r|   rD   r(   r}   r_   r~   r   rU   r&   r  r  r  r  r  r  r  r  rF   rF   rF   rG   r  &  s    	
r  c                 C   s    t jt jt jtd| S )Ndata)ospathjoinabspathdirname__file__)basenamerF   rF   rG   	data_file  s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestSmoothingSplinec                 C   s  t jd d}t t j|d d }|d t d|  |d  t jdd| }tt t	||dd   W d    n1 sDw   Y  tt t	|dd  | W d    n1 saw   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 )Nry   r   r0   r-   r/   r1   r   r"   r+   r   z)``x`` and ``y`` length must be at least 5r~  )r=   rB   r|   r}   r   r&  normalr9   r;   r   re   rv  rA   rH  rP   r   )rC   rD   r_   r~   x_duplexception_messagerF   rF   rG   test_invalid_input  s6   .







"z&TestSmoothingSpline.test_invalid_inputc                 C   sh   t td}|d }|d }|d }W d   n1 sw   Y  t|||}t||ddd dS )ae  
        Data is generated in the following way:
        >>> np.random.seed(1234)
        >>> n = 100
        >>> x = np.sort(np.random.random_sample(n) * 4 - 2)
        >>> y = np.sin(x) + np.random.normal(scale=.5, size=n)
        >>> np.savetxt('x.csv', x)
        >>> np.savetxt('y.csv', y)

        We obtain the result of performing the GCV smoothing splines
        package (by Woltring, gcvspl) on the sample data points
        using its version for Octave (https://github.com/srkuberski/gcvspl).
        In order to use this implementation, one should clone the repository
        and open the folder in Octave.
        In Octave, we load up ``x`` and ``y`` (generated from Python code
        above):

        >>> x = csvread('x.csv');
        >>> y = csvread('y.csv');

        Then, in order to access the implementation, we compile gcvspl files in
        Octave:

        >>> mex gcvsplmex.c gcvspl.c
        >>> mex spldermex.c gcvspl.c

        The first function computes the vector of unknowns from the dataset
        (x, y) while the second one evaluates the spline in certain points
        with known vector of coefficients.

        >>> c = gcvsplmex( x, y, 2 );
        >>> y0 = spldermex( x, c, 2, x, 0 );

        If we want to compare the results of the gcvspl code, we can save
        ``y0`` in csv file:

        >>> csvwrite('y0.csv', y0);

        z
gcvspl.npzr_   r~   y_GCVSPLNg-C6?rJ   )r=   loadr   r   r   )rC   r  r_   r~   r&  y_comprrF   rF   rG   test_compare_with_GCVSPL  s   )
z,TestSmoothingSpline.test_compare_with_GCVSPLc                 C   s   t jd d}t t j|d d }|d t d|  |d  t jdd| }t||dd}t||dd	d
}t 	|d |d d| }t
||||dd dS )z
        In case the regularization parameter is 0, the resulting spline
        is an interpolation spline with natural boundary conditions.
        ry   r   r0   r-   r/   r1   r   )lamr   r  r   r+   rI   r]   N)r=   rB   r|   r}   r   r&  r"  r   r	   rU   r   )rC   rD   r_   r~   
spline_GCVspline_interpgridrF   rF   rG   test_non_regularized_case  s   .
z-TestSmoothingSpline.test_non_regularized_casec           
      C   s   t jd d}t t j|d d }|d t d|  |d  t jdd| }t||}t jjt	ddd	D ]9}t 
|}d
||< t|||}t||| ||  }t||| ||  }	||	k rttd|dd|	dq;d S )Nry   r   r0   r-   r/   r1   r   rS   r   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )r=   rB   r|   r}   r   r&  r"  r   choicer   rH  absr;   )
rC   rD   r_   r~   r   indr  spl_worigweightedrF   rF   rG   test_weighted_smoothing_spline  s&   .

z2TestSmoothingSpline.test_weighted_smoothing_splineN)r   r   r   r%  r)  r.  r5  rF   rF   rF   rG   r!    s
    6r!  c                    sv   | \|\t  d }|d ksJ t  d d ks(J t fddt|D S )z-A naive 2D tensort product spline evaluation.r"   c                 3   sF    | ]}t D ]} ||f t| t| V  qqd S rW  )r   r   )rm   ixiyr'   r(   nytxtyr_   r~   rF   rG   rY    s    2zbspline2.<locals>.<genexpr>r`  )r   r&   r'   r(   nxrF   r8  rG   bspline2  s   r=  c                 C   rQ  )Nr   r"   r$   r1   r   rT  rF   rF   rG   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\  rW  r>  r]  r^  rF   rG   rY  *  r_  zbspline.<locals>.<genexpr>r`  ra  rF   r^  rG   r	  '  s    r	  c                   @   s   e Zd ZdddZdd ZdS )
NdBSpline0r/   c                 C   sv   t |}|t |jksJ zt | W n t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 rW  )operatorindex)rm   kirF   rF   rG   rY  F  s    z&NdBSpline0.__init__.<locals>.<genexpr>c                 s   s    | ]
}t j|td V  qdS )r   N)r=   rd   r  )rm   tirF   rF   rG   rY  G  s    N)r   r   r:   r  r(   r&   r'   )rC   r&   r'   r(   r   rF   rF   rG   __init__.  s   
zNdBSpline0.__init__c           
         s8  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~|S )Nnoner"   r   c                    s,   g | ]}t  | j|   | d  qS )r"   )r   r(   rm   r  )r   rC   rF   rG   ro   b     , z'NdBSpline0.__call__.<locals>.<listcomp>c                    s.   g | ]}t | j|  | j| qS rF   )r   r(   r&   rF  )idxrC   r_   rF   rG   ro   d  s    &)r   r&   r   r(   r=   rZ  r  	itertoolsproductr'   prod)
rC   r_   r   r  tdxdr(   resultiterstermrF   )r   rH  rC   r_   rG   __call__J  s(   



0&

zNdBSpline0.__call__Nr/   )r   r   r   rD  rQ  rF   rF   rF   rG   r?  -  s    
r?  c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zejdd d!gejd"d d!gd#d$ Zejd%d&d'gd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd S )4TestNdBSplinec           
      C   s   t jd}d\}}d}t |j|| d d}|j||fd}t|||}t|f||}|jdd}	t||	d d d f ||	dd ||	d d d f j|	jd	 |jd fks\J d S )
Nr3  r7   r   r"   r   ru  r\   r]   r   )	r=   rB   r7  r}   r8  r   r   r   r   )
rC   r9  rD   r(   n_trr&   r'   rE   nbxirF   rF   rG   test_1Dl  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   r/   r   r-   r=   rA   r	   r&   r'   rC   r_   r~   r   y_1r*  t2rV  rF   rF   rG   make_2d_case}  s   
$
zTestNdBSpline.make_2d_casec                 C   s   t d}|d }t||dd}t dd }|d d|  }t||dd}|j|jf}|jd d d f |jd d d f  }|||j|jfS )Nr   r/   r   r   r   r-   )r=   rA   r	   r&   r'   r(   rY  rF   rF   rG   make_2d_mixed  s   
$zTestNdBSpline.make_2d_mixedc                    s   g d}|   \ dd |D }t fdd|D |dd t dd}||jt|fks5J t|||dd tjd	}|jd
dd }||}|jdksWJ |	dj
\}}t| |d |d d|   dd d S )Nr   r6   )r6   r"   )r   r   c                 S   (   g | ]\}}|d  |d  d|   qS r  rF   rm   r_   r~   rF   rF   rG   ro        ( z3TestNdBSpline.test_2D_separable.<locals>.<listcomp>c                    ri   rF   r=  rm   r   rV  r(   r[  rF   rG   ro     rp   r\   r]   r/   r   r3  )r0   r/   r-   r   r   )r0   r/   )r+   r-   r-   )r\  r   r   r   r   r=   rB   r7  r8  re   r  ravel)rC   rV  targetbspl2r9  rN  r_   r~   rF   re  rG   test_2D_separable  s(   
zTestNdBSpline.test_2D_separablec                 C   s  d}g d}dd |D }|   \}}}t||||f}d}t||dd}	|	|}
t||||}|
jdk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 )Nr-   r^  c                 S   r`  r  rF   ra  rF   rF   rG   ro     rb  z5TestNdBSpline.test_2D_separable_2.<locals>.<listcomp>r_  r/   r   )r0   r0   r\   r]   r+   r   gvIh%,=r   r   r-   r-   )r-   r-   )	r\  r=   r   r   r   r   r'   rd   re   )rC   r   rV  rg  r[  rV  r(   c2_4r   bspl2_4rN  
val_singlec2_22bspl2_22rF   rF   rG   test_2D_separable_2  sB   
0
  
z!TestNdBSpline.test_2D_separable_2c              
      s  t jd}dt jddddt |jddd ddddf	 t jddddt |jddd ddddf	 |jj d j d fd tf d	}d
}t||t	|f dd t j
g dg df }t|| fdd|D dd d S )Nr3  r/   r   r   r   r   r0   r"   r   )r$   r$   r\   r]   r"   r   r-   皙?g? @c                    s   g | ]}t |f qS rF   rc  rd  r'   r(   r:  r;  rF   rG   ro     s    z0TestNdBSpline.test_2D_random.<locals>.<listcomp>)r=   rB   r7  r   r}   r8  r   r   r   r=  r   )rC   r9  r   rV  rF   ru  rG   test_2D_random  s"   ..$

zTestNdBSpline.test_2D_randomc                 C   sf   |   \}}}}g d}dd |D }t||||fd}||jt|fks(J t|||dd d S )N)ffffff?r=  )r6   g333333@)r=  rF  c                 S   (   g | ]\}}|d  |d d|   qS r  rF   ra  rF   rF   rG   ro     rb  z/TestNdBSpline.test_2D_mixed.<locals>.<listcomp>r   r\   r]   )r]  r   r   r   r   )rC   r[  rV  kxkyrV  rg  rh  rF   rF   rG   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 )Nrw  r   r  r   c                 S   s,   g | ]\}}d |d  |d d|   qS r  rF   ra  rF   rF   rG   ro      rG  z4TestNdBSpline.test_2D_derivative.<locals>.<listcomp>r\   r]   r"   r"   c                 S   s(   g | ]\}}d |d  d| d  qS r  rF   ra  rF   rF   rG   ro     rb  )r   r   c                 S   ry  r  rF   ra  rF   rF   rG   ro     rb  )r+   r   )r+   r   r"   )r]  r   r   r9   r;   )rC   r[  rV  rz  r{  rV  rh  r   rF   rF   rG   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 )Nr3  )r-   r/   r   r   r   r/   r   r0   r"   rq  rr  r   c                       g | ]} |qS rF   rF   rm   r   bspl2_0rF   rG   ro      r  z6TestNdBSpline.test_2D_mixed_random.<locals>.<listcomp>r\   r]   )r=   rB   r7  r   r}   r8  r   r   r   r?  r   	rC   r9  rz  r{  r:  r;  r'   rV  rh  rF   r  rG   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   r/   r   r-   c                 S      g | ]\}}||fqS rF   rF   rm   r  rE   rF   rF   rG   ro   /      z0TestNdBSpline.test_tx_neq_ty.<locals>.<listcomp>r\   r]   )r=   rA   r	   r'   r   r&   r(   r   rI  rJ  r   anyr   re   r   )rC   r_   r~   spl_xspl_yr   rg   valuesrgirV  bxirF   rF   rG   test_tx_neq_ty"  s   
$0zTestNdBSpline.test_tx_neq_tyc           
      C   s   t d}|d }t||dd}|d d|  }t||dd}|d d|  d }t||dd}|j|j|jf}|jd d d d f |jd d d d f  |jd d d d f  }	||	dfS )Nr   r/   r   r-   r"   rX  )
rC   r_   r~   r   rZ  r*  y_2spl_2r[  rV  rF   rF   rG   make_3d_case6  s   

zTestNdBSpline.make_3d_casec                 C   s   t jd}|jddd \}}}|d |d d|   |d d|  d  }|  \}}}t||dd}	d	d
 t|||D }
|	|
}|jdksKJ t||dd d S )Nr3  r/   r8   r   r   r/   r-   r"   r   c                 S      g | ]}|qS rF   rF   rm   r   rF   rF   rG   ro   Q  rk  z3TestNdBSpline.test_3D_separable.<locals>.<listcomp>)r8   r\   r]   )	r=   rB   r7  r8  r  r   zipr   r   )rC   r9  r_   r~   r  rg  t3c3r(   bspl3rV  rN  rF   rF   rG   test_3D_separableI  s   ,zTestNdBSpline.test_3D_separablec           
      C   sd  |   \}}}t||dd}tjd}|jddd \}}}dd t|||D }	t||	d	d
d|d  |d d|   |d d|  d  dd t||	dd
d| |d d|   |d d|  d  dd t||	dd
d| d|d  d  |d d|  d  dd t||	dd
d| d|d  d  d dd t||	dd
tt	|	dd d S )Nr/   r   r3  r  r   r   c                 S   r  rF   rF   r  rF   rF   rG   ro   [  rk  z4TestNdBSpline.test_3D_derivative.<locals>.<listcomp>)r"   r   r   r   r-   r"   r\   r]   )r-   r   r   r   )r-   r"   r   )r-   r"   r/   )r-   r"   r0   )
r  r   r=   rB   r7  r8  r  r   r  r   )
rC   r  r  r(   r  r9  r_   r~   r  rV  rF   rF   rG   test_3D_derivativeV  s(   0,,
z TestNdBSpline.test_3D_derivativec           	   
      sL  t jd}d}t jddddt |jddd ddddf	 }t jddddt |jddd ddddf	 }t jddddt |jddd ddddf	 }|j|j| d |j| d |j| d fd}t|||f||d	}t|||f||d	 d
}t	|| |dd t j
g dg dg df }t	|| fdd|D dd d S )Nr3  r/   r   r   r   r   r0   r"   r   )r$   r$   r"   r\   r]   rq  rr  g?rx  gffffff?c                    r  rF   rF   r  spl_0rF   rG   ro   }  r  z0TestNdBSpline.test_3D_random.<locals>.<listcomp>)r=   rB   r7  r   r}   r8  r   r   r?  r   r   )	rC   r9  r(   r:  r;  tzr'   r   rV  rF   r  rG   test_3D_randoml  s   ...0
$zTestNdBSpline.test_3D_randomc              
   C   s  t jd}d}t jddddt |jddd ddddf	 }t jddddt |jddd ddddf	 }t jddddt |jddd ddddf	 }|j|j| d |j| d |j| d fd|j|j| d |j| d |j| d fdd	  }t|||f||d
}t|||f|j|d
}t|||f|j	|d
}	t j
g dg dg df }
t||
||
d	|	|
  dd d S )Nr3  r/   r   r   r   r   r0   r"   r#   r   rq  rr  r  r\   r]   )r=   rB   r7  r   r}   r8  r   r   r   r   r   r   )rC   r9  r(   r:  r;  r  r'   r   spl_respl_imrV  rF   rF   rG   test_3D_random_complex  s$   ....2

z$TestNdBSpline.test_3D_random_complex
cls_extrapNTcall_extrapc                 C   s   |   \}}}t||d|d}g dg dg d}}}	ttj|||	f\}}}	dd t|||	D }
|d |d d|   |	d d|	  d	  }||
|d
}t||dd d S )Nr/   r(   rc   r+   r   r   r   r$  r+   g            @c                 S   r  rF   rF   r  rF   rF   rG   ro     rk  z?TestNdBSpline.test_extrapolate_3D_separable.<locals>.<listcomp>r-   r"   rb   r\   r]   r  r   r  r=   rd   r  r   )rC   r  r  r  r  r(   r  r_   r~   r  rV  rg  rN  rF   rF   rG   test_extrapolate_3D_separable  s   ,z+TestNdBSpline.test_extrapolate_3D_separabler   )FT)TNc                 C   s   |   \}}}|\}}t||d|d}g dg dg d}}	}
ttj||	|
f\}}	}
dd t||	|
D }|d |	d d|	   |
d d|
  d	  }|||d
}t||dd d S )Nr/   r  r  r  r  c                 S   r  rF   rF   r  rF   rF   rG   ro     rk  zATestNdBSpline.test_extrapolate_3D_separable_2.<locals>.<listcomp>r-   r"   rb   r\   r]   r  )rC   r   r  r  r(   r  r  r  r_   r~   r  rV  rg  rN  rF   rF   rG   test_extrapolate_3D_separable_2  s   ,z-TestNdBSpline.test_extrapolate_3D_separable_2c                 C   s   |   \}}}t||dd}g dg dg d}}}ttj|||f\}}}dd t|||D }|d |d d|   |d d|  d	  }	||d
d}
t|
d sXJ t|
d saJ t|
d	d |	d	d dd d S )Nr/   r   )r  r"   r   )r   r   r$  )r+   r   r  c                 S   r  rF   rF   r  rF   rF   rG   ro     rk  zETestNdBSpline.test_extrapolate_false_3D_separable.<locals>.<listcomp>r-   r"   Frb   r   r+   r\   r]   )r  r   r  r=   rd   r  r   r   )rC   r  r  r(   r  r_   r~   r  rV  rg  rN  rF   rF   rG   #test_extrapolate_false_3D_separable  s   ,"z1TestNdBSpline.test_extrapolate_false_3D_separablec              	   C   s  |   \}}}t||dd}tddtjdddtjg}tdddtjdd	d	g}td
dddtjddg}dd t|||D }|d |d d|   |d d|  d  }	t|t|B t|B }
tj|	|
< ||}t||
  szJ t||	dd d S )Nr/   r   r  r"   r-   r   r   rF  r$  r+   r  c                 S   r  rF   rF   r  rF   rF   rG   ro     rk  z/TestNdBSpline.test_x_nan_3D.<locals>.<listcomp>r\   r]   )	r  r   r=   rd   r?   r  r   r   r   )rC   r  r  r(   r  r_   r~   r  rV  rg  r   rN  rF   rF   rG   test_x_nan_3D  s   ,
zTestNdBSpline.test_x_nan_3Dc           	         s  t jd}d\}}t |jdddd}t j|d f| ||d f| f }t |jdddd}t j|d f| ||d f| f }|d d d jj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 )Nr3  r/   r/   r   r0      r6  r+   r-   r"   r   rq  rr  r   c                    r  rF   rF   r  r  rF   rG   ro     r  z7TestNdBSpline.test_non_c_contiguous.<locals>.<listcomp>r\   r]   )r=   rB   r7  r}   r8  r   flagsc_contiguousr   r  r   r   r?  r   r  rF   r  rG   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 )Nr/   r   FrZ   )r  r   r   r  	writeable)rC   r  r  r(   r  r   bspl3_rF   rF   rG   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 )NrZ   )r0   r   r   r   gؗҜ<r]   r/   zData and knots*r~  r"   r-   )
r  r=   rd   r   r   r   r   todenser9   r;   )rC   r  r  r(   rV  dmdm1rF   rF   rG   test_design_matrix  s   
"z TestNdBSpline.test_design_matrix)r   r   r   rW  r\  r]  ri  rp  rv  r|  r~  r  r  r  r  r  r  r  rP   r   r!  r  r  r  r  r  r  r  rF   rF   rF   rG   rS  j  s4    (	
rS  c                   @   s   e Zd Zdd Zdd Zejdg ddd Zd	d
 Z	dd Z
dd Zejdejejgdd Zdd Zejdg ddd Zdd ZdS )
TestMakeNDc                 C   s   t d}t dd }|d d d f d |d d|  d d d f  }dd t||D }t||f|dd}t||| d	d
 t||d dd}t||d d|  dd}|jd d d f |jd d d f  }t||jddd ddl	m
}	 |	||f|dd}
t|
|||dd
 d S )Nr   r   r/   r-   c                 S   r  rF   rF   r  rF   rF   rG   ro   	  r  z7TestMakeND.test_2D_separable_simple.<locals>.<listcomp>r"   r   rI   r]   r  r   rJ   )r   linearmethodr\   )r=   rA   rI  rJ  r   r   rf  r	   r'   scipy.interpolater   )rC   r_   r~   r  rV  rg   r  r  r   RGIr  rF   rF   rG   test_2D_separable_simple	  s   
0$z#TestMakeND.test_2D_separable_simplec           
      C   s  t d}t d}dd t||D }|d d d f d |d d|  d d d f  }t ||||f}t||f|dtjd}||}t ||||f}|jdksUJ 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  rF   rF   r  rF   rF   rG   ro   #	  r  z>TestMakeND.test_2D_separable_trailing_dims.<locals>.<listcomp>r/   r-   r(   solver)$   r0   r0   r\   r]   rj  )r  r-   r-   )r=   rA   rI  rJ  r   r   sslspsolver   r   re   )
rC   r_   r~   rV  r  values4rg   rN  rg  values22rF   rF   rG   test_2D_separable_trailing_dims	  s&   

0


z*TestMakeND.test_2D_separable_trailing_dimsr(   )r  r}  )r/   r"   )r"   r/   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  rF   rF   r  rF   rF   rG   ro   >	  r  z,TestMakeND.test_2D_mixed.<locals>.<listcomp>r/   r-   r  rI   r]   )	r=   rA   rI  rJ  r   r  r  r   rf  )rC   r(   r_   r~   rV  r  rg   rF   rF   rG   r|  9	  s   
0zTestMakeND.test_2D_mixedc              	   C   sT   t g d}t g d}t g dg dg dg dg dg dg}|||fS )N)r   r2   r3   r4   r>  r?  )r"   r-   r"   r-   r"   r"   )r"   r-   r/   r-   r"   r"   )r"   r-   r-   r-   r"   r"   )r=   r   r  rF   rF   rG   _get_sample_2d_dataD	  s   

zTestMakeND._get_sample_2d_datac                 C   sd   |   \}}}t||f|dd}t||f|dd}tg dg dgj}t||||dd d S )	Nr"   r   r  r  r"   gffffff@g333333@r   ffffff
@333333?r/   r"   r  r  r4   r  r$   r/   r\   r]   r  r   r   r=   r   r  r   rC   r_   r~   r  rg   r  rV  rF   rF   rG   test_2D_vs_RGI_linearT	  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 )	Nr/   r  cubic_legacyr  r  r  r\   r]   	r  r   r  r  r   r=   r   r  r   r  rF   rF   rG   test_2D_vs_RGI_cubic^	     
zTestMakeND.test_2D_vs_RGI_cubicr  c                 C   sh   |   \}}}t||f|d|dd}t||f|dd}tg dg dgj}t||||dd	 d S )
Nr/   gư>)r(   r  rL   r  r  r  r  r\   r]   r  )rC   r  r_   r~   r  rg   r  rV  rF   rF   rG   test_2D_vs_RGI_cubic_iterativeh	  s   
z)TestMakeND.test_2D_vs_RGI_cubic_iterativec                 C   r  )	Nr   r  quintic_legacyr  r  r  r\   r]   r  r  rF   rF   rG   test_2D_vs_RGI_quinticw	  r  z!TestMakeND.test_2D_vs_RGI_quinticzk, meth))r"   r  )r/   r  )r   r  c                 C   s   t jd}t |jdd}t |jdd}t |jdd}|jdd}t|||f||tjd}t|||f||d}	t jjd	d
dd}
t	||
|	|
dd d S )Ni@ r   r   r   r   r   r  r  gffffff?rt  r7   r6  r\   r]   )
r=   rB   r7  cumsumr8  r   r  r  r   r   )rC   r(   methrndmr_   r~   r  r  rg   r  rV  rF   rF   rG   test_3D_random_vs_RGI	  s   z TestMakeND.test_3D_random_vs_RGIc                 C   s   |   \}}}ddi}ttdd t||f|fddi| W d    n1 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(   r/   )r  r9   r;   r   r=   r   )rC   r_   r~   r  solver_argsrF   rF   rG   test_solver_err_not_converged	  s   &"z(TestMakeND.test_solver_err_not_convergedN)r   r   r   r  r  rP   r   r!  r|  r  r  r  r  gmresgcrotmkr  r  r  r  rF   rF   rF   rG   r  
	  s     






r  c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )
TestFpchecc                 C   s   d}t ddd}t d}tjtdd t||| W d    n1 s)w   Y  tjtdd t||| W d    d S 1 sHw   Y  d S )Nr"   r  r-   r   z1D sequencer~  )r=   rA   re   rP   r   r;   _bfpcheckrC   r(   r&   r_   rF   rF   rG   test_1D_x_t	  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 )Nr/   r-   r"   r8   rS   z	Need k+1*r~  )	r=   rA   r   fpchecrP   r   r;   r  r  )rC   r(   rD   r1  r&   r_   rF   rF   rG   test_condition_1	  s"   



"zTestFpchec.test_condition_1c                 C   s,  d}dg|d  dg dg|d   }g d}t |||dk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 )Nr/   r   r"   r-   r   )r"   r-   r/   r0   r=  r+   rz   zLast k knots*r~  zFirst k knots*r   r  r  r  rv  rP   r   r;   )rC   r(   r&   r_   ttrF   rF   rG   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 )
Nr/   r   r"   r-   r   r"   r-   r/   rF  r0   r=     zInternal knots*r~  )r   r  r  r  rP   r   r;   r  rF   rF   rG   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 )
Nr/   r   r"   r   r  r   zOut of bounds*r~  r+   r  )rC   r(   r&   r_   rX   rF   rF   rG   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"   r-   r-   )rs  rs  rs  r[   Schoenberg-Whitney*r~  )r   r   r   r   r  rP   r   r;   r  r  r  rF   rF   rG   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  rF   rF   rG   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 )	Nr/   r   r"   r-   r   r[   r  r~  r  r  rF   rF   rG   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 )Nr/   r   r"   r-   r   rs  r0   r[   r  r~  r  r  rF   rF   rG   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   r-   r/   r0   r   r   r   r   )r"   r"   r"   @r  r  r$  r[   r  r~  r  r  rF   rF   rG   test_condition_5_34
  s   "zTestFpchec.test_condition_5_3N)r   r   r   r  r  r  r  r  r  r  r  r  r  rF   rF   rF   rG   r  	  s    r  r  )rp  r/   rR  )Or  r@  rI  numpyr=   numpy.testingr   r   r   rP   r   r9   r  r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   scipy.linalgr  r  scipy.sparse.linalgsparser  scipy.interpolate._bsplinesr   r   r   r   r   scipy.interpolate._fitpack_implinterpolate_fitpack_implr   scipy._lib._utilr   scipy.interpolate._ndbspliner   r   r    r  r!   r"  rP  rS  rk   rq   r   r^   r   rN   rO  rx  r  r  r
  r  r   r!  r=  r   r	  r?  rS  r  r  rF   rF   rF   rG   <module>   sl    P    Ry	
	
 `   -
Z 	=   # 