o
    Ö­j-õ ã                   @   sú  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlZd dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z  d dl!m"Z# d dl$m%  m"Z& d dl'm(Z(m)Z)m*Z*m+Z+m,Z, d dlm-Z-m.Z.m/Z/ d dl0m1  m2Z3 d dl4m5Z5 d d	l6m7Z7 d d
l8m9Z9 d dlm:Z; d dlm<Z= d dlm>Z> G dd„ dƒZ?G dd„ dƒZ@dd„ ZAdd„ ZBdd„ ZCdd„ ZDdd„ ZEdd„ ZFd^dd„ZGd_d"d#„ZHd$d%„ ZIG d&d'„ d'ƒZJG d(d)„ d)ƒZKd*d+„ ZLd`d,d-„ZMejN Od.d/d0g¡ZPG d1d2„ d2ƒZQG d3d4„ d4ƒZRdad6d7„ZSd8d9„ ZTd:d;„ ZUG d<d=„ d=ƒZVd>d?„ ZWG d@dA„ dAƒZXdBdC„ ZYdDdE„ ZZdFdG„ Z[G dHdI„ dIƒZ\G dJdK„ dKƒZ]G dLdM„ dMƒZ^G dNdO„ dOƒZ_dPdQ„ Z`dRdS„ ZaG dTdU„ dUƒZbdVdW„ ZcG dXdY„ dYƒZdG dZd[„ d[ƒZeG d\d]„ d]ƒZfdS )bé    N)Úsuppress_warnings)Úxp_assert_equalÚxp_assert_close)Úraises)ÚBSplineÚBPolyÚPPolyÚmake_interp_splineÚmake_lsq_splineÚsplevÚsplrepÚsplprepÚsplderÚ
splantiderÚsprootÚsplintÚinsertÚCubicSplineÚ	NdBSplineÚmake_smoothing_splineÚRegularGridInterpolator)Ú_not_a_knotÚ_augkntÚ_woodbury_algorithmÚ_periodic_knotsÚ_make_interp_per_full_matr)Úgenerate_knotsÚmake_splrepÚmake_splprep)Ú	AxisError)Ú_run_concurrent_barrier)Úmake_ndbspl)Ú	_dfitpack)Ú	_bsplines)Ú_dierckxc                   @   sÈ  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Ze j! "d;e#d<d=ƒ¡d>d?„ ƒZ$d@dA„ Z%e j!j&dBdC„ ƒZ'e j! "dDg dE¢¡e j! "dFe#dGƒ¡dHdI„ ƒƒZ(dJdK„ Z)dLdM„ Z*dNdO„ Z+e j! "dPg dQ¢¡dRdS„ ƒZ,e j! "dPg dQ¢¡dTdU„ ƒZ-dVdW„ Z.dXdY„ Z/e j!j&dZd[„ ƒZ0d\d]„ Z1d^S )_ÚTestBSplinec              	   C   sö  t ttftfi tddgdgdd�¤Ž tjdd�� t ttfi tdtjgdgdd�¤Ž W d   ƒ n1 s6w   Y  t ttfi tdtjgdgdd�¤Ž t ttfi tddgdgdd�¤Ž t ttfi tdgdggdgdd�¤Ž t ttfi tg d	¢dgdd�¤Ž t ttfi tg d
¢ddgdd�¤Ž t ttfi tg d¢g d¢dd�¤Ž t ttfi tg d¢g d¢dd�¤Ž t ttfi tg d¢g d¢dd�¤Ž d\}}tj	|| d tj
d�}tj |¡}t|||ƒ}t||jƒ t||jƒ ||jksùJ ‚d S )Né   ù              ð?ç      ð?r   ©ÚtÚcÚkÚignore)Úinvalidéÿÿÿÿ©r   r&   é   ©r   r&   r1   é   é   r1   )ç        r5   r(   ç       @ç      @ç      @)r(   r(   r(   Úcubicç      @)r5   r   r&   r&   r1   r3   )r(   r&   r&   ©é   r3   ©Údtype)Úassert_raisesÚ	TypeErrorÚ
ValueErrorr   ÚdictÚnpÚerrstateÚnanÚinfÚarangeÚfloat64Úrandomr   r*   r+   r,   )ÚselfÚnr,   r*   r+   Úb© rM   úb/var/www/html/CropPilot/venv/lib/python3.10/site-packages/scipy/interpolate/tests/test_bsplines.pyÚ	test_ctor)   s:   ÿ&ÿ$"&"
ÿ
ÿ
ÿ
ÿzTestBSpline.test_ctorc                 C   s€   t ƒ }|j}t|j|d ddd� t|j|d ddd� |j|d ks%J ‚t t¡� d|_W d   ƒ d S 1 s9w   Y  d S )Nr   çVçž¯Ò<©ÚatolÚrtolr&   r1   Úfoo)	Ú_make_random_splineÚtckr   r*   r+   r,   Úpytestr   ÚAttributeError)rJ   rL   rV   rM   rM   rN   Útest_tckL   s   "ÿzTestBSpline.test_tckc                 C   sp   t  ddd¡}tddgdgdd�}t||ƒt  |¡d ƒ tg d¢ddgdd�}t||ƒt  |d	k dd
¡ƒ d S )Nr   r&   é
   r7   r)   )r   çffffffÖ?r&   r3   r4   r[   r8   )rC   Úlinspacer   r   Ú	ones_likeÚwhere©rJ   ÚxxrL   rM   rM   rN   Útest_degree_0X   s
    zTestBSpline.test_degree_0c                 C   s–   g d¢}g d¢}d}t |||ƒ}t ddd¡}t|d t|ƒ |d t|d ƒ  |d t|d ƒ  ||ƒdd	� tt||||fƒ||ƒdd	� d S )
Nr2   ©r&   r1   r3   r&   r3   é2   r   r1   ç›+¡†›„=©rR   )r   rC   r\   r   ÚB_012r   )rJ   r*   r+   r,   rL   ÚxrM   rM   rN   Útest_degree_1a   s   8ÿ"zTestBSpline.test_degree_1c                 C   s¤   d}t  dg|d  dg|d   ¡}t  g d¢¡}t| dd¡ddgƒ}t|||ƒ}t  ddd¡}t||d	d
�||d	d
�dd� tt||||fƒ||ƒdd� d S )Nr3   r   r&   ©r(   r6   r7   r8   r/   g      ð¿r6   rZ   T©Úextrapolaterd   re   )rC   Úasarrayr   Úreshaper   r\   r   r   )rJ   r,   r*   r+   ÚbpÚbsplr`   rM   rM   rN   Útest_bernsteinl   s   "ÿ
ÿzTestBSpline.test_bernsteinc                    s‚   t ƒ }|j\‰‰ ‰t ˆˆ ˆˆ d  d¡}||ƒ}‡ ‡‡fdd„|D ƒ}t||dd� ‡ ‡‡fdd„|D ƒ}t||dd� d S )Nr&   rc   c                    ó   g | ]	}t |ˆˆ ˆƒ‘qS rM   ©Ú_naive_eval©Ú.0rg   ©r+   r,   r*   rM   rN   Ú
<listcomp>‚   ó    z4TestBSpline.test_rndm_naive_eval.<locals>.<listcomp>rd   re   c                    rq   rM   )Ú_naive_eval_2rt   rv   rM   rN   rw   …   rx   )rU   rV   rC   r\   r   )rJ   rL   r`   Úy_bÚy_nÚy_n2rM   rv   rN   Útest_rndm_naive_evalz   s   z TestBSpline.test_rndm_naive_evalc                 C   sP   t ƒ }|j\}}}t || || d  d¡}t||ƒt||||fƒdd� d S )Nr&   rc   rd   re   ©rU   rV   rC   r\   r   r   ©rJ   rL   r*   r+   r,   r`   rM   rM   rN   Útest_rndm_splevˆ   s   "zTestBSpline.test_rndm_splevc           	      C   s~   t j d¡}t  | d¡¡}| d¡}t||ƒ}t|Ž }|j|j}}t  || || d  d¡}t	||ƒt
||ƒdd� d S )NéÒ  é   r&   éP   rd   re   )rC   rI   ÚRandomStateÚsortr   r   r*   r,   r\   r   r   )	rJ   Úrngrg   ÚyrV   rL   r*   r,   r`   rM   rM   rN   Útest_rndm_splrepŽ   s   

zTestBSpline.test_rndm_splrepc                 C   sP   t ƒ }t |j¡|_t |j|j |j|j d  d¡}t||ƒt |¡ƒ d S )Nr&   éd   )rU   rC   r]   r+   r\   r*   r,   r   )rJ   rL   r`   rM   rM   rN   Útest_rndm_unityš   s   $zTestBSpline.test_rndm_unityc           
      C   s†   t j d¡}d\}}t  | |¡¡}|j|ddfd�}t|||ƒ}|| || d  }}||| | d¡  }	||	ƒjdksAJ ‚d S )	Nr�   ©é   r3   é   é   ©Úsizer&   ©r3   r4   é   )r3   r4   r’   r�   rŽ   )rC   rI   r„   r…   r   Úshape)
rJ   r†   rK   r,   r*   r+   rL   ÚtmÚtpr`   rM   rM   rN   Útest_vectorization    s   zTestBSpline.test_vectorizationc                 C   sì   t j d¡}d\}}t  | || d ¡¡}| |¡}t j|| |d ¡f }t|||ƒt|||ƒ}}|d |d  }	t  |d |	 |d |	 d¡}
t||
ƒ||
ƒdd� t||
ƒt|
|||fƒdd� t||
ƒt|
|||fƒdd� d S )	Nr�   )é!   r3   r&   r/   r   rc   rd   re   )	rC   rI   r„   r…   Úr_r   r\   r   r   )rJ   r†   rK   r,   r*   r+   Úc_padrL   Úb_padÚdtr`   rM   rM   rN   Ú
test_len_cª   s   
"zTestBSpline.test_len_cc           	      C   sd   t ƒ }|j\}}}|| || d  }}dD ]}t|||g|ƒ||d |d g|ƒddd� qd S )Nr&   ©TFç»½×Ùß|Û=ç•Ö&è.>çH¯¼šò×z>rQ   ©rU   rV   r   )	rJ   Únum_parallel_threadsrL   r*   Ú_r,   r”   r•   ÚextraprM   rM   rN   Útest_endpoints½   s   ÿÿzTestBSpline.test_endpointsc                 C   sX   t ƒ }|j\}}}t|||d | d … d ƒ|||d | d … d ƒdd� d S )Nr&   rž   rŸ   re   r¡   )rJ   r¢   rL   r*   r£   r,   rM   rM   rN   Útest_continuityÇ   s
   :
ÿzTestBSpline.test_continuityc                 C   s¬   t ƒ }|j\}}}|d |d  }t || | || d  | d¡}|| |k ||| d  k @ }t||| dd�||| dd�ƒ t||dd�t||||fdd�ƒ d S )	Nr/   r   r&   rc   Trj   F)Úextr~   )rJ   rL   r*   r+   r,   r›   r`   ÚmaskrM   rM   rN   Útest_extrapÎ   s   $ÿÿzTestBSpline.test_extrapc                 C   sJ   t ƒ }|j\}}}|d d |d d g}||ƒ}t t |¡¡r#J ‚d S )Nr   r&   r/   )rU   rV   rC   ÚallÚisnan)rJ   rL   r*   r£   r,   r`   ÚyyrM   rM   rN   Útest_default_extrapÝ   s
   zTestBSpline.test_default_extrapc           
      C   sþ   t j d¡}t  | d¡¡}| d¡}d}t|||dd�}|j|d  }|d |d	  }t  || | || | d
¡}|| |||  || ||    }	t||ƒt|	|||fƒƒ g d¢}|| |||  || ||    }	t	||dd�||	dd�ƒ d S )Nr�   é   r4   r3   Úperiodicrj   r&   r/   r   rc   )r/   r   ç      à?r&   T)
rC   rI   r„   r…   r   r�   r\   r   r   r   )
rJ   r†   r*   r+   r,   rL   rK   r›   r`   ÚxyrM   rM   rN   Útest_periodic_extrapå   s   
$$z TestBSpline.test_periodic_extrapc                 C   sV   t ƒ }|j\}}}t |||f¡}t || ||  d¡}t||ƒ||ƒddd� d S )Nr‰   rd   rQ   )rU   rV   r   Úfrom_splinerC   r\   r   )rJ   rL   r*   r+   r,   Úppr`   rM   rM   rN   Ú
test_ppoly÷   s
   zTestBSpline.test_ppolyc                 C   s˜   t ƒ }|j\}}}t |d |d d¡}tj||f }td|d ƒD ]}t||||f|d�}t||||d�dd� q"t|||d d�t |¡dd� d S )	Nr   r/   rc   r&   ©Úder©Únurd   re   )	rU   rV   rC   r\   r˜   Úranger   r   Ú
