a
    ‡ù»jÕx ã                   @   s"  d dl Z d dlZd dlZd dlZd dlmZmZmZ d dl	m
Z d dl	Z	d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlm Z! d dl"m#  m Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,  m-Z. d dl/m0Z0 d dl1m2Z2 d dlm3Z3 d d	lm4Z5 G d
d„ dƒZ6G dd„ dƒZ7dd„ Z8dd„ Z9dd„ Z:dd„ Z;dd„ Z<dd„ Z=d>dd„Z>d?dd„Z?d d!„ Z@G d"d#„ d#ƒZAG d$d%„ d%ƒZBd&d'„ ZCd@d(d)„ZDG d*d+„ d+ƒZEd,d-„ ZFG d.d/„ d/ƒZGd0d1„ ZHd2d3„ ZId4d5„ ZJG d6d7„ d7ƒZKG d8d9„ d9ƒZLG d:d;„ d;ƒZMG d<d=„ d=ƒZNdS )Aé    N)Úassert_equalÚassert_allcloseÚassert_)Úraises)ÚBSplineÚBPolyÚPPolyÚmake_interp_splineÚmake_lsq_splineÚ_bsplÚsplevÚsplrepÚsplprepÚsplderÚ
splantiderÚsprootÚsplintÚinsertÚCubicSplineÚ	NdBSplineÚmake_smoothing_splineÚRegularGridInterpolator)Ú_not_a_knotÚ_augkntÚ_woodbury_algorithmÚ_periodic_knotsÚ_make_interp_per_full_matr)Ú	AxisError)Úmake_ndbspl)Údfitpack)Ú	_bsplinesc                   @   s   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zej  !d9e"d:d;ƒ¡d<d=„ ƒZ#d>d?„ Z$d@dA„ Z%ej  !dBg dC¢¡ej  !dDe"dEƒ¡dFdG„ ƒƒZ&dHdI„ Z'dJdK„ Z(dLdM„ Z)ej  !dNg dO¢¡dPdQ„ ƒZ*ej  !dNg dO¢¡dRdS„ ƒZ+dTdU„ Z,dVdW„ Z-dXS )YÚTestBSplinec              	   C   sî  t ttftfi tddgdgdd�¤Ž tjdd��4 t ttfi tdtjgdgdd�¤Ž W d   ƒ n1 sl0    Y  t ttfi tdtjgdgdd�¤Ž t ttfi tddgdgdd�¤Ž t ttfi tdgdggdgdd�¤Ž t ttfi tg d	¢dgdd�¤Ž t ttfi tg d
¢ddgdd�¤Ž t ttfi tg d¢g d¢dd�¤Ž t ttfi tg d¢g d¢dd�¤Ž t ttfi tg d¢g d¢dd�¤Ž d\}}t 	|| d ¡}tj
 
|¡}t|||ƒ}t||jƒ t||jƒ t||jƒ d S )Né   ù              ð?ç      ð?r   ©ÚtÚcÚkÚignore)Úinvalidéÿÿÿÿ©r   r"   é   ©r   r"   r-   é   é   r-   )ç        r1   r$   ç       @ç      @ç      @)r$   r$   r$   Zcubicç      @)r1   r   r"   r"   r-   r/   )r$   r"   r"   ©é   r/   )Úassert_raisesÚ	TypeErrorÚ
ValueErrorr   ÚdictÚnpZerrstateÚnanÚinfÚarangeÚrandomr   r&   r'   r   r(   )ÚselfÚnr(   r&   r'   Úb© rD   úKE:\soccer\ml_env\Lib\site-packages\scipy/interpolate/tests/test_bsplines.pyÚ	test_ctor!   s8    ÿB$"&"
ÿ
ÿ
ÿ
ÿzTestBSpline.test_ctorc                 C   s|   t ƒ }|j}t|j|d ddd� t|j|d ddd� t|j|d ƒ t t	¡� d|_W d   ƒ n1 sn0    Y  d S )Nr   çVçž¯Ò<©ÚatolÚrtolr"   r-   Zfoo)
Ú_make_random_splineÚtckr   r&   r'   r   r(   Úpytestr   ÚAttributeError)rA   rC   rL   rD   rD   rE   Útest_tckD   s    zTestBSpline.test_tckc                 C   sf   t  ddd¡}tddgdgdd�}t||ƒdƒ tg d¢ddgdd�}t||ƒt  |d	k dd¡ƒ d S )
Nr   r"   é
   r3   r%   r/   )r   çffffffÖ?r"   r0   rQ   )r<   Úlinspacer   r   Úwhere©rA   ÚxxrC   rD   rD   rE   Útest_degree_0P   s
    zTestBSpline.test_degree_0c                 C   s–   g d¢}g d¢}d}t |||ƒ}t ddd¡}t|d t|ƒ |d t|d ƒ  |d t|d ƒ  ||ƒdd	� tt||||fƒ||ƒdd	� d S )
Nr.   ©r"   r-   r/   r"   r/   é2   r   r-   ç›+¡†›„=©rI   )r   r<   rR   r   ÚB_012r   )rA   r&   r'   r(   rC   ÚxrD   rD   rE   Útest_degree_1Y   s    8ÿzTestBSpline.test_degree_1c                 C   s¤   d}t  dg|d  dg|d   ¡}t  g d¢¡}t| dd¡ddgƒ}t|||ƒ}t  ddd¡}t||d	d
�||d	d
�dd� tt||||fƒ||ƒdd� d S )Nr/   r   r"   ©r$   r2   r3   r4   r+   g      ð¿r2   rP   T©ÚextrapolaterY   rZ   )r<   Úasarrayr   Úreshaper   rR   r   r   )rA   r(   r&   r'   ÚbpÚbsplrU   rD   rD   rE   Útest_bernsteind   s    "ÿÿzTestBSpline.test_bernsteinc                    s‚   t ƒ }|j\‰‰ ‰t ˆˆ ˆˆ d  d¡}||ƒ}‡ ‡‡fdd„|D ƒ}t||dd� ‡ ‡‡fdd„|D ƒ}t||dd� d S )Nr"   rX   c                    s   g | ]}t |ˆˆ ˆƒ‘qS rD   ©Ú_naive_eval©Ú.0r\   ©r'   r(   r&   rD   rE   Ú
<listcomp>z   ó    z4TestBSpline.test_rndm_naive_eval.<locals>.<listcomp>rY   rZ   c                    s   g | ]}t |ˆˆ ˆƒ‘qS rD   )Ú_naive_eval_2rh   rj   rD   rE   rk   }   rl   )rK   rL   r<   rR   r   )rA   rC   rU   Zy_bZy_nZy_n2rD   rj   rE   Útest_rndm_naive_evalr   s    z TestBSpline.test_rndm_naive_evalc                 C   sP   t ƒ }|j\}}}t || || d  d¡}t||ƒt||||fƒdd� d S )Nr"   rX   rY   rZ   ©rK   rL   r<   rR   r   r   ©rA   rC   r&   r'   r(   rU   rD   rD   rE   Útest_rndm_splev€   s    zTestBSpline.test_rndm_splevc                 C   s‚   t j d¡ t  t j d¡¡}t j d¡}t||ƒ}t|Ž }|j|j }}t  || || d  d¡}t	||ƒt
||ƒdd� d S )NéÒ  é   r"   éP   rY   rZ   )r<   r@   ÚseedÚsortr   r   r&   r(   rR   r   r   )rA   r\   ÚyrL   rC   r&   r(   rU   rD   rD   rE   Útest_rndm_splrep†   s    
zTestBSpline.test_rndm_splrepc                 C   sJ   t ƒ }t |j¡|_t |j|j |j|j d  d¡}t||ƒdƒ d S )Nr"   éd   r$   )rK   r<   Ú	ones_liker'   rR   r&   r(   r   )rA   rC   rU   rD   rD   rE   Útest_rndm_unity’   s    $zTestBSpline.test_rndm_unityc           	      C   s~   d\}}t  t j |¡¡}t jj|ddfd�}t|||ƒ}|| || d   }}||| t j d¡  }t||ƒjdƒ d S )N©é   r/   é   é   ©Úsizer"   ©r/   r0   é   )r/   r0   rƒ   r~   r   )r<   rv   r@   r   r   Úshape)	rA   rB   r(   r&   r'   rC   ÚtmÚtprU   rD   rD   rE   Útest_vectorization˜   s    zTestBSpline.test_vectorizationc           
      C   sæ   d\}}t  t j || d ¡¡}t j |¡}t j|t j |d ¡f }t|||ƒt|||ƒ }}|d |d  }t  |d | |d | d¡}	t||	ƒ||	ƒdd� t||	ƒt|	|||fƒdd� t||	ƒt|	|||fƒdd� d S )N)é!   r/   r"   r+   r   rX   rY   rZ   )r<   rv   r@   Úr_r   rR   r   r   )
rA   rB   r(   r&   r'   Zc_padrC   Zb_padÚdtrU   rD   rD   rE   Ú
test_len_c¡   s    zTestBSpline.test_len_cc                 C   sb   t ƒ }|j\}}}|| || d   }}dD ].}t|||g|ƒ||d |d g|ƒdd� q.d S )Nr"   )TFç»½×Ùß|Û=ç•Ö&è.>rZ   ©rK   rL   r   )rA   rC   r&   Ú_r(   r…   r†   ÚextraprD   rD   rE   Útest_endpoints³   s    ÿzTestBSpline.test_endpointsc                 C   sX   t ƒ }|j\}}}t|||d | d … d ƒ|||d | d … d ƒdd� d S )Nr"   rŒ   r�   rZ   rŽ   )rA   rC   r&   r�   r(   rD   rD   rE   Útest_continuity¼   s
    :ÿzTestBSpline.test_continuityc                 C   s¬   t ƒ }|j\}}}|d |d  }t || | || d  | d¡}|| |k ||| d  k @ }t||| dd�||| dd�ƒ t||dd�t||||fdd�ƒ d S )	Nr+   r   r"   rX   Tr_   F)Úextro   )rA   rC   r&   r'   r(   rŠ   rU   ÚmaskrD   rD   rE   Útest_extrapÃ   s    $ÿÿzTestBSpline.test_extrapc                 C   sL   t ƒ }|j\}}}|d d |d d g}||ƒ}tt t |¡¡ ƒ d S )Nr   r"   r+   )rK   rL   r   r<   ÚallÚisnan)rA   rC   r&   r�   r(   rU   ÚyyrD   rD   rE   Útest_default_extrapÒ   s
    zTestBSpline.test_default_extrapc           	      C   s  t j d¡ t  t j d¡¡}t j d¡}d}t|||dd�}|j|d  }|d |d	  }t  || | || | d
¡}|| |||  || ||    }t||ƒt||||fƒƒ g d¢}|| |||  || ||    }t	||dd�||dd�ƒ d S )Nrr   é   r0   r/   Úperiodicr_   r"   r+   r   rX   )r+   r   ç      à?r"   T)
r<   r@   ru   rv   r   r�   rR   r   r   r   )	rA   r&   r'   r(   rC   rB   rŠ   rU   ÚxyrD   rD   rE   Útest_periodic_extrapÚ   s    $$z TestBSpline.test_periodic_extrapc                 C   sV   t ƒ }|j\}}}t |||f¡}t || ||  d¡}t||ƒ||ƒddd� d S )Nry   rY   rH   )rK   rL   r   Úfrom_spliner<   rR   r   )rA   rC   r&   r'   r(   ÚpprU   rD   rD   rE   Ú
test_ppolyì   s
    zTestBSpline.test_ppolyc                 C   s’   t ƒ }|j\}}}t |d |d d¡}tj||f }td|d ƒD ].}t||||f|d�}t||||d�dd� qDt|||d d�ddd� d S )	Nr   r+   rX   r"   ©Úder©ÚnurY   rZ   )rK   rL   r<   rR   r‰   Úranger   r   )rA   rC   r&   r'   r(   rU   r£   ZydrD   rD   rE   Útest_derivative_rndmô   s    z TestBSpline.test_derivative_rndmc              
   C   s4  d}g d¢}t j d¡ t jddt j d¡ddf }t|||ƒ}t  g d¢¡}t|||dk d ƒ|||dk d ƒƒ tt  |d	ƒ|d
ƒ¡ ƒ t  ddg¡}t||d dd�||d dd�ƒ t  ddg¡}tt  	t  ||d dd�||d dd�¡¡ ƒ tt  	t  ||d dd�||d dd�¡¡ ƒ d S )Nr-   )r+   r+   r   r"   r"   r/   r0   r~   r~   r~   r   r   rr   r   rƒ   )r"   r/   r0   r~   r~   rŒ   g2Hþÿÿÿ@gÎ·   @r/   r0   r"   r¤   )
r<   r@   ru   r‰   r   ra   r   r   Zallcloser–   )rA   r(   r&   r'   rC   r\   Úx0Úx1rD   rD   rE   Útest_derivative_jumps  s*    ÿÿÿ
ÿz!TestBSpline.test_derivative_jumpsc                 C   s¦   t  ddd¡}tjg d¢d�}t||ƒt||j|j|jfƒdd� t||ƒt	|ƒdd� tjg d¢d�}t  d	d
d¡}t||ƒt  
|dk || d| d
 ¡dd� d S )Nr+   r0   rs   ©r   r"   r-   r/   )r&   rY   rZ   ©r   r"   r"   r-   r   r-   rP   r"   r2   )r<   rR   r   Úbasis_elementr   r   r&   r'   r(   ÚB_0123rS   rT   rD   rD   rE   Útest_basis_element_quadratic  s    ÿÿÿz(TestBSpline.test_basis_element_quadraticc                 C   sN   t ƒ }|j\}}}t || || d  d¡}t||ƒt||||ƒdd� d S )Nr"   rs   rY   rZ   )rK   rL   r<   rR   r   Ú_sum_basis_elementsrp   rD   rD   rE   Útest_basis_element_rndm*  s    z#TestBSpline.test_basis_element_rndmc           	      C   s–   t ƒ }|j\}}}|d }t|||ƒ}t||jj|ƒ}t||jj|ƒ}t || || d  d¡}t||ƒj||ƒdd� t||ƒj||ƒdd� d S )Ny      ð?      @r"   rs   rY   rZ   )	rK   rL   r   r'   ÚrealÚimagr<   rR   r   )	rA   rC   r&   r'   r(   ÚccÚb_reÚb_imrU   rD   rD   rE   Ú
