U
    e»{j¡Ñ  ã                   @   s  d Z ddlm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mZmZmZ ddlmZ ddlmZmZmZ ddlmZ dd	lmZ d
ZdZej d¡ ej e¡Z dddgZ!ej "e¡Z#dddddgZ$de gZ%ddgZ&G dd„ dƒZ'ej(j)e dd�G dd„ dƒƒZ*dS )z#Tests for spline models and fittersé    N)Úassert_allclose)ÚFittableModelÚModelDefinitionError)ÚSplineExactKnotsFitterÚSplineInterpolateFitterÚSplineSmoothingFitterÚSplineSplrepFitter)Ú	Parameter)ÚSpline1DÚ_SplineÚ_SplineFitter)Ú	HAS_SCIPY)ÚAstropyUserWarningé2   é
   é*   éÿÿÿÿé   é   é   é   é   g{®Gáz„?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S )Ú
TestSplinec                 C   sL   d| _ dd„ t| j ƒD ƒ| _dd„ t| j ƒD ƒ| _G dd„ dtƒ}|| _d S )Nr   c                 S   s   i | ]}d |› �t  ¡ “qS ©Útest©ÚmkÚ	MagicMock©Ú.0Úi© r!   úa/var/www/html/bwave/python/venv/lib/python3.8/site-packages/astropy/modeling/tests/test_spline.pyÚ
<dictcomp>%   s      z*TestSpline.setup_class.<locals>.<dictcomp>c                 S   s   i | ]}d |› �t  ¡ “qS )Únewr   r   r!   r!   r"   r#   &   s      c                       s2   e Zd ZddiZ‡ fdd„Zd‡ fdd„	Z‡  ZS )z&TestSpline.setup_class.<locals>.Spliner   c                    s   t ƒ  ¡  d S ©N)ÚsuperÚ_init_parameters©Úself©Ú	__class__r!   r"   r'   +   s    z7TestSpline.setup_class.<locals>.Spline._init_parametersNc                    s   t ƒ j|||d� d S )N©Úbounds)r&   Ú
_init_data)r)   ÚknotsÚcoeffsr-   r*   r!   r"   r.   .   s    z1TestSpline.setup_class.<locals>.Spline._init_data)N)Ú__name__Ú
__module__Ú__qualname__Úoptional_inputsr'   r.   Ú__classcell__r!   r!   r*   r"   ÚSpline(   s   r6   )Znum_optÚranger4   Úextra_kwargsr   r6   )r)   r6   r!   r!   r"   Úsetup_class#   s
    	zTestSpline.setup_classc              	   C   sP  |   ¡ }|jd kst‚|jd ks$t‚|jdks2t‚|jd ks@t‚|jd ksNt‚t|dƒr\t‚tj	j
tddd��ª}|   ¡ }|jg ks†t‚t ¡ }t ¡ }t ¡ }| j |||d�}|jt ||||¡gksÊt‚|jd ksØt‚|jd ksæt‚|jdksôt‚|jd k�st‚|jd k�st‚W 5 Q R X d}tjt|d�� | j t ¡ d	� W 5 Q R X d S )
NFÚdegreeÚ_init_splineT©Úautospec)r/   r0   r-   z;If one passes a coeffs vector one needs to also pass knots!©Úmatch)r0   )r6   Ú_tÚAssertionErrorÚ_cÚ_user_knotsÚ_degreeÚ_testÚhasattrr   ÚpatchÚobjectr   Úcall_args_listr   ÚcallÚpytestÚraisesÚ
ValueError)r)   ÚsplZmkInitr/   r0   r-   ÚMESSAGEr!   r!   r"   Útest___init__3   s.    zTestSpline.test___init__c                 C   sr   |   ¡ }|jdkst‚tdd„ tdƒD ƒƒ}||_|j|ks@t‚tdd„ tdƒD ƒƒ}||_|j|| ksnt‚d S )Nr!   c                 s   s   | ]}t  ¡ V  qd S r%   r   ©r   Ú_r!   r!   r"   Ú	<genexpr>Z   s     z.TestSpline.test_param_names.<locals>.<genexpr>r   c                 s   s   | ]}t  ¡ V  qd S r%   r   rQ   r!   r!   r"   rS   ^   s     )r6   Úparam_namesrA   Útupler7   Ú_knot_namesÚ_coeff_names)r)   rN   Ú
knot_namesÚcoeff_namesr!   r!   r"   Útest_param_namesU   s    zTestSpline.test_param_namesc                 C   s   |   ¡ }| d¡dkst‚d S )Nr   rE   )r6   Ú_optional_argrA   ©r)   rN   r!   r!   r"   Útest__optional_argb   s    zTestSpline.test__optional_argc              	      sx   G ‡ fdd„dˆ j ƒ}|ƒ }ˆ jD ].}| |¡}t||ƒs>t‚t||ƒd ks"t‚q"tjtdd�� | 	¡  W 5 Q R X d S )Nc                       s   e Zd Z” jZdd„ ZdS )z7TestSpline.test__create_optional_inputs.<locals>.Splinec                 S   s   |   ¡  d S r%   ©Ú_create_optional_inputsr(   r!   r!   r"   Ú__init__j   s    z@TestSpline.test__create_optional_inputs.<locals>.Spline.__init__N©r1   r2   r3   r4   r`   r!   r(   r!   r"   r6   g   s   r6   z2Optional argument .* already exists in this class!r>   )
r6   r4   r[   rF   rA   ÚgetattrrK   rL   rM   r_   )r)   r6   rN   ÚargÚ	attributer!   r(   r"   Útest__create_optional_inputsf   s    

 ÿz'TestSpline.test__create_optional_inputsc              	      sD  G ‡ fdd„dˆ j ƒ}|ƒ }|jf ˆ jŽ}ˆ j ¡ D ]$\}}| |¡}t||ƒd ks4t‚q4|ˆ jksht‚ˆ j ¡ }ˆ jD ]}t	 
¡ ||< qx|jf |Ž}ˆ j ¡ D ]X\}}| |¡}t||ƒd k	sÄt‚t||ƒ|| ksÚt‚t||ƒ|ksìt‚||ks t‚q |ˆ jk�s
t‚|ˆ jk�st‚tjtdd�� |jf |Ž W 5 Q R X d S )Nc                       s   e Zd Z” jZdd„ ZdS )z:TestSpline.test__intercept_optional_inputs.<locals>.Splinec                 S   s   |   ¡  d S r%   r^   r(   r!   r!   r"   r`   |   s    zCTestSpline.test__intercept_optional_inputs.<locals>.Spline.__init__Nra   r!   r(   r!   r"   r6   y   s   r6   z2.* has already been set, something has gone wrong!r>   )r6   Ú_intercept_optional_inputsr8   r4   Úitemsr[   rb   rA   Úcopyr   r   rK   rL   ÚRuntimeError)r)   r6   rN   Ú
new_kwargsrc   Úvaluerd   Úkwargsr!   r(   r"   Útest__intercept_optional_inputsx   s0    



 ÿz*TestSpline.test__intercept_optional_inputsc           	         s‚  G ‡ fdd„dˆ j ƒ}|ƒ }|jf ˆ jŽ}ˆ j ¡ D ]\}}|| |ks4t‚q4ˆ j ¡ D ]\}}|| |ksXt‚qXt|ƒtˆ jƒtˆ jƒ ks’t‚ˆ j ¡ }ˆ jD ]}t 	¡ ||< q¢|j