zeros_like)rJ   rL   r*   r+   r,   r`   r·   ÚydrM   rM   rN   Útest_derivative_rndmÿ   s   $z TestBSpline.test_derivative_rndmc           	      C   s   d}g d¢}t j d¡}t jdd| d¡ddf }t|||ƒ}t  g d¢¡}t|||dk d ƒ|||dk d ƒƒ t  |d	ƒ|d
ƒ¡rGJ ‚t  ddg¡}t||d dd�||d dd�ƒ t  ddg¡}t  ||d dd�||d dd�¡rzJ ‚t  ||d dd�||d dd�¡rŽJ ‚d S )Nr1   )r/   r/   r   r&   r&   r3   r4   r�   r�   r�   rŽ   rŽ   r�   r   r’   )r&   r3   r4   r�   r�   rž   g2Hþÿÿÿ@gÎ·   @r3   r4   r&   r¸   )rC   rI   r„   r˜   r   rl   r   Úallclose)	rJ   r,   r*   r†   r+   rL   rg   Úx0Úx1rM   rM   rN   Útest_derivative_jumps  s"   ÿÿ(,z!TestBSpline.test_derivative_jumpsc                 C   s¦   t  ddd¡}tjg d¢d�}t||ƒt||j|j|jfƒdd� t||ƒt	|ƒdd� tjg d¢d�}t  d	d
d¡}t||ƒt  
|dk || d| d
 ¡dd� d S )Nr/   r4   r‚   ©r   r&   r1   r3   )r*   rd   re   ©r   r&   r&   r1   r   r1   rZ   r&   r6   )rC   r\   r   Úbasis_elementr   r   r*   r+   r,   ÚB_0123r^   r_   rM   rM   rN   Útest_basis_element_quadratic&  s   ÿÿ
ÿz(TestBSpline.test_basis_element_quadraticc                 C   sN   t ƒ }|j\}}}t || || d  d¡}t||ƒt||||ƒdd� d S )Nr&   r‚   rd   re   )rU   rV   rC   r\   r   Ú_sum_basis_elementsr   rM   rM   rN   Útest_basis_element_rndm3  s    z#TestBSpline.test_basis_element_rndmc           	      C   s–   t ƒ }|j\}}}|d }t|||ƒ}t||jj|ƒ}t||jj|ƒ}t || || d  d¡}t||ƒj||ƒdd� t||ƒj||ƒdd� d S )Ny      ð?      @r&   r‚   rd   re   )	rU   rV   r   r+   ÚrealÚimagrC   r\   r   )	rJ   rL   r*   r+   r,   ÚccÚb_reÚb_imr`   rM   rM   rN   Ú
test_cmplx9  s   zTestBSpline.test_cmplxc                 C   s&   t  g d¢¡}t |tjƒ¡sJ ‚d S )NrÃ   )r   rÄ   rC   r«   rE   ©rJ   rL   rM   rM   rN   Útest_nanF  s   zTestBSpline.test_nanc                 C   st   t dd�}|j\}}}t|||ƒ}t || || d  d¡}td|ƒD ]}| ¡ }t|||ƒ||ƒddd� q$d S )Nr’   ©r,   r&   r‚   çê-�™—q=rQ   )rU   rV   r   rC   r\   rº   Ú
derivativer   )rJ   rL   r*   r+   r,   Úb0r`   ÚjrM   rM   rN   Útest_derivative_methodK  s   
þz"TestBSpline.test_derivative_methodc                 C   sœ   t ƒ }|j\}}}t || || d  d¡}t| ¡  ¡ |ƒ||ƒddd� tj|||f }t ||f¡}t	|||ƒ}t| ¡  ¡ |ƒ||ƒddd� d S )Nr&   r‚   rd   rQ   )
rU   rV   rC   r\   r   ÚantiderivativerÓ   Úc_Údstackr   r   rM   rM   rN   Útest_antiderivative_methodT  s   
ÿ

ÿz&TestBSpline.test_antiderivative_methodc              	   C   sª  t  g d¢¡}t| dd¡t d¡ƒ t| dd¡t d¡ƒ t| dd¡t d¡ƒ t| dd¡t d¡ƒ t|jdddd	�t d¡ƒ t|jddd
d	�t d¡ƒ t|jddd
d	�t d¡ƒ t|jddd
d	�t t dd|j¡¡ƒ d|_	| 
¡ }t |dƒ|dƒ ¡}t| dd¡|ƒ t| dd¡t d| ¡ƒ t| dd¡|ƒ t| dd¡t d| ¡ƒ t| dd¡t |dƒ|dƒ ¡ƒ t| dd¡t |dƒ|dƒ |dƒ |dƒ ¡ƒ t| dd¡t |dƒ|dƒ |dƒ |dƒ ¡ƒ t| dd¡t |dƒ|dƒ |dƒ |dƒ d|  ¡ƒ t| dd¡t |dƒ|dƒ ¡ƒ t| dd¡t |dƒ|dƒ ¡ƒ t| dd¡t |dƒ|dƒ d|  ¡ƒ d S )Nr0   r   r&   r°   ç      à¿r/   r5   Trj   Fr¯   r1   i÷ÿÿÿiùÿÿÿiøÿÿÿéüÿÿÿç      ø?r3   g      +@é   r�   iöÿÿÿr4   )r   rÄ   r   Ú	integraterC   rl   Ú_implr   rV   rk   r×   )rJ   rL   ÚiÚ
period_intrM   rM   rN   Útest_integralb  sF   ÿÿ$ÿ$ÿ,ÿ$$ÿzTestBSpline.test_integralc                 C   sN   g d¢}t ||ƒ}d|_t |¡}dD ]\}}t| ||¡| ||¡ƒ qd S )Nr2   r¯   ))éûÿÿÿr°   )r°   r’   )rÜ   é   )r	   rk   r   r³   r   rß   )rJ   rg   rL   Úpr¿   rÀ   rM   rM   rN   Útest_integrate_ppolyŠ  s   


ÿÿz TestBSpline.test_integrate_ppolyc                 C   sJ   t  g d¢¡}dD ]}|jdd|d�}t|tjƒsJ ‚|jdks"J ‚q	d S )Nr0   r�   r   r&   rj   )r   rÄ   rß   Ú
isinstancerC   ÚndarrayÚndim)rJ   rL   rk   ÚresrM   rM   rN   Útest_integrate_0D_always•  s   ýz$TestBSpline.test_integrate_0D_alwaysc                 C   sT   G dd„ dt ƒ}| g d¢¡}|j|ksJ ‚| ¡ j|ksJ ‚| ¡ j|ks(J ‚d S )Nc                   @   s   e Zd ZdS )z'TestBSpline.test_subclassing.<locals>.BN)Ú__name__Ú
__module__Ú__qualname__rM   rM   rM   rN   ÚBŸ  s    rð   )r   r&   r1   r1   )r   rÄ   Ú	__class__rÓ   r×   )rJ   rð   rL   rM   rM   rN   Útest_subclassing�  s
   zTestBSpline.test_subclassingÚaxisrÜ   r4   c              
   C   sv  d\}}t  dd|| d ¡}g d¢}|d }| ||¡ t|ƒ}t j d¡}|j|d�}t||||d�}	|	jj|| f|d |…  ||d d …  ksNJ ‚| d	¡}
|	|
ƒj|d |… |
j ||d d …  kskJ ‚|j	 d |j	fD ]}t
ttfi t||||d
�¤Ž qtt||||d� ¡ t||||d� d¡t||||d� ¡ t||||d� d¡fD ]
}|j|	jks¸J ‚q®d S )Nr‹   r   r&   ©r�   rŽ   r®   r4   r�   r�   ©ró   r‘   )r*   r+   r,   ró   r1   )rC   r\   r   ÚtuplerI   r„   r   r+   r“   rê   r?   r   rB   rÓ   r×   ró   )rJ   ró   rK   r,   r*   ÚshÚpos_axisr†   r+   rL   ÚxpÚaxÚb1rM   rM   rN   Ú	test_axis§  s.   2
0
ÿýüzTestBSpline.test_axisc                 C   sp   d}g d¢}t  g d¢g d¢g¡}t|||dd�}t||d |ƒ}t||d |ƒ}t|d	ƒ|d	ƒ|d	ƒgƒ d S )
Nr1   )r   r&   r1   r3   r4   r’   r�   )r/   r1   r   r/   )r1   r   éýÿÿÿr&   r/   rõ   r   r&   r:   )rC   Úarrayr   r   )rJ   r,   r*   r+   ÚsplÚspl0Úspl1rM   rM   rN   Útest_neg_axisÅ  s   zTestBSpline.test_neg_axisc                 C   sh   dd„ }d}d}dD ]}||||ƒ q
t dddƒD ]}|||dƒ qd	}t dd
ƒD ]}|||dƒ q)dS )a7  
        Splines with different boundary conditions are built on different
        types of vectors of knots. As far as design matrix depends only on
        vector of knots, `k` and `x` it is useful to make tests for different
        boundary conditions (and as following different vectors of knots).
        c           
      S   s¾   t j d¡}t  | | ¡d d ¡}| | ¡d d }|dkr%|d |d< t||||d�}t  t|jƒ| d ¡}t	|j||ƒ|ƒ}t	 
||j|¡ ¡ }	t|	|j |d	d
� t||	d	d
� dS )zY
            To avoid repetition of code the following function is provided.
            r�   é(   r‚   r¯   r/   r   ©r,   Úbc_typer&   rd   re   N)rC   rI   r„   r…   Úrandom_sampler	   ÚeyeÚlenr*   r   Údesign_matrixÚtoarrayr   r+   )
rK   r,   r  r†   rg   r‡   ro   r+   Údes_matr_defÚdes_matr_csrrM   rM   rN   Úrun_design_matrix_tests×  s    þþzHTestBSpline.test_design_matrix_bc_types.<locals>.run_design_matrix_testsr<   r3   ©ÚclampedÚnaturalr®   r1   ú
not-a-knotr’   rŽ   r¯   N)rº   )rJ   r  rK   r,   ÚbcrM   rM   rN   Útest_design_matrix_bc_typesÏ  s   ÿz'TestBSpline.test_design_matrix_bc_typesrk   )FTr¯   Údegreer’   c              	   C   sH  t j d¡}| d|d  ¡}t  |¡t  |¡}}|}t jt  |d |d |¡t  ||d|d  ¡t  |d |d |¡f }t  t	|ƒ| d ¡}	t
||	||ƒ}
t|
|ƒt
 ||||¡ ¡ ƒ t  |d |d |d |d g¡}|s“t t¡� t
 ||||¡ W d  ƒ dS 1 sŒw   Y  dS t|
|ƒt
 ||||¡ ¡ ƒ dS )z;Test that design_matrix(x) is equivalent to BSpline(..)(x).r�   rZ   r&   r1   rÝ   N)rC   rI   r„   r  ÚaminÚamaxr˜   r\   r  r  r   r   r	  r
  rþ   rW   r   rA   )rJ   rk   r  r†   rg   ÚxminÚxmaxr,   r*   r+   ÚbsplinerM   rM   rN   Ú'test_design_matrix_same_as_BSpline_callú  s,   þÿ""ÿþz3TestBSpline.test_design_matrix_same_as_BSpline_callc                 C   s    t j d¡}d}d}t  | |¡d d ¡}| |¡d d }t|||d�}tddƒD ]"}|d |… }|d |… }	t ||j	|¡ 
¡ }
t|
|j |	d	d
� q+d S )Nr�   rZ   r3   r  r‚   rÑ   r&   r4   rd   re   )rC   rI   r„   r…   r  r	   rº   r   r	  r*   r
  r   r+   )rJ   r†   rK   r,   rg   r‡   ro   rá   ÚxcÚycr  rM   rM   rN   Útest_design_matrix_x_shapes  s"   þþúz'TestBSpline.test_design_matrix_x_shapesc                 C   s2   g d¢}t  d|d¡ ¡ }t|g d¢gdd� d S )N)r(   r(   r(   r6   r7   r8   r8   r8   r6   r3   )g      Ð?gm‰à¨ªªâ?gKÚ}\UUÅ?r5   rd   re   )r   r	  r
  r   )rJ   r*   Údes_matrrM   rM   rN   Útest_design_matrix_t_shapes'  s   
þz'TestBSpline.test_design_matrix_t_shapesc                 C   sÞ   t j d¡}d}d}t  | |¡d d ¡}| |¡d d }t|||d�}ttƒ� t 	||j
d d d… |¡ W d   ƒ n1 sBw   Y  d}g d	¢}g d
¢}ttƒ� t 	|||¡ W d   ƒ d S 1 shw   Y  d S )Nr�   rZ   r3   r  r‚   rÑ   r/   r1   )r5   r(   r6   r7   r8   ç      @ri   )rC   rI   r„   r…   r  r	   r?   rA   r   r	  r*   )rJ   r†   rK   r,   rg   r‡   ro   r*   rM   rM   rN   Útest_design_matrix_asserts/  s   
ÿ
"ÿz&TestBSpline.test_design_matrix_assertsr  )r  r  r¯   r  c           	      C   sž   t j d¡}t  | d¡¡}| d¡}|dkr|d |d< t|||d�}tj||d�}t  ddd¡}t||ƒ||ƒdd	� t	|||d�}t|j
|j
dd	� d S )
Nr�   r‚   r¯   r   r/   ©r  r&   rP   re   )rC   rI   r„   r…   r   r   Úfrom_power_basisr\   r   r	   r+   )	rJ   r  r†   rg   r‡   Úcbro   r`   Úbspl_newrM   rM   rN   Útest_from_power_basisA  s   
z!TestBSpline.test_from_power_basisc           	      C   s¤   t j d¡}t  | d¡¡}| d¡| d¡d  }|dkr$|d |d< t|||d�}tj||d�}t||j|d�}t||j	|d�}t
|j|jd|j  dd	� d S )
Nr�   r‚   r'   r¯   r   r/   r"  rP   re   )rC   rI   r„   r…   r   r   r#  r	   rÉ   rÊ   r   r+   )	rJ   r  r†   rg   r‡   r$  ro   Úbspl_new_realÚbspl_new_imagrM   rM   rN   Útest_from_power_basis_complexP  s    z)TestBSpline.test_from_power_basis_complexc                 C   sL   t  g d¢¡}t  g d¢¡}tjt||dd�dd�}t|jg d¢dd� dS )	a}  
        For x = [0, 1, 2, 3, 4] and y = [1, 1, 1, 1, 1]
        the coefficients of Cubic Spline in the power basis:

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

        It could be shown explicitly that coefficients of the interpolating
        function in B-spline basis are c = [1, 1, 1, 1, 1, 1, 1]
        r2   )r&   r&   r&   r&   r&   r  r"  )r(   r&   r&   r&   r&   r&   r&   rP   re   N)rC   rþ   r   r#  r   r   r+   )rJ   rg   r‡   ro   rM   rM   rN   Útest_from_power_basis_exmp^  s   ÿz&TestBSpline.test_from_power_basis_exmpc                 C   sv   t  ddg¡}t  dg¡}|jdd� |jdd� t  ddd¡}|jdd� t||dd�}t||ƒt  |¡d ƒ d S )Nr   r&   r7   F©ÚwriterZ   r)   )rC   rþ   Úsetflagsr\   r   r   r]   )rJ   r*   r+   r`   rL   rM   rM   rN   Útest_read_onlyq  s   zTestBSpline.test_read_onlyc                 C   s   t ƒ }dd„ }td||ƒ d S )Nc                 S   s4   |j \}} }t || || d  d¡}||ƒ d S )Nr&   i'  )rV   rC   r\   )r£   rL   r*   r,   r`   rM   rM   rN   Ú	worker_fnƒ  s   z/TestBSpline.test_concurrency.<locals>.worker_fnrZ   )rU   r    )rJ   rL   r/  rM   rM   rN   Útest_concurrency~  s   zTestBSpline.test_concurrencyc                 C   s¶   t ƒ }t ddd¡}||ƒ}t ¡ }tjt| d|› d�¡ƒd|jj	|jj
d�}|j|d d …< tjt| d|› d�¡ƒd|jj	|jj
d�}|j|d d …< ||_||_t||ƒ|ƒ d S )	Nr   r&   rZ   r*   z.datzw+)Úmoder>   r“   r+   )rU   rC   r\   Ú	threadingÚget_native_idÚmemmapÚstrÚjoinr*   r>   r“   r+   r   )rJ   ÚtmpdirrL   r`   ÚexpectedÚtidÚt_mmÚc_mmrM   rM   rN   Útest_memmap‹  s   ÿÿzTestBSpline.test_memmapN)2rí   rî   rï   rO   rY   ra   rh   rp   r}   r€   rˆ   rŠ   r–   rœ   r¥   r¦   r©   r­   r²   rµ   r½   rÁ   rÆ   rÈ   rÎ   rÐ   rÖ   rÚ   rã   rç   rì   rò   rW   ÚmarkÚparametrizerº   rü   r  Úthread_unsafer  r  r  r  r!  r&  r)  r*  r.  r0  r<  rM   rM   rM   rN   r%   '   sd    #	

	(



*


r%   c                   @   sŒ   e Zd Zej dg d¢¡dd„ ƒZej dg d¢¡dd„ ƒZd	d
„ Zej dg d¢¡dd„ ƒZ	ej dddg¡dd„ ƒZ
dd„ Zdd„ ZdS )Ú
TestInsertÚxval)r5   r(   r:   r4   ç      @ç      @c                 C   sœ  t  d¡}t  |¡d }t||dd�}t||ƒ}| |¡}t|j|jdd� t|j|jd |j	 d … dd� ||d kr?|n|d d… }t j
|d|dd … |d d…   f }t||ƒ||ƒdd� t  |¡d }t||dd�}	t|t j||f dd�}
|
 |¡}t|j|jdd� t|jt j| |¡j|	 |¡jf dd� ||d kr¨|n|d d… }t j
|d|dd … |d d…   f }t|
|ƒ||ƒdd� d S )	Nr®   r3   rÑ   rP   re   r&   r/   r°   )rC   rG   Úsinr	   r   Úinsert_knotr   r*   r+   r,   r˜   ÚcosrØ   )rJ   rA  rg   r‡   rÿ   Úspl_1fÚspl_1r`   Úy1Úspl_y1Úspl_yyÚspl_yy1rM   rM   rN   Útest_insert¤  s.   


"&

ÿÿ&zTestInsert.test_insertzxval, m))r5   r1   )r(   r3   )rÝ   r’   )r4   r1   )rC  r1   c           	      C   sÐ   t  d¡}t  |¡d }t||dd�}t|||d�}| ||¡}t|j|jdd� t|j|jd |j	 d … dd� ||d krB|n|d d… }t j
|d	|dd … |d d…   f }t||ƒ||ƒdd� d S )
Nr®   r3   rÑ   ©ÚmrP   re   r&   r/   r°   )rC   rG   rD  r	   r   rE  r   r*   r+   r,   r˜   )	rJ   rA  rO  rg   r‡   rÿ   rG  rH  r`   rM   rM   rN   Útest_insert_multiÅ  s   
"&zTestInsert.test_insert_multic           
      C   s²   t j d¡}d\}}t  |j|| d d�¡}|j|ddfd�}t|||ƒ}|j||d  || d  d�}| |¡}|j||d  || d  dd	�}	t||	ƒ||	ƒd
d� d S )Né90  r;   r&   r�   r3   r1   )ÚlowÚhighr—   ©rR  rS  r�   rP   re   )rC   rI   Údefault_rngr…   Úuniformr   rE  r   )
rJ   r†   rK   r,   r*   r+   rÿ   ÚxvrH  r`   rM   rM   rN   Útest_insert_random×  s    
"zTestInsert.test_insert_randomrW  )	r   çš™™™™™¹?r6   r8   ç      @ç      @ç      @gffffff@rC  c                 C   sÊ   t  d¡}t  |¡d }t||dd�}t|ddiŽ}| |¡}t||jdd�\}}}	t|j	|dd	� t|j
d |	 d
 … |d |	 d
 … dd	� t j d¡jdddd�}