test_cmplx0  s    zTestBSpline.test_cmplxc                 C   s&   t  g d¢¡}tt |tjƒ¡ƒ d S )Nr¬   )r   r­   r   r<   r—   r=   ©rA   rC   rD   rD   rE   Útest_nan=  s    zTestBSpline.test_nanc                 C   st   t dd�}|j\}}}t|||ƒ}t || || d  d¡}td|ƒD ]&}| ¡ }t|||ƒ||ƒddd� qHd S )Nrƒ   ©r(   r"   rs   çê-�™—q=rH   )rK   rL   r   r<   rR   r¦   Ú
derivativer   )rA   rC   r&   r'   r(   Zb0rU   ÚjrD   rD   rE   Útest_derivative_methodB  s    
z"TestBSpline.test_derivative_methodc                 C   sœ   t ƒ }|j\}}}t || || d  d¡}t| ¡  ¡ |ƒ||ƒddd� tj|||f }t ||f¡}t	|||ƒ}t| ¡  ¡ |ƒ||ƒddd� d S )Nr"   rs   rY   rH   )
rK   rL   r<   rR   r   Úantiderivativer¼   Úc_Údstackr   rp   rD   rD   rE   Útest_antiderivative_methodK  s    
ÿ
ÿz&TestBSpline.test_antiderivative_methodc                 C   s>  t  g d¢¡}t| dd¡dƒ t| dd¡dƒ t| dd¡dƒ t| dd¡dƒ t|jdddd�dƒ t|jddd	d�dƒ t|jddd	d�dƒ t|jddd	d�t dd|j¡ƒ d
|_| ¡ }|dƒ|dƒ }t| dd¡|ƒ t| dd¡d| ƒ t| dd¡|ƒ t| dd¡d| ƒ t| dd¡|dƒ|dƒ ƒ t| dd¡|dƒ|dƒ |dƒ |dƒ ƒ t| dd¡|dƒ|dƒ |dƒ |dƒ ƒ t| dd¡|dƒ|dƒ |dƒ |dƒ d|  ƒ t| dd¡|dƒ|dƒ ƒ t| dd¡|dƒ|dƒ ƒ t| dd¡|dƒ|dƒ d|  ƒ d S )Nr,   r   r"   rœ   ç      à¿r+   Tr_   Fr›   r-   i÷ÿÿÿiùÿÿÿiøÿÿÿéüÿÿÿç      ø?r/   g      +@é   r~   iöÿÿÿr0   )	r   r­   r   Ú	integrateÚ_implr   rL   r`   r¿   )rA   rC   ÚiZ
period_intrD   rD   rE   Útest_integralY  s:    ÿ.ÿ&ÿzTestBSpline.test_integralc                 C   sN   g d¢}t ||ƒ}d|_t |¡}dD ]"\}}t| ||¡| ||¡ƒ q&d S )Nr.   r›   ))éûÿÿÿrœ   )rœ   rƒ   )rÄ   é   )r	   r`   r   rŸ   r   rÇ   )rA   r\   rC   Úpr¨   r©   rD   rD   rE   Útest_integrate_ppoly~  s    


ÿz TestBSpline.test_integrate_ppolyc                 C   sN   G dd„ dt ƒ}| g d¢¡}t|j|ƒ t| ¡ j|ƒ t| ¡ j|ƒ d S )Nc                   @   s   e Zd ZdS )z'TestBSpline.test_subclassing.<locals>.BN)Ú__name__Ú
__module__Ú__qualname__rD   rD   rD   rE   ÚB‹  s   rÒ   )r   r"   r-   r-   )r   r­   r   Ú	__class__r¼   r¿   )rA   rÒ   rC   rD   rD   rE   Útest_subclassing‰  s
    zTestBSpline.test_subclassingÚaxisrÄ   r0   c              
   C   sf  d\}}t  dd|| d ¡}g d¢}|d }| ||¡ t jj|d�}t||||d�}t|jj|| g|d |…  ||d d …  ƒ t j d¡}	t||	ƒj|d |… t|	jƒ ||d d …  ƒ |j	 d |j	fD ]"}
t
ttfi t||||
d	�¤Ž qØt||||d� ¡ t||||d� d
¡t||||d� ¡ t||||d� d
¡fD ]}t|j|jƒ �qLd S )Nr|   r   r"   ©r~   r   rš   r0   r€   ©rÕ   r‚   )r&   r'   r(   rÕ   r-   )r<   rR   r   r@   r   r   r'   r„   ÚlistÚndimr8   r   r;   r¼   r¿   rÕ   )rA   rÕ   rB   r(   r&   ÚshZpos_axisr'   rC   ÚxpÚaxÚb1rD   rD   rE   Ú	test_axis“  s0    $ÿ
$ÿ
ÿýzTestBSpline.test_axisc                 C   sp   d}g d¢}t  g d¢g d¢g¡}t|||dd�}t||d |ƒ}t||d |ƒ}t|d	ƒ|d	ƒ|d	ƒgƒ d S )
Nr-   )r   r"   r-   r/   r0   rƒ   r~   )r+   r-   r   r+   )r-   r   éýÿÿÿr"   r+   r×   r   r"   r5   )r<   Úarrayr   r   )rA   r(   r&   r'   ÚsplZspl0Zspl1rD   rD   rE   Útest_neg_axis±  s    zTestBSpline.test_neg_axisc                 C   sh   dd„ }d}d}dD ]}||||ƒ qt dddƒD ]}|||dƒ q2d	}t dd
ƒD ]}|||dƒ qRdS )a7  
        Splines with different boundary conditions are built on different
        types of vectors of knots. As far as design matrix depends only on
        vector of knots, `k` and `x` it is useful to make tests for different
        boundary conditions (and as following different vectors of knots).
        c           	      S   sÂ   t j d¡ t  t j | ¡d d ¡}t j | ¡d d }|dkrN|d |d< t||||d�}t  t|jƒ| d ¡}t	|j||ƒ|ƒ}t	 
||j|¡ ¡ }t||j |d	d
� t||d	d
� dS )zY
            To avoid repetition of code the following function is provided.
            rr   é(   rs   r›   r+   r   ©r(   Úbc_typer"   rY   rZ   N)r<   r@   ru   rv   Úrandom_sampler	   ÚeyeÚlenr&   r   Údesign_matrixÚtoarrayr   r'   )	rB   r(   rå   r\   rw   rd   r'   Zdes_matr_defÚdes_matr_csrrD   rD   rE   Úrun_design_matrix_testsÂ  s    þzHTestBSpline.test_design_matrix_bc_types.<locals>.run_design_matrix_testsr7   r/   ©ÚclampedÚnaturalrš   r-   ú
not-a-knotrƒ   r   r›   N)r¦   )rA   rì   rB   r(   ÚbcrD   rD   rE   Útest_design_matrix_bc_types»  s    z'TestBSpline.test_design_matrix_bc_typesr`   )FTr›   Údegreerƒ   c           
   	   C   sJ  t j d¡ t j d|d  ¡}t  |¡t  |¡ }}|}t jt  |d |d |¡t  ||d|d  ¡t  |d |d |¡f }t  t	|ƒ| d ¡}t
||||ƒ}	t|	|ƒt
 ||||¡ ¡ ƒ t  |d |d |d |d g¡}|�s(t t¡�  t
 ||||¡ W d  ƒ n1 �s0    Y  nt|	|ƒt
 ||||¡ ¡ ƒ dS )z;Test that design_matrix(x) is equivalent to BSpline(..)(x).rr   rP   r"   r-   rÅ   N)r<   r@   ru   ræ   ZaminZamaxr‰   rR   rç   rè   r   r   ré   rê   rà   rM   r   r:   )
rA   r`   ró   r\   ZxminZxmaxr(   r&   r'   ÚbsplinerD   rD   rE   Ú'test_design_matrix_same_as_BSpline_callå  s*    þÿ"2þz3TestBSpline.test_design_matrix_same_as_BSpline_callc           
      C   s¤   t j d¡ d}d}t  t j |¡d d ¡}t j |¡d d }t|||d�}tddƒD ]D}|d |… }|d |… }t ||j	|¡ 
¡ }	t|	|j |d	d
� qZd S )Nrr   rP   r/   rã   rs   rº   r"   r0   rY   rZ   )r<   r@   ru   rv   ræ   r	   r¦   r   ré   r&   rê   r   r'   )
rA   rB   r(   r\   rw   rd   rÉ   ZxcÚycrë   rD   rD   rE   Útest_design_matrix_x_shapes  s    þz'TestBSpline.test_design_matrix_x_shapesc                 C   s2   g d¢}t  d|d¡ ¡ }t|g d¢gdd� d S )N)r$   r$   r$   r2   r3   r4   r4   r4   r2   r/   )g      Ð?gm‰à¨ªªâ?gKÚ}\UUÅ?r1   rY   rZ   )r   ré   rê   r   )rA   r&   Zdes_matrrD   rD   rE   Útest_design_matrix_t_shapes  s    þz'TestBSpline.test_design_matrix_t_shapesc                 C   sà   t j d¡ d}d}t  t j |¡d d ¡}t j |¡d d }t|||d�}ttƒ�* t 	||j
d d d… |¡ W d   ƒ n1 sˆ0    Y  d}g d	¢}g d
¢}ttƒ� t 	|||¡ W d   ƒ n1 sÒ0    Y  d S )Nrr   rP   r/   rã   rs   rº   r+   r-   )r1   r$   r2   r3   r4   ç      @r^   )r<   r@   ru   rv   ræ   r	   r8   r:   r   ré   r&   )rA   rB   r(   r\   rw   rd   r&   rD   rD   rE   Útest_design_matrix_asserts  s    
8
z&TestBSpline.test_design_matrix_assertsrå   )rï   rî   r›   rð   c                 C   s¢   t j d¡ t  t j d¡¡}t j d¡}|dkr>|d |d< t|||d�}tj||d�}t  ddd¡}t||ƒ||ƒdd	� t	|||d�}t|j
|j
dd	� d S )
Nrr   rs   r›   r   r+   ©rå   r"   rG   rZ   )r<   r@   ru   rv   r   r   Úfrom_power_basisrR   r   r	   r'   )rA   rå   r\   rw   Úcbrd   rU   Zbspl_newrD   rD   rE   Útest_from_power_basis,  s    z!TestBSpline.test_from_power_basisc                 C   sÆ   t j d¡ t  t j d¡¡}t j d¡t j d¡d  }|dkrN|d |d< t|||d�}tj||d�}t||j|d�}t||j	|d�}t
|jj|jd|j  jƒ t|j|jd|j  dd	� d S )
Nrr   rs   r#   r›   r   r+   rû   rG   rZ   )r<   r@   ru   rv   r   r   rü   r	   r²   r³   r   r'   Údtyper   )rA   rå   r\   rw   rý   rd   Zbspl_new_realZbspl_new_imagrD   rD   rE   Útest_from_power_basis_complex;  s"    ÿ
ÿÿz)TestBSpline.test_from_power_basis_complexc                 C   sL   t  g d¢¡}t  g d¢¡}tjt||dd�dd�}t|jg d¢dd� dS )	a}  
        For x = [0, 1, 2, 3, 4] and y = [1, 1, 1, 1, 1]
        the coefficients of Cubic Spline in the power basis:

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

        It could be shown explicitly that coefficients of the interpolating
        function in B-spline basis are c = [1, 1, 1, 1, 1, 1, 1]
        r.   )r"   r"   r"   r"   r"   rï   rû   )r"   r"   r"   r"   r"   r"   r"   rG   rZ   N)r<   rà   r   rü   r   r   r'   )rA   r\   rw   rd   rD   rD   rE   Útest_from_power_basis_exmpL  s    ÿz&TestBSpline.test_from_power_basis_exmpc                 C   sl   t  ddg¡}t  dg¡}|jdd� |jdd� t  ddd¡}|jdd� t||dd�}t||ƒdƒ d S )	Nr   r"   r3   F©ÚwriterP   r%   r/   )r<   rà   ÚsetflagsrR   r   r   )rA   r&   r'   rU   rC   rD   rD   rE   Útest_read_only_  s    zTestBSpline.test_read_onlyN).rÏ   rÐ   rÑ   rF   rO   rV   r]   re   rn   rq   rx   r{   r‡   r‹   r‘   r’   r•   r™   rž   r¡   r§   rª   r¯   r±   r·   r¹   r¾   rÂ   rÊ   rÎ   rÔ   rM   ÚmarkÚparametrizer¦   rÞ   râ   rò   rõ   r÷   rø   rú   rþ   r   r  r  rD   rD   rD   rE   r!      sX   #				%


*

r!   c                   @   sr   e Zd Zej dg d¢¡dd„ ƒZej dg d¢¡dd„ ƒZd	d
„ Zej dg d¢¡dd„ ƒZ	dd„ Z
dd„ ZdS )Ú
TestInsertÚxval)r1   r$   r5   r0   ç      @ç      @c                 C   sž  t  d¡}t  |¡d }t||dd�}t||ƒ}| |¡}t|j|jdd� t|j|jd |j	 d … dd� ||d kr~|n
|d d… }t j
|d|dd … |d d…   f }t||ƒ||ƒdd� t  |¡d }t||dd�}	t|t j||f dd�}
|
 |¡}t|j|jdd� t|jt j| |¡j|	 |¡jf dd� ||d k�rR|n
|d d… }t j
|d|dd … |d d…   f }t|
|ƒ||ƒdd� d S )	Nrš   r/   rº   rG   rZ   r"   r+   rœ   )r<   r?   Úsinr	   r   Úinsert_knotr   r&   r'   r(   r‰   ÚcosrÀ   )rA   r	  r\   rw   rá   Úspl_1fÚspl_1rU   Úy1Zspl_y1Zspl_yyZspl_yy1rD   rD   rE   Útest_inserto  s.    


"&

ÿÿ&zTestInsert.test_insertzxval, m))r1   r-   )r$   r/   )rÅ   rƒ   )r0   r-   )r  r-   c           	      C   sÐ   t  d¡}t  |¡d }t||dd�}t|||d�}| ||¡}t|j|jdd� t|j|jd |j	 d … dd� ||d kr„|n
|d d… }t j
|d	|dd … |d d…   f }t||ƒ||ƒdd� d S )
Nrš   r/   rº   ©ÚmrG   rZ   r"   r+   rœ   )r<   r?   r  r	   r   r  r   r&   r'   r(   r‰   )	rA   r	  r  r\   rw   rá   r  r  rU   rD   rD   rE   Útest_insert_multi�  s    
"&zTestInsert.test_insert_multic           
      C   s²   t j d¡}d\}}t  |j|| d d�¡}|j|ddfd�}t|||ƒ}|j||d  || d  d�}| |¡}|j||d  || d  dd	�}	t||	ƒ||	ƒd
d� d S )Né90  r6   r"   r€   r/   r-   )ÚlowÚhighrˆ   ©r  r  r�   rG   rZ   )r<   r@   Údefault_rngrv   Úuniformr   r  r   )
rA   ÚrngrB   r(   r&   r'   rá   Úxvr  rU   rD   rD   rE   Útest_insert_random¢  s     
"zTestInsert.test_insert_randomr  )	r   çš™™™™™¹?r2   r4   ç      @ç      @ç      @gffffff@r  c                 C   sÊ   t  d¡}t  |¡d }t||dd�}t|ddiŽ}| |¡}t||jdd�\}}}	t|j	|dd	� t|j
d |	 d
 … |d |	 d
 … dd	� t j d¡jdddd�}
t||
ƒt|
|||	fƒdd	� d S )Nrš   r/   rº   r`   r›   T©ÚperrG   rZ   r"   rr   r   r   é)   r  )r<   r?   r  r   r   r  r   rL   r   r&   r'   r@   r  r  r   )rA   r  r\   rw   rL   rá   r  ÚtfÚcfr(   rU   rD   rD   rE   Útest_insert_periodic°  s    