f |Ž |jf ˆ jŽ}||ksÚt‚ˆ jD ] }| |¡}t||ƒd ksàt‚qàˆ j ¡ }ˆ jD ]}t 	¡ ||< �q|j
f |Ž ˆ j ¡ }ˆ jD ]}t 	¡ ||< �qB||k�sdt‚|jf |Ž}||k�s~t‚d S )Nc                       s   e Zd Z” jZdS )z(TestSpline.test_evaluate.<locals>.SplineN)r1   r2   r3   r4   r!   r(   r!   r"   r6   ™   s   r6   )r6   Úevaluater8   r4   rg   rA   Úlenrh   r   r   rf   r[   rb   )	r)   r6   rN   rj   rc   rk   rl   rd   Z
set_kwargsr!   r(   r"   Útest_evaluate˜   s6     







zTestSpline.test_evaluatec              
   C   sÐ   |   ¡ }tdd„ tdƒD ƒƒ}dd„ tdƒD ƒ}dd„ tdƒD ƒ}tjjtdd|d	��p}tjjtd
dd��R}|j|||Žks€t	‚|j
tj|f|ž|Žgksžt	‚|j
tj|f|Žgks¸t	‚W 5 Q R X W 5 Q R X d S )Nc                 s   s   | ]}t  ¡ V  qd S r%   r   rQ   r!   r!   r"   rS   À   s     z+TestSpline.test___call__.<locals>.<genexpr>r   c                 S   s   i | ]}d |› �t  ¡ “qS r   r   ©r   Úidxr!   r!   r"   r#   Á   s      z,TestSpline.test___call__.<locals>.<dictcomp>c                 S   s   i | ]}d |› �t  ¡ “qS ©Znew_testr   rq   r!   r!   r"   r#   Â   s      rf   T©r=   Úreturn_valueÚ__call__r<   )r6   rU   r7   r   rG   rH   r   r   ru   rA   rI   rJ   )r)   rN   Úargsrl   rj   ZmkInterceptZmkCallr!   r!   r"   Útest___call__½   s    üzTestSpline.test___call__c           	         s   t j d¡ t j d¡}| ¡ ‰| ¡ ‰ G ‡ ‡fdd„d| jƒ}|ƒ }|jˆk ¡ sXt‚|jˆ k ¡ sjt‚t	dƒD �]}d|› �}| 
||d¡ t||ƒsžt‚t||ƒ}t|tƒs¶t‚|j|ksÄt‚|jdksÒt‚|jˆ|   k�r|j|   k�r|| k�sn t‚t j ¡ }||_|j| |k�s0t‚|j| || k�sHt‚t j ¡ }||j|< |j|k�slt‚|j|ksrt‚qrt	dƒD �]}d|› �}| 
||d	d
¡ t||ƒ�s´t‚t||ƒ}t|tƒ�sÎt‚|j|k�sÞt‚|jd
k�sît‚|jˆ |   k�r"|j|   k�r"|| k�s(n t‚t j ¡ }||_|j| |k�sLt‚|j| || k�sdt‚t j ¡ }||j|< |j|k�sˆt‚|j|k�s„t‚�q„d S )Né%   é   c                       s,   e Zd Ze‡fdd„ƒZe‡ fdd„ƒZdS )z1TestSpline.test__create_parameter.<locals>.Splinec                    s   ˆ S r%   r!   r(   r   r!   r"   r   Õ   s    z6TestSpline.test__create_parameter.<locals>.Spline.testc                    s   ˆ S r%   r!   r(   )Ú
fixed_testr!   r"   r{   Ù   s    z<TestSpline.test__create_parameter.<locals>.Spline.fixed_testN)r1   r2   r3   Úpropertyr   r{   r!   ©r{   r   r!   r"   r6   Ô   s   r6   Z	test_namer   FZfixed_test_namer{   T)ÚnpÚrandomÚseedrh   r6   r   ÚallrA   r{   r7   Ú_create_parameterrF   rb   Ú
isinstancer	   ÚmodelÚfixedrk   )	r)   Zbase_vecr6   rN   ÚindexÚnameÚparamZnew_setZnew_getr!   r}   r"   Útest__create_parameterÎ   s`    	

:




þ
ý
ü


z!TestSpline.test__create_parameterc              	      s¬   t j d¡ t j d¡‰G ‡fdd„d| jƒ}|ƒ ‰t ¡ ‰ tjjtddd��T}ˆ 	dd	ˆ ¡}|t
d
d„ tdƒD ƒƒks|t‚|j‡ ‡fdd„tdƒD ƒksžt‚W 5 Q R X d S )Nry   rz   c                       s   e Zd Ze‡ fdd„ƒZdS )z2TestSpline.test__create_parameters.<locals>.Splinec                    s   ˆ S r%   r!   r(   r   r!   r"   r     s    z7TestSpline.test__create_parameters.<locals>.Spline.testN)r1   r2   r3   r|   r   r!   r   r!   r"   r6     s   r6   r‚   Tr<   Ú
test_paramr   c                 s   s   | ]}d |› �V  qdS )rŠ   Nr!   rq   r!   r!   r"   rS     s     z5TestSpline.test__create_parameters.<locals>.<genexpr>c              	      s$   g | ]}t  ˆd |› �|dˆ ¡‘qS )rŠ   r   )r   rJ   rq   )r…   rN   r!   r"   Ú
<listcomp>  s   ÿz6TestSpline.test__create_parameters.<locals>.<listcomp>)r~   r   r€   r6   r   r   rG   rH   r   Ú_create_parametersrU   r7   rA   rI   )r)   r6   ÚmkCreateÚparamsr!   )r…   rN   r   r"   Útest__create_parameters
  s    þz"TestSpline.test__create_parametersc              	   C   s2   |   ¡ }d}tjt|d�� | ¡  W 5 Q R X d S ©NzThis needs to be implementedr>   )r6   rK   rL   ÚNotImplementedErrorr'   ©r)   rN   rO   r!   r!   r"   Útest__init_parameters  s    z TestSpline.test__init_parametersc              	   C   sr   |   ¡ }d}tjt|d��  | t ¡ t ¡ t ¡ ¡ W 5 Q R X tjt|d�� | t ¡ t ¡ ¡ W 5 Q R X d S r�   )r6   rK   rL   r‘   r.   r   r   r’   r!   r!   r"   Útest__init_data%  s    $zTestSpline.test__init_datac              
   C   s¸   |   ¡ }t ¡ }t ¡ }t ¡ }tjjtddd��|}tjjtddd��^}t ¡ }| |d¡ | |d¡ | |||¡ |jtj	j
