U
    »mœdé  ã                   @   sj  d dl Zd dlmZmZmZ d dlmZ d dlZd dl	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dlmZ d dlmZmZm Z m!Z!m"Z" d dl#m$  m%Z& d dl'Z'G dd„ dƒZ(dd	„ Z)d
d„ Z*dd„ Z+dd„ Z,dd„ Z-dd„ Z.d*dd„Z/d+dd„Z0dd„ Z1G dd„ dƒZ2G dd„ dƒZ3d d!„ Z4d,d"d#„Z5G d$d%„ d%ƒZ6d&d'„ Z7G d(d)„ d)ƒZ8dS )-é    N)Úassert_equalÚassert_allcloseÚassert_)Úraises)ÚBSplineÚBPolyÚPPolyÚmake_interp_splineÚmake_lsq_splineÚ_bsplÚsplevÚsplrepÚsplprepÚsplderÚ
splantiderÚsprootÚsplintÚinsertÚCubicSplineÚmake_smoothing_spline)Ú_not_a_knotÚ_augkntÚ_woodbury_algorithmÚ_periodic_knotsÚ_make_interp_per_full_matrc                   @   s¢  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zej  !d9e"d:d;ƒ¡d<d=„ ƒZ#d>d?„ Z$d@dA„ Z%ej  !dBdCdDdEg¡ej  !dFe"dGƒ¡dHdI„ ƒƒZ&dJdK„ Z'dLdM„ Z(dNdO„ Z)ej  !dPdQdRdEdSg¡dTdU„ ƒZ*ej  !dPdQdRdEdSg¡dVdW„ ƒZ+dXdY„ Z,dZS )[ÚTestBSplinec              	   C   sØ  t ttftftddgdgdd�Ž tjdd��& t ttftdtjgdgdd�Ž W 5 Q R X t ttftdtjgdgdd�Ž t ttftddgdgdd�Ž t ttftdgdggdgdd�Ž t ttftddd	gdgdd�Ž t ttftddd	d
dgddgd	d�Ž t ttftddddddgdddgdd�Ž t ttftddddddgdddgdd�Ž t ttftddddd	d
gdddgd	d�Ž d\}}t 	|| d ¡}tj
 
|¡}t|||ƒ}t||jƒ t||jƒ t||jƒ d S )Né   ù              ð?ç      ð?r   ©ÚtÚcÚkÚignore)Úinvalidéÿÿÿÿé   é   é   ç        ç       @ç      @ç      @Zcubicç      @)é   r'   )Úassert_raisesÚ	TypeErrorÚ
ValueErrorr   ÚdictÚnpZerrstateÚnanÚinfÚarangeÚrandomr   r    r!   r   r"   )ÚselfÚnr"   r    r!   Úb© r;   ú^/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/scipy/interpolate/tests/test_bsplines.pyÚ	test_ctor   s8    ÿ* " ÿÿÿÿzTestBSpline.test_ctorc              	   C   sh   t ƒ }|j}t|j|d ddd� t|j|d ddd� t|j|d ƒ t t	¡� d|_W 5 Q R X d S )Nr   çVçž¯Ò<©ÚatolÚrtolr   r&   Zfoo)
Ú_make_random_splineÚtckr   r    r!   r   r"   Úpytestr   ÚAttributeError)r8   r:   rC   r;   r;   r<   Útest_tck8   s    zTestBSpline.test_tckc                 C   sh   t  ddd¡}tddgdgdd�}t||ƒdƒ tdddgddgdd�}t||ƒt  |dk dd¡ƒ d S )	Nr   r   é
   r+   r   r'   gffffffÖ?r(   )r3   Úlinspacer   r   Úwhere©r8   Úxxr:   r;   r;   r<   Útest_degree_0D   s
    zTestBSpline.test_degree_0c                 C   sž   dddddg}dddg}d}t |||ƒ}t ddd¡}t|d t|ƒ |d t|d ƒ  |d t|d ƒ  ||ƒdd� tt||||fƒ||ƒdd� d S )	Nr   r   r&   r'   r(   é2   ç›+¡†›„=©r@   )r   r3   rH   r   ÚB_012r   )r8   r    r!   r"   r:   Úxr;   r;   r<   Útest_degree_1M   s    
8 ÿzTestBSpline.test_degree_1c                 C   s¨   d}t  dg|d  dg|d   ¡}t  ddddg¡}t| dd¡ddgƒ}t|||ƒ}t  d	dd
¡}t||dd�||dd�dd� tt||||fƒ||ƒdd� d S )Nr'   r   r   r   r*   r+   r,   r%   g      ð¿rG   T©ÚextrapolaterN   rO   )r3   Úasarrayr   Úreshaper   rH   r   r   )r8   r"   r    r!   ÚbpÚbsplrK   r;   r;   r<   Útest_bernsteinX   s    "
 ÿ ÿzTestBSpline.test_bernsteinc                    s‚   t ƒ }|j\‰‰ ‰t ˆˆ ˆˆ d  d¡}||ƒ}‡ ‡‡fdd„|D ƒ}t||dd� ‡ ‡‡fdd„|D ƒ}t||dd� d S )Nr   rM   c                    s   g | ]}t |ˆˆ ˆƒ‘qS r;   ©Ú_naive_eval©Ú.0rQ   ©r!   r"   r    r;   r<   Ú
<listcomp>n   s     z4TestBSpline.test_rndm_naive_eval.<locals>.<listcomp>rN   rO   c                    s   g | ]}t |ˆˆ ˆƒ‘qS r;   )Ú_naive_eval_2r\   r^   r;   r<   r_   q   s     )rB   rC   r3   rH   r   )r8   r:   rK   Zy_bZy_nZy_n2r;   r^   r<   Útest_rndm_naive_evalf   s    z TestBSpline.test_rndm_naive_evalc                 C   sP   t ƒ }|j\}}}t || || d  d¡}t||ƒt||||fƒdd� d S )Nr   rM   rN   rO   ©rB   rC   r3   rH   r   r   ©r8   r:   r    r!   r"   rK   r;   r;   r<   Útest_rndm_splevt   s    zTestBSpline.test_rndm_splevc                 C   s‚   t j d¡ t  t j d¡¡}t j d¡}t||ƒ}t|Ž }|j|j }}t  || || d  d¡}t	||ƒt
||ƒdd� d S )NéÒ  é   r   éP   rN   rO   )r3   r7   ÚseedÚsortr   r   r    r"   rH   r   r   )r8   rQ   ÚyrC   r:   r    r"   rK   r;   r;   r<   Útest_rndm_splrepz   s    
zTestBSpline.test_rndm_splrepc                 C   sJ   t ƒ }t |j¡|_t |j|j |j|j d  d¡}t||ƒdƒ d S )Nr   éd   r   )rB   r3   Ú	ones_liker!   rH   r    r"   r   )r8   r:   rK   r;   r;   r<   Útest_rndm_unity†   s    $zTestBSpline.test_rndm_unityc           	      C   s~   d\}}t  t j |¡¡}t jj|ddfd�}t|||ƒ}|| || d   }}||| t j d¡  }t||ƒjdƒ d S )N©é   r'   é   é   ©Úsizer   ©r'   r(   é   )r'   r(   rv   rq   rr   )r3   ri   r7   r   r   Úshape)	r8   r9   r"   r    r!   r:   ÚtmÚtprK   r;   r;   r<   Útest_vectorizationŒ   s    zTestBSpline.test_vectorizationc           
      C   sæ   d\}}t  t j || d ¡¡}t j |¡}t j|t j |d ¡f }t|||ƒt|||ƒ }}|d |d  }t  |d | |d | d¡}	t||	ƒ||	ƒdd� t||	ƒt|	|||fƒdd� t||	ƒt|	|||fƒdd� d S )N)é!   r'   r   r%   r   rM   rN   rO   )r3   ri   r7   Úr_r   rH   r   r   )