t||
ƒt|
|||	fƒdd	� d S )Nr®   r3   rÑ   rk   r¯   T©ÚperrP   re   r&   r�   r   rŽ   é)   rT  )rC   rG   rD  r   r   rE  r   rV   r   r*   r+   rI   rU  rV  r   )rJ   rW  rg   r‡   rV   rÿ   rH  ÚtfÚcfr,   r`   rM   rM   rN   Útest_insert_periodicå  s   

,"zTestInsert.test_insert_periodicrk   Nr¯   c                 C   sÔ   t  d¡d t j }t  |¡t  |¡}}t||d|  dd�}||_t||dd�}||_t||dd�}||_d}| |¡}	| |¡}
| |¡}t|	j	|
j	dd� t|	j	|j	dd� t|	j
|
j
d|j
  dd� d S )	Nr®   r1   r'   r3   rÑ   ç      @rP   re   )rC   rG   ÚpirD  rF  r	   rk   rE  r   r*   r+   )rJ   rk   rg   Úy_reÚy_imrÿ   Úspl_reÚspl_imrW  rH  Úspl_1reÚspl_1imrM   rM   rN   Útest_complex÷  s   


 zTestInsert.test_complexc                 C   sÌ   d}d}t  dg|d  g d¢ dg|d   ¡}t  t|ƒ| d ¡}t|||dd�}ttƒ� t||||fd	d
� W d   ƒ n1 sEw   Y  ttƒ� | |¡ W d   ƒ d S 1 s_w   Y  d S )Nrc  r3   r   r&   ©r1   r3   r4   r’   rŽ   r¯   rj   Tr]  )	rC   rþ   Úonesr  r   r?   rA   r   rE  )rJ   rW  r,   r*   r+   rÿ   rM   rM   rN   Ú+test_insert_periodic_too_few_internal_knots  s   *
ÿ
"ÿz6TestInsert.test_insert_periodic_too_few_internal_knotsc                 C   sð   d}t  dg|d  g d¢ dg|d   ¡}t  t|ƒ| d ¡}t|||ƒ}ttƒ� | d¡ W d   ƒ n1 s<w   Y  ttƒ� | d¡ W d   ƒ n1 sUw   Y  ttƒ� |jddd� W d   ƒ d S 1 sqw   Y  d S )	Nr3   r   r&   rl  rŽ   r/   r®   rN  )rC   rþ   rm  r  r   r?   rA   rE  )rJ   r,   r*   r+   rÿ   rM   rM   rN   Útest_insert_no_extrap"  s   *
ÿ
ÿ
"ÿz TestInsert.test_insert_no_extrap)rí   rî   rï   rW   r=  r>  rM  rP  rX  rb  rk  rn  ro  rM   rM   rM   rN   r@  ¢  s    
 ÿ


r@  c               	   C   sf   d	dd„} dD ])}t |d�}tt|ƒƒD ]\}}| ||ƒ td|d ƒD ]
}| |||ddƒ q$qqd S )
Nr   rd   c           	   	   S   s†   | j \}}}t |¡}tj|d d d|dd … |d d…   |d d f }tt||||f|ƒ| ||ƒ||d|› d| j› �d� d S )	Nr   rY  r°   r&   r/   zder = z  k = )rR   rS   Úerr_msg)rV   rC   Úuniquer˜   r   r   r,   )	rL   rÕ   r·   rR   rS   r*   r+   r,   rg   rM   rM   rN   Úcheck_splev6  s   
8
ÿz,test_knots_multiplicity.<locals>.check_splev©r&   r1   r3   r4   r’   rÑ   r&   rÒ   )r   rd   rd   )rU   Ú	enumerateÚ_make_multiplesrº   )rr  r,   rL   rÕ   rû   r·   rM   rM   rN   Útest_knots_multiplicity2  s   



ÿþþrv  c                 C   óò   |dkr|| |   kr||d  k rdS  dS |||  || kr%d}n| ||  |||  ||   t | |d ||ƒ }||| d  ||d  krRd}|| S ||| d  |  ||| d  ||d    t | |d |d |ƒ }|| S )zw
    Naive way to compute B-spline basis functions. Useful only for testing!
    computes B(x; t[i],..., t[i+k+1])
    r   r&   r(   r5   ©Ú_naive_B©rg   r,   rá   r*   Úc1Úc2rM   rM   rN   ry  I  s   (2Fÿry  c                    sŽ   ˆˆˆ kr	ˆ‰nt  ˆˆ¡d ‰ˆˆ ˆ  kr"ˆˆd  ks%J ‚ J ‚ˆˆkr1ˆtˆƒˆ k s3J ‚t‡ ‡‡‡‡fdd„tdˆd ƒD ƒƒS )z=
    Naive B-spline evaluation. Useful only for testing!
    r&   c                 3   s.   � | ]}ˆ ˆ|  t ˆˆˆ| ˆƒ V  qd S ©Nrx  )ru   rÕ   ©r+   rá   r,   r*   rg   rM   rN   Ú	<genexpr>f  s   €, z_naive_eval.<locals>.<genexpr>r   )rC   Úsearchsortedr  Úsumrº   )rg   r*   r+   r,   rM   r~  rN   rs   \  s   ((rs   c                    st   t ˆƒˆd  }|ˆd ksJ ‚t ˆ ƒ|ksJ ‚ˆˆ ˆ  kr'ˆ| ks*J ‚ J ‚t‡ ‡‡‡fdd„t|ƒD ƒƒS )z'Naive B-spline evaluation, another way.r&   c                 3   ó&   � | ]}ˆ | t ˆˆ|ˆƒ V  qd S r}  rx  ©ru   rá   ©r+   r,   r*   rg   rM   rN   r  o  ó   €$ z _naive_eval_2.<locals>.<genexpr>©r  r�  rº   ©rg   r*   r+   r,   rK   rM   r„  rN   ry   i  s
   $ ry   c                 C   s~   t |ƒ|d  }||d ksJ ‚t |ƒ|ksJ ‚d}t|ƒD ]}tj|||| d … dd�| ƒ}||| t |¡ 7 }q|S )Nr&   r5   r1   Frj   )r  rº   r   rÄ   rC   Ú
nan_to_num)rg   r*   r+   r,   rK   Úsrá   rL   rM   rM   rN   rÇ   r  s   "rÇ   c                 C   sT   t  | ¡} t  | | dk | dkB | dk| dk @ | dk| dk@ gdd„ dd„ dd„ g¡S )z+ A linear B-spline function B(x | 0, 1, 2).r   r1   r&   c                 S   ó   dS )Nr5   rM   ©rg   rM   rM   rN   Ú<lambda>ƒ  ó    zB_012.<locals>.<lambda>c                 S   s   | S r}  rM   r‹  rM   rM   rN   rŒ  ƒ  r�  c                 S   s   d|  S ©Nr6   rM   r‹  rM   rM   rN   rŒ  ƒ  s    )rC   Ú
atleast_1dÚ	piecewiser‹  rM   rM   rN   rf   }  s   
þýrf   c                 C   sˆ   t  | ¡} | dk | dk| dk @ | dkg}|dkr$dd„ dd„ dd„ g}n|dkr4dd„ d	d„ d
d„ g}ntd|› �ƒ‚t  | ||¡}|S )z0A quadratic B-spline function B(x | 0, 1, 2, 3).r&   r1   r   c                 S   s   | |  d S rŽ  rM   r‹  rM   rM   rN   rŒ  ‹  s    zB_0123.<locals>.<lambda>c                 S   s   d| d d  S )Ng      è?rÝ   r1   rM   r‹  rM   rM   rN   rŒ  Œ  ó    c                 S   s   d|  d d S )Nr7   r1   rM   r‹  rM   rM   rN   rŒ  �  r‘  c                 S   rŠ  ©Nr(   rM   r‹  rM   rM   rN   rŒ  �  r�  c                 S   rŠ  )Ng       ÀrM   r‹  rM   rM   rN   rŒ  �  r�  c                 S   rŠ  r’  rM   r‹  rM   rM   rN   rŒ  ‘  r�  znever be here: der=)rC   r�  rA   r�  )rg   r·   ÚcondsÚfuncsÚpiecesrM   rM   rN   rÅ   †  s   
þþrÅ   é#   r3   c                 C   s<   t j d¡}t  | | | d ¡¡}| | ¡}t |||¡S )Né{   r&   )rC   rI   r„   r…   r   Úconstruct_fast)rK   r,   r†   r*   r+   rM   rM   rN   rU   ˜  s   
rU   c                 c   s¢   � | j | j}}| j ¡ }|d |dd…< |d |d< t|||ƒV  | j ¡ }|d |d|d …< t|||ƒV  | j ¡ }|d || d d…< t|||ƒV  dS )	zIncrease knot multiplicity.é   é   é   rŒ   r   Nr&   r/   )r+   r,   r*   Úcopyr   )rL   r+   r,   Út1rM   rM   rN   ru  Ÿ  s   €


ru  c                   @   sd   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚTestInteropc                 C   s¤   t  ddt j d¡}t  |¡}t||ƒ}|j|j|jf| _|||| _	| _
| _t  ddt j d¡| _t j|j|j|jf }t  ||f¡| _t|j| j|jƒ| _d S )Nr   r8   r_  r›  )rC   r\   rd  rF  r	   r*   r+   r,   rV   r`   r¬   rL   ÚxnewrØ   rÙ   r|  r   Úb2)rJ   r`   r¬   rL   r|  rM   rM   rN   Úsetup_methodµ  s   

zTestInterop.setup_methodc                    s  | j | j| j}‰ }tt|ˆ ƒˆ |ƒddd� tt|ˆ jƒˆ |ƒddd� tt ‡ fdd„|D ƒ¡ˆ |ƒddd� tt	dd�� t||ƒ W d   ƒ n1 sPw   Y  t
td|jjƒƒd }|j |¡}|j||jf}tt t||ƒ¡||ƒ |¡ddd� d S )	NrP   rQ   c                    s   g | ]}t |ˆ ƒ‘qS rM   )r   rt   ©rL   rM   rN   rw   Ë  ó    z*TestInterop.test_splev.<locals>.<listcomp>zCalling splev.. with BSpline©Úmatchr&   ©r   )rŸ  rL   r   r   r   rV   rC   rl   r?   rA   rö   rº   r+   rê   Ú	transposer*   r,   )rJ   rŸ  r   r÷   rË   rV   rM   r¢  rN   Ú
test_splevÂ  s&   

ÿ
ÿ
ÿÿ
ÿzTestInterop.test_splevc                 C   sÞ   | j | j}}t||ƒ}t ||¡\}}}t|d |dd� t|d |dd� |d |ks/J ‚t||dd�\}}}}t|d |dd� t|d |dd� |d |ksTJ ‚t||ƒ}	t||	dd� t|Ž }
t||
|ƒdd� d S )Nr   rP   re   r&   r1   T)Úfull_output)r`   r¬   r   rà   r   r   r   )rJ   rg   r‡   rV   r*   r+   r,   Útck_fr£   r¬   rL   rM   rM   rN   Útest_splrepÝ  s   

zTestInterop.test_splrepc                 C   s  | j | j}}tj||f }ttƒ� t||ƒ W d   ƒ n1 s"w   Y  ttƒ� t ||¡ W d   ƒ n1 s<w   Y  ttdd�� t|d d… |d d… ƒ W d   ƒ n1 s_w   Y  ttdd�� t |d d… |d d… ¡ W d   ƒ d S 1 s„w   Y  d S )Núm > k must holdr¤  r3   )	r`   r¬   rC   rØ   r?   rA   r   rà   r@   )rJ   rg   r‡   Úy2rM   rM   rN   Útest_splrep_errorsõ  s   
ÿ
ÿÿ"ÿzTestInterop.test_splrep_errorsc           	      C   s¸   t jdt jd� d¡}t|ƒ\}}t |¡\}}t||dd� tt  t||ƒ¡|dd� tt  t||ƒ¡|dd� t|ddd�\\}}}}}t||dd� tt  t||ƒ¡|dd� d S )	NrÞ   r=   ©r3   r’   rP   re   r   T)r‰  r©  )	rC   rG   rH   rm   r   rà   r   rl   r   )	rJ   rg   rL   ÚurV   Úu1Úb_fÚu_fr£   rM   rM   rN   Útest_splprep  s   zTestInterop.test_splprepc                 C   sÀ  t  d¡ d¡}ttdd�� t|ƒ W d   ƒ n1 sw   Y  ttdd�� t |¡ W d   ƒ n1 s8w   Y  t jdddd�}ttd	d�� t|gƒ W d   ƒ n1 s[w   Y  ttd	d�� t |g¡ W d   ƒ n1 sww   Y  g d
¢}ttdd�� t|gƒ W d   ƒ n1 s–w   Y  ttdd�� t |g¡ W d   ƒ n1 s²w   Y  g d¢}g d¢}ttdd�� t|gd |gŽ  W d   ƒ d S 1 sÙw   Y  d S )Né<   r‘   ztoo many values to unpackr¤  r   r  r3   )Únumr¬  )ç– Ð>IÀr·  ç– Ð>KÀr¸  zInvalid inputs)r&   r3   r1   r4   )r   g333333Ó?gš™™™™™É?r&   )	rC   rG   rm   r?   rA   r   rà   r\   r@   )rJ   rg   r°  rM   rM   rN   Útest_splprep_errors  s4   
ÿÿÿÿÿÿ"ÿzTestInterop.test_splprep_errorsc                 C   sä   | j | j}}t g d¢¡tj }tt|ƒ|ddd� tt|j|j|j	fƒ|ddd� t
tdd�� t|dd� W d   ƒ n1 sBw   Y  |j dd	d
¡}t t|j||j	fdd�¡}|jdksdJ ‚t|| t |¡dd� d S )N)r°   rÝ   r:   rc  r    rQ   zCalling sproot.. with BSpliner¤  rc   )Úmestr&   r1   r   )r3   r1   r4   rÒ   re   )rL   r   rC   rþ   rd  r   r   r*   r+   r,   r?   rA   r§  rl   r“   r»   )rJ   rL   r   ÚrootsÚc2rÚrrrM   rM   rN   Útest_sproot1  s    ÿzTestInterop.test_sprootc                 C   sÞ   | j | j}}ttdd|ƒtdd|jƒddd� ttdd|ƒ| dd¡ddd� ttdd�� tdd|ƒ W d   ƒ n1 s?w   Y  |j 	ddd¡}t
 tdd|j||jfƒ¡}|jd	ksaJ ‚t|tdd|ƒddd
� d S )Nr   r&   rd   F)rR   Úcheck_0dzCalling splint.. with BSpliner¤  r1   ©r3   r1   )rR   Úcheck_shape)rL   r   r   r   rV   rß   r?   rA   r+   r§  rC   rl   r*   r,   r“   )rJ   rL   r   r¼  ÚintegrrM   rM   rN   Útest_splintB  s    ÿÿÿ
ÿzTestInterop.test_splintc              	   C   óà   | j | jfD ]g}t|jƒt|jƒ }|j ¡ }|dkr-tj|t |f|j	dd …  ¡f }dD ]=}t
|ƒ}t 
|j ¡ ||jf¡}t|j|d dd� t|j|d dd� |j|d ks^J ‚t|tƒseJ ‚t|tƒslJ ‚q/qd S ©Nr   r&   rb   rP   re   r1   )rL   r   r  r*   r+   rœ  rC   r˜   Úzerosr“   r   rà   r,   r   rè   r   rö   ©rJ   rL   ÚctÚb_crK   ÚbdÚtck_drM   rM   rN   Útest_splderV  ó   
$ùùzTestInterop.test_splderc              	   C   rÄ  rÅ  )rL   r   r  r*   r+   rœ  rC   r˜   rÆ  r“   r   rà   r,   r   rè   r   rö   rÇ  rM   rM   rN   Útest_splantiderg  rÍ  zTestInterop.test_splantiderc                 C   s$  | j | j| j}}}|jjd }d|j| |j|d    }t||ƒt||j|j|jfƒ}}tt	||ƒt	||ƒdd� t
|tƒsDJ ‚t
|tƒsKJ ‚tt|jjƒƒ}|j |dd … d ¡}	t||j|	|jfƒ}
t||ƒ}tt t	||
ƒ¡ ddd¡||ƒdd� t
|tƒs‰J ‚t
|
tƒs�J ‚d S )Nr1   r°   r&   rP   re   r¦  r   )rL   r   r`   r*   r�   r   r+   r,   r   r   rè   r   rö   rº   rê   r§  rC   rl   )rJ   rL   r   r`   rÕ   ÚtnÚbnÚtck_nr÷   rØ   Útck_n2Úbn2rM   rM   rN   rM  x  s$   "

ÿ
ÿzTestInterop.test_insertN)rí   rî   rï   r¡  r¨  r«  r®  r´  r¹  r¾  rÃ  rÌ  rÎ  rM  rM   rM   rM   rN   rž  ±  s    rž  c                   @   s�  e Zd Ze ddej ¡Ze e¡Zdd„ Z	dd„ Z
dd„ Zej d	g d
¢¡dd„ ƒZej d	g d
¢¡dd„ ƒZdd„ Zdd„ Zej d	g d¢¡dd„ ƒZdd„ Zdd„ Zdd„ Zej d	g d¢¡dd„ ƒZdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zejjd)d*�d+d,„ ƒZd-d.„ Zd/d0„ Z d1d2„ Z!d3d4„ Z"d5d6„ Z#d7d8„ Z$d9d:„ Z%d;d<„ Z&ej d	g d=¢¡d>d?„ ƒZ'd@dA„ Z(dBdC„ Z)dDdE„ Z*dFdG„ Z+dHdI„ Z,dJS )KÚ
TestInterpr5   r6   c                 C   s@   t tƒ� t| j| jdd� W d   ƒ d S 1 sw   Y  d S )Nr:   rÑ   )r?   r@   r	   r`   r¬   ©rJ   rM   rM   rN   Útest_non_int_orderš  s   
"ÿzTestInterp.test_non_int_orderc                 C   óZ   t | j| jdd�}t|| jƒ| jddd� t | j| jddd�}t|| jƒ| jddd� d S )Nr   rÑ   rd   rQ   r/   ©r,   ró   ©r	   r`   r¬   r   rÏ   rM   rM   rN   Útest_order_0ž  ó   zTestInterp.test_order_0c                 C   r×  )Nr&   rÑ   rd   rQ   r/   rØ  rÙ  rÏ   rM   rM   rN   Útest_linear¤  rÛ  zTestInterp.test_linearr,   rÂ   c                 C   sP   g d¢}g d¢}t tdd�� t|||d� W d   ƒ d S 1 s!w   Y  d S )N©r   r&   r1   r3   r4   r’   )r   r&   r1   r3   r4   r’   r�   rŽ   zShapes of xr¤  rÑ   ©r?   rA   r	   ©rJ   r,   rg   r‡   rM   rM   rN   Útest_incompatible_x_yª  s
   "ÿz TestInterp.test_incompatible_x_yc                 C   sä   g d¢}g d¢}t tdd�� t|||d� W d   ƒ n1 s w   Y  g d¢}t tdd�� t|||d� W d   ƒ n1 sAw   Y  g d¢}t |¡ d¡}t tdd�� t|||d� W d   ƒ d S 1 skw   Y  d S )	N)r   r&   r&   r1   r3   r4   rÝ  zx to not have duplicatesr¤  rÑ   )r   r1   r&   r3   r4   r’   zExpect x to be a 1D strictly)r&   r/   )r?   rA   r	   rC   rl   rm   rß  rM   rM   rN   Útest_broken_x±  s   ÿÿ"ÿzTestInterp.test_broken_xc                 C   s6   dD ]}t | j| j|ƒ}t|| jƒ| jddd� qd S )N©r1   r3   r4   r’   r�   rŽ   rd   rQ   rÙ  )rJ   r,   rL   rM   rM   rN   Útest_not_a_knotÁ  s   þzTestInterp.test_not_a_knotc                 C   sÒ   t | j| jddd�}t|| jƒ| jddd� tddƒD ]}t|| jd |d�|| jd	 |d�d
d� qt | j| jddd	d�}t|| jƒ| jddd� tddƒD ]}t|| jd |d�|| jd	 |d�d
d� qOd S )Nr’   r¯   r  rd   rQ   r&   r   r¸   r/   ç•dyáý¥=re   ©r,   r  ró   )r	   r`   r¬   r   rº   )rJ   rL   rá   rM   rM   rN   Útest_periodicÆ  s   ,,ÿzTestInterp.test_periodicrâ  c                 C   sd   d}t j d¡}t  | |¡d ¡}| |¡d }|d |d< t|||dd�}t||ƒ|d	d
� d S )Nr’   r�   rZ   r‰   r/   r   r¯   r  rd   re   )rC   rI   r„   r…   r  r	   r   )rJ   r,   rK   r†   rg   r‡   rL   rM   rM   rN   Útest_periodic_randomÔ  s   zTestInterp.test_periodic_randomc                 C   sÚ   | j jd }tj d¡}| |¡d tj }t |¡}d|d< dtj |d< t d|f¡}t 	|¡|d< t 
|¡|d< t||dddd	�}t|ƒD ]}t||| ƒ|d d …|f d
d� qHt||d ƒ||d ƒd
d� d S )Nr   r�   r1   r5   r/   r&   r’   r¯   rå  rd   re   )r`   r“   rC   rI   r„   r  rd  r…   rÆ  rD  rF  r	   rº   r   )rJ   rK   r†   rg   r‡   rL   rá   rM   rM   rN   Útest_periodic_axisß  s   
$"zTestInterp.test_periodic_axisc                 C   s|   t j d¡}d}d}t  | |¡¡}| |¡}|d d |d< ttƒ� t|||dd� W d   ƒ d S 1 s7w   Y  d S )	Nr�   r’   r®   r/   r&   r   r¯   r  )rC   rI   r„   r…   r  r?   rA   r	   )rJ   r†   r,   rK   rg   r‡   rM   rM   rN   Útest_periodic_points_exceptionî  s   

"ÿz)TestInterp.test_periodic_points_exceptionc                 C   s~   t j d¡}d}d}t  | |¡¡}| |¡}t  |d|  ¡}ttƒ� t||||dƒ W d   ƒ d S 1 s8w   Y  d S )Nr�   r3   rŽ   r1   r¯   )	rC   rI   r„   r…   r  rÆ  r?   rA   r	   )rJ   r†   r,   rK   rg   r‡   r*   rM   rM   rN   Útest_periodic_knots_exceptionù  s   