||||d�tj	 |¡gks t‚W 5 Q R X W 5 Q R X d S )Nr'   Tr<   r.   Ú
parametersÚdatar,   )r6   r   r   rG   rH   r   Úattach_mockr;   Ú
mock_callsrJ   r–   r•   rA   )r)   rN   r/   r0   r-   ZmkParametersZmkDataÚmainr!   r!   r"   Útest__init_spline/  s&      ÿ
þzTestSpline.test__init_splinec                 C   sl   |   ¡ }|jd kst‚|jd ks$t‚|jd ks2t‚| j dd�}|jd ksLt‚|jd ksZt‚|jdksht‚d S )Nr   ©r:   )r6   rB   rA   r@   rD   r\   r!   r!   r"   Útest__init_tckC  s    zTestSpline.test__init_tckN)r1   r2   r3   r9   rP   rZ   r]   re   rm   rp   rx   r‰   r�   r“   r”   rš   rœ   r!   r!   r!   r"   r   "   s   " %<
r   zrequires scipy)Úreasonc                   @   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d;d<„ Z d=d>„ Z!e"d?d@„ ƒZ#dAdB„ Z$dCdD„ Z%dEdF„ Z&e'j( )dGe*¡e'j( )dHe+¡dIdJ„ ƒƒZ,e'j( )dGe*¡e'j( )dHe+¡e'j( )dKe-¡dLdM„ ƒƒƒZ.e'j( )dGe*¡e'j( )dHe+¡dNdO„ ƒƒZ/e'j( )dGe*¡e'j( )dHe+¡e'j( )dKe-¡dPdQ„ ƒƒƒZ0e'j( )dGe*¡e'j( )dHe+¡dRdS„ ƒƒZ1dTdTgdU dTdTdTfdVdW„Z2dXdY„ Z3dZd[„ Z4d\d]„ Z5dTS )^ÚTestSpline1Dc                 C   sž   d	dd„}t  ddt¡| _|| jtƒ| _|| jƒ| _t  | j¡}t j 	|¡ | j| | _
|| j
t| ƒ| _d| _t  dd| j¡| _t  ddt¡dd… | _d S )
Nr   c                 S   s   t  | d  ¡d|  S )Nr   çš™™™™™¹?)r~   Úexp)ÚxÚnoiser!   r!   r"   ÚfuncR  s    z&TestSpline1D.setup_class.<locals>.funcéýÿÿÿr   iè  r   r   )r   )r~   ÚlinspaceÚnptsr¡   r¢   ÚyÚtruthZargsortr   ÚshuffleZx_sZy_sZnpts_outÚxsÚnknotsÚt)r)   r£   Zarg_sortr!   r!   r"   r9   Q  s    
zTestSpline1D.setup_classc           	      C   s¤   ||kst ‚|t| |¡d ƒks&t ‚|› |› �}||ks>t ‚t||ƒsLt ‚t||ƒ}t|tƒsdt ‚|j|ksrt ‚|j||ƒks„t ‚|j	|ks’t ‚|j
|ks t ‚d S ©Nr   )rA   ÚintÚsplitrF   rb   rƒ   r	   r‡   rk   r„   r…   )	r)   rN   Ú	base_namer‡   r†   rk   r…   Z	knot_namerˆ   r!   r!   r"   Úcheck_parameterd  s    
zTestSpline1D.check_parameterc              	   C   s*   t |ƒD ]\}}|  ||||||¡ qd S r%   )Ú	enumerater±   )r)   rN   rŽ   r°   rk   r…   rr   r‡   r!   r!   r"   Úcheck_parametersq  s    zTestSpline1D.check_parametersc                 C   s,   |D ]"}t ||ƒ}||_|j|kst‚qd S r%   )rb   rk   rA   )r)   rN   r/   rk   r‡   rˆ   r!   r!   r"   Úupdate_parametersu  s    
zTestSpline1D.update_parametersc                 C   st   t ƒ }|jdkst‚|jdks"t‚|jd ks0t‚|jd ks>t‚|jd ksLt‚t|jƒdks^t‚t|j	ƒdkspt‚d S )Nr   Fr   )
r
   rD   rA   rC   r@   rB   Ú_nuro   rV   rW   r\   r!   r!   r"   Ú%test___init__with_no_knot_information{  s    z2TestSpline1D.test___init__with_no_knot_informationc                 C   sø   t dd�}|jdkst‚|jdks&t‚|jd ks4t‚t|jƒdksFt‚t d¡}d|dd …< |j|k 	¡ snt‚t|j
ƒdks€t‚|j
t d¡k 	¡ s˜t‚t|jƒdksªt‚t|jƒdks¼t‚dd	„ }|  ||jd
|d¡ dd„ }|  ||jd|d¡ d S )Nr   ©r/   r   Fé   r   éüÿÿÿc                 S   s   | dk rdS dS d S ©Né   r   r   r!   ©rr   r!   r!   r"   Úvalue0œ  s    z>TestSpline1D.test___init__with_number_of_knots.<locals>.value0ÚknotTc                 S   s   dS ©Nr   r!   r¼   r!   r!   r"   Úvalue1¥  s    z>TestSpline1D.test___init__with_number_of_knots.<locals>.value1Úcoeff)r
   rD   rA   rC   rµ   ro   r@   r~   Úzerosr�   rB   rV   rW   r³   )r)   rN   r¬   r½   rÀ   r!   r!   r"   Ú!test___init__with_number_of_knots‡  s     

z.TestSpline1D.test___init__with_number_of_knotsc                    sæ   dt  d¡ d ‰ tˆ d�}|jdks*t‚|jdks8t‚|jd ksFt‚|jˆ k ¡ sXt‚t	|j
ƒdksjt‚|j
t  d¡k ¡ s‚t‚t	|jƒdks”t‚t	|jƒdks¦t‚‡ fdd„}|  ||jd	|d¡ d
d„ }|  ||jd|d¡ d S )Né   rz   é    r·   r   Tc                    s   ˆ |  S r%   r!   r¼   ©r¬   r!   r"   r½   ½  s    z@TestSpline1D.test___init__with_full_custom_knots.<locals>.value0r¾   c                 S   s   dS r¿   r!   r¼   r!   r!   r"   rÀ   Ã  s    z@TestSpline1D.test___init__with_full_custom_knots.<locals>.value1rÁ   F)r~   Úaranger
   rD   rA   rC   rµ   r@   r�   ro   rB   rÂ   rV   rW   r³   ©r)   rN   r½   rÀ   r!   rÆ   r"   Ú#test___init__with_full_custom_knotsª  s    
z0TestSpline1D.test___init__with_full_custom_knotsc                    s  t  dd¡‰ tˆ ddgd�}|jdks*t‚|jdks8t‚|jd ksFt‚t|jƒdksXt‚|jdd	… ˆ k 	¡ srt‚|jd d… dk 	¡ sŒt‚|jd	d … dk 	¡ s¦t‚t|j
ƒdks¸t‚|j
t  d¡k 	¡ sÐt‚‡ fd
d„}|  ||jd|d¡ dd„ }|  ||jd|d¡ d S )Nr   rz   r   )r/   r-   r   Té   r   r¹   c                    s(   | dk rdS | dkrdS ˆ | d  S d S )Nr   r   é   rz   r!   r¼   rÆ   r!   r"   r½   Ú  s
    zDTestSpline1D.test___init__with_interior_custom_knots.<locals>.value0r¾   c                 S   s   dS r¿   r!   r¼   r!   r!   r"   rÀ   å  s    zDTestSpline1D.test___init__with_interior_custom_knots.<locals>.value1rÁ   F)r~   rÇ   r
   rD   rA   rC   rµ   ro   r@   r�   rB   rÂ   r³   rV   rW   rÈ   r!   rÆ   r"   Ú'test___init__with_interior_custom_knotsÈ  s    z4TestSpline1D.test___init__with_interior_custom_knotsc                    sô   dt  d¡ d ‰t  ddd¡‰ tˆˆ d�}|jdks:t‚|jdksHt‚|jd ksVt‚|jˆk 	¡ sht‚t