r8   r9   r"   r    r!   Zc_padr:   Zb_padÚdtrK   r;   r;   r<   Ú
test_len_c•   s    zTestBSpline.test_len_cc                 C   sb   t ƒ }|j\}}}|| || d   }}dD ].}t|||g|ƒ||d |d g|ƒdd� q.d S )Nr   )TFç»½×Ùß|Û=ç•Ö&è.>rO   ©rB   rC   r   )r8   r:   r    Ú_r"   rx   ry   Zextrapr;   r;   r<   Útest_endpoints§   s     ÿzTestBSpline.test_endpointsc                 C   sX   t ƒ }|j\}}}t|||d | d … d ƒ|||d | d … d ƒdd� d S )Nr   r   r€   rO   r�   )r8   r:   r    r‚   r"   r;   r;   r<   Útest_continuity°   s
    :ÿzTestBSpline.test_continuityc                 C   s¬   t ƒ }|j\}}}|d |d  }t || | || d  | d¡}|| |k ||| d  k @ }t||| dd�||| dd�ƒ t||dd�t||||fdd�ƒ d S )	Nr%   r   r   rM   TrS   F)Úextrb   )r8   r:   r    r!   r"   r}   rK   Úmaskr;   r;   r<   Útest_extrap·   s    $ÿÿzTestBSpline.test_extrapc                 C   sL   t ƒ }|j\}}}|d d |d d g}||ƒ}tt t |¡¡ ƒ d S )Nr   r   r%   )rB   rC   r   r3   ÚallÚisnan)r8   r:   r    r‚   r"   rK   Úyyr;   r;   r<   Útest_default_extrapÆ   s
    zTestBSpline.test_default_extrapc           	      C   s  t j d¡ t  t j d¡¡}t j d¡}d}t|||dd�}|j|d  }|d |d	  }t  || | || | d
¡}|| |||  || ||    }t||ƒt||||fƒƒ dd	ddg}|| |||  || ||    }t	||dd�||dd�ƒ d S )Nre   é   r(   r'   ÚperiodicrS   r   r%   r   rM   ç      à?T)
r3   r7   rh   ri   r   rt   rH   r   r   r   )	r8   r    r!   r"   r:   r9   r}   rK   Zxyr;   r;   r<   Útest_periodic_extrapÎ   s    $$z TestBSpline.test_periodic_extrapc                 C   sV   t ƒ }|j\}}}t |||f¡}t || ||  d¡}t||ƒ||ƒddd� d S )Nrl   rN   r?   )rB   rC   r   Úfrom_spliner3   rH   r   )r8   r:   r    r!   r"   ÚpprK   r;   r;   r<   Ú
test_ppolyà   s
    zTestBSpline.test_ppolyc                 C   s’   t ƒ }|j\}}}t |d |d d¡}tj||f }td|d ƒD ].}t||||f|d�}t||||d�dd� qDt|||d d�ddd� d S )	Nr   r%   rM   r   ©Úder©ÚnurN   rO   )rB   rC   r3   rH   r|   Úranger   r   )r8   r:   r    r!   r"   rK   r”   Zydr;   r;   r<   Útest_derivative_rndmè   s    z TestBSpline.test_derivative_rndmc                 C   sL  d}ddddddddddddg}t j d	¡ t jddt j d
¡ddf }t|||ƒ}t  ddddg¡}t|||dk d ƒ|||dk d ƒƒ tt  |dƒ|dƒ¡ ƒ t  ddg¡}t||d dd�||d dd�ƒ t  ddg¡}tt  	t  ||d dd�||d dd�¡¡ ƒ tt  	t  ||d dd�||d dd�¡¡ ƒ d S )Nr&   r%   r   r   r'   r(   rq   rr   re   rv   r   g2Hþÿÿÿ@gÎ·   @r•   )
r3   r7   rh   r|   r   rU   r   r   Zallcloserˆ   )r8   r"   r    r!   r:   rQ   Úx0Úx1r;   r;   r<   Útest_derivative_jumpsõ   s*    ÿÿÿ
ÿz!TestBSpline.test_derivative_jumpsc                 C   s®   t  ddd¡}tjddddgd�}t||ƒt||j|j|jfƒd	d
� t||ƒt	|ƒd	d
� tjddddgd�}t  ddd¡}t||ƒt  
|dk || d| d ¡d	d
� d S )Nr%   r(   rf   r   r   r&   r'   )r    rN   rO   rG   r*   )r3   rH   r   Úbasis_elementr   r   r    r!   r"   ÚB_0123rI   rJ   r;   r;   r<   Útest_basis_element_quadratic  s      ÿ ÿ ÿz(TestBSpline.test_basis_element_quadraticc                 C   sN   t ƒ }|j\}}}t || || d  d¡}t||ƒt||||ƒdd� d S )Nr   rf   rN   rO   )rB   rC   r3   rH   r   Ú_sum_basis_elementsrc   r;   r;   r<   Útest_basis_element_rndm  s    z#TestBSpline.test_basis_element_rndmc           	      C   s–   t ƒ }|j\}}}|d }t|||ƒ}t||jj|ƒ}t||jj|ƒ}t || || d  d¡}t||ƒj||ƒdd� t||ƒj||ƒdd� d S )Ny      ð?      @r   rf   rN   rO   )	rB   rC   r   r!   ÚrealÚimagr3   rH   r   )	r8   r:   r    r!   r"   ÚccÚb_reÚb_imrK   r;   r;   r<   Ú
test_cmplx$  s    zTestBSpline.test_cmplxc                 C   s*   t  ddddg¡}tt |tjƒ¡ƒ d S )Nr   r   r&   )r   rœ   r   r3   r‰   r4   ©r8   r:   r;   r;   r<   Útest_nan1  s    zTestBSpline.test_nanc                 C   st   t dd�}|j\}}}t|||ƒ}t || || d  d¡}td|ƒD ]&}| ¡ }t|||ƒ||ƒddd� qHd S )Nrv   ©r"   r   rf   çê-�™—q=r?   )rB   rC   r   r3   rH   r—   Ú
derivativer   )r8   r:   r    r!   r"   Zb0rK   Újr;   r;   r<   Útest_derivative_method6  s    
z"TestBSpline.test_derivative_methodc                 C   sœ   t ƒ }|j\}}}t || || d  d¡}t| ¡  ¡ |ƒ||ƒddd� tj|||f }t ||f¡}t	|||ƒ}t| ¡  ¡ |ƒ||ƒddd� d S )Nr   rf   rN   r?   )
rB   rC   r3   rH   r   Úantiderivativer«   Úc_Údstackr   rc   r;   r;   r<   Útest_antiderivative_method?  s       ÿ  ÿz&TestBSpline.test_antiderivative_methodc                 C   s@  t  dddg¡}t| dd¡dƒ t| dd¡dƒ t| dd¡dƒ t| dd¡dƒ t|jdddd�dƒ t|jddd	d�dƒ t|jddd	d�dƒ t|jddd	d�t dd|j¡ƒ d
|_| ¡ }|dƒ|dƒ }t| dd¡|ƒ t| dd¡d| ƒ t| dd¡|ƒ t| dd¡d| ƒ t| dd¡|dƒ|dƒ ƒ t| dd¡|dƒ|dƒ |dƒ |dƒ ƒ t| dd¡|dƒ|dƒ |dƒ |dƒ ƒ t| dd¡|dƒ|dƒ |dƒ |dƒ d|  ƒ t| dd¡|dƒ|dƒ ƒ t| dd¡|dƒ|dƒ ƒ t| dd¡|dƒ|dƒ d|  ƒ d S )Nr   r   r&   rŽ   g      à¿r%   TrS   Fr�   i÷ÿÿÿiùÿÿÿiøÿÿÿéüÿÿÿç      ø?r'   g      +@é   rq   iöÿÿÿr(   )	r   rœ   r   Ú	integrateÚ_implr   rC   rT   r®   )r8   r:   ÚiZ
period_intr;   r;   r<   Útest_integralM  s:    ÿ.ÿ&ÿzTestBSpline.test_integralc                 C   sT   dddddg}t ||ƒ}d|_t |¡}dD ]"\}}t| ||¡| ||¡ƒ q,d S )Nr   r   r&   r'   r(   r�   ))éûÿÿÿrŽ   )rŽ   rv   )r²   é   )r	   rT   r   r�   r   rµ   )r8   rQ   r:   Úpr™   rš   r;   r;   r<   Útest_integrate_ppolyr  s    