,zTestInsert.test_insert_periodicc                 C   sÊ   d}d}t  dg|d  g d¢ dg|d   ¡}t  t|ƒ| d ¡}t|||dd�}ttƒ�$ t||||fd	d
� W d   ƒ n1 sŠ0    Y  ttƒ� | |¡ W d   ƒ n1 s¼0    Y  d S )Nç      @r/   r   r"   ©r-   r/   r0   rƒ   r   r›   r_   Tr#  )	r<   rà   Úonesrè   r   r8   r:   r   r  )rA   r  r(   r&   r'   rá   rD   rD   rE   Ú+test_insert_periodic_too_few_internal_knotsÂ  s    *
2
z6TestInsert.test_insert_periodic_too_few_internal_knotsc                 C   sî   d}t  dg|d  g d¢ dg|d   ¡}t  t|ƒ| d ¡}t|||ƒ}ttƒ� | d¡ W d   ƒ n1 sx0    Y  ttƒ� | d¡ W d   ƒ n1 sª0    Y  ttƒ� |jddd� W d   ƒ n1 sà0    Y  d S )	Nr/   r   r"   r*  r   r+   rš   r  )r<   rà   r+  rè   r   r8   r:   r  )rA   r(   r&   r'   rá   rD   rD   rE   Útest_insert_no_extrapÖ  s    *
(
(
z TestInsert.test_insert_no_extrapN)rÏ   rÐ   rÑ   rM   r  r  r  r  r  r(  r,  r-  rD   rD   rD   rE   r  m  s   
 ÿ

r  c               	   C   sf   d	dd„} dD ]R}t |d�}tt|ƒƒD ]6\}}| ||ƒ td|d ƒD ]}| |||ddƒ qHq(qd S )
Nr   rY   c           	   	   S   s†   | j \}}}t |¡}tj|d d d|dd … |d d…   |d d f }tt||||f|ƒ| ||ƒ||d|› d| j› �d� d S )	Nr   r  rœ   r"   r+   zder = z  k = )rI   rJ   Úerr_msg)rL   r<   Úuniquer‰   r   r   r(   )	rC   r½   r£   rI   rJ   r&   r'   r(   r\   rD   rD   rE   Úcheck_splevê  s    
8ÿz,test_knots_multiplicity.<locals>.check_splev)r"   r-   r/   r0   rƒ   rº   r"   r»   )r   rY   rY   )rK   Ú	enumerateÚ_make_multiplesr¦   )r0  r(   rC   r½   rÝ   r£   rD   rD   rE   Útest_knots_multiplicityæ  s    



r3  c                 C   sð   |dkr4|| |   kr(||d  k r0n ndS dS |||  || krNd}n2| ||  |||  ||   t | |d ||ƒ }||| d  ||d  kr¢d}nF||| d  |  ||| d  ||d    t | |d |d |ƒ }|| S )zw
    Naive way to compute B-spline basis functions. Useful only for testing!
    computes B(x; t[i],..., t[i+k+1])
    r   r"   r$   r1   ©Ú_naive_B©r\   r(   rÉ   r&   Úc1Úc2rD   rD   rE   r5  ý  s    ,2Fr5  c                    sŒ   ˆˆˆ krˆ‰nt  ˆˆ¡d ‰ˆˆ ˆ  krBˆˆd  ksHn J ‚ˆˆkr`ˆtˆƒˆ k sdJ ‚t‡ ‡‡‡‡fdd„tdˆd ƒD ƒƒS )z=
    Naive B-spline evaluation. Useful only for testing!
    r"   c                 3   s,   | ]$}ˆ ˆ|  t ˆˆˆ| ˆƒ V  qd S ©Nr4  )ri   r½   ©r'   rÉ   r(   r&   r\   rD   rE   Ú	<genexpr>  rl   z_naive_eval.<locals>.<genexpr>r   )r<   Úsearchsortedrè   Úsumr¦   )r\   r&   r'   r(   rD   r:  rE   rg     s    &rg   c                    sr   t ˆƒˆd  }|ˆd ks J ‚t ˆ ƒ|ks0J ‚ˆˆ ˆ  krLˆ| ksRn J ‚t‡ ‡‡‡fdd„t|ƒD ƒƒS )z'Naive B-spline evaluation, another way.r"   c                 3   s$   | ]}ˆ | t ˆˆ|ˆƒ V  qd S r9  r4  ©ri   rÉ   ©r'   r(   r&   r\   rD   rE   r;  #  rl   z _naive_eval_2.<locals>.<genexpr>©rè   r=  r¦   ©r\   r&   r'   r(   rB   rD   r?  rE   rm     s
    "rm   c                 C   s~   t |ƒ|d  }||d ks J ‚t |ƒ|ks0J ‚d}t|ƒD ]<}tj|||| d … dd�| ƒ}||| t |¡ 7 }q<|S )Nr"   r1   r-   Fr_   )rè   r¦   r   r­   r<   Z
nan_to_num)r\   r&   r'   r(   rB   ÚsrÉ   rC   rD   rD   rE   r°   &  s    "r°   c                 C   sT   t  | ¡} t  | | dk | dkB | dk| dk @ | dk| dk@ gdd„ dd„ dd„ g¡S )z+ A linear B-spline function B(x | 0, 1, 2).r   r-   r"   c                 S   s   dS )Nr1   rD   ©r\   rD   rD   rE   Ú<lambda>7  rl   zB_012.<locals>.<lambda>c                 S   s   | S r9  rD   rC  rD   rD   rE   rD  7  rl   c                 S   s   d|  S ©Nr2   rD   rC  rD   rD   rE   rD  7  rl   )r<   Ú
atleast_1dÚ	piecewiserC  rD   rD   rE   r[   1  s    
þýr[   c                 C   s†   t  | ¡} | dk | dk| dk @ | dkg}|dkrHdd„ dd„ dd„ g}n,|dkrhdd„ d	d„ d
d„ g}ntd| ƒ‚t  | ||¡}|S )z0A quadratic B-spline function B(x | 0, 1, 2, 3).r"   r-   r   c                 S   s   | |  d S rE  rD   rC  rD   rD   rE   rD  ?  rl   zB_0123.<locals>.<lambda>c                 S   s   d| d d  S )Ng      è?rÅ   r-   rD   rC  rD   rD   rE   rD  @  rl   c                 S   s   d|  d d S )Nr3   r-   rD   rC  rD   rD   rE   rD  A  rl   c                 S   s   dS ©Nr$   rD   rC  rD   rD   rE   rD  C  rl   c                 S   s   dS )Ng       ÀrD   rC  rD   rD   rE   rD  D  rl   c                 S   s   dS rH  rD   rC  rD   rD   rE   rD  E  rl   znever be here: der=%s)r<   rF  r:   rG  )r\   r£   ZcondsÚfuncsÚpiecesrD   rD   rE   r®   :  s    
þþr®   é#   r/   c                 C   s@   t j d¡ t  t j | | d ¡¡}t j | ¡}t |||¡S )Né{   r"   )r<   r@   ru   rv   r   Zconstruct_fast)rB   r(   r&   r'   rD   rD   rE   rK   L  s    rK   c                 c   s    | j | j }}| j ¡ }|d |dd…< |d |d< t|||ƒV  | j ¡ }|d |d|d …< t|||ƒV  | j ¡ }|d || d d…< t|||ƒV  dS )	zIncrease knot multiplicity.é   é   é   r}   r   Nr"   r+   )r'   r(   r&   Úcopyr   )rC   r'   r(   Út1rD   rD   rE   r2  S  s    


r2  c                   @   sd   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTestInteropc                 C   s¤   t  ddt j d¡}t  |¡}t||ƒ}|j|j|jf| _|||  | _	| _
| _t  ddt j d¡| _t j|j|j|jf }t  ||f¡| _t|j| j|jƒ| _d S )Nr   r4   r%  rO  )r<   rR   Úpir  r	   r&   r'   r(   rL   rU   r˜   rC   ÚxnewrÀ   rÁ   r8  r   Úb2)rA   rU   r˜   rC   r8  rD   rD   rE   Úsetup_methodi  s    

zTestInterop.setup_methodc                    sø   | j | j| j  }‰ }tt|ˆ ƒˆ |ƒddd� tt|ˆ jƒˆ |ƒddd� t‡ fdd„|D ƒˆ |ƒddd� ttdd�� t||ƒ W d   ƒ n1 sš0    Y  tt	d|j
jƒƒd }|j
 |¡}|j||jf}tt||ƒ||ƒ |¡ddd� d S )	NrG   rH   c                    s   g | ]}t |ˆ ƒ‘qS rD   )r   rh   ©rC   rD   rE   rk     rl   z*TestInterop.test_splev.<locals>.<listcomp>zCalling splev.. with BSpline©Úmatchr"   ©r   )rT  rC   rU  r   r   rL   r8   r:   Útupler¦   r'   rÙ   Ú	transposer&   r(   )rA   rT  rU  rÚ   r´   rL   rD   rW  rE   Ú
test_splevv  s$    

ÿ
ÿ
ÿ(
ÿzTestInterop.test_splevc                 C   sÚ   | j | j }}t||ƒ}t ||¡\}}}t|d |dd� t|d |dd� t|d |ƒ t||dd�\}}}}t|d |dd� t|d |dd� t|d |ƒ t||ƒ}	t||	dd� t|Ž }
t||
|ƒdd� d S )Nr   rG   rZ   r"   r-   T)Úfull_output)rU   r˜   r   rÈ   r   r   r   r   )rA   r\   rw   rL   r&   r'   r(   Ztck_fr�   r˜   rC   rD   rD   rE   Útest_splrep‘  s    