|jƒdkszt‚|jˆ k 	¡ sŒt‚t
|jƒdksžt‚t
|jƒdks°t‚‡fd	d
„}|  ||jd|d¡ ‡ fdd„}|  ||jd|d¡ d S )NrÄ   rz   rÅ   r   r   )r/   r0   r   Tc                    s   ˆ |  S r%   r!   r¼   rÆ   r!   r"   r½   þ  s    zJTestSpline1D.test___init__with_user_knots_and_coefficients.<locals>.value0r¾   c                    s   ˆ |  S r%   r!   r¼   ©Úcr!   r"   rÀ     s    zJTestSpline1D.test___init__with_user_knots_and_coefficients.<locals>.value1rÁ   F)r~   rÇ   r¥   r
   rD   rA   rC   rµ   r@   r�   ro   rB   rV   rW   r³   rÈ   r!   ©rÎ   r¬   r"   Ú-test___init__with_user_knots_and_coefficientsê  s    z:TestSpline1D.test___init__with_user_knots_and_coefficientsc              
   C   s°   d}d|› d�}t jt|d�� t|d� W 5 Q R X d}tdƒD ].}t jt|d�� tt |¡d� W 5 Q R X q@t d¡d d d	… }d
}t jt|d�� t|d� W 5 Q R X d S )Ng      @zKnots: z must be iterable or valuer>   r·   úMust have at least 8 knotsé   rz   r   z'Knots must be in a non-decreasing order)rK   rL   rM   r
   r7   r~   rÇ   )r)   r/   rO   rr   r¬   r!   r!   r"   Útest___init__errors	  s    z TestSpline1D.test___init__errorsc                    s
  t dƒ}dd„ }|  ||jd|d¡ t d¡‰ˆ ¡ |_‡fdd„}|  ||jd|d¡ |  ||jd	¡ |jd d … d	k ¡ s‚t	‚d
d„ }|  ||j
d|d¡ dt d¡ d ‰ ˆ  ¡ |_‡ fdd„}|  ||j
d|d¡ |  ||j
d¡ |jd d … dk ¡ �st	‚d S )Nr   c                 S   s   | dk rdS dS d S rº   r!   r¼   r!   r!   r"   r½      s    z6TestSpline1D.test_parameter_array_link.<locals>.value0r¾   Tr¸   c                    s   ˆ |  S r%   r!   r¼   rÆ   r!   r"   rÀ   ,  s    z6TestSpline1D.test_parameter_array_link.<locals>.value1r   c                 S   s   dS r¿   r!   r¼   r!   r!   r"   Úvalue26  s    z6TestSpline1D.test_parameter_array_link.<locals>.value2rÁ   Fr   c                    s   ˆ |  S r%   r!   r¼   rÍ   r!   r"   Úvalue3?  s    z6TestSpline1D.test_parameter_array_link.<locals>.value3r   )r
   r³   rV   r~   rÇ   rh   r@   r´   r�   rA   rW   rB   )r)   rN   r½   rÀ   rÔ   rÕ   r!   rÏ   r"   Útest_parameter_array_link  s"    


z&TestSpline1D.test_parameter_array_linkc                    s®  t dd�}t ddd�}|jdks$t‚t|jƒdks6t‚t d¡}d|d	d …< |j|k ¡ s^t‚t|jƒdkspt‚|jt d¡k ¡ sˆt‚|jdks–t‚t|jƒd
ks¨t‚t d
¡}d|dd …< |j|k ¡ sÐt‚t|jƒd
ksât‚|jt d
¡k ¡ sút‚t|j	ƒdk�st‚t|j	ƒd
k�s"t‚dd„ }|  
||j	d|d¡ dd„ }|  
||j	d|d¡ dt d¡ d ‰dt d
¡ d ‰ˆ ¡ |jd d …< ˆ ¡ |jd d …< ‡fdd„}|  
||j	d|d¡ ‡fdd„}|  
||j	d|d¡ |  ||j	d¡ |  ||j	d¡ |jd d … dk ¡ �st‚|jd d … dk ¡ �s:t‚t|jƒdk�sNt‚t|jƒd
k�sbt‚dd„ }|  
||jd|d¡ |  
||jd|d¡ dt d¡ d  ‰ d!t d
¡ d" ‰ˆ  ¡ |jd d …< ˆ ¡ |jd d …< ‡ fd#d$„}	|  
||jd|	d¡ ‡fd%d&„}
|  
||jd|
d¡ |  ||jd'¡ |  ||jd(¡ |jd d … dk ¡ �sVt‚|jd d … dk ¡ �srt‚|jd d … d'k ¡ �sŽt‚|jd d … d(k ¡ �sªt‚d S ))Nr   r·   é   r   ©r/   r:   r   r¸   r   r¹   é   r¤   c                 S   s   | dk rdS dS d S rº   r!   r¼   r!   r!   r"   r½   `  s    z-TestSpline1D.test_two_splines.<locals>.value0r¾   Tc                 S   s   | dk rdS dS d S )Nr¸   r   r   r!   r¼   r!   r!   r"   rÀ   h  s    z-TestSpline1D.test_two_splines.<locals>.value1é   rÊ   é   é   c                    s   ˆ |  S r%   r!   r¼   )Út0r!   r"   rÔ   v  s    z-TestSpline1D.test_two_splines.<locals>.value2c                    s   ˆ |  S r%   r!   r¼   )Út1r!   r"   rÕ   {  s    z-TestSpline1D.test_two_splines.<locals>.value3r   c                 S   s   dS r¿   r!   r¼   r!   r!   r"   Úvalue4‹  s    z-TestSpline1D.test_two_splines.<locals>.value4rÁ   FrÄ   r»   ry   é/   c                    s   ˆ |  S r%   r!   r¼   )Úc0r!   r"   Úvalue5—  s    z-TestSpline1D.test_two_splines.<locals>.value5c                    s   ˆ |  S r%   r!   r¼   )Úc1r!   r"   Úvalue6œ  s    z-TestSpline1D.test_two_splines.<locals>.value6r   é   )r
   rD   rA   ro   r@   r~   rÂ   r�   rB   rV   r³   rÇ   rh   r´   rW   )r)   Zspl0Zspl1r¬   r½   rÀ   rÔ   rÕ   rß   râ   rä   r!   )rá   rã   rÝ   rÞ   r"   Útest_two_splinesH  sj    


zTestSpline1D.test_two_splinesc                 C   sD   t ƒ }|jdkst‚dd„ tdƒD ƒ}t dƒ}|jt|ƒks@t‚d S )Nr!   c                 S   s   g | ]}d |› �‘qS ©r¾   r!   rq   r!   r!   r"   r‹   ¯  s     z1TestSpline1D.test__knot_names.<locals>.<listcomp>r¸   r   )r
   rV   rA   r7   rU   )r)   rN   rX   r!   r!   r"   Útest__knot_names©  s
    zTestSpline1D.test__knot_namesc                 C   sD   t ƒ }|jdkst‚dd„ tdƒD ƒ}t dƒ}|jt|ƒks@t‚d S )Nr!   c                 S   s   g | ]}d |› �‘qS ©rÁ   r!   rq   r!   r!   r"   r‹   º  s     z2TestSpline1D.test__coeff_names.<locals>.<listcomp>r¸   r   )r
   rW   rA   r7   rU   )r)   rN   rY   r!   r!   r"   Útest__coeff_names´  s
    zTestSpline1D.test__coeff_namesc                 C   s^   t ƒ }|jdkst‚dd„ tdƒD ƒ}dd„ tdƒD ƒ}|| }t dƒ}|jt|ƒksZt‚d S )Nr!   c                 S   s   g | ]}d |› �‘qS rç   r!   rq   r!   r!   r"   r‹   Å  s     z1TestSpline1D.test_param_names.<locals>.<listcomp>r¸   c                 S   s   g | ]}d |› �‘qS ré   r!   rq   r!   r!   r"   r‹   Æ  s     r   )r
   rT   rA   r7   rU   )r)   rN   rX   rY   rT   r!   r!   r"   rZ   ¿  s    zTestSpline1D.test_param_namesc              
   C   sF  t ƒ }|jd kst‚|jddddddddgk ¡ s6t‚d}tjt|d�� t 	¡ |_W 5 Q R X t dƒ}t
 d¡}d|dd …< |j|k ¡ sŽt‚|j|k ¡ s t‚t
 d¡d |_|jt
 d¡d k ¡ sÌt‚|jt
 d¡d k ¡ sèt‚|j|k ¡ sút‚d	}td