"ÿz(TestInterp.test_periodic_knots_exceptionrl  c                 C   s„   t | j| j|dd�}t| j| jd|d�}t| j|ƒ}t||| jƒdd� td|ƒD ]}t| j||d�}t||| j|d	�d
d� q)d S )Nr¯   r  T)r^  r,   rd   re   r&   r¶   r¸   rž   )r	   r`   r¬   r   r   r   rº   )rJ   r,   rL   rV   rÿ   rá   rM   rM   rN   Útest_periodic_splev  s   þzTestInterp.test_periodic_splevc                 C   s¶   t | j| jddd�}t| j| jdd�}t|| jƒ|| jƒdd� tj d¡}d}t | 	|¡d ¡}| 	|¡d	 }|d
 |d< t ||ddd�}t||dd�}t||ƒ||ƒdd� d S )Nr3   r¯   r  r"  rd   re   r�   rZ   r‰   r/   r   )
r	   r`   r¬   r   r   rC   rI   r„   r…   r  )rJ   rL   Úcubr†   rK   rg   r‡   rM   rM   rN   Útest_periodic_cubic  s   zTestInterp.test_periodic_cubicc                    sj   d‰t | j| jˆdd�}t| jˆƒ‰t| j| jˆˆƒ‰ t ‡ ‡‡fdd„¡}t|| jƒ|| jƒdd� d S )Nr3   r¯   r  c                    s   t | ˆˆ ˆƒS r}  rr   r‹  rv   rM   rN   rŒ  (  s    z6TestInterp.test_periodic_full_matrix.<locals>.<lambda>rd   re   )r	   r`   r¬   r   r   rC   Ú	vectorizer   )rJ   rL   rû   rM   rv   rN   Útest_periodic_full_matrix!  s   z$TestInterp.test_periodic_full_matrixc                 C   s¶   dg}t | j| jdd |fd�}t|| jƒ| jddd� t|| jd dƒ|d d ddd	d
� t | j| jd|d fd�}t|| jƒ| jddd� t|| jd dƒ|d d ddd	d
� d S )N©r&   g       @r1   r  rd   rQ   r/   r&   r   F©rR   rS   r¿  rÙ  )rJ   r·   rL   rM   rM   rN   Útest_quadratic_deriv+  s   ÿ
ÿzTestInterp.test_quadratic_derivc                 C   sÐ   d}dgdg}}t | j| j|||fd�}t|| jƒ| jddd� tt || jd dƒ|| jd	 dƒg¡t |d d |d d g¡ddd� d
gd
g}}t | j| j|||fd�}t|| jƒ| jddd� d S )Nr3   ©r&   r7   )r&   r8   r"  rd   rQ   r   r&   r/   ©r1   r   )r	   r`   r¬   r   rC   rl   )rJ   r,   Úder_lÚder_rrL   rM   rM   rN   Útest_cubic_deriv<  s   & ÿzTestInterp.test_cubic_derivc                 C   sÐ   d\}}t  |¡ t j¡}t  |¡}ddg}ddg}t|||||fd�}t||ƒ|ddd� tt  ||d	 d
ƒ||d	 dƒg¡t  dd„ |D ƒ¡ƒ tt  ||d d
ƒ||d dƒg¡t  dd„ |D ƒ¡ƒ d S )N)r’   rŽ   )r&   g      (À)r1   r&   rð  )r1   r7   r  rd   rQ   r   r&   r1   c                 S   ó   g | ]\}}|‘qS rM   rM   ©ru   r¹   ÚvalrM   rM   rN   rw   T  ó    z2TestInterp.test_quintic_derivs.<locals>.<listcomp>r/   c                 S   rø  rM   rM   rù  rM   rM   rN   rw   V  rû  )rC   rG   ÚastyperH   rD  r	   r   rl   )rJ   r,   rK   rg   r‡   rõ  rö  rL   rM   rM   rN   Útest_quintic_derivsK  s   
"ÿ"ÿzTestInterp.test_quintic_derivsÚunstable)Úreasonc                 C   sN   d}t | j|ƒ}ddg}t| j| j|||d fd�}t|| jƒ| jddd� d S )Nr3   ró  )r1   r8   r"  rd   rQ   )r   r`   r	   r¬   r   )rJ   r,   r*   rõ  rL   rM   rM   rN   Útest_cubic_deriv_unstableX  s
   z$TestInterp.test_cubic_deriv_unstablec                 C   sÊ   d}t j| jd f|d  | jdd … | jd d…  d | jd f|d  f }t| j| j||dgdgfd�}t|| jƒ| jddd	� t|| jd dƒt  d
¡dd� t|| jd dƒt  d
¡dd� d S )Nr1   r   r&   r/   r6   rô  r"  rd   rQ   r5   re   )rC   r˜   r`   r	   r¬   r   rl   )rJ   r,   r*   rL   rM   rM   rN   Útest_knots_not_data_sitesg  s   þ
ÿ $z$TestInterp.test_knots_not_data_sitesc                 C   sX   d}ddg}ddg}t |||dgdgfd�}t dd¡}|d }t||ƒ|ddd� d S )	Nr3   r5   r(   ©r&   r5   ró  r"  rd   rQ   )r	   rC   r\   r   )rJ   r,   rg   r‡   rL   r`   r¬   rM   rM   rN   Útest_minimum_points_and_derivv  s   z(TestInterp.test_minimum_points_and_derivc                 C   s4  g d¢ }}t tƒ� t||dgd fd� W d   ƒ n1 sw   Y  t tƒ� t||dd� W d   ƒ n1 s:w   Y  t tƒ� t||dgd� W d   ƒ n1 sVw   Y  t tƒ� t||dd� W d   ƒ n1 sqw   Y  d\}}t tƒ� t||||fd� W d   ƒ d S 1 s“w   Y  d S )N)r(   r1   r3   r4   r’   r�   r  r"  é*   )r  r  rÞ  ©rJ   rg   r‡   ÚlÚrrM   rM   rN   Útest_deriv_spec‚  s"   
ÿ
ÿ
ÿ
ÿ
"ÿzTestInterp.test_deriv_specc                 C   s°   t  d¡}|d }dgdg}}ttdd�� t||||fd� W d   ƒ n1 s*w   Y  dgdg}}ttd	d�� t||||fd� W d   ƒ d S 1 sQw   Y  d S )
NrŽ   r1   )r�   r   ©r&   r   zBad boundary conditions at 0.r¤  r"  )iúÿÿÿr   zBad boundary conditions at 6.)rC   rG   r?   rA   r	   r  rM   rM   rN   Útest_deriv_order_too_large™  s   
þ"þz%TestInterp.test_deriv_order_too_largec                 C   sÈ   d}| j }| jd| j  }dgdg}}t|||||fd�}t||ƒ|ddd� t||d d	ƒ|d d	 ddd
d� t||d d	ƒ|d d	 ddd
d� dD ]}t|||d�}t||ƒ|ddd� qNd S )Nr3   r'   )r&   y              @)r&   y      @       @r"  rd   rQ   r   r&   Frñ  r/   )r   r&   rÑ   )r`   r¬   r	   r   )rJ   r,   r`   r¬   rõ  rö  rL   rM   rM   rN   rk  ¦  s    ÿÿþzTestInterp.test_complexc                 C   sD   t  d¡ t¡}t  d¡ t¡}dD ]}t|||d�}||ƒ qd S )NrZ   rÂ   rÑ   )rC   rG   rü  Úintr	   )rJ   rg   r‡   r,   rL   rM   rM   rN   Útest_int_xy»  s   
þzTestInterp.test_int_xyc                 C   sF   t  ddd¡}|d d d… }|d d d… }dD ]	}t|||d� qd S )Nr/   r&   r‰   r’   rÂ   rÑ   )rC   r\   r	   )rJ   r`   rg   r‡   r,   rM   rM   rN   Útest_sliced_inputÅ  s   ÿzTestInterp.test_sliced_inputc                 C   sJ   t  d¡ t¡}|d }t jt jt j fD ]}||d< ttt||ƒ qd S )NrZ   r1   r/   )	rC   rG   rü  ÚfloatrE   rF   r?   rA   r	   ©rJ   rg   r‡   ÚzrM   rM   rN   Útest_check_finiteÏ  s   þzTestInterp.test_check_finite)r&   r1   r3   r’   c                 C   s,   t tdƒƒ}dd„ |D ƒ}t|||d� d S )NrZ   c                 S   s   g | ]}|d  ‘qS )r1   rM   )ru   ÚarM   rM   rN   rw   Ü  rû  z.TestInterp.test_list_input.<locals>.<listcomp>rÑ   )Úlistrº   r	   rß  rM   rM   rN   Útest_list_inputØ  s   zTestInterp.test_list_inputc                 C   s²   t jt  | j¡t  | j¡f }dddgfg}dddgfg}t| j|d||fd�}t|| jƒ|ddd	� t|| jd
 dƒ|d
 d ddd	� t|| jd dƒ|d
 d ddd	� d S )Nr&   r(   r6   r7   r8   r3   r  rd   rQ   r   r/   )rC   rØ   rD  r`   rF  r	   r   )rJ   r¬   rõ  rö  rL   rM   rM   rN   Útest_multiple_rhsß  s   $(zTestInterp.test_multiple_rhsc           	      C   s¶   t j d¡}d\}}t  |j|d�¡}|j|dddfd�}t|||ƒ}|jj|dddfks/J ‚d| d¡fg}d| d¡fg}t|||||fd	�}|jj|| d dddfksYJ ‚d S )
Nr�   ©r3   rŒ   r�   r’   r�   rŽ   r&   ©r’   r�   rŽ   r"  )rC   rI   r„   r…   r	   r+   r“   )	rJ   r†   r,   rK   rg   r‡   rL   Úd_lÚd_rrM   rM   rN   Útest_shapesé  s   $zTestInterp.test_shapesc                 C   s<  t  | j¡}t| j|ddd�}t| j|ddgdgfd�}t|j|jdd� t| j|ddd�}t| j|ddgdgfd�}t|j|jdd� t| j|d	d
d�}t| j|d	d dgfd�}t|j|jdd� t| j|ddd�}t| j|dd d�}t|j|jdd� ttƒ� t| j|ddd� W d   ƒ n1 s•w   Y  t jt  | j¡t  	| j¡f }dddgfg}d	ddgfg}t| j|d||fd�}t| j|ddd�}t|j|jdd� t j
 d¡}d\}}t  |j
|d�¡}	|j
|dddfd�}
dt  d¡fg}dt  d¡fg}t|	|
|||fd�}t|	|
|dd�}t|j|jdd� d S )Nr3   r  r  rô  rP   re   )r  r  r	  r1   )Nr  r  r  Útypor&   r5   r  r�   r  r�   r’   r�   rŽ   r  r"  r  )rC   rD  r`   r	   r   r+   r?   rA   rØ   rF  rI   r„   r…   rÆ  )rJ   r¬   rû   r   rõ  rö  r†   r,   rK   rg   r‡   r  r  rM   rM   rN   Útest_string_aliasesø  sJ   
ÿ

ÿ
ÿ
ÿzTestInterp.test_string_aliasesc           	      C   sn   t j d¡}d\}}t  |j|d�¡}|j|d�}t||ƒ}t||||ƒ}t||||ƒ}t|j|ddd� d S )Nr�   )r3   rŽ   r�   rd   rQ   )	rC   rI   r„   r…   r   r	   Úmake_interp_full_matrr   r+   )	rJ   r†   r,   rK   rg   r‡   r*   rL   ra  rM   rM   rN   Útest_full_matrix+  s   
zTestInterp.test_full_matrixc                 C   s¤  t j d¡}d}tdddƒD ]Á}t|d d ƒ}t  | d|f¡¡}td|d ƒD ]4}|d| …|d…f  t  | d|| f¡¡7  < ||d…d| …f  t  | d|| f¡¡7  < q)| ||f¡}||d|…| d…f< | ||f¡}||| d…d|…f< t  ||f¡}	tt|| d dƒƒD ]#\}}
|
d	k rªt j||
d
�|	|d|
…f< q”t j||
d
�|	||
d…f< q”| |¡}t	t
|	||||ƒt j ||¡dd� qdS )z­
        Random elements in diagonal matrix with blocks in the
        left lower and right upper corners checking the
        implementation of Woodbury algorithm.
        r�   éÉ   r3   é    r1   r&   Nr/   r   )Úoffsetrd   re   )rC   rI   r„   rº   r  ÚdiagflatrÆ  rt  Údiagonalr   r   ÚlinalgÚsolve)rJ   r†   rK   r,   r!  r  rá   ÚurÚllÚdrÕ   rL   rM   rM   rN   Útest_woodbury6  s,   24
ÿïzTestInterp.test_woodburyN)-rí   rî   rï   rC   r\   rd  r`   rD  r¬   rÖ  rÚ  rÜ  rW   r=  r>  rà  rá  rã  ræ  rç  rè  ré  rê  rë  rí  rï  rò  r÷  rý  Úxfailr   r  r  r  r
  rk  r  r  r  r  r  r  r  r  r)  rM   rM   rM   rN   rÔ  “  sR    









	

3rÔ  c                 C   s²   | j |j ksJ ‚|j | j | d ksJ ‚| j }tj||ftjd�}t|ƒD ]+}| | }||| kr4|}nt ||¡d }t ||||¡}	|	|||| |d …f< q%t 	||¡}
|
S )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�   rC   rÆ  rH   rº   r€  r$   Úevaluate_all_bsplÚslr%  )rg   r‡   r*   r,   rK   ÚArÕ   rA  ÚleftÚbbr+   rM   rM   rN   r  S  s   r  c                 C   sÔ   t tj| ||fƒ\} }}| j}|j| d }tj||ftjd�}t|ƒD ]+}| | }||| kr3|}	nt ||¡d }	t 	||||	¡}
|
|||	| |	d …f< q$t 
|j|¡}t 
|j|¡}t ||¡}|||ffS )z,Make the least-square spline, full matrices.r&   r=   )ÚmaprC   rl   r�   rÆ  rH   rº   r€  r$   r+  ÚdotÚTr,  r%  )rg   r‡   r*   r,   rO  rK   r-  rÕ   rA  r.  r/  rð   ÚYr+   rM   rM   rN   Úmake_lsq_full_matrixo  s   r4  Úmethodúnorm-eqÚqrc                   @   s  e Zd Zej d¡Zd\ZZe 	e e¡¡Z
e e¡Zee e
d e
d d¡eƒZedd„ ƒZedd	„ ƒZd
d„ Zedd„ ƒZedd„ ƒZdd„ Zedd„ ƒZdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZej d e e!d!dƒƒ¡d"d#„ ƒZ"d$d%„ Z#d&S )'ÚTestLSQr�   )rå   r3   r   r/   rŽ   c                 C   sš   | j | j| j| jf\}}}}t||||ƒ\}}t|||||d�}t|j|ƒ |jj|j	| d fks4J ‚|\}	}
t
jj|	|dd�\}}}}t|j|ƒ d S )N©r5  r&   r/   )Úrcond)rg   r‡   r*   r,   r4  r
   r   r+   r“   r�   rC   r$  Úlstsq)rJ   r5  rg   r‡   r*   r,   Úc0ÚAYrL   Úaar¬   r{  r£   rM   rM   rN   Ú
test_lstsq—  s   zTestLSQ.test_lstsqc           	      C   s„   | j | j| j| jf\}}}}t |¡}t|||||d�}t||||||d�}t|j|jdd� t|j|jdd� |j|jks@J ‚d S )Nr9  ©Úwr5  rd   re   )	rg   r‡   r*   r,   rC   r]   r
   r   r+   )	rJ   r5  rg   r‡   r*   r,   rA  rL   Úb_wrM   rM   rN   Útest_weights§  s   
zTestLSQ.test_weightsc           	      C   sž   | j | j| j| jf\}}}}tj d¡j|jd d�}t	|||||dd�}t	|||||dd�}t	||||dd�}t
|j|jdd	� tj|j|jdd	�rMJ ‚d S )
Nr�   r   r�   r6  r@  r7  r9  rd   re   )rg   r‡   r*   r,   rC   rI   rU  rV  r“   r
   r   r+   r¾   )	rJ   rg   r‡   r*   r,   rA  Úb_neÚb_qrÚb_no_wrM   rM   rN   Útest_weights_same´  s   zTestLSQ.test_weights_samec           	      C   st   | j | j| j| jf\}}}}tj d¡}|j|dddfd�}t|||||d�}|jj	|j
| d dddfks8J ‚d S )Nr�   r’   r�   rŽ   r�   r9  r&   )rg   r*   r,   rK   rC   rI   r„   r
   r+   r“   r�   )	rJ   r5  rg   r*   r,   rK   r†   r‡   rL   rM   rM   rN   r  À  s
   &zTestLSQ.test_multiple_rhsc                    sž   | j | j| j| jf\‰‰‰}d}tj d¡}|j||fd�‰tˆˆˆˆˆd�}‡‡‡‡‡fdd„t|ƒD ƒ‰ t 	‡ fdd„t|ƒD ƒ¡j
}t||jdd	� d S )
Nr3   r�   r�   r9  c              	      s*   g | ]}t ˆˆd d …|f ˆˆ ˆd�‘qS )Nr9  )r
   rƒ  )r,   r5  r*   rg   r‡   rM   rN   rw   Ð  s    "ÿz/TestLSQ.test_multiple_rhs_2.<locals>.<listcomp>c                    s   g | ]}ˆ | j ‘qS rM   )r+   rƒ  )r/  rM   rN   rw   Ò  r£  rP   re   )rg   r*   r,   rK   rC   rI   r„   r
   rº   Úvstackr2  r   r+   )rJ   r5  rK   Únrhsr†   rL   ÚcoefsrM   )r/  r,   r5  r*   rg   r‡   rN   Útest_multiple_rhs_2È  s   ÿzTestLSQ.test_multiple_rhs_2c           	      C   sl   | j | j| j| jf\}}}}d}tjj||fd�}t||||dd�}t||||dd�}t|j|jdd� d S )Nr3   r�   r7  r9  r6  rP   re   )	rg   r*   r,   rK   rC   rI   r
   r   r+   )	rJ   rg   r*   r,   rK   rI  r‡   rE  Úb_neqrM   rM   rN   Útest_multiple_rhs_3Ö  s   zTestLSQ.test_multiple_rhs_3c           	      C   s‚   | j | j| j}}}| jd }t|||||d�}t||j|||d�}t||j|||d�}t||ƒ||ƒd||ƒ  ddd� d S )Nù      ð?       @r9  r'   rP   rQ   )rg   r*   r,   r‡   r
   rÉ   rÊ   r   )	rJ   r5  rg   r*   r,   r  rL   rÌ   rÍ   rM   rM   rN   rk  Þ  s   
(zTestLSQ.test_complexc                 C   sì   | j | j| j}}}| jd }tj||fdd�}t||||ƒ}t||j||ƒ}t||j||ƒ}t	||ƒ||ƒd||ƒ  ddd� tj||fdd�}t||||ƒ}t||j||ƒ}t||j||ƒ}t	||ƒ||ƒd||ƒ  ddd� d S )NrN  r&   rõ   r'   rP   rQ   )
rg   r*   r,   r‡   rC   Ústackr
   rÉ   rÊ   r   )rJ   rg   r*   r,   r  rL   rÌ   rÍ   rM   rM   rN   Útest_complex_2ê  s   
$(zTestLSQ.test_complex_2c                 C   sB   t  d¡ t¡}t  d¡ t¡}t|dd�}t|||d|d� d S )NrZ   r&   rÑ   ©r,   r5  )rC   rG   rü  r  r   r
   ©rJ   r5  rg   r‡   r*   rM   rM   rN   r     s   zTestLSQ.test_int_xyc                 C   s˜   t jdt jd�}t jdt jd�}t|dd�}t|||d|d�}t| t¡| t¡| t¡d|d�}|dd … |d d…  d }t||ƒ||ƒdd	� d S )
NrZ   r=   r&   rÑ   rQ  r/   r6   rP   re   )rC   rG   Úfloat32r   r
   rü  r  r   )rJ   r5  rg   r‡   r*   Úspl_f32Úspl_f64Úx2rM   rM   rN   Útest_f32_xy  s   ÿzTestLSQ.test_f32_xyc                 C   sJ   t  ddd¡}|d d d… }|d d d… }t|dƒ}t|||d|d� d S )Nr/   r&   r‰   r3   rQ  )rC   r\   r   r
   )rJ   r5  r`   rg   r‡   r*   rM   rM   rN   r    s
   