zTestInterop.test_splrepc                 C   s  | j | j }}tj||f }ttƒ� t||ƒ W d   ƒ n1 sD0    Y  ttƒ� t ||¡ W d   ƒ n1 sx0    Y  ttdd��* t|d d… |d d… ƒ W d   ƒ n1 s¾0    Y  ttdd��, t |d d… |d d… ¡ W d   ƒ n1 �s0    Y  d S )Núm > k must holdrX  r/   )	rU   r˜   r<   rÀ   r8   r:   r   rÈ   r9   )rA   r\   rw   Úy2rD   rD   rE   Útest_splrep_errors©  s    
(
*8zTestInterop.test_splrep_errorsc           	      C   s    t  d¡ d¡}t|ƒ\}}t |¡\}}t||dd� tt||ƒ|dd� tt||ƒ|dd� t|ddd�\\}}}}}t||dd� tt||ƒ|dd� d S )NrÆ   ©r/   rƒ   rG   rZ   r   T)rB  r^  )r<   r?   rb   r   rÈ   r   r   )	rA   r\   rC   ÚurL   Úu1Zb_fZu_fr�   rD   rD   rE   Útest_splprep¹  s    zTestInterop.test_splprepc                 C   sÄ  t  d¡ d¡}ttdd�� t|ƒ W d   ƒ n1 s:0    Y  ttdd�� t |¡ W d   ƒ n1 sp0    Y  t jdddd�}ttd	d�� t|gƒ W d   ƒ n1 s¶0    Y  ttd	d�� t |g¡ W d   ƒ n1 sî0    Y  g d
¢}ttdd�� t|gƒ W d   ƒ n1 �s.0    Y  ttdd�� t |g¡ W d   ƒ n1 �sh0    Y  g d¢}g d¢}ttdd��  t|gd |gŽ  W d   ƒ n1 �s¶0    Y  d S )Né<   r‚   ztoo many values to unpackrX  r   rã   r/   )Únumr`  )ç– Ð>IÀri  ç– Ð>KÀrj  zInvalid inputs)r"   r/   r-   r0   )r   g333333Ó?gš™™™™™É?r"   )	r<   r?   rb   r8   r:   r   rÈ   rR   r9   )rA   r\   rd  rD   rD   rE   Útest_splprep_errorsÈ  s&    &((**,zTestInterop.test_splprep_errorsc                 C   sÜ   | j | j }}t g d¢¡tj }tt|ƒ|ddd� tt|j|j|j	fƒ|ddd� t
tdd�� t|dd� W d   ƒ n1 s„0    Y  |j dd	d
¡}t t|j||j	fdd�¡}t|jdƒ t|| d
dd� d S )N)rœ   rÅ   r5   r)  gH¯¼šò×z>rH   zCalling sproot.. with BSplinerX  rX   )Zmestr"   r-   r   )r/   r-   r0   r»   rZ   )rC   rU  r<   rà   rS  r   r   r&   r'   r(   r8   r:   r\  ra   r   r„   )rA   rC   rU  ÚrootsÚc2rZrrrD   rD   rE   Útest_sprootå  s     *zTestInterop.test_sprootc                 C   sÖ   | j | j }}ttdd|ƒtdd|jƒdd� ttdd|ƒ| dd¡dd� ttdd�� tdd|ƒ W d   ƒ n1 sz0    Y  |j 	ddd¡}t
 tdd|j||jfƒ¡}t|jdƒ t|tdd|ƒdd� d S )	Nr   r"   rY   rZ   zCalling splint.. with BSplinerX  r-   ©r/   r-   )rC   rU  r   r   rL   rÇ   r8   r:   r'   r\  r<   ra   r&   r(   r   r„   )rA   rC   rU  rm  ZintegrrD   rD   rE   Útest_splintö  s    ÿÿ*ÿzTestInterop.test_splintc              	   C   sØ   | j | jfD ]Æ}t|jƒt|jƒ }|dkrVtj|jt |f|jjdd …  ¡f |_dD ]v}t	|ƒ}t
 	|j|j|jf¡}t|j|d dd� t|j|d dd� t|j|d ƒ tt|tƒƒ tt|tƒƒ qZqd S ©Nr   r"   rW   rG   rZ   r-   )rC   rU  rè   r&   r'   r<   r‰   Úzerosr„   r   rÈ   r(   r   r   r   Ú
isinstancer   r[  ©rA   rC   ÚctrB   ZbdZtck_drD   rD   rE   Útest_splder	  s    *zTestInterop.test_splderc              	   C   sØ   | j | jfD ]Æ}t|jƒt|jƒ }|dkrVtj|jt |f|jjdd …  ¡f |_dD ]v}t	|ƒ}t
 	|j|j|jf¡}t|j|d dd� t|j|d dd� t|j|d ƒ tt|tƒƒ tt|tƒƒ qZqd S rq  )rC   rU  rè   r&   r'   r<   r‰   rr  r„   r   rÈ   r(   r   r   r   rs  r   r[  rt  rD   rD   rE   Útest_splantider  s    *zTestInterop.test_splantiderc                 C   s$  | j | j| j  }}}|jjd }d|j| |j|d    }t||ƒt||j|j|jfƒ }}tt	||ƒt	||ƒdd� t
t|tƒƒ t
t|tƒƒ tt|jjƒƒ}|j |dd … d ¡}	t||j|	|jfƒ}
t||ƒ}tt t	||
ƒ¡ ddd¡||ƒdd� t
t|tƒƒ t
t|
tƒƒ d S )Nr-   rœ   r"   rG   rZ   rZ  r   )rC   rU  rU   r&   r�   r   r'   r(   r   r   r   rs  r   r[  r¦   rÙ   r\  r<   ra   )rA   rC   rU  rU   r½   ÚtnZbnZtck_nrÚ   rÀ   Ztck_n2Zbn2rD   rD   rE   r  )  s$    "

ÿ
ÿzTestInterop.test_insertN)rÏ   rÐ   rÑ   rV  r]  r_  rb  rf  rk  rn  rp  rv  rw  r  rD   rD   rD   rE   rR  e  s   rR  c                   @   sˆ  e Zd Ze ddej ¡Ze e¡Zdd„ Z	dd„ Z
dd„ Zej d	g d
¢¡dd„ ƒZej d	g d
¢¡dd„ ƒZdd„ Zdd„ Zej d	g d¢¡dd„ ƒZdd„ Zdd„ Zdd„ Zej d	g d¢¡dd„ ƒZdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zejjd)d*�d+d,„ ƒZd-d.„ Zd/d0„ Z d1d2„ Z!d3d4„ Z"d5d6„ Z#d7d8„ Z$d9d:„ Z%ej d	g d;¢¡d<d=„ ƒZ&d>d?„ Z'd@dA„ Z(dBdC„ Z)dDdE„ Z*dFdG„ Z+dHS )IÚ
TestInterpr1   r2   c                 C   s>   t tƒ�" t| j| jdd� W d   ƒ n1 s00    Y  d S )Nr5   rº   )r8   r9   r	   rU   r˜   )rA   rD   rD   rE   Útest_non_int_orderK  s    
zTestInterp.test_non_int_orderc                 C   sZ   t | j| jdd�}t|| jƒ| jddd� t | j| jddd�}t|| jƒ| jddd� d S )Nr   rº   rY   rH   r+   ©r(   rÕ   ©r	   rU   r˜   r   r¸   rD   rD   rE   Útest_order_0O  s    zTestInterp.test_order_0c                 C   sZ   t | j| jdd�}t|| jƒ| jddd� t | j| jddd�}t|| jƒ| jddd� d S )Nr"   rº   rY   rH   r+   r{  r|  r¸   rD   rD   rE   Útest_linearU  s    zTestInterp.test_linearr(   r«   c                 C   sN   g d¢}g d¢}t tdd�� t|||d� W d   ƒ n1 s@0    Y  d S )N©r   r"   r-   r/   r0   rƒ   )r   r"   r-   r/   r0   rƒ   r~   r   zShapes of xrX  rº   ©r8   r:   r	   ©rA   r(   r\   rw   rD   rD   rE   Útest_incompatible_x_y[  s    z TestInterp.test_incompatible_x_yc                 C   sâ   g d¢}g d¢}t tdd�� t|||d� W d   ƒ n1 s@0    Y  g d¢}t tdd�� t|||d� W d   ƒ n1 s‚0    Y  g d¢}t |¡ d¡}t tdd�� t|||d� W d   ƒ n1 sÔ0    Y  d S )	N)r   r"   r"   r-   r/   r0   r  zx to not have duplicatesrX  rº   )r   r-   r"   r/   r0   rƒ   zExpect x to be a 1D strictly)r"   r+   )r8   r:   r	   r<   ra   rb   r�  rD   rD   rE   Útest_broken_xb  s    ,,zTestInterp.test_broken_xc                 C   s6   dD ],}t | j| j|ƒ}t|| jƒ| jddd� qd S )Nrc  rY   rH   r|  )rA   r(   rC   rD   rD   rE   Útest_not_a_knotr  s    zTestInterp.test_not_a_knotc                 C   sÒ   t | j| jddd�}t|| jƒ| jddd� tddƒD ].}t|| jd |d�|| jd	 |d�d
d� q6t | j| jddd	d�}t|| jƒ| jddd� tddƒD ].}t|| jd |d�|| jd	 |d�d
d� qžd S )Nrƒ   r›   rä   rY   rH   r"   r   r¤   r+   ç•dyáý¥=rZ   ©r(   rå   rÕ   )r	   rU   r˜   r   r¦   )rA   rC   rÉ   rD   rD   rE   Útest_periodicw  s    ,zTestInterp.test_periodic)r-   r/   r0   rƒ   r~   r   c                 C   sh   d}t j d¡ t  t j |¡d ¡}t j |¡d }|d |d< t|||dd�}t||ƒ|d	d
� d S )Nrƒ   rr   rP   ry   r+   r   r›   rä   rY   rZ   )r<   r@   ru   rv   ræ   r	   r   )rA   r(   rB   r\   rw   rC   rD   rD   rE   Útest_periodic_random…  s    zTestInterp.test_periodic_randomc                 C   sÜ   | j jd }tj d¡ tj |¡d tj }t |¡}d|d< dtj |d< t d|f¡}t 	|¡|d< t 
|¡|d< t||dddd	�}t|ƒD ]&}t||| ƒ|d d …|f d
d� q’t||d ƒ||d ƒd
d� d S )Nr   rr   r-   r1   r+   r"   rƒ   r›   r†  rY   rZ   )rU   r„   r<   r@   ru   ræ   rS  rv   rr  r  r  r	   r¦   r   )rA   rB   r\   rw   rC   rÉ   rD   rD   rE   Útest_periodic_axis�  s    
$zTestInterp.test_periodic_axisc                 C   s~   t j d¡ d}d}t  t j |¡¡}t j |¡}|d d |d< ttƒ�  t|||dd� W d   ƒ n1 sp0    Y  d S )	Nrr   rƒ   rš   r+   r"   r   r›   rä   )r<   r@   ru   rv   ræ   r8   r:   r	   )rA   r(   rB   r\   rw   rD   rD   rE   Útest_periodic_points_exceptionŸ  s    
z)TestInterp.test_periodic_points_exceptionc                 C   s€   t j d¡ d}d}t  t j |¡¡}t j |¡}t  |d|  ¡}ttƒ�  t||||dƒ W d   ƒ n1 sr0    Y  d S )Nrr   r/   r   r-   r›   )	r<   r@   ru   rv   ræ   rr  r8   r:   r	   )rA   r(   rB   r\   rw   r&   rD   rD   rE   Útest_periodic_knots_exceptionª  s    
z(TestInterp.test_periodic_knots_exceptionr*  c                 C   s„   t | j| j|dd�}t| j| jd|d�}t| j|ƒ}t||| jƒdd� td|ƒD ],}t| j||d�}t||| j|d	�d
d� qRd S )Nr›   rä   T)r$  r(   rY   rZ   r"   r¢   r¤   rŒ   )r	   rU   r˜   r   r   r   r¦   )rA   r(   rC   rL   rá   rÉ   rD   rD   rE   Útest_periodic_splevµ  s    zTestInterp.test_periodic_splevc                 C   s®   t | j| jddd�}t| j| jdd�}t|| jƒ|| jƒdd� d}t tj |¡d ¡}tj |¡d }|d	 |d
< t ||ddd�}t||dd�}t||ƒ||ƒdd� d S )Nr/   r›   rä   rû   rY   rZ   rP   ry   r+   r   )	r	   rU   r˜   r   r   r<   rv   r@   ræ   )rA   rC   ZcubrB   r\   rw   rD   rD   rE   Útest_periodic_cubicÂ  s    zTestInterp.test_periodic_cubicc                    sj   d‰t | j| jˆdd�}t| jˆƒ‰t| j| jˆˆƒ‰ t ‡ ‡‡fdd„¡}t|| jƒ|| jƒdd� d S )Nr/   r›   rä   c                    s   t | ˆˆ ˆƒS r9  rf   rC  rj   rD   rE   rD  Ø  rl   z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>rY   rZ   )r	   rU   r˜   r   r   r<   Z	vectorizer   )rA   rC   rÝ   rD   rj   rE   Útest_periodic_full_matrixÑ  s    z$TestInterp.test_periodic_full_matrixc                 C   s²   dg}t | j| jdd |fd�}t|| jƒ| jddd� t|| jd dƒ|d d ddd� t | j| jd|d fd�}t|| jƒ| jddd� t|| jd dƒ|d d ddd� d S )	N©r"   g       @r-   rä   rY   rH   r+   r"   r   r|  )rA   r£   rC   rD   rD   rE   Útest_quadratic_derivÛ  s    $zTestInterp.test_quadratic_derivc                 C   sÄ   d}dgdg }}t | j| j|||fd�}t|| jƒ| jddd� t|| jd dƒ|| jd	 dƒg|d d |d d gddd� d
gd
g }}t | j| j|||fd�}t|| jƒ| jddd� d S )Nr/   ©r"   r3   )r"   r4   rû   rY   rH   r   r"   r+   ©r-   r   r|  )rA   r(   Úder_lÚder_rrC   rD   rD   rE   Útest_cubic_derivè  s     ÿzTestInterp.test_cubic_derivc                 C   s¸   d\}}t  |¡ t j¡}t  |¡}ddg}ddg}t|||||fd�}t||ƒ|ddd� t||d	 d
ƒ||d	 dƒgdd„ |D ƒƒ t||d d
ƒ||d dƒgdd„ |D ƒƒ d S )N)rƒ   r   )r"   g      (À)r-   r"   r�  )r-   r3   rä   rY   rH   r   r"   r-   c                 S   s   g | ]\}}|‘qS rD   rD   ©ri   r¥   ÚvalrD   rD   rE   rk      rl   z2TestInterp.test_quintic_derivs.<locals>.<listcomp>r+   c                 S   s   g | ]\}}|‘qS rD   rD   r–  rD   rD   rE   rk     rl   )r<   r?   ÚastypeÚfloat64r  r	   r   )rA   r(   rB   r\   rw   r“  r”  rC   rD   rD   rE   Útest_quintic_derivs÷  s    
ÿÿzTestInterp.test_quintic_derivsZunstable)Úreasonc                 C   sN   d}t | j|ƒ}ddg}t| j| j|||d fd�}t|| jƒ| jddd� d S )Nr/   r‘  )r-   r4   rû   rY   rH   )r   rU   r	   r˜   r   )rA   r(   r&   r“  rC   rD   rD   rE   Útest_cubic_deriv_unstable  s
    z$TestInterp.test_cubic_deriv_unstablec                 C   s¸   d}t j| jd f|d  | jdd … | jd d…  d | jd f|d  f }t| j| j||dgdgfd�}t|| jƒ| jddd	� t|| jd dƒ|| jd dƒgd
d
gdd� d S )Nr-   r   r"   r+   r2   r’  rû   rY   rH   r1   rZ   )r<   r‰   rU   r	   r˜   r   )rA   r(   r&   rC   rD   rD   rE   Útest_knots_not_data_sites  s    þ
ÿ&ÿz$TestInterp.test_knots_not_data_sitesc                 C   sX   d}ddg}ddg}t |||dgdgfd�}t dd¡}|d }t||ƒ|ddd� d S )	Nr/   r1   r$   ©r"   r1   r‘  rû   rY   rH   )r	   r<   rR   r   )rA   r(   r\   rw   rC   rU   r˜   rD   rD   rE   Útest_minimum_points_and_deriv"  s    z(TestInterp.test_minimum_points_and_derivc                 C   s4  g d¢ }}t tƒ�$ t||dgd fd� W d   ƒ n1 s>0    Y  t tƒ� t||dd� W d   ƒ n1 st0    Y  t tƒ�  t||dgd� W d   ƒ n1 s¬0    Y  t tƒ� t||dd� W d   ƒ n1 sâ0    Y  d\}}t tƒ�" t||||fd� W d   ƒ n1 �s&0    Y  d S )N)r$   r-   r/   r0   rƒ   r~   rž  rû   é*   )rž  rž  r€  )rA   r\   rw   ÚlÚrrD   rD   rE   Útest_deriv_spec.  s    
2
,
.
,
zTestInterp.test_deriv_specc                 C   s¼   d}| j }| jd| j  }dgdg }}t|||||fd�}t||ƒ|ddd� t||d d	ƒ||d
 d	ƒg|d d	 |d d	 gddd� dD ]&}t|||d�}t||ƒ|ddd� q�d S )Nr/   r#   )r"   y              @)r"   y      @       @rû   rY   rH   r   r"   r+   )r   r"   rº   )rU   r˜   r	   r   )rA   r(   rU   r˜   r“  r”  rC   rD   rD   rE   Útest_complexE  s    ÿzTestInterp.test_complexc                 C   sD   t  d¡ t¡}t  d¡ t¡}dD ]}t|||d�}||ƒ q$d S )NrP   r«   rº   )r<   r?   r˜  Úintr	   )rA   r\   rw   r(   rC   rD   rD   rE   Útest_int_xyV  s
    zTestInterp.test_int_xyc                 C   sF   t  ddd¡}|d d d… }|d d d… }dD ]}t|||d� q.d S )Nr+   r"   ry   rƒ   r«   rº   )r<   rR   r	   )rA   rU   r\   rw   r(   rD   rD   rE   Útest_sliced_input`  s
    zTestInterp.test_sliced_inputc                 C   sJ   t  d¡ t¡}|d }t jt jt j fD ]}||d< ttt||ƒ q*d S )NrP   r-   r+   )	r<   r?   r˜  Úfloatr=   r>   r8   r:   r	   ©rA   r\   rw   ÚzrD   rD   rE   Útest_check_finitej  s
    zTestInterp.test_check_finite)r"   r-   r/   rƒ   c                 C   s,   t tdƒƒ}dd„ |D ƒ}t|||d� d S )NrP   c                 S   s   g | ]}|d  ‘qS )r-   rD   )ri   ÚarD   rD   rE   rk   w  rl   z.TestInterp.test_list_input.<locals>.<listcomp>rº   )rØ   r¦   r	   r�  rD   rD   rE   Útest_list_inputs  s    zTestInterp.test_list_inputc                 C   s²   t jt  | j¡t  | j¡f }dddgfg}dddgfg}t| j|d||fd�}t|| jƒ|ddd	� t|| jd
 dƒ|d
 d ddd	� t|| jd dƒ|d
 d ddd	� d S )Nr"   r$   r2   r3   r4   r/   rä   rY   rH   r   r+   )r<   rÀ   r  rU   r  r	   r   )rA   r˜   r“  r”  rC   rD   rD   rE   Útest_multiple_rhsz  s    $zTestInterp.test_multiple_rhsc                 C   sº   t j d¡ d\}}t  t jj|d�¡}t jj|dddfd�}t|||ƒ}t|jj|dddfƒ dt j d¡fg}dt j d¡fg}t|||||fd	�}t|jj|| d dddfƒ d S )