ƒD ]:}|dk�r�qtjt|d�� t
 |¡|_W 5 Q R X �qd S )Nr   r   z=The model parameters must be initialized before setting knotsr>   r   r¸   r¹   r×   z9There must be exactly as many knots as previously definedé   )r
   r@   rA   r¬   r�   rK   rL   rM   r   r   r~   rÂ   rÇ   r7   )r)   rN   rO   r¬   rr   r!   r!   r"   Útest_tÌ  s*    "

zTestSpline1D.test_tc              
   C   sB  t ƒ }|jd kst‚|jddddddddgk ¡ s6t‚d}tjt|d�� t 	¡ |_W 5 Q R X t dƒ}|jt
 d¡k ¡ s~t‚|jt
 d¡k ¡ s–t‚t
 d¡d |_|jt
 d¡d k ¡ sÂt‚|jt
 d¡d k ¡ sÞt‚|jt
 d¡k ¡ söt‚d}tdƒD ]:}|dk�r�qtjt|d�� t
 |¡|_W 5 Q R X �qd S )	Nr   z>The model parameters must be initialized before setting coeffsr>   r   r¸   r×   z:There must be exactly as many coeffs as previously definedrë   )r
   rB   rA   rÎ   r�   rK   rL   rM   r   r   r~   rÂ   rÇ   r7   )r)   rN   rO   rr   r!   r!   r"   Útest_cë  s&    "
zTestSpline1D.test_cc                 C   sL   t ƒ }|jdkst‚|jdks"t‚t dd�}|jdks:t‚|jdksHt‚d S )Nr   r   r›   )r
   rD   rA   r:   r\   r!   r!   r"   Útest_degree  s    
zTestSpline1D.test_degreec                 C   s2   t ƒ }|jdkst‚t ddd�}|jdks.t‚d S )NFr   r   rØ   T)r
   Ú_initializedrA   r\   r!   r!   r"   Útest__initialized  s    zTestSpline1D.test__initializedc                    s$  t ƒ }|jddddddddgk ¡ s(t‚|jddddddddgk ¡ sJt‚|jdksXt‚|j}|d |jk ¡ stt‚|d |jk ¡ sŠt‚|d |jksœt‚|jd ksªt‚|jd ks¸t‚|j	dksÆt‚|j
dksÔt‚t ddddddddddddg¡‰tj d¡ tj d	¡‰ d}ˆˆ |f|_|jˆk ¡ �s2t‚|jˆ k ¡ �sFt‚|j|k�sVt‚‡fd
d„}|  ||j	d|d¡ ‡ fdd„}|  ||j
d|d¡ t ddd�}t d¡‰dˆdd …< |jˆk ¡ �sÌt‚|jt d¡k ¡ �sæt‚|jdk�söt‚|j}|d |jk ¡ �st‚|d |jk ¡ �s,t‚|d |jk�s@t‚dt d¡ d ‰dt d¡ d ‰ d}ˆˆ |f|_|jˆk ¡ �sˆt‚|jˆ k ¡ �sœt‚|j|k�s¬t‚|j}|d |jk ¡ �sÊt‚|d |jk ¡ �sât‚|d |jk�söt‚d}tjt|d�� ˆˆ df|_W 5 Q R X d S )Nr   r   r   r   r!   r   r   ék  é   c                    s   ˆ |  S r%   r!   r¼   rÆ   r!   r"   r½   8  s    z%TestSpline1D.test_tck.<locals>.value0r¾   Tc                    s   ˆ |  S r%   r!   r¼   rÍ   r!   r"   rÀ   =  s    z%TestSpline1D.test_tck.<locals>.value1rÁ   Fr   rØ   é   r¤   rÛ   rÚ   é   ztck has incompatible degree!r>   )r
   r¬   r�   rA   rÎ   r:   Útckr@   rB   rV   rW   r~   Úarrayr   r€   r³   rÂ   rÇ   rK   rL   rM   )r)   rN   rõ   Úkr½   rÀ   rO   r!   rÏ   r"   Útest_tck  s`    """
zTestSpline1D.test_tckc                    s¬  ddl m} tƒ }|j}t||ƒs&t‚|jd |jd k ¡ sBt‚|jd |jd k ¡ s^t‚|jd |jd ksvt‚t 	ddddddddddddg¡‰tj
 d¡ tj
 
d	¡‰ d}‡fd
d„}‡ fdd„}tƒ }|jd ksàt‚|jd ksît‚|jdksüt‚|jdk�st‚|ˆˆ |ƒ}||_|jˆk ¡ �s2t‚|jˆ k ¡ �sFt‚|j|k�sVt‚|  ||jd|d¡ |  ||jd|d¡ tƒ }|jd k�s”t‚|jd k�s¤t‚|jdk�s´t‚|jdk�sÄt‚ˆˆ |f|_|jˆk ¡ �sät‚|jˆ k ¡ �søt‚|j|k�st‚|  ||jd|d¡ |  ||jd|d¡ tddd�}|j}t||ƒ�sRt‚|jd |jd k ¡ �spt‚|jd |jd k ¡ �sŽt‚|jd |jd k�s¨t‚d S )Nr   )ÚBSpliner   r   r   r   r   rñ   rò   c                    s   ˆ |  S r%   r!   r¼   rÆ   r!   r"   r½   q  s    z)TestSpline1D.test_bspline.<locals>.value0c                    s   ˆ |  S r%   r!   r¼   rÍ   r!   r"   rÀ   t  s    z)TestSpline1D.test_bspline.<locals>.value1r!   r¾   TrÁ   Fr   rØ   )Úscipy.interpolaterù   r
   Úbsplinerƒ   rA   rõ   r�   r~   rö   r   r€   r@   rB   rV   rW   r:   r³   )r)   rù   rN   rû   r÷   r½   rÀ   r!   rÏ   r"   Útest_bspline`  sT    "zTestSpline1D.test_bsplinec                 C   sr   t ƒ }|jg kst‚t dƒ}|j}t|ƒdks2t‚|D ]6}t|tƒsHt‚t||jƒsXt‚t||jƒ|ks6t‚q6d S ©Nr   r¸   )	r
   r/   rA   ro   rƒ   r	   rF   r‡   rb   )r)   rN   r/   r¾   r!   r!   r"   Ú