zTestLSQ.test_sliced_inputc              	   C   sZ   t  d¡ t¡}|d }t|dƒ}t jt jt j fD ]}||d< ttt	||||d� qd S )Né   r1   r3   r/   r9  )
rC   rG   rü  r  r   rE   rF   r?   rA   r
   )rJ   r5  rg   r‡   r*   r  rM   rM   rN   Útest_checkfinite  s   
þzTestLSQ.test_checkfinitec                 C   sN   | j | j| j}}}|jdd� |jdd� |jdd� t||||d� d S )NFr+  )rg   r‡   r*   r5  )rg   r‡   r*   r-  r
   rR  rM   rM   rN   r.  *  s
   zTestLSQ.test_read_onlyr,   r&   c                 C   s„   | j | j}}tt |d |d d¡|ƒ}t||||dd�}t||||dd�}|dd … |d d…  d }t||ƒ||ƒd	d
� d S )Nr   r/   rŽ   r6  rQ  r7  r&   r6   rP   re   )rg   r‡   r   rC   r\   r
   r   )rJ   r,   rg   r‡   r*   Úspl_norm_eqÚspl_qrr`   rM   rM   rN   Útest_qr_vs_norm_eq3  s   zTestLSQ.test_qr_vs_norm_eqc                 C   s~   t  | jd¡}t  | jd¡}t| j| j| jddd�}t||| jddd�}|dd … |d d…  d }t||ƒ||ƒdd	� d S )
Nr1   r3   r7  rQ  r&   r/   r6   rP   re   )rC   Úrepeatrg   r‡   r
   r*   r   )rJ   rg   r‡   rH  Úspl_2r`   rM   rM   rN   Útest_duplicates>  s   zTestLSQ.test_duplicatesN)$rí   rî   rï   rC   rI   r„   r†   rK   r,   r…   rg   r‡   r   r\   r*   Úparametrize_lsq_methodsr?  rC  rG  r  rK  rM  rk  rP  r  rW  r  rY  r.  rW   r=  r>  r  rº   r\  r_  rM   rM   rM   rN   r8  �  s@    








	


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

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

    c                 C   sJ   || _ || _|| _|jdksJ ‚|jdksJ ‚|jd |jd ks#J ‚d S )Nr1   r&   r   )r  r!  Úncrê   r“   )rJ   r  r!  rb  rM   rM   rN   Ú__init__R  s   zPackedMatrix.__init__c                 C   s   | j jd | jfS )Nr   )r  r“   rb  rÕ  rM   rM   rN   r“   [  s   zPackedMatrix.shapec                 C   st   t  | j¡}| jjd }t|jd ƒD ]$}t| j| j|  |ƒ}| j|d |…f ||| j| | j| | …f< q|S )Nr&   r   )rC   rÆ  r“   r  rº   Úminrb  r!  )rJ   ÚoutÚnelemrá   ÚnelrM   rM   rN   Útodense_  s   0zPackedMatrix.todenseN)rí   rî   rï   Ú__doc__rc  Úpropertyr“   rh  rM   rM   rM   rN   ra  I  s    	
ra  r&   c              
   C   sz  ddl m} | j}| j}| j}|j\}}|jd |ksJ ‚| ¡ }	| ¡ }
t||ƒD ]y}|| }t||ƒD ]m}|t||ƒkr@ nc||	|df |	|df ƒ\}}}||	|df< td|ƒD ]}t	|||	||f |	||f ƒ\|	||f< |	||d f< q[d|	|df< t|
jd ƒD ]}t	|||
||f |
||f ƒ\|
||f< |
||f< q†q5q*t
t|	jd ƒƒ}t|	tj|tjd�|ƒ}||
fS )zjThis is a python counterpart of the `_qr_reduce` routine,
    declared in interpolate/src/__fitpack.h
    r   )Údlartgr&   r5   r/   r=   )Úscipy.linalg.lapackrk  r  r!  rb  r“   rœ  rº   rd  Úfprotar  ra  rC   rþ   Úint64)Úa_pr‡   Ústartrowrk  r  r!  rb  rO  ÚnzÚRrI  rá   ÚoirÕ   r+   r‰  r  r  ÚoffsÚR_prM   rM   rN   Ú_qr_reduce_pyh  s2   
 84ÿ€rv  c                 C   s*   | | ||  }| | | |  }||fS )zLGivens rotate [a, b].

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

    rM   )r+   r‰  r  rL   r>  r/  rM   rM   rN   rm  ”  s   rm  c           
      C   sâ   | j }|j\}}| j}|jd |jd ksJ ‚t |d|… ¡}||d  ||d df  ||d df< t|d ddƒD ]2}t||| ƒ}||d|…df ||d || …df  jdd�}	|| |	 ||df  ||df< q<|S )z€Backsubsitution solve upper triangular banded `R @ c = y.`

    `R` is in the "packed" format: `R[i, :]` is `a[i, i:i+k+1]`
    r   Nr&   .r1   r/   rõ   )r  r“   rb  rC   r»   rº   rd  r�  )
ru  r‡   rr  r£   rq  rb  r+   rá   rg  ÚsummrM   rM   rN   Úfpback   s   
(2"rx  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTestGivensQRc                 C   s<   d}t j|td�}|d dd|   }t||ƒ}||||fS )Nr3   r=   r&   )rC   rG   r  r   )rJ   rK   r,   rg   r‡   r*   rM   rM   rN   Ú_get_xyt·  s
   
zTestGivensQR._get_xytc              	   C   sr  d}|   |¡\}}}}t |||¡}t | ¡ ¡\}}|j| }	|j\}
}||jd | d ks2J ‚|jd d |d … }t	j
|t	jd�}|j |
|d ¡}t|||ƒ}|d d …d f }t ||||¡ tt	 | ¡ | | ¡ | ¡t	 |¡dd� tt	 t|	|d d …df  ƒt|	|d d …df  ƒ¡t	 |	¡dd� t ||	¡}t |j|j|¡}t||d d …df dd� d S )	NrZ   r   r&   r=   rP   re   g‚vIhÂ%L=çê-�™—a=)rz  r   r	  r,  r7  rh  r2  r“   ÚindicesrC   Úascontiguousarrayrn  Údatarm   ra  r$   Ú	qr_reducer   Úminimumr»   Úabsr%  rx  r  rb  )rJ   rK   rg   r‡   r*   r,   Úa_csrÚqr  ÚqTyrO  rb  r!  r-  rr  Úy_Úc_fullÚc_bandedrM   rM   rN   Útest_vs_full¾  s4   


ÿ
ÿÿ
ÿzTestGivensQR.test_vs_fullc                 C   sþ   d}|   |¡\}}}}t |||¡}|j\}}||jd | d ks$J ‚|jd d |d … }	tj|	tjd�}	|j 	||d ¡}
t
|
|	|ƒ}|d d …d f }t||ƒ\}}t |
|	||¡ t|j|jdd� t|j|jdd� |j|jksvJ ‚t||dd� d S )	NrZ   r   r&   r=   rP   re   F)Úcheck_dtype)rz  r   r	  r“   r|  rC   r}  rn  r~  rm   ra  rv  r$   r  r   r  r   r!  rb  )rJ   rK   rg   r‡   r*   r,   r‚  rO  rb  r!  r-  rr  r…  ÚRRr¬   rM   rM   rN   Útest_py_vs_compiledá  s    
z TestGivensQR.test_py_vs_compiledc                 C   sÖ   d}|   |¡\}}}}tjd|d td�}t ||||¡\}}}	|jd }
t |||¡}||d d …d f   	¡ }|j
 |
|d f¡}|jd d |d …  tj¡}t||dd� t||ƒ |	|jd | d ksiJ ‚d S )NrZ   r&   r=   r   rP   re   )rz  rC   rG   r  r$   Údata_matrixr“   r   r	  Útocsrr~  rm   r|  rü  rn  r   r   )rJ   rK   rg   r‡   r*   r,   rA  r-  r!  rb  rO  r‚  Úa_wÚA_Úoffset_rM   rM   rN   Útest_data_matrixü  s   

zTestGivensQR.test_data_matrixc                 C   sŠ   d}|   |¡\}}}}tj||d f }t |||t |¡¡\}}}t|||ƒ}	t ||||¡ t|	|ƒ}
t |||¡}t	||
dd� d S )NrZ   r1   rd   re   )
rz  rC   rØ   r$   rŒ  r]   ra  r  rx  r   )rJ   rK   rg   r‡   r*   r,   r-  r!  rb  rr  r+   rË   rM   rM   rN   Útest_fpback  s   
zTestGivensQR.test_fpbackN)rí   rî   rï   rz  rˆ  r‹  r‘  r’  rM   rM   rM   rN   ry  ´  s    #ry  c                 C   s    t j t j t j t¡¡d| ¡S )Nr~  )ÚosÚpathr6  ÚabspathÚdirnameÚ__file__)ÚbasenamerM   rM   rN   Ú	data_file  s   ÿr™  c                   @   s8   e Zd Zdd„ Zdd„ Zdd„ Zej d¡dd	„ ƒZ	d
S )ÚTestSmoothingSplinec                 C   sÜ  t j d¡}d}t  | |¡d d ¡}|d t  d| ¡ |d  | dd|¡ }ttƒ� t	||dd … ƒ W d   ƒ n1 sBw   Y  ttƒ� t	|dd … |ƒ W d   ƒ n1 s_w   Y  ttƒ� t	| 
d|¡|ƒ W d   ƒ n1 s|w   Y  ttƒ� t	|d d d	… |ƒ W d   ƒ n1 sšw   Y  t  |¡}|d |d
< ttƒ� t	||ƒ W d   ƒ n1 s¾w   Y  t  d¡}t  d¡}d}tjt|d�� t	||ƒ W d   ƒ d S 1 sçw   Y  d S )Nr�   r‰   r4   r1   r3   r5   rÝ   r&   r/   r   z)``x`` and ``y`` length must be at least 5r¤  )rC   rI   r„   r…   r  rD  Únormalr?   rA   r   rm   rœ  rG   rm  rW   r   )rJ   r†   rK   rg   r‡   Úx_duplÚexception_messagerM   rM   rN   Útest_invalid_input$  s6   ,
ÿ
ÿ
ÿ
ÿ

ÿ

"ÿz&TestSmoothingSpline.test_invalid_inputc                 C   sj   t  tdƒ¡�}|d }|d }|d }W d  ƒ n1 sw   Y  t||ƒ|ƒ}t||dddd� dS )	ae  
        Data is generated in the following way:
        >>> np.random.seed(1234)
        >>> n = 100
        >>> x = np.sort(np.random.random_sample(n) * 4 - 2)
        >>> y = np.sin(x) + np.random.normal(scale=.5, size=n)
        >>> np.savetxt('x.csv', x)
        >>> np.savetxt('y.csv', y)

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

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

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

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

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

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

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

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

        z
gcvspl.npzrg   r‡   Úy_GCVSPLNg-Cëâ6?F)rR   rS   r‰  )rC   Úloadr™  r   r   )rJ   r~  rg   r‡   rŸ  Úy_comprrM   rM   rN   Útest_compare_with_GCVSPLC  s   )
ûz,TestSmoothingSpline.test_compare_with_GCVSPLc                 C   s¦   t j d¡}d}t  | |¡d d ¡}|d t  d| ¡ |d  | dd|¡ }t||dd�}t||dd	d
�}t  	|d |d d| ¡}t
||ƒ||ƒdd� dS )z–
        In case the regularization parameter is 0, the resulting spline
        is an interpolation spline with natural boundary conditions.
        r�   r‰   r4   r1   r3   r5   rÝ   )Úlamr  r"  r   r/   rP   re   N)rC   rI   r„   r…   r  rD  r›  r   r	   r\   r   )rJ   r†   rK   rg   r‡   Ú
spline_GCVÚspline_interpÚgridrM   rM   rN   Útest_non_regularized_case{  s   ,
þz-TestSmoothingSpline.test_non_regularized_caser1   c                 C   sè   t j d¡}d}t  | |¡d d ¡}|d t  d| ¡ |d  | dd|¡ }t||ƒ}|jt	dƒdd	�D ]9}t  
|¡}d
||< t|||ƒ}t||| ƒ||  ƒ}	t||| ƒ||  ƒ}
|	|
k rqtd|	d›d|
d›�ƒ‚q8d S )Nr�   r‰   r4   r1   r3   r5   rÝ   rZ   r�   g      >@zJSpline with weights should be closer to the points than the original one: z.4z < )rC   rI   r„   r…   r  rD  r›  r   Úchoicerº   rm  r�  rA   )rJ   r†   rK   rg   r‡   rÿ   ÚindrA  Úspl_wÚorigÚweightedrM   rM   rN   Útest_weighted_smoothing_splineŽ  s&   ,

ÿþÿ÷z2TestSmoothingSpline.test_weighted_smoothing_splineN)
rí   rî   rï   rž  r¢  r§  rW   r=  Ú	fail_slowr­  rM   rM   rM   rN   rš     s    8
rš  c                    s€   | \‰‰|\‰‰t ˆƒˆ d }|ˆd ksJ ‚t ˆƒˆ d ‰ˆˆd ks(J ‚t‡ ‡‡‡‡‡‡fdd„t|ƒD ƒƒ}t |¡S )z-A naive 2D tensort product spline evaluation.r&   c                 3   sF   � | ]}t ˆƒD ]}ˆ ||f tˆˆ|ˆƒ tˆˆ|ˆƒ V  qqd S r}  )rº   rð   )ru   ÚixÚiy©r+   r,   ÚnyÚtxÚtyrg   r‡   rM   rN   r  ³  s   € ÿ2ÿzbspline2.<locals>.<genexpr>)r  r�  rº   rC   rl   )r±   r*   r+   r,   Únxrë   rM   r±  rN   Úbspline2«  s   ÿ
r¶  c                 C   rw  )Nr   r&   r(   r5   ©rð   rz  rM   rM   rN   rð   ¸  s   (2Fÿrð   c                    sL   t ˆƒˆ d }|ˆd krt ˆ ƒ|ksJ ‚t‡ ‡‡‡fdd„t|ƒD ƒƒS )Nr&   c                 3   r‚  r}  r·  rƒ  r„  rM   rN   r  É  r…  zbspline.<locals>.<genexpr>r†  r‡  rM   r„  rN   r  Æ  s    r  c                   @   s   e Zd Zddd„Zdd„ ZdS )Ú
NdBSpline0r3   c                 C   sv   t |ƒ}|t |jƒksJ ‚zt |ƒ W n ty!   |f| }Y nw tdd„ |D ƒƒ| _tdd„ |D ƒƒ| _|| _dS )a¯  Tensor product spline object.

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

        Parameters
        ----------
        c : ndarray, shape (n1, n2, ..., nd, ...)
            b-spline coefficients
        t : tuple of 1D ndarrays
            knot vectors in directions 1, 2, ... d
            ``len(t[i]) == n[i] + k + 1``
        k : int or length-d tuple of integers
            spline degrees.
        c                 s   s   � | ]}t  |¡V  qd S r}  )ÚoperatorÚindex)ru   ÚkirM   rM   rN   r  å  s   € z&NdBSpline0.__init__.<locals>.<genexpr>c                 s   s   � | ]
}t j|td �V  qdS )r=   N)rC   rl   r  )ru   ÚtirM   rM   rN   r  æ  s   € N)r  r“   r@   rö   r,   r*   r+   )rJ   r*   r+   r,   rê   rM   rM   rN   rc  Í  s   þ
zNdBSpline0.__init__c           
         s>  t ˆjƒ}t ˆƒ|ksJ ‚dg| ‰ t|ƒD ]P}ˆj| ˆ| }}ˆj| }||| kr2|ˆ |< n
t ||¡d ˆ |< |ˆ |  |  krQ|ˆ | d  ksTJ ‚ J ‚ˆ | |krdˆ | t |ƒ| k sfJ ‚qtˆ ƒ‰ d}‡ ‡fdd„t|ƒD ƒ}tj|Ž D ]‰ˆj	ˆ t 
‡‡‡fdd„t|ƒD ƒ¡ }	||	7 }q~t |¡S )NÚnoner&   r   c                    s,   g | ]}t ˆ | ˆj|  ˆ | d  ƒ‘qS ©r&   )rº   r,   ©ru   r(  )rá   rJ   rM   rN   rw   	  ó   , z'NdBSpline0.__call__.<locals>.<listcomp>c                    s.   g | ]}t ˆ| ˆj| ˆ | ˆj| ƒ‘qS rM   )rð   r,   r*   r¿  )ÚidxrJ   rg   rM   rN   rw   	  s    &ÿ)r  r*   rº   r,   rC   r€  rö   Ú	itertoolsÚproductr+   Úprodrl   )
rJ   rg   rê   r(  ÚtdÚxdr,   ÚresultÚitersÚtermrM   )rá   rÁ  rJ   rg   rN   Ú__call__é  s(   



0&
ÿ

zNdBSpline0.__call__N©r3   )rí   rî   rï   rc  rÊ  rM   rM   rM   rN   r¸  Ì  s    
r¸  c                   @   s
  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zej d!d"d#g¡ej d$d"d#g¡d%d&„ ƒƒZej d'd(d)g¡d*d+„ ƒZd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zejjd6d7„ ƒZd"S )8ÚTestNdBSplinec           
      C   s¼   t j d¡}d\}}d}t  |j|| d d�¡}|j||fd�}t|||ƒ}t|f||ƒ}|jdd�}	t||	d d …d f ƒ||	ƒdd� ||	d d …d f ƒj|	jd	 |jd fks\J ‚d S )