ÿz TestBSpline.test_integrate_ppolyc                 C   sR   G dd„ dt ƒ}| ddddg¡}t|j|ƒ t| ¡ j|ƒ t| ¡ j|ƒ d S )Nc                   @   s   e Zd ZdS )z'TestBSpline.test_subclassing.<locals>.BN)Ú__name__Ú
__module__Ú__qualname__r;   r;   r;   r<   ÚB  s   rÀ   r   r   r&   )r   rœ   r   Ú	__class__r«   r®   )r8   rÀ   r:   r;   r;   r<   Útest_subclassing}  s
    zTestBSpline.test_subclassingÚaxisr²   r(   c              	   C   sf  d\}}t  dd|| d ¡}dddg}|d }| ||¡ t jj|d�}t||||d	�}t|jj|| g|d |…  ||d d …  ƒ t j d
¡}	t||	ƒj|d |… t|	jƒ ||d d …  ƒ |j	 d |j	fD ] }
t
t jtft||||
d�Ž qÚt||||d	� ¡ t||||d	� d¡t||||d	� ¡ t||||d	� d¡fD ]}t|j|jƒ �qLd S )Nro   r   r   rq   rr   rŒ   r(   rs   ©rÃ   ru   )r    r!   r"   rÃ   r&   )r3   rH   r   r7   r   r   r!   rw   ÚlistÚndimr/   Z	AxisErrorr2   r«   r®   rÃ   )r8   rÃ   r9   r"   r    ÚshZpos_axisr!   r:   ZxpZaxÚb1r;   r;   r<   Ú	test_axis‡  s0    
$ÿ
$ÿ
ÿýzTestBSpline.test_axisc                 C   s‚   d}dddddddg}t  ddddgddd	dgg¡}t|||dd
�}t||d |ƒ}t||d |ƒ}t|dƒ|dƒ|dƒgƒ d S )Nr&   r   r   r'   r(   rv   rq   r%   éýÿÿÿrÄ   r-   )r3   Úarrayr   r   )r8   r"   r    r!   ÚsplZspl0Zspl1r;   r;   r<   Útest_neg_axis¥  s    zTestBSpline.test_neg_axisc                 C   sh   dd„ }d}d}dD ]}||||ƒ qt dddƒD ]}|||dƒ q2d	}t dd
ƒD ]}|||dƒ qRdS )a7  
        Splines with different boundary conditions are built on different
        types of vectors of knots. As far as design matrix depends only on
        vector of knots, `k` and `x` it is useful to make tests for different
        boundary conditions (and as following different vectors of knots).
        c           	      S   sÂ   t j d¡ t  t j | ¡d d ¡}t j | ¡d d }|dkrN|d |d< t||||d�}t  t|jƒ| d ¡}t	|j||ƒ|ƒ}t	 
||j|¡ ¡ }t||j |d	d
� t||d	d
� dS )zY
            To avoid repetition of code the following function is provided.
            re   é(   rf   r�   r%   r   ©r"   Úbc_typer   rN   rO   N)r3   r7   rh   ri   Úrandom_sampler	   ÚeyeÚlenr    r   Údesign_matrixÚtoarrayr   r!   )	r9   r"   rÐ   rQ   rj   rX   r!   Zdes_matr_defÚdes_matr_csrr;   r;   r<   Úrun_design_matrix_tests¶  s    þzHTestBSpline.test_design_matrix_bc_types.<locals>.run_design_matrix_testsr.   r'   ©ÚclampedÚnaturalrŒ   r&   ú
not-a-knotrv   rr   r�   N)r—   )r8   r×   r9   r"   Úbcr;   r;   r<   Útest_design_matrix_bc_types¯  s    z'TestBSpline.test_design_matrix_bc_typesrT   FTr�   Údegreerv   c           
   	   C   s4  t j d¡ t j d|d  ¡}t  |¡t  |¡ }}|}t jt  |d |d |¡t  ||d|d  ¡t  |d |d |¡f }t  t	|ƒ| d ¡}t
||||ƒ}	t|	|ƒt
 ||||¡ ¡ ƒ t  |d |d |d |d g¡}|�st t¡� t
 ||||¡ W 5 Q R X nt|	|ƒt
 ||||¡ ¡ ƒ dS )z;Test that design_matrix(x) is equivalent to BSpline(..)(x).re   rG   r   r&   r³   N)r3   r7   rh   rÑ   ZaminZamaxr|   rH   rÒ   rÓ   r   r   rÔ   rÕ   rË   rD   r   r1   )
r8   rT   rÞ   rQ   ZxminZxmaxr"   r    r!   Zbspliner;   r;   r<   Ú'test_design_matrix_same_as_BSpline_callÙ  s,    þ ÿ"þz3TestBSpline.test_design_matrix_same_as_BSpline_callc           
      C   s¤   t j d¡ d}d}t  t j |¡d d ¡}t j |¡d d }t|||d�}tddƒD ]D}|d |… }|d |… }t ||j	|¡ 
¡ }	t|	|j |d	d
� qZd S )Nre   rG   r'   rÎ   rf   r©   r   r(   rN   rO   )r3   r7   rh   ri   rÑ   r	   r—   r   rÔ   r    rÕ   r   r!   )
r8   r9   r"   rQ   rj   rX   r·   ZxcÚycrÖ   r;   r;   r<   Útest_design_matrix_x_shapesõ  s    þz'TestBSpline.test_design_matrix_x_shapesc                 C   sB   ddddddddg}t  d|d¡ ¡ }t|dddd	ggd
d� d S )Nr   r*   r+   r,   r'   g      Ð?gm‰à¨ªªâ?gKÚ}\UUÅ?r)   rN   rO   )r   rÔ   rÕ   r   )r8   r    Zdes_matrr;   r;   r<   Útest_design_matrix_t_shapes  s    þz'TestBSpline.test_design_matrix_t_shapesc              	   C   sÄ   t j d¡ d}d}t  t j |¡d d ¡}t j |¡d d }t|||d�}ttƒ�  t 	||j
d d d… |¡ W 5 Q R X d}d	d
ddddg}d
dddg}ttƒ� t 	|||¡ W 5 Q R X d S )Nre   rG   r'   rÎ   rf   r©   r%   r&   r)   r   r*   r+   r,   g      @)r3   r7   rh   ri   rÑ   r	   r/   r1   r   rÔ   r    )r8   r9   r"   rQ   rj   rX   r    r;   r;   r<   Útest_design_matrix_asserts  s    
$
z&TestBSpline.test_design_matrix_assertsrÐ   rÚ   rÙ   rÛ   c                 C   s¢   t j d¡ t  t j d¡¡}t j d¡}|dkr>|d |d< t|||d�}tj||d�}t  ddd¡}t||ƒ||ƒdd	� t	|||d�}t|j
|j
dd	� d S )
Nre   rf   r�   r   r%   ©rÐ   r   r>   rO   )r3   r7   rh   ri   r   r   Úfrom_power_basisrH   r   r	   r!   )r8   rÐ   rQ   rj   ÚcbrX   rK   Zbspl_newr;   r;   r<   Útest_from_power_basis   s    z!TestBSpline.test_from_power_basisc                 C   sÆ   t j d¡ t  t j d¡¡}t j d¡t j d¡d  }|dkrN|d |d< t|||d�}tj||d�}t||j|d�}t||j	|d�}t
|jj|jd|j  jƒ t|j|jd|j  dd	� d S )
Nre   rf   r   r�   r   r%   rä   r>   rO   )r3   r7   rh   ri   r   r   rå   r	   r¡   r¢   r   r!   Údtyper   )r8   rÐ   rQ   rj   ræ   rX   Zbspl_new_realZbspl_new_imagr;   r;   r<   Útest_from_power_basis_complex/  s"    ÿ
ÿÿz)TestBSpline.test_from_power_basis_complexc              	   C   sb   t  dddddg¡}t  dddddg¡}tjt||dd�dd�}t|jdddddddgdd	� d
S )a}  
        For x = [0, 1, 2, 3, 4] and y = [1, 1, 1, 1, 1]
        the coefficients of Cubic Spline in the power basis:

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

        It could be shown explicitly that coefficients of the interpolating
        function in B-spline basis are c = [1, 1, 1, 1, 1, 1, 1]
        r   r   r&   r'   r(   rÚ   rä   r>   rO   N)r3   rË   r   rå   r   r   r!   )r8   rQ   rj   rX   r;   r;   r<   Útest_from_power_basis_exmp@  s    ÿz&TestBSpline.test_from_power_basis_exmpN)-r½   r¾   r¿   r=   rF   rL   rR   rY   ra   rd   rk   rn   rz   r~   rƒ   r„   r‡   r‹   r�   r’   r˜   r›   rž   r    r¦   r¨   r­   r±   r¸   r¼   rÂ   rD   ÚmarkÚparametrizer—   rÉ   rÍ   rÝ   rß   rá   râ   rã   rç   ré   rê   r;   r;   r;   r<   r      sb   #				%