test_knots›  s    zTestSpline1D.test_knotsc                 C   sr   t ƒ }|jg kst‚t dƒ}|j}t|ƒdks2t‚|D ]6}t|tƒsHt‚t||jƒsXt‚t||jƒ|ks6t‚q6d S rý   )	r
   r0   rA   ro   rƒ   r	   rF   r‡   rb   )r)   rN   r0   rÁ   r!   r!   r"   Útest_coeffsª  s    zTestSpline1D.test_coeffsc              	   C   sZ   t ƒ }tjjt ddd��8}| ¡  |jtj|dddd�t |dd¡gksLt‚W 5 Q R X d S )	NrŒ   Tr<   r¾   r¬   )r…   rÁ   rÎ   )r
   r   rG   rH   r'   rI   rJ   rA   )r)   rN   r�   r!   r!   r"   r“   ¹  s    þz"TestSpline1D.test__init_parametersc                 C   s¼   t ƒ }| ¡ \}}}|dks t‚|ddddgk ¡ s8t‚|ddddgk ¡ sPt‚|jd ks^t‚| d¡\}}}|dkszt‚|ddddgk ¡ s’t‚|ddddgk ¡ sªt‚|jdks¸t‚d S )NFr   r   )éûÿÿÿr   Tr   r   )r
   Ú_init_boundsrA   r�   Z_user_bounding_box)r)   rN   Ú
has_boundsÚlowerÚupperr!   r!   r"   Útest__init_boundsÃ  s    zTestSpline1D.test__init_boundsc           	      C   sV  t j d¡ t j d¡}t j d¡}tjjtdtjd��j}tƒ }|jd ksNt	‚| 
dt ¡ ||¡ t  |t  d¡|f¡}|j|k ¡ sŠt	‚|jt ¡ gksžt	‚W 5 Q R X tjjtdtjd��p}t j d¡}tƒ }|jd ksÞt	‚| 
|d||¡ t  |||f¡}|j|k ¡ �st	‚|jt ¡ gk�s(t	‚W 5 Q R X tjjtdtjd��Â}t j d¡}tƒ }|jd k�sjt	‚| 
|d||¡ |j|k ¡ �sŽt	‚|jt ¡ gk�s¤t	‚d}td	ƒD ]R}t j |¡}tƒ }|jd k�sÖt	‚tjt|d
�� | 
|d||¡ W 5 Q R X �q°W 5 Q R X tƒ }|jd k�s$t	‚d}tjt|d
�� | 
dd||¡ W 5 Q R X d S )NrÜ   r   rû   ©Znew_callabler   TFrÑ   rÒ   r>   z$Knots: 0.5 must be iterable or valueg      à?)r~   r   r€   r   rG   rH   r
   ÚPropertyMockr@   rA   Ú_init_knotsr   ÚconcatenaterÂ   r�   rI   rJ   r7   rK   rL   rM   )	r)   r  r  Ú	mkBsplinerN   r¬   r/   rO   Únumr!   r!   r"   Útest__init_knotsÒ  sh      ÿ  ÿ   ÿ(zTestSpline1D.test__init_knotsc              	   C   sø   t j d¡ tjjtdtjd��^}tƒ }|jd ks6t	‚ddddg|_
| ¡  |jddddgk ¡ sft	‚|jt ¡ gkszt	‚W 5 Q R X tjjtdtjd��V}t j d	¡}tƒ }|jd ksºt	‚| |¡ |j|k ¡ sÖt	‚|jt ¡ gksêt	‚W 5 Q R X d S )
Niì  rû   r  r   r   r   r   r   r   )r~   r   r€   r   rG   rH   r
   r  rB   rA   r@   Ú_init_coeffsr�   rI   rJ   )r)   r
  rN   r0   r!   r!   r"   Útest__init_coeffs	  s2      ÿ  ÿ
zTestSpline1D.test__init_coeffsc                 C   s  t ƒ }t ¡ }t ¡ }t ¡ }t ¡ }t ¡ }t ¡ }tjjt dd|||fd��´}tjjt ddd��–}	tjjt ddd��x}
t ¡ }| |d¡ | |	d¡ | |
d	¡ | |||¡ |jtj 	||¡tj 
|||||¡tj ||¡gksìt‚W 5 Q R X W 5 Q R X W 5 Q R X d S )
Nr  Trt   r  r<   r  r-   r/   r0   )r
   r   r   rG   rH   r—   r.   r˜   rJ   r-   r/   r0   rA   )r)   rN   r/   r0   r-   r  r  r  ZmkBoundsZmkKnotsZmkCoeffsr™   r!   r!   r"   r”   !  s>    ü  ÿýzTestSpline1D.test__init_datac           	      C   sL  t ƒ }tdd„ tdƒD ƒƒ}dd„ tdƒD ƒ}dd„ tdƒD ƒ}tjjtdd|d	���}tjjt d
tjd��p}|jj|j	||Žks„t
‚|jjtj|d f|Žgks¤t
‚|jt ¡ gks¸t
‚|jtj|f|ž|ŽgksÖt
‚W 5 Q R X W 5 Q R X d}tddƒD ]N}tjjtddd|id	��, tjt|d�� |j	||Ž W 5 Q R X W 5 Q R X qød S )Nc                 s   s   | ]}t  ¡ V  qd S r%   r   rQ   r!   r!   r"   rS   C  s     z-TestSpline1D.test_evaluate.<locals>.<genexpr>r   c                 S   s   i | ]}d |› �t  ¡ “qS r   r   rq   r!   r!   r"   r#   D  s      z.TestSpline1D.test_evaluate.<locals>.<dictcomp>c                 S   s   i | ]}d |› �t  ¡ “qS rs   r   rq   r!   r!   r"   r#   E  s      rn   Trt   rû   r  r   z3Cannot evaluate a derivative of order higher than 4r   rÒ   Únur>   )r
   rU   r7   r   rG   rH   r   r  ru   rn   rA   rI   rJ   rK   rL   ri   )	r)   rN   rw   rl   rj   ZmkEvalr
  rO   rr   r!   r!   r"   rp   @  sH       ÿ  ÿ
 ÿ
ÿ
2   ÿzTestSpline1D.test_evaluatec           	   	      sÞ   ‡ fdd„}‡ fdd„}t |d ƒD ]V}d|› �}ˆ  ˆd|||d¡ tˆjƒ|d  | }d|› �}ˆ  ˆd|||d¡ q$‡fdd	„}tˆjƒtˆjƒks t‚tˆjƒD ].\}}|d|› �ksÄt‚ˆ  ˆd|||d¡ qªd S )
Nc                    s
   ˆ j d S r¿   ©r¡   r¼   r(   r!   r"   r½   `  s    z0TestSpline1D.check_knots_created.<locals>.value0c                    s
   ˆ j d S r­   r  r¼   r(   r!   r"   rÀ   c  s    z0TestSpline1D.check_knots_created.<locals>.value1r   r¾   Tc                    s
   ˆ j |  S r%   rÆ   r¼   ©rN   r!   r"   rÕ   n  s    z0TestSpline1D.check_knots_created.<locals>.value3)r7   r±   ro   r¬   rV   rA   r²   )	r)   rN   r÷   r½   rÀ   rr   r‡   r†   rÕ   r!   r\   r"   Úcheck_knots_created_  s    

z TestSpline1D.check_knots_createdc              	      sb   ‡ fdd„}t ˆ jƒt ˆ jƒks$t‚tˆ jƒD ].\}}|d|› �ksHt‚|  ˆ d|||d¡ q.d S )Nc                    s
   ˆ j |  S r%   rÍ   r¼   r  r!   r"   rk   w  s    z0TestSpline1D.check_coeffs_created.<locals>.valuerÁ   F)ro   rW   rÎ   rA   r²   r±   )r)   rN   rk   rr   r‡   r!   r  r"   Úcheck_coeffs_createdv  s
    z!TestSpline1D.check_coeffs_createdc                 C   sh   |dkr| j dks$t‚nt| j |ƒ |dkr<| jdksHt‚nt| j|ƒ | j|ksVt‚| jdksdt‚dS )zCheck the base spline formN)r@   rA   r   rB   r:   Ú_bounding_box)rN   r¬   rÎ   r÷   r!   r!   r"   Úcheck_base_spline  s    zTestSpline1D.check_base_splinec                 C   s†  t |j|jd ƒ t |j|jd ƒ t |jd jd |jd ƒ t |jd jd |jd ƒ t|jƒt|jƒt|jƒ ks~t‚t |jdt|jƒ… |jƒ t |jt|jƒd… |jƒ t|jƒt|jƒt|jƒ ksØt‚t |jdt|jƒ… |jƒ t |jt|jƒd… |jƒ t | 	¡ |jd ƒ t || j