NrQ  r;   rŽ   r&   r�   r›  rd   re   r   )	rC   rI   rU  r…   rV  r   r   r   r“   )
rJ   r†   rK   r,   Ún_trr*   r+   rL   ÚnbÚxirM   rM   rN   Útest_1D	  s   ÿ2zTestNdBSpline.test_1Dc                 C   sx   t  d¡}|d }t||dd�}|d d|  }t||dd�}|j|jf}|jd d …d f |jd d d …f  }||dfS )Nr�   r3   rÑ   r1   ©rC   rG   r	   r*   r+   ©rJ   rg   r‡   rÿ   Úy_1rH  Út2r|  rM   rM   rN   Úmake_2d_case	  s   
$
zTestNdBSpline.make_2d_casec                 C   sŒ   t  d¡}|d }t||dd�}t  d¡d }|d d|  }t||dd�}|j|jf}|jd d …d f |jd d d …f  }|||j|jfS )Nr�   r3   rÑ   r’   rÝ   r1   )rC   rG   r	   r*   r+   r,   rÒ  rM   rM   rN   Úmake_2d_mixed*	  s   
$zTestNdBSpline.make_2d_mixedc                    sö   g d¢}|   ¡ \‰‰ ‰dd„ |D ƒ}tt ‡ ‡‡fdd„|D ƒ¡t |¡ddd� tˆˆ dd	�}||ƒjt|ƒfks<J ‚t||ƒ|dd
� tj d¡}|j	dd�d }||ƒ}|jdks^J ‚| 
d¡j\}}t| ¡ |d |d d|   dd
� d S )N©©rÝ   r:   )r:   r&   )r°   rÝ   c                 S   ó(   g | ]\}}|d  |d  d|   ‘qS rÀ  rM   ©ru   rg   r‡   rM   rM   rN   rw   <	  ó   ( z3TestNdBSpline.test_2D_separable.<locals>.<listcomp>c                    rq   rM   ©r¶  ©ru   r±   ©r|  r,   rÔ  rM   rN   rw   ?	  rx   Frd   ©rÁ  rR   r3   rÑ   re   rQ  )r4   r3   r1   r�   r’   )r4   r3   )r/   r1   r1   )rÕ  r   rC   rl   r   r“   r  rI   rU  rV  rm   r2  Úravel)rJ   rÏ  ÚtargetÚbspl2r†   rÇ  rg   r‡   rM   rÞ  rN   Útest_2D_separable9	  s*   ýÿ
ÿzTestNdBSpline.test_2D_separablec                 C   s€  d}g d¢}dd„ |D ƒ}|   ¡ \}}}t ||||f¡}d}t||dd�}	|	|ƒ}
t|||ƒ|ƒ}|
jdks9J ‚t|
|gd	 d
d� |	|ƒjt |¡d d… |	jj|d …  ks[J ‚t|	|ƒt |¡d d …d f ddd� | d¡}t||dd�}||ƒ}
|
jdks…J ‚t|
||g||ggd
d� ||ƒjt |¡d d… |jj|d …  ksªJ ‚t||ƒt |¡d d …d d f ddd� d S )Nr1   r×  c                 S   rÙ  rÀ  rM   rÚ  rM   rM   rN   rw   Y	  rÛ  z5TestNdBSpline.test_2D_separable_2.<locals>.<listcomp>rØ  r3   rÑ   ©r4   r4   rd   re   r/   Fg‚vIhÂ%,=rß  ©r�   r�   r1   r1   )r1   r1   )	rÕ  rC   rÙ   r   r“   r   r+   rl   rm   )rJ   rê   rÏ  rá  rÔ  r|  r,   Úc2_4r±   Úbspl2_4rÇ  Ú
val_singleÚc2_22Úbspl2_22rM   rM   rN   Útest_2D_separable_2U	  sF   
ÿ0þ
ÿþ ÿ
þz!TestNdBSpline.test_2D_separable_2c                 C   sœ   g d¢}dd„ |D ƒ}dd„ |D ƒ}|   ¡ \}}}|d }t ||||f¡}d}t||dd�}||ƒ}	t|||ƒ|ƒ}
|	jd	ksBJ ‚t|	|
gd
 dd� d S )Nr×  c                 S   rÙ  rÀ  rM   rÚ  rM   rM   rN   rw   ƒ	  rÛ  z=TestNdBSpline.test_2D_separable_2_complex.<locals>.<listcomp>c                 S   s   g | ]}|d |  ‘qS )y               @rM   )ru   r*   rM   rM   rN   rw   …	  ó    rN  rØ  r3   rÑ   rä  r4   rd   re   )rÕ  rC   rÙ   r   r“   r   )rJ   rÏ  rá  rÔ  r|  r,   ræ  r±   rç  rÇ  rè  rM   rM   rN   Útest_2D_separable_2_complex€	  s   