* ÿ
 ÿ
r   c               	   C   sf   d	dd„} dD ]R}t |d�}tt|ƒƒD ]6\}}| ||ƒ td|d ƒD ]}| |||ddƒ qHq(qd S )
Nr   rN   c           	      S   s‚   | j \}}}t |¡}tj|d d d|dd … |d d…   |d d f }tt||||f|ƒ| ||ƒ||d|| jf d� d S )Nr   gš™™™™™¹?rŽ   r   r%   zder = %s  k = %s)r@   rA   Úerr_msg)rC   r3   Úuniquer|   r   r   r"   )	r:   r¬   r”   r@   rA   r    r!   r"   rQ   r;   r;   r<   Úcheck_splevX  s    
8  ÿz,test_knots_multiplicity.<locals>.check_splev)r   r&   r'   r(   rv   r©   r   rª   )r   rN   rN   )rB   Ú	enumerateÚ_make_multiplesr—   )rï   r"   r:   r¬   rÈ   r”   r;   r;   r<   Útest_knots_multiplicityT  s    



rò   c                 C   sð   |dkr4|| |   kr(||d  k r0n ndS dS |||  || krNd}n2| ||  |||  ||   t | |d ||ƒ }||| d  ||d  k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   r)   ©Ú_naive_B)rQ   r"   r·   r    Úc1Úc2r;   r;   r<   rô   k  s    ,2Frô   c                    sŒ   ˆˆˆ krˆ‰nt  ˆˆ¡d ‰ˆˆ ˆ  krBˆˆd  ksHn t‚ˆˆkr`ˆtˆƒˆ k sdt‚t‡ ‡‡‡‡fdd„tdˆd ƒD ƒƒS )z=
    Naive B-spline evaluation. Useful only for testing!
    r   c                 3   s,   | ]$}ˆ ˆ|  t ˆˆˆ| ˆƒ V  qd S ©Nró   )r]   r¬   ©r!   r·   r"   r    rQ   r;   r<   Ú	<genexpr>ˆ  s     z_naive_eval.<locals>.<genexpr>r   )r3   ÚsearchsortedÚAssertionErrorrÓ   Úsumr—   )rQ   r    r!   r"   r;   rø   r<   r[   ~  s    &r[   c                    sr   t ˆƒˆd  }|ˆd ks t‚t ˆ ƒ|ks0t‚ˆˆ ˆ  krLˆ| ksRn t‚t‡ ‡‡‡fdd„t|ƒD ƒƒS )z'Naive B-spline evaluation, another way.r   c                 3   s$   | ]}ˆ | t ˆˆ|ˆƒ V  qd S r÷   ró   )r]   r·   ©r!   r"   r    rQ   r;   r<   rù   ‘  s     z _naive_eval_2.<locals>.<genexpr>)rÓ   rû   rü   r—   )rQ   r    r!   r"   r9   r;   rý   r<   r`   ‹  s
    "r`   c                 C   s~   t |ƒ|d  }||d ks t‚t |ƒ|ks0t‚d}t|ƒD ]<}tj|||| d … dd�| ƒ}||| t |¡ 7 }q<|S )Nr   r)   r&   FrS   )rÓ   rû   r—   r   rœ   r3   Z
nan_to_num)rQ   r    r!   r"   r9   Úsr·   r:   r;   r;   r<   rŸ   ”  s    "rŸ   c                 C   sT   t  | ¡} t  | | dk | dkB | dk| dk @ | dk| dk@ gdd„ dd„ dd„ g¡S )z+ A linear B-spline function B(x | 0, 1, 2).r   r&   r   c                 S   s   dS )Nr)   r;   ©rQ   r;   r;   r<   Ú<lambda>¥  ó    zB_012.<locals>.<lambda>c                 S   s   | S r÷   r;   rÿ   r;   r;   r<   r   ¥  r  c                 S   s   d|  S ©Nr*   r;   rÿ   r;   r;   r<   r   ¥  r  )r3   Ú
atleast_1dÚ	piecewiserÿ   r;   r;   r<   rP   Ÿ  s    
þýrP   c                 C   s†   t  | ¡} | dk | dk| dk @ | dkg}|dkrHdd„ dd„ dd„ g}n,|dkrhdd„ d	d„ d
d„ g}ntd| ƒ‚t  | ||¡}|S )z0A quadratic B-spline function B(x | 0, 1, 2, 3).r   r&   r   c                 S   s   | |  d S r  r;   rÿ   r;   r;   r<   r   ­  r  zB_0123.<locals>.<lambda>c                 S   s   d| d d  S )Ng      è?r³   r&   r;   rÿ   r;   r;   r<   r   ®  r  c                 S   s   d|  d d S )Nr+   r&   r;   rÿ   r;   r;   r<   r   ¯  r  c                 S   s   dS ©Nr   r;   rÿ   r;   r;   r<   r   ±  r  c                 S   s   dS )Ng       Àr;   rÿ   r;   r;   r<   r   ²  r  c                 S   s   dS r  r;   rÿ   r;   r;   r<   r   ³  r  znever be here: der=%s)r3   r  r1   r  )rQ   r”   ZcondsÚfuncsÚpiecesr;   r;   r<   r�   ¨  s    
þþr�   é#   r'   c                 C   s@   t j d¡ t  t j | | d ¡¡}t j | ¡}t |||¡S )Né{   r   )r3   r7   rh   ri   r   Zconstruct_fast)r9   r"   r    r!   r;   r;   r<   rB   º  s    rB   c                 c   s    | j | j }}| j ¡ }|d |dd…< |d |d< t|||ƒV  | j ¡ }|d |d|d …< t|||ƒV  | j ¡ }|d || d d…< t|||ƒV  dS )	zIncrease knot multiplicity.é   é   é   rp   r   Nr   r%   )r!   r"   r    Úcopyr   )r:   r!   r"   Út1r;   r;   r<   rñ   Á  s    


rñ   c                   @   sd   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTestInteropc                 C   s¤   t  ddt j d¡}t  |¡}t||ƒ}|j|j|jf| _|||  | _	| _
| _t  ddt j d¡| _t j|j|j|jf }t  ||f¡| _t|j| j|jƒ| _d S )Nr   r,   é)   r  )r3   rH   ÚpiÚcosr	   r    r!   r"   rC   rK   rŠ   r:   Úxnewr¯   r°   rö   r   Úb2)r8   rK   rŠ   r:   rö   r;   r;   r<   Úsetup_method×  s    

zTestInterop.setup_methodc              	      sä   | j | j| j  }‰ }tt|ˆ ƒˆ |ƒddd� tt|ˆ jƒˆ |ƒddd� t‡ fdd„|D ƒˆ |ƒddd� ttdd�� t||ƒ W 5 Q R X tt	d|j
jƒƒd }|j
 |¡}|j||jf}tt||ƒ||ƒ |¡ddd� d S )	Nr>   r?   c                    s   g | ]}t |ˆ ƒ‘qS r;   )r   r\   ©r:   r;   r<   r_   í  s     z*TestInterop.test_splev.<locals>.<listcomp>zCalling splev.. with BSpline©Úmatchr   ©r   )r  r:   r  r   r   rC   r/   r1   Útupler—   r!   rÆ   Ú	transposer    r"   )r8   r  r  rÇ   r£   rC   r;   r  r<   Ú