ƒ|| j
ƒƒ t || j
ƒ|jd | j
ƒƒ t || j
ƒ| j|d� t || j
ƒ| j|d� dS )zCheck the spline fitr   r   ÚsplineNÚresid©Zatol)r   r¬   Z
_eval_argsrÎ   Úfit_inforo   Ú_parametersrA   r•   Úget_residualr¡   r§   r¨   )r)   Úfit_splr  ÚfitterZatol_fitZ
atol_truthr!   r!   r"   Úcheck_spline_fit�  s    ""zTestSpline1D.check_spline_fitc                 K   sd   | j d | j d g}||| j | jf||dœ|—Ž}|jt|ƒksDt‚t|j|jƒ t|j|jƒ dS )z%Check the spline fit with bbox optionr   r   )ÚweightsÚbboxN)r¡   r§   Zbounding_boxrU   rA   r   r¬   rÎ   )r)   rN   r  r  Úwrl   r   Zbbox_splr!   r!   r"   Ú
check_bbox¨  s
    zTestSpline1D.check_bboxc              	   K   sB   t ||d�}t t¡�" ||| j| jfd|i|—Ž W 5 Q R X dS )z&Check that the knots warning is raisedrØ   r  N)r
   rK   Úwarnsr   r¡   r§   )r)   r  r/   r÷   r!  rl   rN   r!   r!   r"   Úcheck_knots_warning°  s    z TestSpline1D.check_knots_warningr!  r÷   c           
      C   sV  t ƒ }|jd d dœkst‚t|d�}|  |d d |¡ ||| j| j|d�}|  |d d |¡ t|jƒt| jƒ| d   kr†t|j	ƒksŒn t‚|  
||¡ |  |¡ |jd ks°t‚ddlm}m} || j| j||d�}t|jd |ƒsèt‚| ¡ dksøt‚|  |||dd¡ |  ||||¡ t | jd | jd	 t| jƒ| d ¡}	|  ||	||¡ d S )
N©r  r  r›   ©r  r   r   )ÚInterpolatedUnivariateSplineÚUnivariateSpline©r!  r÷   r  r   )r   r  rA   r
   r  r¡   r§   ro   r¬   rV   r  r  r  rú   r'  r(  rƒ   r  r  r"  r~   r¥   r$  )
r)   r!  r÷   r  rN   r  r'  r(  r  r/   r!   r!   r"   Útest_interpolate_fitter¶  s$    
4
(z$TestSpline1D.test_interpolate_fitterÚsc           
      C   sü   t ƒ }|jd d dœkst‚t|d�}|  |d d |¡ ||| j| j||d�}|  |d d |¡ |  ||¡ |  |¡ |j	d ks~t‚ddl
m} || j| j|||d�}t|jd |ƒs´t‚|  |||dd¡ | j|||||d	� |j ¡ }	| j||	|||d	� d S )
Nr%  r›   ©r+  r  r   )r(  )r!  r÷   r+  r  r   ©r+  )r   r  rA   r
   r  r¡   r§   r  r  r  rú   r(  rƒ   r  r"  r¬   rh   r$  )
r)   r!  r÷   r+  r  rN   r  r(  r  r/   r!   r!   r"   Útest_smoothing_fitterÓ  s     


z"TestSpline1D.test_smoothing_fitterc              	   C   s  t ƒ }|jd d dœkst‚dddg}t | jd g|d  || jd g|d  f¡}t t|ƒ¡}t||| jd | jd gd�}|  	||||¡ |j
|k ¡ s¢t‚||| j| j|d�}|  	||||¡ |j
|k ¡ sØt‚t|jƒt|ƒ  krþt|jƒk�sn t‚|  ||¡ |  |¡ |jd k�s*t‚ddlm}	m}
 |	| j| j|||d�}t|jd	 |
ƒ�sft‚t| ¡ d
dd� t|jd	  ¡ d
dd� |  |||dd¡ |  ||||¡ t t¡� ||| j| j||d� W 5 Q R X t|d�}d}tjt|d�� ||| j| j|d� W 5 Q R X d S )Nr%  r   r   r   ©r/   r:   r-   r&  )ÚLSQUnivariateSpliner(  r)  r  rŸ   r  ©r¬   r  r›   zNo knots have been providedr>   )r   r  rA   r~   r	  r¡   rÂ   ro   r
   r  Ú
t_interiorr�   r§   r¬   rV   r  r  r  rú   r0  r(  rƒ   r   r  r  r"  rK   r#  r   rL   ri   )r)   r!  r÷   r  r/   r¬   rÎ   rN   r  r0  r(  r  rO   r!   r!   r"   Útest_exact_knots_fitterð  s8    
0,
 
z$TestSpline1D.test_exact_knots_fitterc                 C   sj  t ƒ }|jd d d dœkst‚t|d�}|  |d d |¡ ||| j| j||d�}|  |d d |¡ |  ||¡ |  |¡ |j	d ks€t‚ddl
m}m} || j| j|||dd�\}	}
}}t|j|	d ƒ t|j|	d ƒ |jd |
ksât‚|jd	 |ksôt‚|jd
 |k�st‚||	Ž }t|| jƒ|| jƒƒ t|| jƒ| jdd� t|| jƒ| jdd� | j|||||d� d S )N©ÚfpÚierÚmsgr›   r,  r   ©rù   Úsplrepr   )r!  r÷   r+  Úfull_outputr5  r6  r7  r  r-  )r   r  rA   r
   r  r¡   r§   r  r  r  rú   rù   r9  r   r¬   rÎ   r¨   r"  )r)   r!  r÷   r+  r  rN   r  rù   r9  rõ   Ú	spline_fpÚ
spline_ierÚ
spline_msgr  r!   r!   r"   Útest_splrep_fitter_no_knots  s8    

     ÿz(TestSpline1D.test_splrep_fitter_no_knotsc              	   C   s  t ƒ }|jd d d dœkst‚dddg}t | jd g|d  || jd g|d  f¡}t t|ƒ¡}t||| jd | jd gd�}|  	||||¡ |j
|k ¡ s¤t‚||| j| j|d�}|  	||||¡ |j
|k ¡ sÚt‚|  ||¡ |  |¡ |jd ksþt‚ddlm}	m}
 |
| j| j|||dd�\}}}}t|j|d ƒ t|j|d ƒ |jd	 |k�sbt‚|jd
 |k�svt‚|jd |k�sŠt‚|	|Ž }t|| jƒ|| jƒƒ t|| jƒ| jdd� t|| jƒ| jdd� |  ||||¡ t t¡� ||| j| j||d� W 5 Q R X t|d�}|  	|d d |¡ ||| j| j||d�}|  	|d d |¡ |  ||¡ |  |¡ |jd k�svt‚ddlm}	m}
 |