Nrr   ©r/   r}   r€   rƒ   r~   r   r"   ©rƒ   r~   r   rû   )r<   r@   ru   rv   r	   r   r'   r„   )rA   r(   rB   r\   rw   rC   Úd_lÚd_rrD   rD   rE   Útest_shapes„  s    zTestInterp.test_shapesc                 C   sB  t  | j¡}t| j|ddd�}t| j|ddgdgfd�}t|j|jdd� t| j|ddd�}t| j|ddgdgfd�}t|j|jdd� t| j|d	d
d�}t| j|d	d dgfd�}t|j|jdd� t| j|ddd�}t| j|dd d�}t|j|jdd� ttƒ�" t| j|ddd� W d   ƒ n1 �s,0    Y  t jt  | j¡t  	| j¡f }dddgfg}d	ddgfg}t| j|d||fd�}t| j|ddd�}t|j|jdd� t j
 d¡ d\}}t  t j
j
|d�¡}t j
j
|dddfd�}	dt  d¡fg}
dt  d¡fg}t||	||
|fd�}t||	|dd�}t|j|jdd� d S )Nr/   rï   rä   r’  rG   rZ   )rï   rî   ©r"   r   r-   )Nrî   rž  rð   Ztypor"   r1   rí   rr   r¯  r€   rƒ   r~   r   r°  rû   rî   )r<   r  rU   r	   r   r'   r8   r:   rÀ   r  r@   ru   rv   rr  )rA   r˜   rÝ   rU  r“  r”  r(   rB   r\   rw   r±  r²  rD   rD   rE   Útest_string_aliases“  sH    
ÿ

ÿ
2
ÿzTestInterp.test_string_aliasesc                 C   sr   t j d¡ d\}}t  t jj|d�¡}t jj|d�}t||ƒ}t||||ƒ}t||||ƒ}t|j|ddd� d S )Nrr   )r/   r   r€   rY   rH   )	r<   r@   ru   rv   r   r	   Úmake_interp_full_matrr   r'   )rA   r(   rB   r\   rw   r&   rC   r'  rD   rD   rE   Útest_full_matrixÆ  s    
zTestInterp.test_full_matrixc                 C   s¶  t j d¡ d}tdddƒD �]’}t|d d ƒ}t  t j d|f¡¡}td|d ƒD ]l}|d| …|d…f  t  t j d|| f¡¡7  < ||d…d| …f  t  t j d|| f¡¡7  < qVt j ||f¡}||d|…| d…f< t j ||f¡}||| d…d|…f< t  ||f¡}tt|| d dƒƒD ]J\}}	|	d	k �rbt j||	d
�||d|	…f< nt j||	d
�|||	d…f< �q4t j |¡}
t	t
||||
|ƒt j ||
¡dd� qdS )z­
        Random elements in diagonal matrix with blocks in the
        left lower and right upper corners checking the
        implementation of Woodbury algorithm.
        rr   éÉ   r/   é    r-   r"   Nr+   r   )ÚoffsetrY   rZ   )r<   r@   ru   r¦   r¥  Zdiagflatrr  r1  Zdiagonalr   r   ÚlinalgÚsolve)rA   rB   r(   rº  r¬  rÉ   ÚurZllÚdr½   rC   rD   rD   rE   Útest_woodburyÑ  s*    46
ÿzTestInterp.test_woodburyN),rÏ   rÐ   rÑ   r<   rR   rS  rU   r  r˜   rz  r}  r~  rM   r  r  r‚  rƒ  r„  r‡  rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  r�  r•  rš  Zxfailrœ  r�  rŸ  r£  r¤  r¦  r§  r«  r­  r®  r³  rµ  r·  r¿  rD   rD   rD   rE   ry  D  sN   




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

    This routine is here for testing only (even though it's functional).
    r"   ©rÿ   )
r�   r<   rr  r™  r¦   r<  r   Úevaluate_all_bsplÚslr¼  )r\   rw   r&   r(   rB   ÚAr½   r	  ÚleftÚbbr'   rD   rD   rE   r¶  î  s    r¶  c                 C   sÔ   t tj| ||fƒ\} }}| j}|j| d }tj||ftjd�}t|ƒD ]V}| | }||| krf|}	nt ||¡d }	t 	||||	¡}
|
|||	| |	d …f< qHt 
|j|¡}t 
|j|¡}t ||¡}|||ffS )z,Make the least-square spline, full matrices.r"   rÀ  )Úmapr<   ra   r�   rr  r™  r¦   r<  r   rÁ  ÚdotÚTrÂ  r¼  )r\   rw   r&   r(   r  rB   rÃ  r½   r	  rÄ  rÅ  rÒ   ÚYr'   rD   rD   rE   Úmake_lsq_full_matrix
  s    rÊ  c                   @   sš   e Zd Zej d¡ d\ZZe ej e¡¡Z	ej e¡Z
ee e	d e	d d¡eƒZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestLSQrr   )rÌ   r/   r   r+   r   c                 C   s”   | j | j| j| jf\}}}}t||||ƒ\}}t||||ƒ}t|j|ƒ t|jj	|j
| d fƒ |\}}	tjj||dd�\}
}}}t|j|
ƒ d S )Nr"   r+   )Zrcond)r\   rw   r&   r(   rÊ  r
   r   r'   r   r„   r�   r<   r»  Zlstsq)rA   r\   rw   r&   r(   Zc0ZAYrC   Zaar˜   r7  r�   rD   rD   rE   Ú
test_lstsq0  s    zTestLSQ.test_lstsqc                 C   s|   | j | j| j| jf\}}}}t |¡}t||||ƒ}t|||||d�}t|j|jdd� t|j|jdd� t	|j|jƒ d S )N)ÚwrY   rZ   )
r\   rw   r&   r(   r<   rz   r
   r   r'   r   )rA   r\   rw   r&   r(   rÍ  rC   Zb_wrD   rD   rE   Útest_weights?  s    
zTestLSQ.test_weightsc                 C   sd   | j | j| j| jf\}}}}tjj|dddfd�}t||||ƒ}t|jj	|j
| d dddfƒ d S )Nrƒ   r~   r   r€   r"   )r\   r&   r(   rB   r<   r@   r
   r   r'   r„   r�   )rA   r\   r&   r(   rB   rw   rC   rD   rD   rE   r®  K  s    zTestLSQ.test_multiple_rhsc                 C   sv   | j | j| j  }}}| jd }t||||ƒ}t||j||ƒ}t||j||ƒ}t||ƒ||ƒd||ƒ  ddd� d S )Ny      ð?       @r#   rG   rH   )r\   r&   r(   rw   r
   r²   r³   r   )rA   r\   r&   r(   rö   rC   rµ   r¶   rD   rD   rE   r¤  R  s    
zTestLSQ.test_complexc                 C   s@   t  d¡ t¡}t  d¡ t¡}t|dd�}t|||dd� d S )NrP   r"   rº   )r<   r?   r˜  r¥  r   r
   ©rA   r\   rw   r&   rD   rD   rE   r¦  ]  s    zTestLSQ.test_int_xyc                 C   sH   t  ddd¡}|d d d… }|d d d… }t|dƒ}t|||dd� d S )Nr+   r"   ry   r/   rº   )r<   rR   r   r
   )rA   rU   r\   rw   r&   rD   rD   rE   r§  d  s
    
zTestLSQ.test_sliced_inputc                 C   sV   t  d¡ t¡}|d }t|dƒ}t jt jt j fD ]}||d< ttt	|||ƒ q4d S )Né   r-   r/   r+   )
r<   r?   r˜  r¨  r   r=   r>   r8   r:   r
   )rA   r\   rw   r&   rª  rD   rD   rE   Útest_checkfinitem  s    