test_splevä  s4    
  ÿ  ÿ  ÿ
  ÿzTestInterop.test_splevc                 C   sÚ   | j | j }}t||ƒ}t ||¡\}}}t|d |dd� t|d |dd� t|d |ƒ t||dd�\}}}}t|d |dd� t|d |dd� t|d |ƒ t||ƒ}	t||	dd� t|Ž }
t||
|ƒdd� d S )Nr   r>   rO   r   r&   T)Úfull_output)rK   rŠ   r   r¶   r   r   r   r   )r8   rQ   rj   rC   r    r!   r"   Ztck_fr‚   rŠ   r:   r;   r;   r<   Útest_splrepÿ  s    

zTestInterop.test_splrepc              	   C   sÄ   | j | j }}tj||f }ttƒ� t||ƒ W 5 Q R X ttƒ� t ||¡ W 5 Q R X ttdd��  t|d d… |d d… ƒ W 5 Q R X ttdd��" t |d d… |d d… ¡ W 5 Q R X d S )Núm > k must holdr  r'   )	rK   rŠ   r3   r¯   r/   r1   r   r¶   r0   )r8   rQ   rj   Úy2r;   r;   r<   Útest_splrep_errors  s    

$zTestInterop.test_splrep_errorsc           	      C   s    t  d¡ d¡}t|ƒ\}}t |¡\}}t||dd� tt||ƒ|dd� tt||ƒ|dd� t|ddd�\\}}}}}t||dd� tt||ƒ|dd� d S )Nr´   ©r'   rv   r>   rO   r   T)rþ   r  )r3   r6   rV   r   r¶   r   r   )	r8   rQ   r:   ÚurC   Úu1Zb_fZu_fr‚   r;   r;   r<   Útest_splprep'  s    zTestInterop.test_splprepc              	   C   s>  t  d¡ d¡}ttdd�� t|ƒ W 5 Q R X ttdd�� t |¡ W 5 Q R X t jdddd�}ttd	d�� t|gƒ W 5 Q R X ttd	d�� t |g¡ W 5 Q R X d
d
ddg}ttdd�� t|gƒ W 5 Q R X ttdd�� t |g¡ W 5 Q R X ddddg}ddddg}ttdd�� t|gd |gŽ  W 5 Q R X d S )Né<   ru   ztoo many values to unpackr  r   rÎ   r'   )Únumr  g– Ð>IÀg– Ð>KÀzInvalid inputsr   r&   r(   g333333Ó?gš™™™™™É?)	r3   r6   rV   r/   r1   r   r¶   rH   r0   )r8   rQ   r#  r;   r;   r<   Útest_splprep_errors6  s&    zTestInterop.test_splprep_errorsc              	   C   sÌ   | j | j }}t ddddg¡tj }tt|ƒ|ddd� tt|j|j|j	fƒ|ddd� t
tdd�� t|d	d
� W 5 Q R X |j ddd¡}t t|j||j	fd	d
�¡}t|jdƒ t|| ddd� d S )NrŽ   r³   r-   g      @gH¯¼šò×z>r?   zCalling sproot.. with BSpliner  rM   )Zmestr   r&   r   )r'   r&   r(   rª   rO   )r:   r  r3   rË   r  r   r   r    r!   r"   r/   r1   r  rU   r   rw   )r8   r:   r  ÚrootsÚc2rÚrrr;   r;   r<   Útest_sprootS  s     zTestInterop.test_sprootc              	   C   sÂ   | j | j }}ttdd|ƒtdd|jƒdd� ttdd|ƒ| dd¡dd� ttdd�� tdd|ƒ W 5 Q R X |j 	ddd¡}t
 tdd|j||jfƒ¡}t|jdƒ t|tdd|ƒdd� d S )	Nr   r   rN   rO   zCalling splint.. with BSpliner  r&   )r'   r&   )r:   r  r   r   rC   rµ   r/   r1   r!   r  r3   rU   r    r"   r   rw   )r8   r:   r  r*  Zintegrr;   r;   r<   Útest_splintd  s$     ÿ
 ÿ
 ÿzTestInterop.test_splintc              	   C   sØ   | j | jfD ]Æ}t|jƒt|jƒ }|dkrVtj|jt |f|jjdd …  ¡f |_dD ]v}t	|ƒ}t
 	|j|j|jf¡}t|j|d dd� t|j|d dd� t|j|d ƒ tt|tƒƒ tt|tƒƒ qZqd S ©Nr   r   )r   r&   r'   r>   rO   r&   )r:   r  rÓ   r    r!   r3   r|   Úzerosrw   r   r¶   r"   r   r   r   Ú
isinstancer   r  ©r8   r:   Úctr9   ZbdZtck_dr;   r;   r<   Útest_splderw  s    *zTestInterop.test_splderc              	   C   sØ   | j | jfD ]Æ}t|jƒt|jƒ }|dkrVtj|jt |f|jjdd …  ¡f |_dD ]v}t	|ƒ}t
 	|j|j|jf¡}t|j|d dd� t|j|d dd� t|j|d ƒ tt|tƒƒ tt|tƒƒ qZqd S r.  )r:   r  rÓ   r    r!   r3   r|   r/  rw   r   r¶   r"   r   r   r   r0  r   r  r1  r;   r;   r<   Útest_splantider‡  s    *zTestInterop.test_splantiderc                 C   s$  | j | j| j  }}}|jjd }d|j| |j|d    }t||ƒt||j|j|jfƒ }}tt	||ƒt	||ƒdd� t