| j| j|||d�}t|j|d ƒ t|j|d ƒ |	|Ž }t|| jƒ|| jƒƒ t|| jƒ| jdd� t|| jƒ| jdd� | j|||||d� d S )Nr4  r   r   r   r/  r&  r8  )r!  r÷   r¬   r:  r5  r6  r7  r  r1  r›   )r!  r÷   r¬   rÆ   )r   r  rA   r~   r	  r¡   rÂ   ro   r
   r  r2  r�   r§   r  r  r  rú   rù   r9  r   r¬   rÎ   r¨   r"  rK   r#  r   )r)   r!  r÷   r  r/   r¬   rÎ   rN   r  rù   r9  rõ   r;  r<  r=  r  r!   r!   r"   Útest_splrep_fitter_with_knotsA  sf    
0
     ÿ 

z*TestSpline1D.test_splrep_fitter_with_knotsNr   c           	   
   C   sH   |d krd}ddl m}m} || j| j||d |d |||d�}||Ž S )Nr   r   r8  r   )r!  ÚxbZxer÷   r+  r¬   )rú   rù   r9  r¡   r§   )	r)   r!  r   r÷   r+  r¬   rù   r9  rõ   r!   r!   r"   Úgenerate_spline‰  s
    $zTestSpline1D.generate_splinec              
   C   s¤  |   ¡ }tƒ }||_t|j|jƒ t|j|jƒ |j|jks@t‚|j	dd�}t|| j
ƒ|| j
dd�ƒ t|| j
dd�|| j
dd�ƒ t|| j
dd�|| j
dd�ƒ t|| j
dd�|| j
dd�ƒ | 	¡ }t|j|jƒ t|j|jƒ |j|j  krþdk�sn t‚t| | j
¡|j| j
dd�ƒ t|j| j
dd�|j| j
dd�ƒ t|j| j
dd�|j| j
dd�ƒ t|j| j
dd�|j| j
dd�ƒ |j	dd�}t|| j
ƒ|| j
dd�ƒ t|| j
dd�|| j
dd�ƒ t|| j
dd�|| j
dd�ƒ |j	dd�}t|j|jƒ t|j|jƒ |j|j  k�r.dk�s4n t‚t| | j
¡|j| j
dd�ƒ t|j| j
dd�|j| j
dd�ƒ t|j| j
dd�|j| j
dd�ƒ |j	dd�}t|| j
ƒ|| j
dd�ƒ t|| j
dd�|| j
dd�ƒ |j	dd�}t|j|jƒ t|j|jƒ |j|j  k�rdk�s$n t‚t| | j
¡|j| j
dd�ƒ t|j| j
dd�|j| j
dd�ƒ d}tddƒD ],}tjt|d	�� |j	|d� W 5 Q R X �qrd S )
Nr   ©r  r   r   r   r   zMust have nu <= 3é	   r>   )rA  r
   rû   r   r¬   rÎ   r:   r÷   rA   Z
derivativerª   rn   r7   rK   rL   rM   )r)   rû   rN   Z	d_bsplineZderrO   r  r!   r!   r"   Útest_derivative“  sV     """"""""zTestSpline1D.test_derivativec              
   C   sr  |   ¡ }tƒ }||_|jdd�}t|| jƒ|| jdd�ƒ t|| jdd�|| jdd�ƒ t|| jdd�|| jdd�ƒ t|| jdd�|| jdd�ƒ t|| jdd�|| jdd�ƒ | ¡ }t|j|jƒ t|j|jƒ |j|j	  krîdksôn t
‚t| | j¡|j| jdd�ƒ t|j| jdd�|j| jdd�ƒ t|j| jdd�|j| jdd�ƒ t|j| jdd�|j| jdd�ƒ t|j| jdd�|j| jdd�ƒ |jdd�}t|| jƒ|| jdd�ƒ t|| jdd�|| jdd�ƒ t|| jdd�|| jdd�ƒ t|| jdd�|| jdd�ƒ t|| jdd�|| jdd�ƒ |jdd�}t|j|jƒ t|j|jƒ |j|j	  k�r|dk�s‚n t
‚t| | j¡|j| jdd�ƒ t|j| jdd�|j| jdd�ƒ t|j| jdd�|j| jdd�ƒ t|j| jdd�|j| jdd�ƒ t|j| jdd�|j| jdd�ƒ tddƒD ]:}d	|d › �}tjt|d
�� |j|d� W 5 Q R X �q2d S )Nr   rB  r   r   r   r   rå   rC  zGSupported splines can have max degree 5, antiderivative degree will be r>   )rA  r
   rû   Zantiderivativer   rª   r¬   rÎ   r:   r÷   rA   rn   r7   rK   rL   rM   )r)   rû   rN   Z	a_bsplineZantir  rO   r!   r!   r"   Útest_antiderivativeÌ  sL    """""""""ÿz TestSpline1D.test_antiderivativec              	   C   sÀ   t ƒ }G dd„ dtƒ}|ƒ }d}tjt|d��  ||t ¡ t ¡ t ¡ ƒ W 5 Q R X d}tjt|d�� |t ¡ t ¡ t ¡ ƒ W 5 Q R X d}tjt|d�� ||t ¡ t ¡ ƒ W 5 Q R X d S )Nc                       s   e Zd Z‡ fdd„Z‡  ZS )z;TestSpline1D.test__SplineFitter_error.<locals>.SplineFitterc                    s   t ƒ j|||f|Ž d S r%   )r&   Ú_fit_method)r)   r„   r¡   r§   rl   r*   r!   r"   rF    s    zGTestSpline1D.test__SplineFitter_error.<locals>.SplineFitter._fit_method)r1   r2   r3   rF  r5   r!   r!   r*   r"   ÚSplineFitter  s   rG  z$1D model can only have 2 data pointsr>   z2Only spline models are compatible with this fitterz/This has not been implemented for _SplineFitter)	r
   r   rK   rL   rM   r   r   r   r‘   )r)   rN   rG  r  rO   r!   r!   r"   Útest__SplineFitter_errorÿ  s    $"z%TestSpline1D.test__SplineFitter_error)6r1   r2   r3   r9   r±   r³   r´   r¶   rÃ   rÉ   rÌ   rÐ   rÓ   rÖ   ræ   rè   rê   rZ   rì   rí   rî   rð   rø   rü   rþ   rÿ   r“   r  r  r  r”   rp   r  r  Ústaticmethodr  r  r"  r$  rK   ÚmarkZparametrizeÚwieght_testsÚdegree_testsr*  Úsmoothing_testsr.  r3  r>  r?  rA  rD  rE  rH  r!   r!   r!   r"   rž   O  sr   #",a	A;
7	
*"F
93rž   )+Ú__doc__Zunittest.mockZmockr   Únumpyr~   rK   Znumpy.testingr   Zastropy.modeling.corer   r   Zastropy.modeling.fittingr   r   r   r   Zastropy.modeling.parametersr	   Zastropy.modeling.spliner
   r   r   Z"astropy.utils.compat.optional_depsr   Zastropy.utils.exceptionsr   r¦   r«   r   r€   ZrandZtest_wrì   Zrandnr¢   rL  rK  rM  r   rJ  Zskipifrž   r!   r!   r!   r"   Ú<module>   s0   
  /