zTestLSQ.test_checkfinitec                 C   sL   | j | j| j  }}}|jdd� |jdd� |jdd� t|||d� d S )NFr  )r\   rw   r&   )r\   rw   r&   r  r
   rÏ  rD   rD   rE   r  w  s
    zTestLSQ.test_read_onlyN)rÏ   rÐ   rÑ   r<   r@   ru   rB   r(   rv   r\   rw   r   rR   r&   rÌ  rÎ  r®  r¤  r¦  r§  rÑ  r  rD   rD   rD   rE   rË  &  s   	
rË  c                 C   s    t j t j t j t¡¡d| ¡S )NÚdata)ÚosÚpathÚjoinÚabspathÚdirnameÚ__file__)ÚbasenamerD   rD   rE   Ú	data_file€  s    ÿrÚ  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestSmoothingSplinec                 C   sä  t j d¡ d}t  t j |¡d d ¡}|d t  d| ¡ |d  t j dd|¡ }ttƒ�" t	||dd … ƒ W d   ƒ n1 sˆ0    Y  ttƒ�" t	|dd … |ƒ W d   ƒ n1 sÂ0    Y  ttƒ�" t	| 
d|¡|ƒ W d   ƒ n1 sü0    Y  ttƒ�$ t	|d d d	… |ƒ W d   ƒ n1 �s:0    Y  t  |¡}|d |d
< ttƒ� t	||ƒ W d   ƒ n1 �s„0    Y  t  d¡}t  d¡}d}tjt|d�� t	||ƒ W d   ƒ n1 �sÖ0    Y  d S )Nrr   ry   r0   r-   r/   r1   rÅ   r"   r+   r   z)``x`` and ``y`` length must be at least 5rX  )r<   r@   ru   rv   ræ   r  Únormalr8   r:   r   rb   rP  r?   r+  rM   r   )rA   rB   r\   rw   Zx_duplZexception_messagerD   rD   rE   Útest_invalid_input‰  s*    .
0
0
0
4

*

z&TestSmoothingSpline.test_invalid_inputc                 C   sh   t  tdƒ¡�(}|d }|d }|d }W d  ƒ n1 s<0    Y  t||ƒ|ƒ}t||ddd� dS )ae  
        Data is generated in the following way:
        >>> np.random.seed(1234)
        >>> n = 100
        >>> x = np.sort(np.random.random_sample(n) * 4 - 2)
        >>> y = np.sin(x) + np.random.normal(scale=.5, size=n)
        >>> np.savetxt('x.csv', x)
        >>> np.savetxt('y.csv', y)

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

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

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

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

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

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

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

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

        z
gcvspl.npzr\   rw   Úy_GCVSPLNg-Cëâ6?rH   )r<   ÚloadrÚ  r   r   )rA   rÒ  r\   rw   rÞ  Zy_comprrD   rD   rE   Útest_compare_with_GCVSPL¨  s    )&z,TestSmoothingSpline.test_compare_with_GCVSPLc                 C   sª   t j d¡ d}t  t j |¡d d ¡}|d t  d| ¡ |d  t j dd|¡ }t||dd�}t||dd	d
�}t  	|d |d d| ¡}t
||ƒ||ƒdd� dS )z–
        In case the regularization parameter is 0, the resulting spline
        is an interpolation spline with natural boundary conditions.
        rr   ry   r0   r-   r/   r1   rÅ   )Zlamrï   rû   r   r+   rG   rZ   N)r<   r@   ru   rv   ræ   r  rÜ  r   r	   rR   r   )rA   rB   r\   rw   Z
spline_GCVZspline_interpÚgridrD   rD   rE   Útest_non_regularized_caseÞ  s    .þz-TestSmoothingSpline.test_non_regularized_casec           
      C   sî   t j d¡ d}t  t j |¡d d ¡}|d t  d| ¡ |d  t j dd|¡ }t||ƒ}t jjt	dƒdd	�D ]r}t  
|¡}d
||< t|||ƒ}t||| ƒ||  ƒ}t||| ƒ||  ƒ}	||	k rvtd|d›d|	d›�ƒ‚qvd S )Nrr   ry   r0   r-   r/   r1   rÅ   rP   r€   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )r<   r@   ru   rv   ræ   r  rÜ  r   Úchoicer¦   r+  Úabsr:   )
rA   rB   r\   rw   rá   ÚindrÍ  Zspl_wÚorigZweightedrD   rD   rE   Útest_weighted_smoothing_splineñ  s"    .

ÿþz2TestSmoothingSpline.test_weighted_smoothing_splineN)rÏ   rÐ   rÑ   rÝ  rà  râ  rç  rD   rD   rD   rE   rÛ  …  s   6rÛ  c                    sv   | \‰‰|\‰‰t ˆƒˆ d }|ˆd ks0J ‚t ˆƒˆ d ‰ˆˆd ksPJ ‚t‡ ‡‡‡‡‡‡fdd„t|ƒD ƒƒS )z-A naive 2D tensort product spline evaluation.r"   c                 3   sD   | ]<}t ˆƒD ].}ˆ ||f tˆˆ|ˆƒ tˆˆ|ˆƒ V  qqd S r9  )r¦   rÒ   )ri   ZixZiy©r'   r(   ÚnyÚtxÚtyr\   rw   rD   rE   r;    s   ÿzbspline2.<locals>.<genexpr>r@  )r�   r&   r'   r(   ÚnxrD   rè  rE   Úbspline2  s    ÿrí  c                 C   sð   |dkr4|| |   kr(||d  k r0n ndS dS |||  || krNd}n2| ||  |||  ||   t | |d ||ƒ }||| d  ||d  kr¢d}nF||| d  |  ||| d  ||d    t | |d |d |ƒ }|| S )Nr   r"   r$   r1   ©rÒ   r6  rD   rD   rE   rÒ     s    ,2FrÒ   c                    sL   t ˆƒˆ d }|ˆd kr(t ˆ ƒ|ks,J ‚t‡ ‡‡‡fdd„t|ƒD ƒƒS )Nr"   c                 3   s$   | ]}ˆ | t ˆˆ|ˆƒ V  qd S r9  rî  r>  r?  rD   rE   r;  *  rl   zbspline.<locals>.<genexpr>r@  rA  rD   r?  rE   rô   '  s    rô   c                   @   s   e Zd Zddd„Zdd„ ZdS )Ú
NdBSpline0r/   c                 C   sv   t |ƒ}|t |jƒksJ ‚zt |ƒ W n tyB   |f| }Y n0 tdd„ |D ƒƒ| _tdd„ |D ƒƒ| _|| _dS )a¯  Tensor product spline object.

        c[i1, i2, ..., id] * B(x1, i1) * B(x2, i2) * ... * B(xd, id)

        Parameters
        ----------
        c : ndarray, shape (n1, n2, ..., nd, ...)
            b-spline coefficients
        t : tuple of 1D ndarrays
            knot vectors in directions 1, 2, ... d
            ``len(t[i]) == n[i] + k + 1``
        k : int or length-d tuple of integers
            spline degrees.
        c                 s   s   | ]}t  |¡V  qd S r9  )ÚoperatorÚindex)ri   ZkirD   rD   rE   r;  F  rl   z&NdBSpline0.__init__.<locals>.<genexpr>c                 s   s   | ]}t j|td �V  qdS )rÀ  N)r<   ra   r¨  )ri   ÚtirD   rD   rE   r;  G  rl   N)rè   r„   r9   r[  r(   r&   r'   )rA   r&   r'   r(   rÙ   rD   rD   rE   Ú__init__.  s    zNdBSpline0.__init__c           
         s6  t ˆjƒ}t ˆƒ|ksJ ‚dg| ‰ t|ƒD ]ž}ˆj| ˆ|  }}ˆj| }||| krd|ˆ |< nt ||¡d ˆ |< |ˆ |  |  kr |ˆ | d  ks¦n J ‚ˆ | |krÆˆ | t |ƒ| k s,J ‚q,tˆ ƒ‰ d}‡ ‡fdd„t|ƒD ƒ}tj|Ž D ]6‰ˆj	ˆ t 
‡‡‡fdd„t|ƒD ƒ¡ }	||	7 }qú|S )NÚnoner"   r   c                    s,   g | ]$}t ˆ | ˆj|  ˆ | d  ƒ‘qS )r"   )r¦   r(   ©ri   r¾  )rÉ   rA   rD   rE   rk   b  rl   z'NdBSpline0.__call__.<locals>.<listcomp>c                    s.   g | ]&}t ˆ| ˆj| ˆ | ˆj| ƒ‘qS rD   )rÒ   r(   r&   rõ  )ÚidxrA   r\   rD   rE   rk   d  s   ÿ)rè   r&   r¦   r(   r<   r<  r[  Ú	itertoolsÚproductr'   Úprod)
rA   r\   rÙ   r¾  ÚtdZxdr(   ÚresultZitersÚtermrD   )rÉ   rö  rA   r\   rE   Ú__call__J  s(    



.&ÿ

zNdBSpline0.__call__N)r/   )rÏ   rÐ   rÑ   ró  rý  rD   rD   rD   rE   rï  -  s   
rï  c                   @   sò   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zej dd d!g¡ej d"d d!g¡d#d$„ ƒƒZej d%d&d'g¡d(d)„ ƒZd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd S )4ÚTestNdBSplinec           
      C   s¼   t j d¡}d\}}d}t  |j|| d d�¡}|j||fd�}t|||ƒ}t|f||ƒ}|jdd�}	t||	d d …d f ƒ||	ƒdd� ||	d d …d f ƒj|	jd	 |jd fks¸J ‚d S )
Nr  r6   r   r"   r€   rO  rY   rZ   r   )	r<   r@   r  rv   r  r   r   r   r„   )
rA   r  rB   r(   Zn_trr&   r'   rC   ÚnbÚxirD   rD   rE   Útest_1Dl  s    ÿzTestNdBSpline.test_1Dc                 C   sx   t  d¡}|d }t||dd�}|d d|  }t||dd�}|j|jf}|jd d …d f |jd d d …f  }||dfS )Nr~   r/   rº   r-   ©r<   r?   r	   r&   r'   ©rA   r\   rw   rá   Úy_1r  Út2r8  rD   rD   rE   Úmake_2d_case}  s    
$zTestNdBSpline.make_2d_casec                 C   sŒ   t  d¡}|d }t||dd�}t  d¡d }|d d|  }t||dd�}|j|jf}|jd d …d f |jd d d …f  }|||j|jfS )Nr~   r/   rº   rƒ   rÅ   r-   )r<   r?   r	   r&   r'   r(   r  rD   rD   rE   Úmake_2d_mixed‹  s    
$zTestNdBSpline.make_2d_mixedc                    sè   g d¢}|   ¡ \‰‰ ‰dd„ |D ƒ}t‡ ‡‡fdd„|D ƒ|dd� tˆˆ dd�}||ƒjt|ƒfksjJ ‚t||ƒ|dd� tj d	¡}|jd
d�d }||ƒ}|jdks®J ‚| 	d¡j
\}}t| ¡ |d |d d|   dd� d S )N©©rÅ   r5   )r5   r"   )rœ   rÅ   c                 S   s(   g | ] \}}|d  |d  d|   ‘qS ro  rD   ©ri   r\   rw   rD   rD   rE   rk   �  rl   z3TestNdBSpline.test_2D_separable.<locals>.<listcomp>c                    s   g | ]}t |ˆˆ ˆƒ‘qS rD   ©rí  ©ri   r�   ©r8  r(   r  rD   rE   rk      rl   rY   rZ   r/   rº   r  )r0   r/   r-   r€   rƒ   )r0   r/   )r+   r-   r-   )r  r   r   r„   rè   r<   r@   r  r  rb   rÈ  Úravel)rA   r   ÚtargetÚbspl2r  rû  r\   rw   rD   r  rE   Útest_2D_separableš  s(    þÿÿzTestNdBSpline.test_2D_separablec                 C   sˆ  d}g d¢}dd„ |D ƒ}|   ¡ \}}}t ||||f¡}d}t||dd�}	|	|ƒ}
t|||ƒ|ƒ}|
jdksrJ ‚t|
|gd	 d
d� |	|ƒjt |¡d d… |	jj|d …  ks¶J ‚t|	|ƒt |¡d d …d f  ddd� | d¡}t||dd�}||ƒ}
|
jdk�sJ ‚t|
||g||ggd
d� ||ƒjt |¡d d… |jj|d …  k�sZJ ‚t||ƒt |¡d d …d d f  ddd� d S )Nr-   r  c                 S   s(   g | ] \}}|d  |d  d|   ‘qS ro  rD   r
  rD   rD   rE   rk   ¹  rl   z5TestNdBSpline.test_2D_separable_2.<locals>.<listcomp>r	  r/   rº   )r0   r0   rY   rZ   r+   r   g‚vIhÂ%,=©r~   r~   r-   r-   )r-   r-   )	r  r<   rÁ   r   r„   r   r'   ra   rb   )rA   rÙ   r   r  r  r8  r(   Zc2_4r�   Zbspl2_4rû  Z
val_singleZc2_22Zbspl2_22rD   rD   rE   Útest_2D_separable_2µ  sB    
ÿ0ÿ
ÿþ ÿ
 ÿz!TestNdBSpline.test_2D_separable_2c              
      s  t j d¡}d‰t jddddt  |jdd�¡d ddddf	 ‰t jddddt  |jdd�¡d ddddf	 ‰|jˆjˆ d ˆjˆ d fd�‰ tˆˆfˆ ˆd	�}d
}t||ƒt	|ˆˆfˆ ˆƒdd� t j
g d¢g d¢f }t||ƒ‡ ‡‡‡fdd„|D ƒdd� d S )Nr  r/   r   r   r€   rš   r0   r"   rº   )r$   r$   rY   rZ   ©r"   rÅ   r-   ©çš™™™™™ñ?gš™™™™™ù?çÍÌÌÌÌÌ @c                    s   g | ]}t |ˆˆfˆ ˆƒ‘qS rD   r  r  ©r'   r(   rê  rë  rD   rE   rk   í  rl   z0TestNdBSpline.test_2D_random.<locals>.<listcomp>)r<   r@   r  r‰   rv   r  r�   r   r   rí  rÀ   )rA   r  rá   r   rD   r  rE   Útest_2D_randomÝ  s"    ..$ÿ
ÿþzTestNdBSpline.test_2D_randomc                 C   sf   |   ¡ \}}}}g d¢}dd„ |D ƒ}t||||fd�}||ƒjt|ƒfksPJ ‚t||ƒ|dd� d S )N©)çffffffö?r   )r5   g333333@)r   r)  c                 S   s(   g | ] \}}|d  |d d|   ‘qS ro  rD   r
  rD   rD   rE   rk   ó  rl   z/TestNdBSpline.test_2D_mixed.<locals>.<listcomp>rº   rY   rZ   )r  r   r„   rè   r   )rA   r  r8  ÚkxÚkyr   r  r  rD   rD   rE   Útest_2D_mixedð  s    ÿzTestNdBSpline.test_2D_mixedc                 C   s  |   ¡ \}}}}g d¢}t||||fd�}||dd�}t|dd„ |D ƒdd� ||d	d�}t|d