t|tƒƒ t
t|tƒƒ tt|jjƒƒ}|j |dd … d ¡}	t||j|	|jfƒ}
t||ƒ}tt t	||
ƒ¡ ddd¡||ƒdd� t
t|tƒƒ t
t|
tƒƒ d S )Nr&   rŽ   r   r>   rO   r  r   )r:   r  rK   r    rt   r   r!   r"   r   r   r   r0  r   r  r—   rÆ   r  r3   rU   )r8   r:   r  rK   r¬   ÚtnZbnZtck_nrÇ   r¯   Ztck_n2Zbn2r;   r;   r<   Útest_insert—  s(    "
 ÿ
 ÿzTestInterop.test_insertN)r½   r¾   r¿   r  r  r  r!  r%  r(  r,  r-  r3  r4  r6  r;   r;   r;   r<   r  Ó  s   r  c                	   @   s   e Zd Ze ddej ¡Ze e¡Zdd„ Z	dd„ Z
dd„ Zej d	d
dddg¡dd„ ƒZej d	d
dddg¡dd„ ƒZdd„ Zdd„ Zej d	ddddddg¡dd„ ƒZdd„ Zdd„ Zd d!„ Zej d	ddddg¡d"d#„ ƒZd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zejjd.d/�d0d1„ ƒZd2d3„ Zd4d5„ Z d6d7„ Z!d8d9„ Z"d:d;„ Z#d<d=„ Z$d>d?„ Z%ej d	ddddg¡d@dA„ ƒZ&dBdC„ Z'dDdE„ Z(dFdG„ Z)dHdI„ Z*dJdK„ Z+dLS )MÚ
TestInterpr)   r*   c              	   C   s*   t tƒ� t| j| jdd� W 5 Q R X d S )Nr-   r©   )r/   r0   r	   rK   rŠ   )r8   r;   r;   r<   Útest_non_int_order¹  s    
zTestInterp.test_non_int_orderc                 C   sZ   t | j| jdd�}t|| jƒ| jddd� t | j| jddd�}t|| jƒ| jddd� d S )Nr   r©   rN   r?   r%   ©r"   rÃ   ©r	   rK   rŠ   r   r§   r;   r;   r<   Útest_order_0½  s    zTestInterp.test_order_0c                 C   sZ   t | j| jdd�}t|| jƒ| jddd� t | j| jddd�}t|| jƒ| jddd� d S )Nr   r©   rN   r?   r%   r9  r:  r§   r;   r;   r<   Útest_linearÃ  s    zTestInterp.test_linearr"   r   r   r&   r'   c              	   C   sN   ddddddg}ddddddddg}t td	d
�� t|||d� W 5 Q R X d S )Nr   r   r&   r'   r(   rv   rq   rr   zShapes of xr  r©   ©r/   r1   r	   ©r8   r"   rQ   rj   r;   r;   r<   Útest_incompatible_x_yÉ  s    z TestInterp.test_incompatible_x_yc              	   C   sÆ   ddddddg}ddddddg}t tdd�� t|||d	� W 5 Q R X ddddddg}t td
d�� t|||d	� W 5 Q R X ddddddg}t |¡ d¡}t td
d�� t|||d	� W 5 Q R X d S )Nr   r   r&   r'   r(   rv   zx to not have duplicatesr  r©   zExpect x to be a 1D strictly)r   r%   )r/   r1   r	   r3   rU   rV   r>  r;   r;   r<   Útest_broken_xÐ  s    zTestInterp.test_broken_xc                 C   s6   dD ],}t | j| j|ƒ}t|| jƒ| jddd� qd S )Nr"  rN   r?   r:  )r8   r"   r:   r;   r;   r<   Útest_not_a_knotà  s    zTestInterp.test_not_a_knotc                 C   sÒ   t | j| jddd�}t|| jƒ| jddd� tddƒD ].}t|| jd |d�|| jd	 |d�d
d� q6t | j| jddd	d�}t|| jƒ| jddd� tddƒD ].}t|| jd |d�|| jd	 |d�d
d� qžd S )Nrv   r�   rÏ   rN   r?   r   r   r•   r%   g•dyáý¥=rO   ©r"   rÐ   rÃ   )r	   rK   rŠ   r   r—   )r8   r:   r·   r;   r;   r<   Útest_periodicå  s    ,zTestInterp.test_periodicr(   rv   rq   rr   c                 C   sh   d}t j d¡ t  t j |¡d ¡}t j |¡d }|d |d< t|||dd�}t||ƒ|d	d
� d S )Nrv   re   rG   rl   r%   r   r�   rÏ   rN   rO   )r3   r7   rh   ri   rÑ   r	   r   )r8   r"   r9   rQ   rj   r:   r;   r;   r<   Útest_periodic_randomó  s    zTestInterp.test_periodic_randomc                 C   sÜ   | j jd }tj d¡ tj |¡d tj }t |¡}d|d< dtj |d< t d|f¡}t 	|¡|d< t 
|¡|d< t||dddd	�}t|ƒD ]&}t||| ƒ|d d …|f d
d� q’t||d ƒ||d ƒd
d� d S )Nr   re   r&   r)   r%   r   rv   r�   rB  rN   rO   )rK   rw   r3   r7   rh   rÑ   r  ri   r/  Úsinr  r	   r—   r   )r8   r9   rQ   rj   r:   r·   r;   r;   r<   Útest_periodic_axisþ  s    
$zTestInterp.test_periodic_axisc              	   C   sj   t j d¡ d}d}t  t j |¡¡}t j |¡}|d d |d< ttƒ� t|||dd� W 5 Q R X d S )	Nre   rv   rŒ   r%   r   r   r�   rÏ   )r3   r7   rh   ri   rÑ   r/   r1   r	   )r8   r"   r9   rQ   rj   r;   r;   r<   Útest_periodic_points_exception  s    
z)TestInterp.test_periodic_points_exceptionc              	   C   sl   t j d¡ d}d}t  t j |¡¡}t j |¡}t  |d|  ¡}ttƒ� t||||dƒ W 5 Q R X d S )Nre   r'   rr   r&   r�   )	r3   r7   rh   ri   rÑ   r/  r/   r1   r	   )r8   r"   r9   rQ   rj   r    r;   r;   r<   Útest_periodic_knots_exception  s    
z(TestInterp.test_periodic_knots_exceptionc                 C   s„   t | j| j|dd�}t| j| jd|d�}t| j|ƒ}t||| jƒdd� td|ƒD ],}t| j||d�}t||| j|d	�d
d� qRd S )Nr�   rÏ   T)Zperr"   rN   rO   r   r“   r•   r   )r	   rK   rŠ   r   r   r   r—   )r8   r"   r:   rC   rÌ   r·   r;   r;   r<   Útest_periodic_splev#  s    zTestInterp.test_periodic_splevc                 C   s®   t | j| jddd�}t| j| jdd�}t|| jƒ|| jƒdd� d}t tj |¡d ¡}tj |¡d }|d	 |d
< t ||ddd�}t||dd�}t||ƒ||ƒdd� d S )Nr'   r�   rÏ   rä   rN   rO   rG   rl   r%   r   )	r	   rK   rŠ   r   r   r3   ri   r7   rÑ   )r8   r:   Zcubr9   rQ   rj   r;   r;   r<   Útest_periodic_cubic0  s    zTestInterp.test_periodic_cubicc                    sj   d‰t | j| jˆdd�}t| jˆƒ‰t| j| jˆˆƒ‰ t ‡ ‡‡fdd„¡}t|| jƒ|| jƒdd� d S )Nr'   r�   rÏ   c                    s   t | ˆˆ ˆƒS r÷   rZ   rÿ   r^   r;   r<   r   F  r  z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>rN   rO   )r	   rK   rŠ   r   r   r3   Z	vectorizer   )r8   r:   rÈ   r;   r^   r<   Útest_periodic_full_matrix?  s    z$TestInterp.test_periodic_full_matrixc                 C   s²   dg}t | j| jdd |fd�}t|| jƒ| jddd� t|| jd dƒ|d d ddd� t | j| jd|d fd�}t|| jƒ| jddd� t|| jd dƒ|d d ddd� d S )	N©r   g       @r&   rÏ   rN   r?   r%   r   r   r:  )r8   r”   r:   r;   r;   r<   Útest_quadratic_derivI  s    $zTestInterp.test_quadratic_derivc                 C   sÄ   d}dgdg }}t | j| j|||fd�}t|| jƒ| jddd� t|| jd dƒ|| jd	 dƒg|d d |d d gddd� d
gd
g }}t | j| j|||fd�}t|| jƒ| jddd� d S )Nr'   ©r   r+   )r   r,   rä   rN   r?   r   r   r%   ©r&   r   r:  )r8   r"   Úder_lÚder_rr:   r;   r;   r<   Útest_cubic_derivV  s       ÿzTestInterp.test_cubic_derivc                 C   s¸   d\}}t  |¡ t j¡}t  |¡}ddg}ddg}t|||||fd�}t||ƒ|ddd� t||d	 d
ƒ||d	 dƒgdd„ |D ƒƒ t||d d
ƒ||d dƒgdd„ |D ƒƒ d S )N)rv   rr   )r   g      (À)r&   r   rL  )r&   r+   rÏ   rN   r?   r   r   r&   c                 S   s   g | ]\}}|‘qS r;   r;   ©r]   r–   Úvalr;   r;   r<   r_   n  s     z2TestInterp.test_quintic_derivs.<locals>.<listcomp>r%   c                 S   s   g | ]\}}|‘qS r;   r;   rS  r;   r;   r<   r_   p  s     )r3   r6   ÚastypeÚfloat_rE  r	   r   )r8   r"   r9   rQ   rj   rP  rQ  r:   r;   r;   r<   Útest_quintic_derivse  s    
ÿÿzTestInterp.test_quintic_derivsZunstable)Úreasonc                 C   sN   d}t | j|ƒ}ddg}t| j| j|||d fd�}t|| jƒ| jddd� d S )Nr'   rN  )r&   r,   rä   rN   r?   )r   rK   r	   rŠ   r   )r8   r"   r    rP  r:   r;   r;   r<   Útest_cubic_deriv_unstabler  s
    z$TestInterp.test_cubic_deriv_unstablec                 C   s¸   d}t j| jd f|d  | jdd … | jd d…  d | jd f|d  f }t| j| j||dgdgfd�}t|| jƒ| jddd	� t|| jd dƒ|| jd dƒgd