ÿz)TestNdBSpline.test_2D_separable_2_complexc              
      s  t j d¡}d‰t jddddt  |jdd�¡d ddddf	 ‰t jddddt  |jdd�¡d ddddf	 ‰|jˆjˆ d ˆjˆ d fd�‰ tˆˆfˆ ˆd	�}d
}t||ƒt	|ˆˆfˆ ˆƒdd� t j
g d¢g d¢f }t||ƒ‡ ‡‡‡fdd„|D ƒdd� d S )NrQ  r3   r   rŽ   r�   r®   r4   r&   rÑ   )r(   r(   rd   re   ©r&   rÝ   r1   ©çš™™™™™ñ?gš™™™™™ù?çÍÌÌÌÌÌ @c                    s   g | ]}t |ˆˆfˆ ˆƒ‘qS rM   rÜ  rÝ  ©r+   r,   r³  r´  rM   rN   rw   £	  s    z0TestNdBSpline.test_2D_random.<locals>.<listcomp>)rC   rI   rU  r˜   r…   rV  r�   r   r   r¶  rØ   )rJ   r†   rÿ   rÏ  rM   rò  rN   Útest_2D_random“	  s"   ..$ÿ
ÿ
þzTestNdBSpline.test_2D_randomc                 C   sf   |   ¡ \}}}}g d¢}dd„ |D ƒ}t||||fd�}||ƒjt|ƒfks(J ‚t||ƒ|dd� d S )N©)çffffffö?rZ  )r:   g333333@)rZ  rc  c                 S   ó(   g | ]\}}|d  |d d|   ‘qS rÀ  rM   rÚ  rM   rM   rN   rw   ©	  rÛ  z/TestNdBSpline.test_2D_mixed.<locals>.<listcomp>rÑ   rd   re   )rÖ  r   r“   r  r   )rJ   rÔ  r|  ÚkxÚkyrÏ  rá  râ  rM   rM   rN   Útest_2D_mixed¦	  s   
ÿzTestNdBSpline.test_2D_mixedc                 C   s  |   ¡ \}}}}g d¢}t||||fd�}||dd�}t|dd„ |D ƒdd� ||d	d�}t|d
d„ |D ƒdd� ||dd�}t|dd„ |D ƒdd� ttƒ� ||dd�}W d   ƒ n1 s`w   Y  ttƒ� ||dd�}W d   ƒ d S 1 s{w   Y  d S )Nrô  rÑ   r	  r¸   c                 S   s,   g | ]\}}d |d  |d d|   ‘qS rÀ  rM   rÚ  rM   rM   rN   rw   ¶	  rÀ  z4TestNdBSpline.test_2D_derivative.<locals>.<listcomp>rd   re   ©r&   r&   c                 S   s(   g | ]\}}d |d  d| d  ‘qS rÀ  rM   rÚ  rM   rM   rN   rw   º	  rÛ  )r   r   c                 S   rö  rÀ  rM   rÚ  rM   rM   rN   rw   ¾	  rÛ  )r/   r   )r/   r   r&   )rÖ  r   r   r?   rA   )rJ   rÔ  r|  r÷  rø  rÏ  râ  r·   rM   rM   rN   Útest_2D_derivative¯	  s*   ÿÿÿ
þ
"þz TestNdBSpline.test_2D_derivativec           	   
      sú   t j d¡}d\}}t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }|j|j| d	 |j| d	 fd�}t jg d
¢g d¢f }t||f|||fd�}t	||f|||fd�‰ t
||ƒ‡ fdd„|D ƒdd� d S )NrQ  )r1   r3   r   rŽ   r�   r3   r®   r4   r&   rî  rï  rÑ   c                    ó   g | ]}ˆ |ƒ‘qS rM   rM   ©ru   rù   ©Úbspl2_0rM   rN   rw   Ö	  rû  z6TestNdBSpline.test_2D_mixed_random.<locals>.<listcomp>rd   re   )rC   rI   rU  r˜   r…   rV  r�   rØ   r   r¸  r   ©	rJ   r†   r÷  rø  r³  r´  r+   rÏ  râ  rM   rþ  rN   Útest_2D_mixed_randomÈ	  s   ..$
ÿ
ÿz"TestNdBSpline.test_2D_mixed_randomc                 C   s  t  d¡}t  d¡d }t||d dd�}t||d d|  dd�}|jd d …d f |jd d d …f  }t|j|jf||j|jfƒ}|d d d …d f |d d|  d d d …f  }t||f|ƒ}dd„ t 	||¡D ƒ}	||	ƒ}
t  
|
¡ ¡ ryJ ‚t|
||	ƒd	d
� t|
 |j¡|d	d
� d S )Nr�   rŽ   rÝ   r3   rÑ   r1   c                 S   ó   g | ]\}}||f‘qS rM   rM   ©ru   r  rL   rM   rM   rN   rw   å	  rì  z0TestNdBSpline.test_tx_neq_ty.<locals>.<listcomp>rd   re   )rC   rG   r	   r+   r   r*   r,   r   rÂ  rÃ  r«   Úanyr   rm   r“   )rJ   rg   r‡   Úspl_xÚspl_yrË   ro   ÚvaluesÚrgirÏ  ÚbxirM   rM   rN   Útest_tx_neq_tyØ	  s   
$0zTestNdBSpline.test_tx_neq_tyc           
      C   s¶   t  d¡}|d }t||dd�}|d d|  }t||dd�}|d d|  d }t||dd�}|j|j|jf}|jd d …d d f |jd d d …d f  |jd d d d …f  }	||	dfS )Nr�   r3   rÑ   r1   r&   rÑ  )
rJ   rg   r‡   rÿ   rÓ  rH  Úy_2r^  rÔ  r|  rM   rM   rN   Úmake_3d_caseì	  s   
ÿþ
zTestNdBSpline.make_3d_casec                 C   s¨   t j d¡}|jdd�d \}}}|d |d d|   |d d|  d  }|  ¡ \}}}t||dd�}	d	d
„ t|||ƒD ƒ}
|	|
ƒ}|jdksKJ ‚t||dd� d S )NrQ  ©r3   r<   r�   r’   r3   r1   r&   rÑ   c                 S   ó   g | ]}|‘qS rM   rM   ©ru   r£   rM   rM   rN   rw   
  r‘  z3TestNdBSpline.test_3D_separable.<locals>.<listcomp>)r<   rd   re   )	rC   rI   rU  rV  r  r   Úzipr“   r   )rJ   r†   rg   r‡   r  rá  Út3Úc3r,   Úbspl3rÏ  rÇ  rM   rM   rN   Útest_3D_separableÿ	  s   ,zTestNdBSpline.test_3D_separablec           
      C   sd  |   ¡ \}}}t||dd�}tj d¡}|jdd�d \}}}dd„ t|||ƒD ƒ}	t||	d	d
�d|d  |d d|   |d d|  d  dd� t||	dd
�d| |d d|   |d d|  d  dd� t||	dd
�d| d|d  d  |d d|  d  dd� t||	dd
�d| d|d  d  d dd� t||	dd
�t t	|	ƒ¡dd� d S )Nr3   rÑ   rQ  r  r�   r’   c                 S   r  rM   rM   r  rM   rM   rN   rw   
  r‘  z4TestNdBSpline.test_3D_derivative.<locals>.<listcomp>)r&   r   r   r¸   r1   r&   rd   re   )r1   r   r   r�   )r1   r&   r   )r1   r&   r3   )r1   r&   r4   )
r  r   rC   rI   rU  rV  r  r   rÆ  r  )
rJ   r  r  r,   r  r†   rg   r‡   r  rÏ  rM   rM   rN   Útest_3D_derivative
  s(   0ÿ,ÿ,ÿÿ
ÿz TestNdBSpline.test_3D_derivativec           	   
      sL  t j d¡}d}t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }|j|j| d |j| d |j| d fd�}t|||f||d	�}t|||f||d	�‰ d
}t	||ƒˆ |ƒdd� t j
g d¢g d¢g d¢f }t	||ƒ‡ fdd„|D ƒdd� d S )NrQ  r3   r   rŽ   r�   r®   r4   r&   rÑ   )r(   r(   r&   rd   re   rî  rï  ©gÍÌÌÌÌÌì?rõ  gffffffþ?c                    rü  rM   rM   rý  ©Úspl_0rM   rN   rw   3
  rû  z0TestNdBSpline.test_3D_random.<locals>.<listcomp>)rC   rI   rU  r˜   r…   rV  r�   r   r¸  r   rØ   )	rJ   r†   r,   r³  r´  Útzr+   rÿ   rÏ  rM   r  rN   Útest_3D_random"
  s   ...0
þ$zTestNdBSpline.test_3D_randomc              
   C   s€  t j d¡}d}t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }|j|j| d |j| d |j| d fd�|j|j| d |j| d |j| d fd�d	  }t|||f||d
�}t|||f|j|d
�}t|||f|j	|d
�}	t j
g d¢g d¢g d¢f }
t||
ƒ||
ƒd	|	|
ƒ  dd� d S )NrQ  r3   r   rŽ   r�   r®   r4   r&   r'   rÑ   rî  rï  r  rd   re   )rC   rI   rU  r˜   r…   rV  r�   r   rÉ   rÊ   rØ   r   )rJ   r†   r,   r³  r´  r  r+   rÿ   rg  rh  rÏ  rM   rM   rN   Útest_3D_random_complex5
  s$   ....2ÿ
þ
ÿz$TestNdBSpline.test_3D_random_complexÚ
cls_extrapNTÚcall_extrapc                 C   s²   |   ¡ \}}}t||d|d�}g d¢g d¢g d¢}}}	ttj|||	fƒ\}}}	dd„ t|||	ƒD ƒ}
|d |d d|   |	d d|	  d	  }||
|d
�}t||dd� d S )Nr3   ©r,   rk   ©éþÿÿÿr/   rŽ   ©rý   rÛ   rB  ©r/   g      ø¿ç      @c                 S   r  rM   rM   r  rM   rM   rN   rw   R
  r‘  z?TestNdBSpline.test_extrapolate_3D_separable.<locals>.<listcomp>r1   r&   rj   rd   re   ©r  r   r0  rC   rl   r  r   )rJ   r  r  r  r  r,   r  rg   r‡   r  rÏ  rá  rÇ  rM   rM   rN   Útest_extrapolate_3D_separableH
  s   ,z+TestNdBSpline.test_extrapolate_3D_separabler¤   )FT)TNc                 C   sº   |   ¡ \}}}|\}}t||d|d�}g d¢g d¢g d¢}}	}
ttj||	|
fƒ\}}	}
dd„ t||	|
ƒD ƒ}|d |	d d|	   |
d d|
  d	  }|||d
�}t||dd� d S )Nr3   r  r  r!  r"  c                 S   r  rM   rM   r  rM   rM   rN   rw   c
  r‘  zATestNdBSpline.test_extrapolate_3D_separable_2.<locals>.<listcomp>r1   r&   rj   rd   re   r$  )rJ   r¤   r  r  r,   r  r  r  rg   r‡   r  rÏ  rá  rÇ  rM   rM   rN   Útest_extrapolate_3D_separable_2X
  s   ,z-TestNdBSpline.test_extrapolate_3D_separable_2c                 C   sä   |   ¡ \}}}t||dd�}g d¢g d¢g d¢}}}ttj|||fƒ\}}}dd„ t|||ƒD ƒ}|d |d d|   |d d|  d	  }	||d
d�}
t |
d ¡sXJ ‚t |
d ¡saJ ‚t|
d	d… |	d	d… dd� d S )Nr3   rÑ   )r   r&   rŽ   )rý   r°   rB  )r/   rÝ   r#  c                 S   r  rM   rM   r  rM   rM   rN   rw   q
  r‘  zETestNdBSpline.test_extrapolate_false_3D_separable.<locals>.<listcomp>r1   r&   Frj   r   r/   rd   re   )r  r   r0  rC   rl   r  r«   r   )rJ   r  r  r,   r  rg   r‡   r  rÏ  rá  rÇ  rM   rM   rN   Ú#test_extrapolate_false_3D_separablei
  s   ,"z1TestNdBSpline.test_extrapolate_false_3D_separablec              	   C   s  |   ¡ \}}}t||dd�}t ddtjdddtjg¡}t dddtjdd	d	g¡}t d
dddtjddg¡}dd„ t|||ƒD ƒ}|d |d d|   |d d|  d  }	t |¡t |¡B t |¡B }
tj|	|
< ||ƒ}t ||
 ¡ ¡ szJ ‚t||	dd� d S )Nr3   rÑ   r   r&   r1   rŽ   rý   rc  rB  r/   r#  c                 S   r  rM   rM   r  rM   rM   rN   rw   ‚
  r‘  z/TestNdBSpline.test_x_nan_3D.<locals>.<listcomp>rd   re   )	r  r   rC   rl   rE   r  r«   rª   r   )rJ   r  r  r,   r  rg   r‡   r  rÏ  rá  r¨   rÇ  rM   rM   rN   Útest_x_nan_3Dy
  s   ,
zTestNdBSpline.test_x_nan_3Dc           	         s€  t j d¡}d\}}t  |jdddd�¡}t j|d f| ||d f| f }t  |jdddd�¡}t j|d f| ||d f| f }|d d d… jjrOJ ‚|d d d… jjrZJ ‚|j|jd | d	 |jd | d	 fd
�}|j	}|jjryJ ‚t j
g d¢g d¢f }t|d d d… |d d d… f|||fd�}t|d d d… |d d d… f|||fd�‰ t||ƒ‡ fdd„|D ƒdd� d S )NrQ  ©r3   r3   r   r4   é   rT  r/   r1   r&   r�   rî  rï  rÑ   c                    rü  rM   rM   rý  rþ  rM   rN   rw   ¢
  rû  z7TestNdBSpline.test_non_c_contiguous.<locals>.<listcomp>rd   re   )rC   rI   rU  r…   rV  r˜   ÚflagsÚc_contiguousr�   r2  rØ   r   r¸  r   r   rM   rþ  rN   Útest_non_c_contiguous‹
  s&   $$,
ÿ**
ÿz#TestNdBSpline.test_non_c_contiguousc                 C   sd   |   ¡ \}}}t||dd�}tdƒD ]}d|| j_qd|j_t||dd�}|dƒ|dƒks0J ‚d S )Nr3   rÑ   Frb   )r  r   rº   r+  Ú	writeable)rJ   r  r  r,   r  rá   Úbspl3_rM   rM   rN   Útest_readonly¤
  s   zTestNdBSpline.test_readonlyc                 C   s  |   ¡ \}}}t g d¢g d¢g¡}t|||ƒ |||¡}t |||||g¡}|jd |jd ks3J ‚t| ¡ | ¡ dd� tt	ƒ� t g d¢||gd ¡ W d   ƒ n1 sYw   Y  tt	dd�� t d	d
gg||gd ¡ W d   ƒ d S 1 s}w   Y  d S )Nrb   )r4   r’   r�   r   g¼‰Ø—²Òœ<re   r3   zData and knots*r¤  r&   r1   )
r  rC   rl   r   r	  r“   r   rh  r?   rA   )rJ   r  r  r,   rÏ  ÚdmÚdm1rM   rM   rN   Útest_design_matrix°
  s   
ÿ"ÿz TestNdBSpline.test_design_matrixc           	   
   C   sö   t j d¡}d}t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }t jddddt  |jdd�¡d ddddf	 }|j|j| d |j| d |j| d fd�}t|||f||d	�}d
d„ }td||ƒ d S )NrQ  r3   r   rŽ   r�   r®   r4   r&   rÑ   c                 S   s(   t jg d¢g d¢g d¢f }||ƒ d S )Nrî  rï  r  )rC   rØ   )r£   rÿ   rÏ  rM   rM   rN   r/  Ê
  s
   
þz1TestNdBSpline.test_concurrency.<locals>.worker_fnrZ   )	rC   rI   rU  r˜   r…   rV  r�   r   r    )	rJ   r†   r,   r³  r´  r  r+   rÿ   r/  rM   rM   rN   r0  ¿
  s   ...0zTestNdBSpline.test_concurrency)rí   rî   rï   rÐ  rÕ  rÖ  rã  rë  rí  ró  rù  rû  r  r
  r  r  r  r  r  rW   r=  r>  r%  r&  r'  r(  r-  r0  r3  r?  r0  rM   rM   rM   rN   rÌ  		  s:    +	
rÌ  c                   @   s–   e Zd Zdd„ Zdd„ Zej dg d¢¡dd„ ƒZd	d
„ Z	dd„ Z
dd„ Zej dejejg¡dd„ ƒZdd„ Zej dg d¢¡dd„ ƒZdd„ ZdS )Ú
TestMakeNDc                 C   s   t  d¡}t  d¡d }|d d …d f d |d d|  d d d …f  }dd„ t ||¡D ƒ}t||f|dd�}t||ƒ| ¡ d	d
� t||d dd�}t||d d|  dd�}|jd d …d f |jd d d …f  }t||jddd� ddl	m
}	 |	||f|dd�}
t|
|ƒ||ƒdd
� d S )Nr�   r°   r3   r1   c                 S   r  rM   rM   r  rM   rM   rN   rw   Ø
  rì  z7TestMakeND.test_2D_separable_simple.<locals>.<listcomp>r&   rÑ   rP   re   rä  r   rQ   )r   Úlinearr9  rd   )rC   rG   rÂ  rÃ  r!   r   rà  r	   r+   Úscipy.interpolater   )rJ   rg   r‡   r  rÏ  ro   r  r  rË   ÚRGIr  rM   rM   rN   Útest_2D_separable_simpleÔ
  s   
0$z#TestMakeND.test_2D_separable_simplec           
      C   s"  t  d¡}t  d¡}dd„ t ||¡D ƒ}|d d …d f d |d d|  d d d …f  }t  ||||f¡}t||f|dtjd�}||ƒ}t  ||||f¡ t	¡}|j
dksXJ ‚t| ddd¡|d	d
� | d¡}	t||f|	dtjd�}||ƒ}|j
dksJ ‚t| dddd¡| d¡d	d
� d S )Nr�   c                 S   r  rM   rM   r  rM   rM   rN   rw   ì
  rì  z>TestMakeND.test_2D_separable_trailing_dims.<locals>.<listcomp>r3   r1   ©r,   Úsolver)é$   r4   r4   rd   re   rå  )r;  r1   r1   )rC   rG   rÂ  rÃ  rÙ   r!   ÚsslÚspsolverü  r  r“   r   rm   )
rJ   rg   r‡   rÏ  r  Úvalues4ro   rÇ  rá  Úvalues22rM   rM   rN   Útest_2D_separable_trailing_dimsè
  s&   

0ÿ


ÿz*TestMakeND.test_2D_separable_trailing_dimsr,   )r)  rú  )r3   r&   )r&   r3   r¯  c                 C   sŽ   t  d¡}t  d¡d }dd„ t ||¡D ƒ}|d d d …d f |d d|  d d d …f  }t||f||tjd�}t||ƒ| ¡ d	d
� d S )Nr�   rŽ   rÝ   c                 S   r  rM   rM   r  rM   rM   rN   rw     rì  z,TestMakeND.test_2D_mixed.<locals>.<listcomp>r3   r1   r9  rP   re   )	rC   rG   rÂ  rÃ  r!   r<  r=  r   rà  )rJ   r,   rg   r‡   rÏ  r  ro   rM   rM   rN   rù    s   
0zTestMakeND.test_2D_mixedc              	   C   sT   t  g d¢¡}t  g d¢¡}t  g d¢g d¢g d¢g d¢g d¢g d¢g¡}|||fS )N)r°   r6   r7   r8   r[  r\  )r&   r1   r&   r1   r&   r&   )r&   r1   r3   r1   r&   r&   )r&   r1   r1   r1   r&   r&   )rC   rþ   r  rM   rM   rN   Ú_get_sample_2d_data  s   úÿ

zTestMakeND._get_sample_2d_datac                 C   sd   |   ¡ \}}}t||f|dd�}t||f|dd�}t g d¢g d¢g¡j}t||ƒ||ƒdd� d S )	Nr&   rÑ   r5  r9  ©r&   gffffff@g333333@r°   çffffff
@ç333333ó?r3   ©r&   rC  rD  r8   r   r(   r3   rd   re   ©rA  r!   r   rC   rþ   r2  r   ©rJ   rg   r‡   r  ro   r  rÏ  rM   rM   rN   Útest_2D_vs_RGI_linear  s   
ÿÿz TestMakeND.test_2D_vs_RGI_linearc                 C   óh   |   ¡ \}}}t||f|dtjd�}t||f|dd�}t g d¢g d¢g¡j}t||ƒ||ƒdd� d S )	Nr3   r9  Úcubic_legacyr9  rB  rE  rd   re   ©	rA  r!   r<  r=  r   rC   rþ   r2  r   rG  rM   rM   rN   Útest_2D_vs_RGI_cubic'  ó   
ÿÿzTestMakeND.test_2D_vs_RGI_cubicr:  c                 C   sj   |   ¡ \}}}t||f|d|dd�}t||f|dd�}t g d¢g d¢g¡j}t||ƒ||ƒdd	d
� d S )Nr3   g�íµ ÷Æ°>)r,   r:  rS   rJ  r9  rB  rE  rd   r    rQ   rF  )rJ   r:  rg   r‡   r  ro   r  rÏ  rM   rM   rN   Útest_2D_vs_RGI_cubic_iterative1  s   
ÿÿz)TestMakeND.test_2D_vs_RGI_cubic_iterativec                 C   rI  )	Nr’   r9  Úquintic_legacyr9  rB  rE  rd   re   rK  rG  rM   rM   rN   Útest_2D_vs_RGI_quintic@  rM  z!TestMakeND.test_2D_vs_RGI_quinticzk, meth))r&   r5  )r3   rJ  )r’   rO  c                 C   s¦   t j d¡}t  |jdd�¡}t  |jdd�¡}t  |jdd�¡}|jdd�}t|||f||tjd�}t|||f||d�}	t jjd	d
dd�}
t	||
ƒ|	|
ƒdd� d S )Ni@â r�   r�   rŽ   r®   rô   r9  r9  gffffffæ?rñ  r;   rT  rd   re   )
rC   rI   rU  ÚcumsumrV  r!   r<  r=  r   r   )rJ   r,   ÚmethÚrndmrg   r‡   r  r  ro   r  rÏ  rM   rM   rN   Útest_3D_random_vs_RGIJ  s   z TestMakeND.test_3D_random_vs_RGIc                 C   s²   |   ¡ \}}}ddi}ttdd�� t||f|fddi|¤Ž W d   ƒ n1 s)w   Y  ttdd�� t||ft ||f¡fddi|¤Ž W d   ƒ d S 1 sRw   Y  d S )NÚmaxiterr&   r:  r¤  r,   r3   )rA  r?   rA   r!   rC   rÙ   )rJ   rg   r‡   r  Úsolver_argsrM   rM   rN   Útest_solver_err_not_convergedZ  s   ÿ&"ÿz(TestMakeND.test_solver_err_not_convergedN)rí   rî   rï   r8  r@  rW   r=  r>  rù  rA  rH  rL  r<  ÚgmresÚgcrotmkrN  rP  rT  rW  rM   rM   rM   rN   r4  Ó
  s     





ÿ
r4  c                   @   s\   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú
TestFpchecc                 C   sž   d}t  d¡ dd¡}t  d¡}tjtdd�� t |||¡ W d   ƒ n1 s)w   Y  tjtdd�� t |||¡ W d   ƒ d S 1 sHw   Y  d S )Nr&   rX  r1   r�   z1D sequencer¤  )rC   rG   rm   rW   r   rA   Ú_bÚfpcheck©rJ   r,   r*   rg   rM   rM   rN   Útest_1D_x_tg  s   
ÿ"ÿzTestFpchec.test_1D_x_tc                 C   s
  d}d|d  d }|d }t  |¡}t  |¡}t |||¡dks#J ‚tjtdd�� t |||¡ W d   ƒ n1 s<w   Y  d|d  d }|| d }t  |¡}t  |¡}t |||¡dksdJ ‚tjtdd�� t |||¡ W d   ƒ d S 1 s~w   Y  d S )Nr3   r1   r&   r<   rZ   z	Need k+1*r¤  )	rC   rG   ÚdfitpackÚfpchecrW   r   rA   r[  r\  )rJ   r,   rK   rO  r*   rg   rM   rM   rN   Útest_condition_1r  s"   

ÿ

"ÿzTestFpchec.test_condition_1c                 C   s,  d}dg|d  dg dg|d   }g d¢}t  |||¡dks"J ‚t |||¡d u s-J ‚| ¡ }|d |d< t  |||¡dksBJ ‚tjtd	d
�� t |||¡ W d   ƒ n1 s[w   Y  | ¡ }|d |d< t  |||¡dksuJ ‚tjtdd
�� t |||¡ W d   ƒ d S 1 s�w   Y  d S )Nr3   r   r&   r1   r’   )r&   r1   r3   r4   rZ  r/   r‚   zLast k knots*r¤  zFirst k knots*©r_  r`  r[  r\  rœ  rW   r   rA   )rJ   r,   r*   rg   ÚttrM   rM   rN   Útest_condition_2‡  s"   "ÿ"ÿzTestFpchec.test_condition_2c                 C   sØ   d}dg|d  ddg dg|d   }g d¢}t  |||¡dks#J ‚t |||¡d u s.J ‚dg|d  ddg dg|d   }t  |||¡dksKJ ‚tjtdd	�� t |||¡ W d   ƒ d S 1 sew   Y  d S )
Nr3   r   r&   r1   r’   ©r&   r1   r3   rc  r4   rZ  é   zInternal knots*r¤  )r_  r`  r[  r\  rW   r   rA   r]  rM   rM   rN   Útest_condition_3�  s   $$"ÿzTestFpchec.test_condition_3c                 C   sn  d}dg|d  dg|d   }g d¢}t  |||¡dksJ ‚t |||¡d u s*J ‚| ¡ }|d |d< t  |||¡dks?J ‚t |||¡d u sJJ ‚| ¡ }|d d |d< t  |||¡dksaJ ‚tjtdd�� t |||¡ W d   ƒ n1 szw   Y  | ¡ }|d	 d |d	< t  |||¡dks–J ‚tjtdd�� t |||¡ W d   ƒ d S 1 s°w   Y  d S )
Nr3   r   r&   r’   re  r  zOut of bounds*r¤  r/   rb  )rJ   r,   r*   rg   r`   rM   rM   rN   Útest_condition_4ª  s*   ÿ"ÿzTestFpchec.test_condition_4c                 C   sÆ   d}g d¢}g d¢}t  |||¡dksJ ‚tjtdd�� t |||¡ W d   ƒ n1 s.w   Y  g d¢}t  |||¡dksBJ ‚tjtdd�� t |||¡ W d   ƒ d S 1 s\w   Y  d S )Nr&   )r   r   r&   r1   r1   )rð  rð  rð  rc   úSchoenberg-Whitney*r¤  )r°   r°   r°   ©r_  r`  rW   r   rA   r[  r\  r]  rM   rM   rN   Útest_condition_5_x1xmÉ  s   ÿ"ÿz TestFpchec.test_condition_5_x1xmc                 C   sD   d}g d¢}ddg}t  |||¡dksJ ‚t |||¡d u s J ‚d S )Nr&   )r   r   r&   r&   r°   g333333ã?r   )r_  r`  r[  r\  r]  rM   rM   rN   Útest_condition_5_k1×  s
   zTestFpchec.test_condition_5_k1c                 C   s  d}dg|d  dg dg|d   }dgd }t  |||¡dks#J ‚tjtdd�� t |||¡ W d   ƒ n1 s<w   Y  dg|d  dg dg|d   }dgd }t  |||¡dksbJ ‚tjtdd�� t |||¡ W d   ƒ d S 1 s|w   Y  d S )	Nr3   r   r&   r1   r’   rc   ri  r¤  rj  r]  rM   rM   rN   Útest_condition_5_1ß  s   "
ÿ"
"ÿzTestFpchec.test_condition_5_1c                 C   sÌ   d}dg|d  ddg dg|d   }dgd dg }t  |||¡dks'J ‚tjtd	d
�� t |||¡ W d   ƒ n1 s@w   Y  dgd ddg }t  |||¡dksYJ ‚t |||¡d u sdJ ‚d S )Nr3   r   r&   r1   r’   rð  r4   rc   ri  r¤  rj  r]  rM   rM   rN   Útest_condition_5_2î  s   $ÿzTestFpchec.test_condition_5_2c                 C   sl   d}g d¢}g d¢}t  |||¡dksJ ‚tjtdd�� t |||¡ W d   ƒ d S 1 s/w   Y  d S )Nr&   )	r   r   r1   r3   r4   r’   r�   rŽ   rŽ   )r&   r&   r&   çÍÌÌÌÌÌ@ro  ro  rB  rc   ri  r¤  rj  r]  rM   rM   rN   Útest_condition_5_3ý  s   "ÿzTestFpchec.test_condition_5_3N)rí   rî   rï   r^  ra  rd  rg  rh  rk  rl  rm  rn  rp  rM   rM   rM   rN   rZ  d  s    rZ  c                    sº   t  | ||| … ¡‰ ‡ ‡fdd„ttˆ ƒd ƒD ƒ}ˆˆ dd…  }tt|ƒƒD ]}|| d }||  |7  < ||d   |8  < q)|d  ˆd 7  < tt|ƒtˆƒdd� |ˆ fS )z)Split the knot interval into "runs".
    c                    s(   g | ]}ˆˆ | ˆ |d   …   ¡ ‘qS r¾  )r�  rƒ  ©r¯  Ú	residualsrM   rN   rw     rÛ  z_split.<locals>.<listcomp>r&   r/   r1   rP   re   )rC   r€  rº   r  r   r�  )rg   r*   r,   rr  ÚfpartsÚcarriesrá   ÚcarryrM   rq  rN   Ú_split
  s    rv  c                 C   sÀ   t | |||ƒ\}}d}d}tt|ƒƒD ]}||d  ||  dkr-|| |kr-|}|| }q|dkr6tdƒ‚|| ||d   d d }	| |	 }
t ||
¡}tj|d|… |
||d… f }|S )z Insert a new knot given reduals.i›ÿÿÿg}Ã”%­I²Ôr&   z5Internal error, please report it to SciPy developers.r1   N)rv  rº   r  rA   rC   r€  r˜   )rg   r*   r,   rr  rs  r¯  Úidx_maxÚ	fpart_maxrá   Úidx_newknotÚnew_knotÚidx_tÚt_newrM   rM   rN   Ú	_add_knot  s   $€ r}  c                   @   s¢   e Zd Zdd„ Zej dg d¢¡dd„ ƒZdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zej dg d¢¡ej dg d¢¡dd„ ƒƒZejjdd„ ƒZdS )ÚTestGenerateKnotsc                 C   sð   t jdtd�}|d dd|   }d}t  dg|d  dg|d   ¡}t||||d�}||ƒ| d	 }d
dlm} | ||||¡}t||||ƒ}	t	||	dd� t||||d�}
|
|ƒ| d	 }| ||||¡}t||||ƒ}t	||dd� d S )Nr®   r=   r3   r(   r&   r5   rC  )r,   r*   r1   r   ©Ú_fitpack_reprorP   re   )
rC   rG   r  rþ   r
   r6  r€  Úadd_knotr}  r   )rJ   rg   r‡   r,   r*   rÿ   rr  Ú_frÚnew_tÚnew_t_pyÚspl2Ú
residuals2Únew_t2Ú	new_t2_pyrM   rM   rN   Útest_split_add_knot6  s   "z%TestGenerateKnots.test_split_add_knotr,   rs  c                 C   sb   t jdt jd�}t  |t j d ¡}tt|||dd�ƒd }t|||dd�d }t||dd� d S )Nr®   r=   r   ©r,   r‰  r/   rP   re   )	rC   rG   rH   rD  rd  r  r   r   r   )rJ   r,   rg   r‡   r*   rc  rM   rM   rN   Útest_s0N  s
   zTestGenerateKnots.test_s0c                 C   óF   d}t  |¡}|d }tt||ddd�ƒ}t|d t|dƒdd� d S )NrZ   r3   r   rŠ  r/   rP   re   ©rC   rG   r  r   r   r   ©rJ   rK   rg   r‡   ÚknotsrM   rM   rN   Ú	test_s0_1W  s
   
zTestGenerateKnots.test_s0_1c                 C   rŒ  )Nr‚   r3   r   rŠ  r/   rP   re   r�  rŽ  rM   rM   rN   Útest_s0_n20_  s
   
zTestGenerateKnots.test_s0_n20c              	   C   sV   t  d¡}|d }ttƒ� tt||dddd�ƒ W d   ƒ d S 1 s$w   Y  d S )NrZ   r3   r   ©r,   r‰  Únest)rC   rG   r?   rA   r  r   ©rJ   rg   r‡   rM   rM   rN   Útest_s0_nestf  s
   

"ÿzTestGenerateKnots.test_s0_nestc           	      C   sº   t  d¡}t  |t j d ¡}d}tt|||dd�ƒ}g d¢g d¢g d¢g d¢g d	¢g}t|ƒt|ƒks6J ‚t||ƒD ]\}}t||d
d� q;t	|||dd�\}}}t|d |d
d� dS )aY  
        To generate the `wanted` list below apply the following diff and rerun
        the test. The stdout will contain successive iterations of the `t`
        array.

$ git diff scipy/interpolate/fitpack/fpcurf.f
diff --git a/scipy/interpolate/fitpack/fpcurf.f b/scipy/interpolate/fitpack/fpcurf.f
index 1afb1900f1..d817e51ad8 100644
--- a/scipy/interpolate/fitpack/fpcurf.f
+++ b/scipy/interpolate/fitpack/fpcurf.f
@@ -216,6 +216,9 @@ c  t(j+k) <= x(i) <= t(j+k+1) and store it in fpint(j),j=1,2,...nrint.
         do 190 l=1,nplus
 c  add a new knot.
           call fpknot(x,m,t,n,fpint,nrdata,nrint,nest,1)
+          print*, l, nest, ': ', t
+          print*, "n, nmax = ", n, nmax
+
 c  if n=nmax we locate the knots as for interpolation.
           if(n.eq.nmax) go to 10
 c  test whether we cannot further increase the number of knots.
        r®   r3   r    rŠ  )r5   r5   r5   r5   rC  rC  rC  rC  )	r5   r5   r5   r5   r8   rC  rC  rC  rC  ©
r5   r5   r5   r5   r6   r8   rC  rC  rC  rC  )r5   r5   r5   r5   r6   r8   r\  rC  rC  rC  rC  )r5   r5   r5   r5   r6   r7   r8   r   rŽ   rC  rC  rC  rP   re   r/   N)
rC   rG   rD  rd  r  r   r  r  r   r   )	rJ   rg   r‡   r,   r�  Úwantedr*   rc  r£   rM   rM   rN   Útest_s_switchm  s   
üzTestGenerateKnots.test_s_switchc                 C   s(   t tdƒƒ}t||ddd�}t|ƒ d S )Nr®   rY  r&   )r‰  r,   )r  rº   r   Únext)rJ   rg   ÚgenrM   rM   rN   r  ˜  s   z!TestGenerateKnots.test_list_inputc                 C   s�   t  d¡}t  |t j d ¡}d}tt||d|dd�ƒ}t|d g d¢dd	� ttƒ� tt||dd
d�ƒ W d   ƒ d S 1 sAw   Y  d S )Nr®   r    r3   rZ   r’  r/   r–  rP   re   r4   )r,   r“  )	rC   rG   rD  rd  r  r   r   r?   rA   )rJ   rg   r‡   r‰  r�  rM   rM   rN   Ú	test_nestž  s   
ÿ
"þzTestGenerateKnots.test_nestc                 C   s¦   t  d¡}t  |t j d ¡}ttƒ� tt||t  d¡d�ƒ W d   ƒ n1 s*w   Y  ttƒ� tt||t  d¡ d�ƒ W d   ƒ d S 1 sLw   Y  d S )Nr®   r<   ©rA  )	rC   rG   rD  rd  r?   rA   r  r   rm  r”  rM   rM   rN   rC  ¬  s   

ÿ
"ÿzTestGenerateKnots.test_weightsÚnpts)rf  rc   r‰   r‰  )rY  g{®Gáz„?r   c           	      C   sŒ   t j d¡}dt  |j|d�¡ }t  |t j d ¡t  |d d  ¡ }d}t||||d�d }t	t
||||d�ƒd	 }t||d
d� d S )NrQ  rZ   r�   r�   r1   r3   rŠ  r   r/   rP   re   )rC   rI   r„   r…   rV  rD  rd  Úexpr   r  r   r   )	rJ   r‰  r�  rS  rg   r‡   r,   r*   rc  rM   rM   rN   Útest_vs_splrep¶  s   	(z TestGenerateKnots.test_vs_splrepc                 C   s�   d}t  |¡}|d }tt||ddd�ƒ}tƒ �}| t¡}t||ddd�}t|ƒdks.J ‚W d   ƒ n1 s8w   Y  t	|d |d ƒ d S )Né   r3   ç¸ÔJzî�5rŠ  r&   r/   r   )
rC   rG   r  r   r   ÚrecordÚRuntimeWarningr   r  r   )rJ   rK   rg   r‡   r�  Úsupr  rV   rM   rM   rN   Útest_s_too_smallÉ  s   

ýz"TestGenerateKnots.test_s_too_smallN)rí   rî   rï   r‰  rW   r=  r>  r‹  r�  r‘  r•  r˜  r  r›  rC  rŸ  r?  r¥  rM   rM   rM   rN   r~  5  s     
+
r~  c           
      C   s*  | j d }| || d  | |  }|d|  d }| |d || d … }t |d¡}|ddd…  d7  < |ddd…  d8  < t| t || d ¡|ƒ||d�}tj|d |j d ftd�}td|j d dƒD ]}	||	dd…f ||	d dd…f  ||	d dd…f< qi||| | t 	|¡ 9 }|S )z­Straitforward way to compute the discontinuity matrix. For testing ONLY.

    This routine returns a dense matrix, while `_fitpack_repro.disc` returns
    a packed one.
    r   r&   r1   Nrž   r¸   r=   )
r“   rC   r]  r   r  Úemptyr  rº   ÚmathÚ	factorial)
r*   r,   rK   ÚdeltaÚnrintr¼  ÚtiirO  Úmatrrá   rM   rM   rN   Ú
disc_naiveÙ  s   
"6r­  c                   @   s"   e Zd ZdZddd„Zdd„ ZdS )ÚF_densezm The r.h.s. of ``f(p) = s``, an analog of _fitpack_repro.F
    Uses full matrices, so is for tests only.
    Nc           
      C   sâ   || _ || _|| _|| _|d u rtj|td�n|| _| jjdks"J ‚t	|t 
|jd | d ¡|ƒ|ƒ}|| jd d …d f  | _ddlm} t| ||¡Ž  ¡ | _|jdksXJ ‚|| j }	tj|	t | jjd ¡f | _|| _d S )Nr=   r&   r   r  )rg   r‡   r*   r,   rC   r]   r  rA  rê   r   r  r“   Úa_denser6  r€  ra  Údiscrh  Úb_denser˜   rÆ  r¬   r‰  )
rJ   rg   r‡   r*   r,   r‰  rA  r¯  r‚  r¬   rM   rM   rN   rc  ö  s   $

zF_dense.__init__c                 C   s²   t  | j| j| f¡}ddlm}m} ||dd�\}}|j| j }|j	d }||d |…d |…f |d |… ƒ}	t
| j|	| jƒ}
t  | jd |
| jƒ| j d  ¡}|
| _|| j S )Nr   )r7  r%  Úeconomic)r1  r&   r1   )rC   rH  r¯  r±  Úscipy.linalgr7  r%  r2  r¬   r“   r   r*   r,   r�  rA  rg   r‡   rÿ   r‰  )rJ   ræ   Úabr7  r%  rƒ  r  Úqyrb  r+   rÿ   ÚfprM   rM   rN   rÊ    s   
"$
zF_dense.__call__r}  )rí   rî   rï   ri  rc  rÊ  rM   rM   rM   rN   r®  ò  s    
r®  c                   @   st   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zejjdd„ ƒZdd„ Zdd„ ZdS )ÚTestMakeSplrepc                 C   s2  t  ddd¡}t  ddd¡}ttƒ� t||ƒ W d   ƒ n1 s"w   Y  ttƒ� tdddd� W d   ƒ n1 s=w   Y  ttƒ� t  |jdddf¡}t||dd� W d   ƒ n1 sbw   Y  t  d¡}ttƒ� t||d	 |dd
� W d   ƒ n1 s…w   Y  t  d¡ }ttƒ� t||d	 |dd
� W d   ƒ n1 s©w   Y  t  |jd df¡}ttƒ� t||d	 |dd
� W d   ƒ n1 sÑw   Y  ttƒ� t|d d d… |d	 dd� W d   ƒ n1 sów   Y  ttƒ� t||d	 ddd� W d   ƒ n	1 �sw   Y  ttƒ� t||d	 dd� W d   ƒ n	1 �s0w   Y  ttƒ� t||d	 d	ddd� W d   ƒ n	1 �sPw   Y  ttƒ� t||d	 ddd� W d   ƒ n	1 �sow   Y  ttƒ� tt  	d¡t  	d¡dd� W d   ƒ d S 1 �s’w   Y  d S )Nr   rZ   r<   rX  r&   r1   rY  ©r‰  r3   )rA  r‰  r/   r:   rŠ  )r,   r“  r‰  )r‰  r“  r®   é	   )
rC   r\   r?   rA   r   rm  r�   r“   r@   rG   )rJ   rg   r‡   rA  rM   rM   rN   Útest_input_errors!  sT   
þ
þ
ý

þ
þ
þ
þ
þ
þ
þ
þ
$þz TestMakeSplrep.test_input_errorsc                 C   sd   t  ddd¡}t  |d d ¡d }d}d}t  dg|d  d	d
g dg|d   ¡}|||||fS )Nr   r’   r<   g…ëQ¸	@r1   r3   g€Ÿqá@H&?r&   r:   r8   )rC   r\   rD  rþ   )rJ   rg   r‡   r,   r‰  rc  rM   rM   rN   Ú	_get_xyktX  s   *zTestMakeSplrep._get_xyktc           
      C   sn   ddl m} |  ¡ \}}}}}|||d d …d f |||ƒ}t|||||ƒ}dD ]}	t||	ƒ||	ƒdd� q'd S )Nr   ©ÚF©r&   rZ   r‰   rP   re   )Ú scipy.interpolate._fitpack_repror½  r»  r®  r   )
rJ   r½  rg   r‡   r,   r‰  r*   ÚfÚf_dræ   rM   rM   rN   Útest_fitpack_Fa  s   ÿzTestMakeSplrep.test_fitpack_Fc                 C   s¶   ddl m} |  ¡ \}}}}}tj|jd td�}|||d d …d f ||||d�}t||||||d�}	t|||||ƒ}
dD ]}t||ƒ|	|ƒdd� tj	|
|ƒ|	|ƒdd�rXJ ‚q=d S )Nr   r¼  r=   rœ  r¾  rP   re   )
r¿  r½  r»  rC   rG   r“   r  r®  r   r¾   )rJ   r½  rg   r‡   r,   r‰  r*   rA  ÚfwÚfw_drÁ  ræ   rM   rM   rN   Útest_fitpack_F_with_weightsk  s    þz*TestMakeSplrep.test_fitpack_F_with_weightsc              
   C   s¨   dd l m  m} tj d¡}tjddddt |jdd�¡d ddddf	 }t	|ƒd}}t
| ||¡Ž  ¡ }t||ƒ}|jd |d|  d ksKJ ‚t||dd	� d S )
Nr   rQ  rŽ   r�   r’   r3   r1   rP   re   )r¿  Úinterpolater€  rC   rI   rU  r˜   r…   rV  r  ra  r°  rh  r­  r“   r   )rJ   r‚  r†   r*   rK   r,   ÚDÚD_denserM   rM   rN   Útest_disc_matrixz  s   .
zTestMakeSplrep.test_disc_matrixc           	      C   s’   |   ¡ \}}}}}t dg|d  ddg dg|d   ¡}t||||d�\}}}t||kƒs1J ‚t||||d�}t|d |jj… |jdd� d S )	Nr   r&   r:   r8   r’   rŠ  rP   re   )	r»  rC   rþ   r   rª   r   r   r+   r�   )	rJ   rg   r‡   r,   r‰  rc  r*   r+   rÿ   rM   rM   rN   Útest_simple_vs_splrepˆ  s   * z$TestMakeSplrep.test_simple_vs_splrepc           	      C   s„   |   ¡ \}}}}}tt||||d�ƒd }t||||d�}t|||||d�}t|j|jdd� t|j|jdd� |j|jks@J ‚d S )NrŠ  r/   )r*   r,   r‰  rP   re   )r»  r  r   r   r   r*   r+   r,   )	rJ   rg   r‡   r,   r‰  r£   r*   Úspl_autoÚspl_trM   rM   rN   Útest_with_knots’  s   zTestMakeSplrep.test_with_knotsc                 C   sJ   d}t  |¡}|d }d}t|||dd�}|jjd d|d  ks#J ‚d S )NrZ   r3   r&   rŠ  r   r1   )rC   rG   r   r*   r“   )rJ   rK   rg   r‡   r,   rÿ   rM   rM   rN   Útest_no_internal_knotsž  s   
 z%TestMakeSplrep.test_no_internal_knotsc                 C   sH   d}t  |¡}|d }t||dd�}t||dd�}t|j|jdd� d S )NrZ   r3   rÑ   rP   re   )rC   rG   r   r	   r   r+   )rJ   rK   rg   r‡   rÿ   Úspl_irM   rM   rN   Útest_default_s§  s   
zTestMakeSplrep.test_default_sc                 C   s¶   d}t  |¡}|d }tƒ �C}| t¡}t||ddd�}t||ddd�}t|ƒdks,J ‚t|j	|d ƒ t
t j|jdg|jd  f |d dd	� W d   ƒ d S 1 sTw   Y  d S )
Nr   r3   r¡  rŠ  r1   r   r&   r{  re   )rC   rG   r   r¢  r£  r   r   r  r   r*   r   r˜   r+   r,   )rJ   rK   rg   r‡   r¤  r  rV   rÿ   rM   rM   rN   r¥  °  s   

ÿ"úzTestMakeSplrep.test_s_too_smallc                 C   sˆ   d\}}t  |¡}|d }t|||d�}t|||dd�}|jjdks$J ‚|jjdks,J ‚t||dd|   |dd�}|jjdksBJ ‚d S )N©rZ   r3   r3   rÑ   çñhãˆµøä>rŠ  r&   )rC   rG   r   r+   rê   )rJ   rK   r,   rg   r‡   rÿ   rH  r^  rM   rM   rN   Ú
test_shapeÀ  s   
zTestMakeSplrep.test_shapec                 C   s–   d\}}t  |¡}|d }t||ddd�}t||ddd�}|jjdks%J ‚|jjdks-J ‚|jjd || d ks;J ‚|jjd d|d  ksIJ ‚d S )NrÑ  r3   r   rŠ  r&   r1   )rC   rG   r   r+   rê   r*   r“   )rJ   rK   r,   rg   r‡   r  rH  rM   rM   rN   Útest_s0_vs_notÐ  s   
 zTestMakeSplrep.test_s0_vs_notN)rí   rî   rï   rº  r»  rÂ  rÅ  rÉ  rÊ  rÍ  rÎ  rÐ  rW   r=  r?  r¥  rÓ  rÔ  rM   rM   rM   rN   r·     s    7	

		
r·  c                   @   sb   e Zd Zddd„Zej dg d¢¡dd„ ƒZej dg d¢¡d	d
„ ƒZdd„ Z	dd„ Z
dd„ ZdS )ÚTestMakeSplpreprZ   r3   c                 C   s2   t  |¡t j | }t  |¡t  |¡g}|||fS r}  )rC   rG   rd  rD  rF  )rJ   rO  r,   rg   r‡   rM   rM   rN   Ú_get_xyká  s   
zTestMakeSplprep._get_xykr‰  ©r   rY  gü©ñÒMbP?rÒ  c                 C   sØ   d\}}t  |¡t j | }t  |¡t  |¡g}dddddœ}t||d�\\}}}}	t||d�\}
}t||	dd	� t|
j|dd	� t	|ƒ|| ksKJ ‚t  
|¡j}t|
j|dd	� t|
|ƒt|||d
d�|ƒdd	� d S )NrÑ  r   r®   r¹  rZ   r×  r¸  rP   re   r&   rõ   )rC   rG   rd  rD  rF  r   r   r   r*   r  rl   r2  r+   r   )rJ   r‰  rO  r,   rg   r‡   Ú	num_knotsr*   r+   Úu_rÿ   r°  rË   rM   rM   rN   Útest_simple_vs_splprepæ  s   
ÿz&TestMakeSplprep.test_simple_vs_splprepc                 C   s"  |   ¡ \}}}t|tƒsJ ‚t |¡d dksJ ‚t||d�\}}tt |¡|d�\}}t|||d� t|d |d dd� t|d ƒt|d ƒksLJ ‚t	|d |d ƒD ]\}}	t||	dd� qU|d |d kskJ ‚t t
||ƒ¡t |¡kszJ ‚t||d�\}
}t||dd� t|
j|d dd� t|
jj|d dd� |
j|d ks§J ‚|
|ƒjt |¡ks³J ‚tt |¡|d�\}
}t||dd� t|
j|d dd� t|
jj|d dd� |
j|d ksãJ ‚|
|ƒjt |¡ksïJ ‚ttƒ� tt |¡j|d� W d   ƒ d S 1 �s
w   Y  d S )Nr   r1   r¸  re   rP   r&   )rÖ  rè   r  rC   r“   r   rl   r   r  r  r   r   r*   r+   r2  r,   r?   rA   )rJ   r‰  r£   r‡   rV   r°  Útck_aÚu_ar{  r|  rÿ   rM   rM   rN   Útest_array_not_list  s6   
$ÿz#TestMakeSplprep.test_array_not_listc                 C   s4   | j dd�\}}}t|ƒ\}}t||ƒ|dd� d S )NrZ   rN  rP   re   )rÖ  r   r   )rJ   rg   r‡   r,   rÿ   r°  rM   rM   rN   Útest_default_s_is_zero'  s   z&TestMakeSplprep.test_default_s_is_zeroc                 C   sŒ   | j dd�\}}}t|dd�\}}t|dd�\}}t||dd� t||ƒ|dd� t||ƒ|dd� |j|jks:J ‚|jj|jjksDJ ‚d S )NrZ   rN  r   r¸  rP   re   r    )rÖ  r   r   ró   r+   r“   )rJ   rg   r‡   r,   rÏ  Úu_iÚspl_nÚu_nrM   rM   rN   Útest_s_zero_vs_near_zero-  s   z(TestMakeSplprep.test_s_zero_vs_near_zeroc                 C   sô   t jdtd�}ttƒ� t|ƒ W d   ƒ n1 sw   Y  ttƒ� t|dd� W d   ƒ n1 s4w   Y  ttƒ� t|dd� W d   ƒ n1 sNw   Y  t|gdd�\}}t|gdd�\}}||ƒjdksnJ ‚t||ƒ|gdd	� d S )
Nr®   r=   r   r¸  rY  rÒ  )r&   r®   rP   re   )	rC   rG   r  r?   rA   r   r   r“   r   )rJ   rg   rV   rÙ  rÿ   r°  rM   rM   rN   rÐ  :  s   

ÿ
ÿ
ÿzTestMakeSplprep.test_1DNrÑ  )rí   rî   rï   rÖ  rW   r=  r>  rÚ  rÝ  rÞ  râ  rÐ  rM   rM   rM   rN   rÕ  à  s    


"rÕ  r¦  )r–  r3   rË  r¾  )gr“  r¹  rÂ  r§  r2  ÚnumpyrC   Únumpy.testingr   Úscipy._lib._array_apir   r   rW   r   r?   r6  r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r³  r$  r,  Úscipy.sparse.linalgÚsparser<  Úscipy.interpolate._bsplinesr   r   r   r   r   r   r   r   Úscipy.interpolate._fitpack_implrÆ  Ú_fitpack_implrà   Úscipy._lib._utilr   Úscipy._lib._testutilsr    Úscipy.interpolate._ndbspliner!   r"   r_  r#   r[  r$   r%   r@  rv  ry  rs   ry   rÇ   rf   rÅ   rU   ru  rž  rÔ  r  r4  r=  r>  r`  r8  ra  rv  rm  rx  ry  r™  rš  r¶  rð   r  r¸  rÌ  r4  rZ  rv  r}  r~  r­  r®  r·  rÕ  rM   rM   rM   rN   Ú<module>   sœ    L     	
	
 c   C
 =
,g =   M  ' %. A