d„ |D ƒdd� ||dd�}t|dd„ |D ƒdd� ttƒ� ||dd�}W d   ƒ n1 sÀ0    Y  ttƒ� ||dd�}W d   ƒ n1 sô0    Y  d S )Nr  rº   r´  r¤   c                 S   s,   g | ]$\}}d |d  |d d|   ‘qS ro  rD   r
  rD   rD   rE   rk      rl   z4TestNdBSpline.test_2D_derivative.<locals>.<listcomp>rY   rZ   ©r"   r"   c                 S   s(   g | ] \}}d |d  d| d  ‘qS ro  rD   r
  rD   rD   rE   rk     rl   )r   r   c                 S   s(   g | ] \}}|d  |d d|   ‘qS ro  rD   r
  rD   rD   rE   rk     rl   )r+   r   )r+   r   r"   )r  r   r   r8   r:   )rA   r  r8  r  r  r   r  r£   rD   rD   rE   Útest_2D_derivativeù  s&    ÿÿÿ
*
z TestNdBSpline.test_2D_derivativec           	   
      sú   t j d¡}d\}}t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }|j|j| d	 |j| d	 fd�}t jg d
¢g d¢f }t||f|||fd�}t	||f|||fd�‰ t
||ƒ‡ fdd„|D ƒdd� d S )Nr  )r-   r/   r   r   r€   r/   rš   r0   r"   r  r  rº   c                    s   g | ]}ˆ |ƒ‘qS rD   rD   ©ri   rÛ   ©Zbspl2_0rD   rE   rk      rl   z6TestNdBSpline.test_2D_mixed_random.<locals>.<listcomp>rY   rZ   )r<   r@   r  r‰   rv   r  r�   rÀ   r   rï  r   ©	rA   r  r  r  rê  rë  r'   r   r  rD   r"  rE   Útest_2D_mixed_random  s    ..$
ÿÿz"TestNdBSpline.test_2D_mixed_randomc                 C   s  t  d¡}t  d¡d }t||d dd�}t||d d|  dd�}|jd d …d f |jd d d …f  }t|j|jf||j|jfƒ}|d d d …d f |d d|  d d d …f  }t||f|ƒ}dd„ t 	||¡D ƒ}	||	ƒ}
t  
|
¡ ¡ ròJ ‚t|
||	ƒd	d
� t|
 |j¡|d	d
� d S )Nr~   r   rÅ   r/   rº   r-   c                 S   s   g | ]\}}||f‘qS rD   rD   ©ri   r¬  rC   rD   rD   rE   rk   /  rl   z0TestNdBSpline.test_tx_neq_ty.<locals>.<listcomp>rY   rZ   )r<   r?   r	   r'   r   r&   r(   r   r÷  rø  r—   Úanyr   rb   r„   )rA   r\   rw   Úspl_xÚspl_yr´   rd   ÚvaluesÚrgir   ZbxirD   rD   rE   Útest_tx_neq_ty"  s    
$0zTestNdBSpline.test_tx_neq_tyc           
      C   s¶   t  d¡}|d }t||dd�}|d d|  }t||dd�}|d d|  d }t||dd�}|j|j|jf}|jd d …d d f |jd d d …d f  |jd d d d …f  }	||	dfS )Nr~   r/   rº   r-   r"   r  )
rA   r\   rw   rá   r  r  Zy_2Zspl_2r  r8  rD   rD   rE   Úmake_3d_case6  s    
ÿþzTestNdBSpline.make_3d_casec                 C   s¨   t j d¡}|jdd�d \}}}|d |d d|   |d d|  d  }|  ¡ \}}}t||dd�}	d	d
„ t|||ƒD ƒ}
|	|
ƒ}|jdks–J ‚t||dd� d S )Nr  ©r/   r7   r€   rƒ   r/   r-   r"   rº   c                 S   s   g | ]}|‘qS rD   rD   ©ri   r�   rD   rD   rE   rk   Q  rl   z3TestNdBSpline.test_3D_separable.<locals>.<listcomp>)r7   rY   rZ   )	r<   r@   r  r  r,  r   Úzipr„   r   )rA   r  r\   rw   rª  r  Út3Úc3r(   Úbspl3r   rû  rD   rD   rE   Útest_3D_separableI  s    ,zTestNdBSpline.test_3D_separablec           
      C   sd  |   ¡ \}}}t||dd�}tj d¡}|jdd�d \}}}dd„ t|||ƒD ƒ}	t||	d	d
�d|d  |d d|   |d d|  d  dd� t||	dd
�d| |d d|   |d d|  d  dd� t||	dd
�d| d|d  d  |d d|  d  dd� t||	dd
�d| d|d  d  d dd� t||	dd
�t t	|	ƒ¡dd� d S )Nr/   rº   r  r-  r€   rƒ   c                 S   s   g | ]}|‘qS rD   rD   r.  rD   rD   rE   rk   [  rl   z4TestNdBSpline.test_3D_derivative.<locals>.<listcomp>)r"   r   r   r¤   r-   r"   rY   rZ   )r-   r   r   r~   )r-   r"   r   )r-   r"   r/   )r-   r"   r0   )
r,  r   r<   r@   r  r  r/  r   rr  rè   )
rA   r0  r1  r(   r2  r  r\   rw   rª  r   rD   rD   rE   Útest_3D_derivativeV  s(    0ÿ,ÿ,ÿÿÿz TestNdBSpline.test_3D_derivativec           	   
      sL  t j d¡}d}t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }|j|j| d |j| d |j| d fd�}t|||f||d	�}t|||f||d	�‰ d
}t	||ƒˆ |ƒdd� t j
g d¢g d¢g d¢f }t	||ƒ‡ fdd„|D ƒdd� d S )Nr  r/   r   r   r€   rš   r0   r"   rº   )r$   r$   r"   rY   rZ   r  r  ©gÍÌÌÌÌÌì?r  gffffffþ?c                    s   g | ]}ˆ |ƒ‘qS rD   rD   r!  ©Zspl_0rD   rE   rk   }  rl   z0TestNdBSpline.test_3D_random.<locals>.<listcomp>)r<   r@   r  r‰   rv   r  r�   r   rï  r   rÀ   )	rA   r  r(   rê  rë  Útzr'   rá   r   rD   r6  rE   Útest_3D_randoml  s    ...0
þzTestNdBSpline.test_3D_randomc              
   C   s€  t j d¡}d}t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }|j|j| d |j| d |j| d fd�|j|j| d |j| d |j| d fd�d	  }t|||f||d
�}t|||f|j|d
�}t|||f|j	|d
�}	t j
g d¢g d¢g d¢f }
t||
ƒ||
ƒd	|	|
ƒ  dd� d S )Nr  r/   r   r   r€   rš   r0   r"   r#   rº   r  r  r5  rY   rZ   )r<   r@   r  r‰   rv   r  r�   r   r²   r³   rÀ   r   )rA   r  r(   rê  rë  r7  r'   rá   Zspl_reZspl_imr   rD   rD   rE   Útest_3D_random_complex  s$    ....2ÿ
þÿz$TestNdBSpline.test_3D_random_complexÚ
cls_extrapNTÚcall_extrapc                 C   s²   |   ¡ \}}}t||d|d�}g d¢g d¢g d¢  }}}	ttj|||	fƒ\}}}	dd„ t|||	ƒD ƒ}
|d |d d|   |	d d|	  d	  }||
|d
�}t||dd� d S )Nr/   ©r(   r`   ©éþÿÿÿr+   r   ©rß   rÃ   r
  ©r+   g      ø¿ç      @c                 S   s   g | ]}|‘qS rD   rD   r.  rD   rD   rE   rk   œ  rl   z?TestNdBSpline.test_extrapolate_3D_separable.<locals>.<listcomp>r-   r"   r_   rY   rZ   ©r,  r   rÆ  r<   ra   r/  r   )rA   r:  r;  r0  r1  r(   r2  r\   rw   rª  r   r  rû  rD   rD   rE   Útest_extrapolate_3D_separable’  s    ,z+TestNdBSpline.test_extrapolate_3D_separabler�   )FT)TNc                 C   sº   |   ¡ \}}}|\}}t||d|d�}g d¢g d¢g d¢  }}	}
ttj||	|
fƒ\}}	}
dd„ t||	|
ƒD ƒ}|d |	d d|	   |
d d|
  d	  }|||d
�}t||dd� d S )Nr/   r<  r=  r?  r@  c                 S   s   g | ]}|‘qS rD   rD   r.  rD   rD   rE   rk   ­  rl   zATestNdBSpline.test_extrapolate_3D_separable_2.<locals>.<listcomp>r-   r"   r_   rY   rZ   rB  )rA   r�   r0  r1  r(   r:  r;  r2  r\   rw   rª  r   r  rû  rD   rD   rE   Útest_extrapolate_3D_separable_2¢  s    ,z-TestNdBSpline.test_extrapolate_3D_separable_2c                 C   sä   |   ¡ \}}}t||dd�}g d¢g d¢g d¢  }}}ttj|||fƒ\}}}dd„ t|||ƒD ƒ}|d |d d|   |d d|  d	  }	||d
d�}
t |
d ¡s°J ‚t |
d ¡sÂJ ‚t|
d	d… |	d	d… dd� d S )Nr/   rº   )r>  r"   r   )rß   rœ   r
  )r+   rÅ   rA  c                 S   s   g | ]}|‘qS rD   rD   r.  rD   rD   rE   rk   »  rl   zETestNdBSpline.test_extrapolate_false_3D_separable.<locals>.<listcomp>r-   r"   Fr_   r   r+   rY   rZ   )r,  r   rÆ  r<   ra   r/  r—   r   )rA   r0  r1  r(   r2  r\   rw   rª  r   r  rû  rD   rD   rE   Ú#test_extrapolate_false_3D_separable³  s    ,z1TestNdBSpline.test_extrapolate_false_3D_separablec              	   C   s  |   ¡ \}}}t||dd�}t ddtjdddtjg¡}t dddtjdd	d	g¡}t d
dddtjddg¡}dd„ t|||ƒD ƒ}|d |d d|   |d d|  d  }	t |¡t |¡B t |¡B }
tj|	|
< ||ƒ}t ||
 ¡ ¡ sôJ ‚t||	dd� d S )Nr/   rº   r>  r"   r-   r   rß   r)  r
  r+   rA  c                 S   s   g | ]}|‘qS rD   rD   r.  rD   rD   rE   rk   Ì  rl   z/TestNdBSpline.test_x_nan_3D.<locals>.<listcomp>rY   rZ   )	r,  r   r<   ra   r=   r/  r—   r–   r   )rA   r0  r1  r(   r2  r\   rw   rª  r   r  r”   rû  rD   rD   rE   Útest_x_nan_3DÃ  s    ,
zTestNdBSpline.test_x_nan_3Dc           	         s€  t j d¡}d\}}t  |jdddd�¡}t j|d f| ||d f| f }t  |jdddd�¡}t j|d f| ||d f| f }|d d d… jjržJ ‚|d d d… jjr´J ‚|j|jd | d	 |jd | d	 fd
�}|j	}|jjròJ ‚t j
g d¢g d¢f }t|d d d… |d d d… f|||fd�}t|d d d… |d d d… f|||fd�‰ t||ƒ‡ fdd„|D ƒdd� d S )Nr  ©r/   r/   r   r0   é   r  r+   r-   r"   r€   r  r  rº   c                    s   g | ]}ˆ |ƒ‘qS rD   rD   r!  r"  rD   rE   rk   ì  rl   z7TestNdBSpline.test_non_c_contiguous.<locals>.<listcomp>rY   rZ   )r<   r@   r  rv   r  r‰   ÚflagsÚc_contiguousr�   rÈ  rÀ   r   rï  r   r#  rD   r"  rE   Útest_non_c_contiguousÕ  s&    $$,
ÿ**ÿz#TestNdBSpline.test_non_c_contiguousc                 C   sd   |   ¡ \}}}t||dd�}tdƒD ]}d|| j_q$d|j_t||dd�}|dƒ|dƒks`J ‚d S )Nr/   rº   FrW   )r,  r   r¦   rI  Z	writeable)rA   r0  r1  r(   r2  rÉ   Zbspl3_rD   rD   rE   Útest_readonlyî  s    zTestNdBSpline.test_readonlyc                 C   s  |   ¡ \}}}t g d¢g d¢g¡}t|||ƒ |||¡}t |||||g¡}|jd |jd ksfJ ‚t| ¡ | ¡ dd� tt	ƒ�( t g d¢||gd ¡ W d   ƒ n1 s²0    Y  tt	dd��* t d	d
gg||gd ¡ W d   ƒ n1 sø0    Y  d S )NrW   )r0   rƒ   r~   r   g¼‰Ø—²Òœ<rZ   r/   zData and knots*rX  r"   r-   )
r,  r<   ra   r   ré   r„   r   Ztodenser8   r:   )rA   r0  r1  r(   r   ÚdmZdm1rD   rD   rE   Útest_design_matrixú  s    
6z TestNdBSpline.test_design_matrix)rÏ   rÐ   rÑ   r  r  r  r  r  r  r  r   r$  r+  r,  r3  r4  r8  r9  rM   r  r  rC  rD  rE  rF  rK  rL  rN  rD   rD   rD   rE   rþ  j  s2   (	
rþ  c                   @   s–   e Zd Zdd„ Zdd„ Zej dg d¢¡dd„ ƒZd	d
„ Z	dd„ Z
dd„ Zej dejejg¡dd„ ƒZdd„ Zej dg d¢¡dd„ ƒZdd„ ZdS )Ú
TestMakeNDc                 C   s   t  d¡}t  d¡d }|d d …d f d |d d|  d d d …f  }dd„ t ||¡D ƒ}t||f|dd�}t||ƒ| ¡ d	d
� t||d dd�}t||d d|  dd�}|jd d …d f |jd d d …f  }t||jddd� ddl	m
}	 |	||f|dd�}
t|
|ƒ||ƒdd
� d S )Nr~   rœ   r/   r-   c                 S   s   g | ]\}}||f‘qS rD   rD   r%  rD   rD   rE   rk   	  rl   z7TestMakeND.test_2D_separable_simple.<locals>.<listcomp>r"   rº   rG   rZ   r…  r   rH   )r   Úlinear©ÚmethodrY   )r<   r?   r÷  rø  r   r   r  r	   r'   Úscipy.interpolater   )rA   r\   rw   r)  r   rd   r'  r(  r´   ZRGIr*  rD   rD   rE   Útest_2D_separable_simple	  s    
0$z#TestMakeND.test_2D_separable_simplec           
      C   s  t  d¡}t  d¡}dd„ t ||¡D ƒ}|d d …d f d |d d|  d d d …f  }t  ||||f¡}t||f|dtjd�}||ƒ}t  ||||f¡}|jdksªJ ‚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   s   g | ]\}}||f‘qS rD   rD   r%  rD   rD   rE   rk   #	  rl   z>TestMakeND.test_2D_separable_trailing_dims.<locals>.<listcomp>r/   r-   ©r(   Úsolver)é$   r0   r0   rY   rZ   r  )rW  r-   r-   )r<   r?   r÷  rø  rÁ   r   ÚsslÚspsolver„   r   rb   )