d
gdd� d S )Nr&   r   r   r%   r*   rO  rä   rN   r?   r)   rO   )r3   r|   rK   r	   rŠ   r   )r8   r"   r    r:   r;   r;   r<   Útest_knots_not_data_sites�  s    þ
ÿ&ÿz$TestInterp.test_knots_not_data_sitesc                 C   sX   d}ddg}ddg}t |||dgdgfd�}t dd¡}|d }t||ƒ|ddd� d S )	Nr'   r)   r   ©r   r)   rN  rä   rN   r?   )r	   r3   rH   r   )r8   r"   rQ   rj   r:   rK   rŠ   r;   r;   r<   Útest_minimum_points_and_deriv�  s    z(TestInterp.test_minimum_points_and_derivc              	   C   sÖ   ddddddg }}t tƒ� t||dgd fd� W 5 Q R X t tƒ� t||dd� W 5 Q R X t tƒ� t||dgd� W 5 Q R X t tƒ� t||d	d� W 5 Q R X d
\}}t tƒ� t||||fd� W 5 Q R X d S )Nr   r&   r'   r(   rv   rq   r[  rä   é*   )r[  r[  r=  )r8   rQ   rj   ÚlÚrr;   r;   r<   Útest_deriv_specœ  s    




zTestInterp.test_deriv_specc                 C   s¼   d}| j }| jd| j  }dgdg }}t|||||fd�}t||ƒ|ddd� t||d d	ƒ||d
 d	ƒg|d d	 |d d	 gddd� dD ]&}t|||d�}t||ƒ|ddd� q�d S )Nr'   r   )r   y              @)r   y      @       @rä   rN   r?   r   r   r%   )r   r   r©   )rK   rŠ   r	   r   )r8   r"   rK   rŠ   rP  rQ  r:   r;   r;   r<   Útest_complex³  s      ÿzTestInterp.test_complexc                 C   sH   t  d¡ t j¡}t  d¡ t j¡}dD ]}t|||d�}||ƒ q(d S )NrG   ©r   r   r&   r'   r©   )r3   r6   rU  Úint_r	   )r8   rQ   rj   r"   r:   r;   r;   r<   Útest_int_xyÄ  s
    zTestInterp.test_int_xyc                 C   sF   t  ddd¡}|d d d… }|d d d… }dD ]}t|||d� q.d S )Nr%   r   rl   rv   rb  r©   )r3   rH   r	   )r8   rK   rQ   rj   r"   r;   r;   r<   Útest_sliced_inputÎ  s
    zTestInterp.test_sliced_inputc                 C   sJ   t  d¡ t¡}|d }t jt jt j fD ]}||d< ttt||ƒ q*d S )NrG   r&   r%   )	r3   r6   rU  Úfloatr4   r5   r/   r1   r	   )r8   rQ   rj   Úzr;   r;   r<   Útest_check_finiteØ  s
    zTestInterp.test_check_finitec                 C   s,   t tdƒƒ}dd„ |D ƒ}t|||d� d S )NrG   c                 S   s   g | ]}|d  ‘qS )r&   r;   )r]   Úar;   r;   r<   r_   å  s     z.TestInterp.test_list_input.<locals>.<listcomp>r©   )rÅ   r—   r	   r>  r;   r;   r<   Útest_list_inputá  s    zTestInterp.test_list_inputc                 C   s²   t jt  | j¡t  | j¡f }dddgfg}dddgfg}t| j|d||fd�}t|| jƒ|ddd	� t|| jd
 dƒ|d
 d ddd	� t|| jd dƒ|d
 d ddd	� d S )Nr   r   r*   r+   r,   r'   rÏ   rN   r?   r   r%   )r3   r¯   rE  rK   r  r	   r   )r8   rŠ   rP  rQ  r:   r;   r;   r<   Útest_multiple_rhsè  s    $zTestInterp.test_multiple_rhsc                 C   sº   t j d¡ d\}}t  t jj|d�¡}t jj|dddfd�}t|||ƒ}t|jj|dddfƒ dt j d¡fg}dt j d¡fg}t|||||fd	�}t|jj|| d dddfƒ d S )
Nre   ©r'   rp   rs   rv   rq   rr   r   ©rv   rq   rr   rä   )r3   r7   rh   ri   r	   r   r!   rw   )r8   r"   r9   rQ   rj   r:   Úd_lÚd_rr;   r;   r<   Útest_shapesò  s    zTestInterp.test_shapesc              	   C   s,  t  | j¡}t| j|ddd�}t| j|ddgdgfd�}t|j|jdd� t| j|ddd�}t| j|ddgdgfd�}t|j|jdd� t| j|d	d
d�}t| j|d	d dgfd�}t|j|jdd� t| j|ddd�}t| j|dd d�}t|j|jdd� ttƒ� t| j|ddd� W 5 Q R X t jt  | j¡t  	| j¡f }dddgfg}d	ddgfg}t| j|d||fd�}t| j|ddd�}t|j|jdd� t j
 d¡ d\}}t  t j
j
|d�¡}t j
j
|dddfd�}	dt  d¡fg}
dt  d¡fg}t||	||
|fd�}t||	|dd�}t|j|jdd� d S )Nr'   rÚ   rÏ   rO  r>   rO   )rÚ   rÙ   )r   r   r&   )NrÙ   r[  rÛ   Ztypor   r)   rØ   re   rl  rs   rv   rq   rr   rm  rä   rÙ   )r3   rE  rK   r	   r   r!   r/   r1   r¯   r  r7   rh   ri   r/  )r8   rŠ   rÈ   r  rP  rQ  r"   r9   rQ   rj   rn  ro  r;   r;   r<   Útest_string_aliases  sH    
ÿ

ÿ