rA   r\   rw   r   r)  Zvalues4rd   rû  r  Zvalues22rD   rD   rE   Útest_2D_separable_trailing_dims	  s&    

0ÿ

ÿz*TestMakeND.test_2D_separable_trailing_dimsr(   )rG  r  )r/   r"   )r"   r/   rc  c                 C   sŽ   t  d¡}t  d¡d }dd„ t ||¡D ƒ}|d d d …d f |d d|  d d d …f  }t||f||tjd�}t||ƒ| ¡ d	d
� d S )Nr~   r   rÅ   c                 S   s   g | ]\}}||f‘qS rD   rD   r%  rD   rD   rE   rk   >	  rl   z,TestMakeND.test_2D_mixed.<locals>.<listcomp>r/   r-   rU  rG   rZ   )	r<   r?   r÷  rø  r   rX  rY  r   r  )rA   r(   r\   rw   r   r)  rd   rD   rD   rE   r  9	  s    
0zTestMakeND.test_2D_mixedc              	   C   sT   t  g d¢¡}t  g d¢¡}t  g d¢g d¢g d¢g d¢g d¢g d¢g¡}|||fS )N)rœ   r2   r3   r4   r!  r"  )r"   r-   r"   r-   r"   r"   )r"   r-   r/   r-   r"   r"   )r"   r-   r-   r-   r"   r"   )r<   rà   r©  rD   rD   rE   Ú_get_sample_2d_dataD	  s    úÿ
zTestMakeND._get_sample_2d_datac                 C   sd   |   ¡ \}}}t||f|dd�}t||f|dd�}t g d¢g d¢g¡j}t||ƒ||ƒdd� d S )	Nr"   rº   rP  rQ  ©r"   gffffff@g333333@rœ   çffffff
@ç333333ó?r/   ©r"   r]  r^  r4   rù   r$   r/   rY   rZ   ©r[  r   r   r<   rà   rÈ  r   ©rA   r\   rw   rª  rd   r*  r   rD   rD   rE   Útest_2D_vs_RGI_linearT	  s    
ÿz TestMakeND.test_2D_vs_RGI_linearc                 C   sh   |   ¡ \}}}t||f|dtjd�}t||f|dd�}t g d¢g d¢g¡j}t||ƒ||ƒdd� d S )	Nr/   rU  Úcubic_legacyrQ  r\  r_  rY   rZ   ©	r[  r   rX  rY  r   r<   rà   rÈ  r   ra  rD   rD   rE   Útest_2D_vs_RGI_cubic^	  s    
ÿzTestMakeND.test_2D_vs_RGI_cubicrV  c                 C   sh   |   ¡ \}}}t||f|d|dd�}t||f|dd�}t g d¢g d¢g¡j}t||ƒ||ƒdd	� d S )
Nr/   g�íµ ÷Æ°>)r(   rV  rJ   rc  rQ  r\  r_  rY   rZ   r`  )rA   rV  r\   rw   rª  rd   r*  r   rD   rD   rE   Útest_2D_vs_RGI_cubic_iterativeh	  s    
ÿz)TestMakeND.test_2D_vs_RGI_cubic_iterativec                 C   sh   |   ¡ \}}}t||f|dtjd�}t||f|dd�}t g d¢g d¢g¡j}t||ƒ||ƒdd� d S )	Nrƒ   rU  Úquintic_legacyrQ  r\  r_  rY   rZ   rd  ra  rD   rD   rE   Útest_2D_vs_RGI_quinticw	  s    
ÿz!TestMakeND.test_2D_vs_RGI_quinticzk, meth))r"   rP  )r/   rc  )rƒ   rg  c                 C   s¦   t j d¡}t  |jdd�¡}t  |jdd�¡}t  |jdd�¡}|jdd�}t|||f||tjd�}t|||f||d�}	t jjd	d
dd�}
t	||
ƒ|	|
ƒdd� d S )Ni@â r~   r€   r   rš   rÖ   rU  rQ  gffffffæ?r  r6   r  rY   rZ   )
r<   r@   r  Zcumsumr  r   rX  rY  r   r   )rA   r(   ÚmethZrndmr\   rw   rª  r)  rd   r*  r   rD   rD   rE   Útest_3D_random_vs_RGI�	  s    z TestMakeND.test_3D_random_vs_RGIc                 C   s°   |   ¡ \}}}ddi}ttdd��* t||f|fddi|¤Ž W d   ƒ n1 sR0    Y  ttdd��4 t||ft ||f¡fddi|¤Ž W d   ƒ n1 s¢0    Y  d S )NÚmaxiterr"   rV  rX  r(   r/   )r[  r8   r:   r   r<   rÁ   )rA   r\   rw   rª  Zsolver_argsrD   rD   rE   Útest_solver_err_not_converged‘	  s    8z(TestMakeND.test_solver_err_not_convergedN)rÏ   rÐ   rÑ   rT  rZ  rM   r  r  r  r[  rb  re  rX  ZgmresZgcrotmkrf  rh  rj  rl  rD   rD   rD   rE   rO  
	  s   





ÿ
rO  c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú
TestFpchecc                 C   sœ   d}t  d¡ dd¡}t  d¡}tjtdd�� t |||¡ W d   ƒ n1 sR0    Y  tjtdd�� t |||¡ W d   ƒ n1 sŽ0    Y  d S )Nr"   rÐ  r-   r~   z1D sequencerX  )r<   r?   rb   rM   r   r:   Ú_bÚfpcheck©rA   r(   r&   r\   rD   rD   rE   Útest_1D_x_tž	  s    
,zTestFpchec.test_1D_x_tc                 C   s  d}d|d  d }|d }t  |¡}t  |¡}t |||¡dksFJ ‚tjtdd�� t |||¡ W d   ƒ n1 sx0    Y  d|d  d }|| d }t  |¡}t  |¡}t |||¡dksÈJ ‚tjtdd�� t |||¡ W d   ƒ n1 sú0    Y  d S )Nr/   r-   r"   r7   rP   z	Need k+1*rX  )	r<   r?   r   ÚfpchecrM   r   r:   rn  ro  )rA   r(   rB   r  r&   r\   rD   rD   rE   Útest_condition_1©	  s    

,

zTestFpchec.test_condition_1c                 C   s,  d}dg|d  dg dg|d   }g d¢}t  |||¡dksDJ ‚t |||¡d u sZJ ‚| ¡ }|d |d< t  |||¡dks„J ‚tjtd	d
�� t |||¡ W d   ƒ n1 s¶0    Y  | ¡ }|d |d< t  |||¡dksêJ ‚tjtdd
�� t |||¡ W d   ƒ n1 �s0    Y  d S )Nr/   r   r"   r-   rƒ   )r"   r-   r/   r0   r   r+   rs   zLast k knots*rX  zFirst k knots*©r   rr  rn  ro  rP  rM   r   r:   )rA   r(   r&   r\   ÚttrD   rD   rE   Útest_condition_2¾	  s    ",zTestFpchec.test_condition_2c                 C   sÖ   d}dg|d  ddg dg|d   }g d¢}t  |||¡dksFJ ‚t |||¡d u s\J ‚dg|d  ddg dg|d   }t  |||¡dks–J ‚tjtdd	�� t |||¡ W d   ƒ n1 sÈ0    Y  d S )
Nr/   r   r"   r-   rƒ   ©r"   r-   r/   r)  r0   r   é   zInternal knots*rX  )r   rr  rn  ro  rM   r   r:   rp  rD   rD   rE   Útest_condition_3Ô	  s    $$zTestFpchec.test_condition_3c                 C   sp  d}dg|d  dg|d   }g d¢}t  |||¡dks>J ‚t |||¡d u sTJ ‚| ¡ }|d |d< t  |||¡dks~J ‚t |||¡d u s”J ‚| ¡ }|d d |d< t  |||¡dksÂJ ‚tjtdd�� t |||¡ W d   ƒ n1 sô0    Y  | ¡ }|d	 d |d	< t  |||¡dk�s.J ‚tjtdd�� t |||¡ W d   ƒ n1 �sb0    Y  d S )
Nr/   r   r"   rƒ   rw  rã   zOut of bounds*rX  r+   rt  )rA   r(   r&   r\   rU   rD   rD   rE   Útest_condition_4á	  s&    ,zTestFpchec.test_condition_4c                 C   sÄ   d}g d¢}g d¢}t  |||¡dks*J ‚tjtdd�� t |||¡ W d   ƒ n1 s\0    Y  g d¢}t  |||¡dks„J ‚tjtdd�� t |||¡ W d   ƒ n1 s¶0    Y  d S )Nr"   )r   r   r"   r-   r-   )r  r  r  rX   úSchoenberg-Whitney*rX  )rœ   rœ   rœ   ©r   rr  rM   r   r:   rn  ro  rp  rD   rD   rE   Útest_condition_5_x1xm 
  s    ,z TestFpchec.test_condition_5_x1xmc                 C   sD   d}g d¢}ddg}t  |||¡dks*J ‚t |||¡d u s@J ‚d S )Nr"   )r   r   r"   r"   rœ   g333333ã?r   )r   rr  rn  ro  rp  rD   rD   rE   Útest_condition_5_k1
  s
    zTestFpchec.test_condition_5_k1c                 C   s  d}dg|d  dg dg|d   }dgd }t  |||¡dksFJ ‚tjtdd�� t |||¡ W d   ƒ n1 sx0    Y  dg|d  dg dg|d   }dgd }t  |||¡dksÄJ ‚tjtdd�� t |||¡ W d   ƒ n1 sö0    Y  d S )	Nr/   r   r"   r-   rƒ   rX   r{  rX  r|  rp  rD   rD   rE   Útest_condition_5_1
  s    "
,"
zTestFpchec.test_condition_5_1c                 C   sÌ   d}dg|d  ddg dg|d   }dgd dg }t  |||¡dksNJ ‚tjtd	d
�� t |||¡ W d   ƒ n1 s€0    Y  dgd ddg }t  |||¡dks²J ‚t |||¡d u sÈJ ‚d S )Nr/   r   r"   r-   rƒ   r  r0   rX   r{  rX  r|  rp  rD   rD   rE   Útest_condition_5_2%
  s    $,zTestFpchec.test_condition_5_2c                 C   sj   d}g d¢}g d¢}t  |||¡dks*J ‚tjtdd�� t |||¡ W d   ƒ n1 s\0    Y  d S )Nr"   )	r   r   r-   r/   r0   rƒ   r~   r   r   )r"   r"   r"   çÍÌÌÌÌÌ@r�  r�  r
  rX   r{  rX  r|  rp  rD   rD   rE   Útest_condition_5_34
  s    zTestFpchec.test_condition_5_3N)rÏ   rÐ   rÑ   rq  rs  rv  ry  rz  r}  r~  r  r€  r‚  rD   rD   rD   rE   rm  ›	  s   rm  )r   )rK  r/   )r/   )OrÓ  rð  r÷  Únumpyr<   Znumpy.testingr   r   r   rM   r   r8   rS  r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscipy.linalgr»  rÂ  Zscipy.sparse.linalgÚsparserX  Zscipy.interpolate._bsplinesr   r   r   r   r   Zscipy.interpolate._fitpack_implZinterpolateZ_fitpack_implrÈ   Zscipy._lib._utilr   Zscipy.interpolate._ndbspliner   r   r    rn  r!   r  r3  r5  rg   rm   r°   r[   r®   rK   r2  rR  ry  r¶  rÊ  rË  rÚ  rÛ  rí  rÒ   rô   rï  rþ  rO  rm  rD   rD   rD   rE   Ú<module>   sj   P    Ry		

 `   -
Z 	=   # 