ÿzTestInterp.test_string_aliasesc                 C   sr   t j d¡ d\}}t  t jj|d�¡}t jj|d�}t||ƒ}t||||ƒ}t||||ƒ}t|j|ddd� d S )Nre   )r'   rr   rs   rN   r?   )	r3   r7   rh   ri   r   r	   Úmake_interp_full_matrr   r!   )r8   r"   r9   rQ   rj   r    r:   Úcfr;   r;   r<   Útest_full_matrix4  s    
zTestInterp.test_full_matrixc                 C   s¶  t j d¡ d}tdddƒD �]’}t|d d ƒ}t  t j d|f¡¡}td|d ƒD ]l}|d| …|d…f  t  t j d|| f¡¡7  < ||d…d| …f  t  t j d|| f¡¡7  < qVt j ||f¡}||d|…| d…f< t j ||f¡}||| d…d|…f< t  ||f¡}tt|| d dƒƒD ]J\}}	|	d	k �rbt j||	d
�||d|	…f< nt j||	d
�|||	d…f< �q4t j |¡}
t	t
||||
|ƒt j ||
¡dd� qdS )z­
        Random elements in diagonal matrix with blocks in the
        left lower and right upper corners checking the
        implementation of Woodbury algorithm.
        re   éÉ   r'   é    r&   r   Nr%   r   )ÚoffsetrN   rO   )r3   r7   rh   r—   ÚintZdiagflatr/  rð   Zdiagonalr   r   ÚlinalgÚsolve)r8   r9   r"   rw  ri  r·   ÚurÚllÚdr¬   r:   r;   r;   r<   Útest_woodbury?  s,    46
 ÿzTestInterp.test_woodburyN),r½   r¾   r¿   r3   rH   r  rK   rE  rŠ   r8  r;  r<  rD   rë   rì   r?  r@  rA  rC  rD  rF  rG  rH  rI  rJ  rK  rM  rR  rW  ZxfailrY  rZ  r\  r`  ra  rd  re  rh  rj  rk  rp  rq  rt  r~  r;   r;   r;   r<   r7  ²  sN   









	

3r7  c                 C   s²   | j |j kst‚|j | j | d ks(t‚| j }tj||ftjd�}t|ƒD ]V}| | }||| krh|}nt ||¡d }t ||||¡}	|	|||| |d …f< qJt	 
||¡}
|
S )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è   )rt   rû   r3   r/  rV  r—   rú   r   Úevaluate_all_bsplÚslrz  )rQ   rj   r    r"   r9   ÚAr¬   ÚxvalÚleftÚbbr!   r;   r;   r<   rr  \  s    rr  c                 C   sÔ   t tj| ||fƒ\} }}| j}|j| d }tj||ftjd�}t|ƒD ]V}| | }||| krf|}	nt ||¡d }	t 	||||	¡}
|
|||	| |	d …f< qHt 
|j|¡}t 
|j|¡}t ||¡}|||ffS )z,Make the least-square spline, full matrices.r   r  )Úmapr3   rU   rt   r/  rV  r—   rú   r   r€  ÚdotÚTr�  rz  )rQ   rj   r    r"   Úmr9   r‚  r¬   rƒ  r„  r…  rÀ   ÚYr!   r;   r;   r<   Úmake_lsq_full_matrixx  s    r‹  c                   @   s’   e Zd Zej d¡ d\ZZe ej e¡¡Z	ej e¡Z
ee e	d e	d d¡eƒZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚTestLSQre   )rº   r'   r   r%   rr   c                 C   s”   | j | j| j| jf\}}}}t||||ƒ\}}t||||ƒ}t|j|ƒ t|jj	|j
| d fƒ |\}}	tjj||dd�\}
}}}t|j|
ƒ d S )Nr   r%   )Zrcond)rQ   rj   r    r"   r‹  r
   r   r!   r   rw   rt   r3   ry  Zlstsq)r8   rQ   rj   r    r"   Zc0ZAYr:   ZaarŠ   rõ   r‚   r;   r;   r<   Ú
test_lstsqž  s    zTestLSQ.test_lstsqc                 C   s|   | j | j| j| jf\}}}}t |¡}t||||ƒ}t|||||d�}t|j|jdd� t|j|jdd� t	|j|jƒ d S )N)ÚwrN   rO   )
rQ   rj   r    r"   r3   rm   r
   r   r!   r   )r8   rQ   rj   r    r"   rŽ  r:   Zb_wr;   r;   r<   Útest_weights­  s    
zTestLSQ.test_weightsc                 C   sd   | j | j| j| jf\}}}}tjj|dddfd�}t||||ƒ}t|jj	|j
| d dddfƒ d S )Nrv   rq   rr   rs   r   )rQ   r    r"   r9   r3   r7   r
   r   r!   rw   rt   )r8   rQ   r    r"   r9   rj   r:   r;   r;   r<   rk  ¹  s    zTestLSQ.test_multiple_rhsc                 C   sv   | j | j| j  }}}| jd }t||||ƒ}t||j||ƒ}t||j||ƒ}t||ƒ||ƒd||ƒ  ddd� d S )Ny      ð?       @r   r>   r?   )rQ   r    r"   rj   r
   r¡   r¢   r   )r8   rQ   r    r"   rà   r:   r¤   r¥   r;   r;   r<   ra  À  s    
zTestLSQ.test_complexc                 C   sD   t  d¡ t j¡}t  d¡ t j¡}t|dd�}t|||dd� d S )NrG   r   r©   )r3   r6   rU  rc  r   r
   )r8   rQ   rj   r    r;   r;   r<   rd  Ë  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   rl   r'   r©   )r3   rH   r   r
   )r8   rK   rQ   rj   r    r;   r;   r<   re  Ò  s
    
zTestLSQ.test_sliced_inputc                 C   sV   t  d¡ t¡}|d }t|dƒ}t jt jt j fD ]}||d< ttt	|||ƒ q4d S )Né   r&   r'   r%   )
r3   r6   rU  rf  r   r4   r5   r/   r1   r
   )r8   rQ   rj   r    rg  r;   r;   r<   Útest_checkfiniteÛ  s    
zTestLSQ.test_checkfiniteN)r½   r¾   r¿   r3   r7   rh   r9   r"   ri   rQ   rj   r   rH   r    r�  r�  rk  ra  rd  re  r‘  r;   r;   r;   r<   rŒ  ”  s   	rŒ  c                 C   s    t j t j t j t¡¡d| ¡S )NÚdata)ÚosÚpathÚjoinÚabspathÚdirnameÚ__file__)Úbasenamer;   r;   r<   Ú	data_fileæ  s     ÿrš  c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚTestSmoothingSplinec              	   C   s*  t j d¡ d}t  t j |¡d d ¡}|d t  d| ¡ |d  t j dd|¡ }ttƒ� t	||dd … ƒ W 5 Q R X ttƒ� t	|dd … |ƒ W 5 Q R X ttƒ� t	| 
d|¡|ƒ W 5 Q R X ttƒ� t	|d d d	… |ƒ W 5 Q R X t  |¡}|d |d
< ttƒ� t	||ƒ W 5 Q R X d S )Nre   rl   r(   r&   r'   r)   r³   r   r%   r   )r3   r7   rh   ri   rÑ   rE  Únormalr/   r1   r   rV   r  )r8   r9   rQ   rj   Zx_duplr;   r;   r<   Útest_invalid_inputï  s     .





z&TestSmoothingSpline.test_invalid_inputc                 C   sH   t  tdƒ¡}|d }|d }|d }t||ƒ|ƒ}t||ddd� dS )ae  
        Data is generated in the following way:
        >>> np.random.seed(1234)
        >>> n = 100
        >>> x = np.sort(np.random.random_sample(n) * 4 - 2)
        >>> y = np.sin(x) + np.random.normal(scale=.5, size=n)
        >>> np.savetxt('x.csv', x)
        >>> np.savetxt('y.csv', y)

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

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

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

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

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

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

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

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

        z
gcvspl.npzrQ   rj   Úy_GCVSPLg-Cëâ6?r?   N)r3   Úloadrš  r   r   )r8   r’  rQ   rj   rž  Zy_comprr;   r;   r<   Útest_compare_with_GCVSPL  s    )z,TestSmoothingSpline.test_compare_with_GCVSPLc                 C   sª   t j d¡ d}t  t j |¡d d ¡}|d t  d| ¡ |d  t j dd|¡ }t||dd�}t||dd	d
�}t  	|d |d d| ¡}t
||ƒ||ƒdd� dS )z–
        In case the regularization parameter is 0, the resulting spline
        is an interpolation spline with natural boundary conditions.
        re   rl   r(   r&   r'   r)   r³   )ZlamrÚ   rä   r   r%   r>   rO   N)r3   r7   rh   ri   rÑ   rE  rœ  r   r	   rH   r   )r8   r9   rQ   rj   Z
spline_GCVZspline_interpÚgridr;   r;   r<   Útest_non_regularized_case=  s    .þz-TestSmoothingSpline.test_non_regularized_casec           
      C   sî   t j d¡ d}t  t j |¡d d ¡}|d t  d| ¡ |d  t j dd|¡ }t||ƒ}t jjt	dƒdd	�D ]r}t  
|¡}d
||< t|||ƒ}t||| ƒ||  ƒ}t||| ƒ||  ƒ}	||	k rvtd|d›d|	d›�ƒ‚qvd S )Nre   rl   r(   r&   r'   r)   r³   rG   rs   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )r3   r7   rh   ri   rÑ   rE  rœ  r   Úchoicer—   ZonesÚabsr1   )
r8   r9   rQ   rj   rÌ   ÚindrŽ  Zspl_wÚorigZweightedr;   r;   r<   Útest_weighted_smoothing_splineP  s    .

z2TestSmoothingSpline.test_weighted_smoothing_splineN)r½   r¾   r¿   r�  r   r¢  r§  r;   r;   r;   r<   r›  ë  s   6r›  )r   )r  r'   )r'   )9Únumpyr3   Znumpy.testingr   r   r   rD   r   r/   Zscipy.interpolater   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   Zscipy.linalgry  r�  Zscipy.interpolate._bsplinesr   r   r   r   r   Zscipy.interpolate._fitpack_implZinterpolateZ_fitpack_implr¶   r“  r   rò   rô   r[   r`   rŸ   rP   r�   rB   rñ   r  r7  rr  r‹  rŒ  rš  r›  r;   r;   r;   r<   Ú<module>   sB   H    E		

 `   -
R