U
    ½mœd¾d  ã                   @   s˜  d dl Zd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZ ej d
eef¡dd„ ƒZej dddg¡dd„ ƒZdd„ Zej dddddg¡ej dddg¡dd„ ƒƒZej deddƒ¡ej deddƒ¡ej ddd g¡ej dddg¡d!d"„ ƒƒƒƒZej d#d$gd%d&g¡d'd(„ ƒZej ddd)d*gddde  d dgdd+gd,d-gg¡fdde  d d ddd ddg¡e  ddgd.d+gd,d-gg¡fdd.de  d dgdd,gd.d/gd,d-gg¡fd dde  d dgddgd,d-gg¡fd de  d d ddd ddg¡e  ddgdd+gd,d-gg¡fg¡d0d1„ ƒZ!ej d#d$gd%d&g¡d2d3„ ƒZ"d4d5„ Z#d6d7„ Z$ej dddg¡d8d9„ ƒZ%ej d#d$gd%d&g¡ej ddddd.dg¡d:d;„ ƒƒZ&d<d=„ Z'ej ddd/g¡ej d>d?d@g¡ej dddg¡dAdB„ ƒƒƒZ(ej dCddDidEfddFidEfddGidEfddHidIfg¡dJdK„ ƒZ)e *¡ dLdM„ ƒZ+ej dNdd?d@e,ddƒfdd@d@e,ddƒfdd?d?d dgfdd@d?dgfdOd?d@d ddgfdOd@d@ddgfdOd?d?d gfdOd@d?g fg¡ej dPd@ej-ej.g¡dQdR„ ƒƒZ/e *¡ dSdT„ ƒZ0ej dNdd?d@e,d d,ƒfdd@d@e,dd,ƒfdd?d?d ddd.gfdd@d?ddd.gfdUd?d@d dd.dgfdUd@d@dd.dgfdUd?d?d d.gfdUd@d?d.gfdd?d@e,ddƒfdd@d@e,ddƒfdd?d?d ddd.gfdd@d?ddd.gfdOd?d@d dd.dd,dVd+dWgfdOd@d@e,ddƒfdOd?d?d d.gfdOd@d?d.gfdXd?d@d d,dVd+dWgfdXd@d@d,dVd+dWgfdXd?d?d gfdXd@d?g fg¡ej dPd@ej-ej.g¡dYdZ„ ƒƒZ1d[d\„ Z2ej d]d>d^d_gdd?d@e3fdd?d@e3fdd?d@ej4fdd?d@ej5fdd@d@ej5fdd@d?ej5fd.d@d@ej5fd.d@d?ej5fg¡d`da„ ƒZ6ej d]d>d^d_gdd?d@e3fdd?d@e3fdd?d@ej4fdd?d@ej5fdd@d@ej5fdd@d?ej5fg¡dbdc„ ƒZ7ej dddd.dg¡ej dedfdgdhdidjg¡ej d^d?d@g¡ej d>d?d@g¡dkdl„ ƒƒƒƒZ8ej d]d>d^d_gdd?d@ej4fdd?d@ej5fdd@d@ej5fdd@d?ej5fg¡dmdn„ ƒZ9ej dod]d^gdpdqdrdsdtdudvdwdxdydzd{g¡d|d}„ ƒZ:ej d>d^gd~d%d&dg¡d€d�„ ƒZ;ej d]d‚d^gdƒdrd„d…d†d‡dxdˆd‰dŠg
¡d‹dŒ„ ƒZ<d�dŽ„ Z=dS )�é    N)Úsparse)Úrandom)Úassert_array_almost_equal)Úassert_allcloseÚassert_array_equal)ÚBSpline)ÚLinearRegression)ÚPipeline)ÚKBinsDiscretizerÚPolynomialFeaturesÚSplineTransformerÚestc                 C   sd   t  d¡ dd¡}dd„ }|| ƒ  |¡ƒs.t‚|| dd� |¡ƒsFt‚t  | dd� |¡¡s`t‚d	S )
z+Test that output array has the given order.é
   é   é   c                 S   s   t  | j¡S )N)ÚnpÚ	isfortranÚT)Úa© r   úd/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/preprocessing/tests/test_polynomial.pyÚis_c_contiguous   s    z?test_polynomial_and_spline_array_order.<locals>.is_c_contiguousÚC)ÚorderÚFN)r   ÚarangeÚreshapeÚfit_transformÚAssertionErrorr   )r   ÚXr   r   r   r   Ú&test_polynomial_and_spline_array_order   s
    r    ÚextrapolationÚcontinueÚperiodicc                 C   sL   t  d¡ dd¡}ddgddgddgddgddgg}td	|| d
� |¡}dS )zATest that SplineTransformer accepts integer value knot positions.é   r   r   r   é   r   é   é   é   )ÚdegreeÚknotsr!   N)r   r   r   r   r   )r!   r   r*   Ú_r   r   r   Ú%test_spline_transformer_integer_knots   s    "  ÿþr,   c                  C   sŒ   t  d¡ dd¡} tdddd� | ¡}| ¡ }t|ddd	d
ddddddg
ƒ tdddd� | ¡}| ddg¡}t|ddddddddgƒ dS )z<Test that SplineTransformer generates correct features name.r$   r   r   r(   T©Ún_knotsr)   Úinclude_biasZx0_sp_0Zx0_sp_1Zx0_sp_2Zx0_sp_3Zx0_sp_4Zx1_sp_0Zx1_sp_1Zx1_sp_2Zx1_sp_3Zx1_sp_4Fr   ÚbZa_sp_0Za_sp_1Za_sp_2Za_sp_3Zb_sp_0Zb_sp_1Zb_sp_2Zb_sp_3N)r   r   r   r   ÚfitÚget_feature_names_outr   )r   ÚspltÚfeature_namesr   r   r   Ú%test_spline_transformer_feature_names)   s>    öþøþr5   ÚconstantÚlinearr)   r   r(   c                 C   sh   t  d¡ dd¡}t|| d� |¡}| ddg¡}t|ƒ|jksDt‚| 	|¡}|j
d t|ƒksdt‚dS )	zsTest feature names are correct for different extrapolations and degree.

    Non-regression test for gh-25292.
    r$   r   r   )r)   r!   r   r0   r%   N)r   r   r   r   r1   r2   ÚlenÚn_features_out_r   Ú	transformÚshape)r!   r)   r   r3   r4   ZX_transr   r   r   Ú7test_split_transform_feature_names_extrapolation_degreeO   s    

r<   r%   r   r.   r*   ÚuniformÚquantilec                 C   s²   t  ddd¡dd…df }t jdgg|ddd…dd…f dggf }|ddd…dd…f }|dkrj||  }t|| |d|d�}| |¡ ||fD ]}tt j| |¡dd	�dƒ qŽdS )
zšTest that B-splines are indeed a decomposition of unity.

    Splines basis functions must sum up to 1 per row, if we stay in between
    boundaries.
    r   r%   éd   Nr   r#   T)r.   r)   r*   r/   r!   ©Zaxis)r   ÚlinspaceZr_r   r1   r   Úsumr:   )r)   r.   r*   r!   r   ZX_trainZX_testr3   r   r   r   Ú+test_spline_transformer_unity_decompositionb   s    
*û
rC   ÚbiasÚ	intercept)TF)FTc                 C   s€   t  ddd¡dd…df }t  |dd…df ¡d }tdtdd| d	d
�fdt|d�fgd�}| ||¡ t| |¡|dd� dS )z7Test that B-splines fit a sinusodial curve pretty well.r   r   r?   Nr   Úsplineé   r(   r6   ©r.   r)   r/   r!   Úols©Zfit_intercept©Zstepsçü©ñÒMbP?©Úrtol)	r   rA   Úsinr	   r   r   r1   r   Úpredict)rD   rE   r   ÚyÚpiper   r   r   Ú)test_spline_transformer_linear_regression€   s     üþ	öÿrS   Úsample_weightÚexpected_knotsé   é   é   é   r   c              
   C   sT   t  ddgddgddgddgddgddgddgg¡}tj|| ||d	�}t||ƒ d S )
Nr   r   r(   rY   rW   r   rV   rX   )r   r*   r.   rT   )r   Úarrayr   Z_get_base_knot_positionsr   )r*   r.   rT   rU   r   Z
base_knotsr   r   r   Ú/test_spline_transformer_get_base_knot_positions—   s    4   ÿr[   c                 C   sÌ   dd„ }t  ddd¡dd…df }tdtdd	| d
d�fdt|d�fgd�}| |||dd…df ƒ¡ t  ddd¡dd…df }| |¡}t|||dd…df ƒddd� t|dd… |dd… dd� dS )z5Test that B-splines fit a periodic curve pretty well.c                 S   s,   t  dt j |  ¡t  dt j |  ¡ d S )Nr   rV   r(   )r   rO   Úpi)Úxr   r   r   Úf»   s    z=test_spline_transformer_periodic_linear_regression.<locals>.fr   r%   ée   NrF   r$   r(   r#   rH   rI   rJ   rK   éÿÿÿÿr   i-  g{®Gáz„?)ZatolrN   r?   éÈ   rL   rM   )r   rA   r	   r   r   r1   rP   r   )rD   rE   r^   r   rR   ZX_Zpredictionsr   r   r   Ú2test_spline_transformer_periodic_linear_regression·   s&    üþ	öÿ
 rb   c                  C   sœ   t  ddd¡dd…df } d}t|ddgdgd	ggd
�}| | ¡}t  d	dgdd	gd	dgdd	gg¡}tt  dd¡||dƒ}|| dd…df ƒ}t||ƒ dS )z@Test that the backport of extrapolate="periodic" works correctlyéþÿÿÿg      @r   Nr   r#   g      ð¿ç        ç      ð?©r)   r!   r*   éýÿÿÿrY   r   )r   rA   r   r   rZ   r   r   r   )r   r)   ÚtransformerÚXtZcoefZsplZXsplr   r   r   Ú0test_spline_transformer_periodic_spline_backportÖ   s      ÿ
"rj   c               	   C   sž   t  ddd¡dd…df } tdddgdgd	gd
gdgdggd�}tdddgd	gd
gdgdgdggd�}| | ¡}| | ¡}t||dd…dddddgf ƒ dS )zT
    Test if shifted knots result in the same transformation up to permutation.
    r   r   r_   Nr(   r#   rd   re   ç      @ç      @ç      @ç       @rf   g      "@rY   r%   r   )r   rA   r   r   r   )r   Ztransformer_1Ztransformer_2ZXt_1ZXt_2r   r   r   Ú4test_spline_transformer_periodic_splines_periodicityè   s    ýý

ro   c           	   	   C   sÖ   t  ddd¡dd…df }t| ddgdgdgd	gd
gdggd�}| |¡}| ¡ | ¡  t|ƒ }d| }|}td| d ƒD ]0}t j|dd�}t  	|¡ ¡ |k s¤t
‚|| }q|t j|dd�}t  	|¡ ¡ dksÒt
‚dS )z?Test that spline transformation is smooth at first / last knot.rc   r   i'  Nr#   rd   re   rk   rl   rm   rn   rf   r%   r   r@   )r   rA   r   r   ÚmaxÚminr8   ÚrangeÚdiffÚabsr   )	r)   r   rh   ri   ÚdeltaZtolZdXtÚdrs   r   r   r   Ú3test_spline_transformer_periodic_splines_smoothness   s     ý


rw   c              	   C   s$  t  ddd¡dd…df }| ¡ }tdtd|| dd�gd	t|d
�ggƒ}| ||¡ t| dgdgg¡ddgƒ tdtd|| dd�gd	t|d
�ggƒ}| ||¡ t| dgdgg¡ddgƒ td|| dd�}| |¡ t	 
t¡� | dgg¡ W 5 Q R X t	 
t¡� | dgg¡ W 5 Q R X dS )z1Test that B-spline extrapolation works correctly.r`   r%   r?   NrF   rY   r6   rH   rI   rJ   iöÿÿÿr   r7   Úerror)r   rA   Zsqueezer	   r   r   r1   r   rP   ÚpytestÚraisesÚ
ValueErrorr:   )rD   rE   r)   r   rQ   rR   r3   r   r   r   Ú%test_spline_transformer_extrapolation'  sR    üþ	öÿüþ	öÿ   ÿ
r|   c                  C   sn   t j d¡} |  d¡ dd¡}d}|d }t|dddd�}| |¡}t|d	dd
�}| |¡}t||dd� dS )zCTest that a B-spline of degree=0 is equivalent to KBinsDiscretizer.iû| ra   r%   r   r   r>   T)r.   r)   r*   r/   zonehot-dense)Ún_binsÚencodeZstrategyg‚vIhÂ%<=rM   N)	r   r   ÚRandomStateZrandnr   r   r   r
   r   )Úrngr   r}   r.   r3   ZsplinesZkbdZkbinsr   r   r   Ú'test_spline_transformer_kbindiscretizer^  s       ÿ

r�   r/   TFc                 C   sP   t | ||d�}t ddd¡dd…df }| |¡ | |¡jd |jksLt‚dS )z8Test that transform results in n_features_out_ features.r-   r   r%   r   N)r   r   rA   r1   r:   r;   r9   r   )r.   r/   r)   r3   r   r   r   r   Ú&test_spline_transformer_n_features_outr  s    
r‚   zparams, err_msg)r`   r   z&degree=\(min_degree, max_degree\) must)r   g      ø?©r(   r   )r%   r   r(   z'int or tuple \(min_degree, max_degree\)c              	   C   s:   dgdgg}t jt|d�� tf | Ž |¡ W 5 Q R X dS )zBTest that we raise errors for invalid input in PolynomialFeatures.r%   r   ©ÚmatchN)ry   rz   r{   r   r1   )ÚparamsÚerr_msgr   r   r   r   Ú)test_polynomial_features_input_validation~  s    rˆ   c                  C   s@   t  d¡d d …t jf } t  t  | ¡| | d | d g¡}| |fS )NrW   r   r(   )r   r   ZnewaxisÚhstackZ	ones_like)r   ÚPr   r   r   Úsingle_feature_degree3�  s     r‹   z/degree, include_bias, interaction_only, indices©r   r(   Úsparse_Xc           
      C   sz   | \}}|r||ƒ}t |||d� |¡}| |¡}	|r>|	 ¡ }	t|	|dd…|f ƒ |jdkrv|jj|j|jfksvt	‚dS )z9Test PolynomialFeatures on single feature up to degree 3.©r)   r/   Úinteraction_onlyNr   ©
r   r1   r:   Útoarrayr   Ún_output_features_Zpowers_r;   Zn_features_in_r   )
r‹   r)   r/   r�   Úindicesr�   r   rŠ   ÚtfÚoutr   r   r   Ú$test_polynomial_features_one_feature–  s       ÿþ

r–   c                  C   sÖ   t  d¡ d¡} | d d …d d…f }| d d …dd …f }t  |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  g
¡}| |fS )NrW   rƒ   r%   r   r   r(   )r   r   r   r‰   )r   Úx1Úx2rŠ   r   r   r   Útwo_features_degree3¾  s"    öÿr™   )r   r   é   é	   ©r(   r(   c           
      C   sz   | \}}|r||ƒ}t |||d� |¡}| |¡}	|r>|	 ¡ }	t|	|dd…|f ƒ |jdkrv|jj|j|jfksvt	‚dS )z5Test PolynomialFeatures on 2 features up to degree 3.rŽ   Nr   r�   )
r™   r)   r/   r�   r“   r�   r   rŠ   r”   r•   r   r   r   Ú%test_polynomial_features_two_featuresÔ  s     &  ÿþ

r�   c                  C   sÆ  t  d¡ dd¡} tddd� | ¡}| ¡ }tddd	d
ddddddg
|ƒ t|ƒ| | ¡j	d ksft
‚tddd� | ¡}| dddg¡}tdddddddddddddd d!d"d#d$d%g|ƒ t|ƒ| | ¡j	d ksÔt
‚td&dd� | ¡}| dddg¡}tddddddddddd d!d"d#d$d%g|ƒ t|ƒ| | ¡j	d k�s>t
‚td'ddd(� | ¡}| dddg¡}tdd g|ƒ t|ƒ| | ¡j	d k�sŽt
‚tddd� | ¡}| d)d*d+g¡}tdd)d*d+g|ƒ d S ),Né   r   r(   r   T©r)   r/   Ú1Zx0r—   r˜   zx0^2zx0 x1zx0 x2zx1^2zx1 x2zx2^2r%   Fr   r0   Úcza^2za bza czb^2zb czc^2za^3za^2 bza^2 cza b^2za b cza c^2zb^3zb^2 czb c^2zc^3rŒ   rœ   rŽ   zF40Du   â˜®u   ×�)r   r   r   r   r1   r2   r   r8   r:   r;   r   )r   Úpolyr4   r   r   r   Útest_polynomial_feature_names  sŒ    þíêðí  ÿþr£   Údegr�   Údtypec           
      C   s‚   t j d¡}| ddd¡}t |¡}t| ||d�}| | |¡¡}| | |¡¡}	t	|tjƒsbt
‚|j|	jksrt
‚t|j|	ƒ d S )Nr   r   ©r?   r   ©r/   r�   )r   r   r   Úrandintr   Ú
csc_matrixr   r   ÚastypeÚ
isinstancer   r¥   r   ÚA)
r¤   r/   r�   r¥   r€   r   ZX_cscr   ZXt_cscÚXt_denser   r   r   Útest_polynomial_features_csc_XT  s    
  ÿr®   c           
      C   s†   t j d¡}| ddd¡}t |¡}t| ||d�}| | |¡¡}| |j|dd�¡}	t	|tjƒsft
‚|j|	jksvt
‚t|j|	ƒ d S )Nr   r   r¦   r§   F)Úcopy)r   r   r   r¨   r   Ú
csr_matrixr   r   rª   r«   r   r¥   r   r¬   )
r¤   r/   r�   r¥   r€   r   ÚX_csrr   ÚXt_csrr­   r   r   r   Útest_polynomial_features_csr_Xq  s    
  ÿr³   Ú
n_featureszmin_degree, max_degree)r   r%   )r   r   )r%   r(   )r   rY   )r(   rY   c           	      C   sl   t  dgdg| d gff¡}t|||d�}| |¡ |j}tj| d|||d�}|tdd„ |D ƒƒksht‚dS )z?
    Test that n_output_features_ is calculated correctly.
    r%   r   )r)   r�   r/   )r´   Ú
min_degreeÚ
max_degreer�   r/   c                 S   s   g | ]}d ‘qS )r%   r   )Ú.0r+   r   r   r   Ú
<listcomp>¬  s     z)test_num_combinations.<locals>.<listcomp>N)r   r°   r   r1   r’   Z_combinationsrB   r   )	r´   rµ   r¶   r�   r/   r]   r   Z
num_combosZcombosr   r   r   Útest_num_combinationsŒ  s     ý
ûr¹   c           	      C   sz   t ddddd� ¡ }| ¡ }t| ||d�}| | |¡¡}| | |¡¡}t|tjƒsZt	‚|j
|j
ksjt	‚t|j|ƒ d S )Néè  r   ç      à?r   ©Zrandom_stater§   )Úsparse_randomÚtocsrr‘   r   r   rª   r«   r   r°   r   r¥   r   r¬   )	r¤   r/   r�   r¥   r±   r   r   r²   r­   r   r   r   Ú%test_polynomial_features_csr_X_floats¯  s    
  ÿr¿   Úzero_row_index)r   r   T)r%   r   T)r   r   T)r   r(   T)r%   r(   T)r   r(   T)r   r   F)r%   r   F)r   r   F)r   r(   F)r%   r(   F)r   r(   Fc                 C   s~   t ddddd� ¡ }d|| d d …f< | ¡ }t|d|d�}| |¡}| |¡}t|tjƒs^t‚|j	|j	ksnt‚t
|j|ƒ d S )	Nr(   r   re   r   r¼   rd   Fr§   ©r½   r¾   r‘   r   r   r«   r   r°   r   r¥   r   r¬   )rÀ   r¤   r�   r±   r   r   r²   r­   r   r   r   Ú'test_polynomial_features_csr_X_zero_rowÇ  s    

rÂ   )TT)FFc                 C   sn   t ddddd� ¡ }| ¡ }td| |d�}| |¡}| |¡}t|tjƒsNt‚|j	|j	ks^t‚t
|j|ƒ d S )Nrº   r   r»   r   r¼   rY   r§   rÁ   )r/   r�   r±   r   r   r²   r­   r   r   r   Ú'test_polynomial_features_csr_X_degree_4è  s      ÿ

rÃ   Údim)r   r%   T)r(   r%   T)r(   r   T)r(   r(   T)r   r%   F)r(   r%   F)r(   r   F)r(   r(   Fc                 C   sl   t d|ddd� ¡ }| ¡ }t| |d�}| |¡}| |¡}t|tjƒsLt‚|j	|j	ks\t‚t
|j|ƒ d S )Nrº   r»   r   r¼   )r�   rÁ   )r¤   rÄ   r�   r±   r   r   r²   r­   r   r   r   Ú(test_polynomial_features_csr_X_dim_edgesû  s    

rÅ   c               	   C   sÔ   t  d¡} tddd�}d}tjt|d�� | | ¡ W 5 Q R X tddd�}d}tjt|d�� | | ¡ W 5 Q R X | t | ¡t 	| ¡fD ]F}tdd	d�}| |¡}t 
|¡r´| ¡ }t|t  | jd d
f¡ƒ qˆdS )z”Check that PolynomialFeatures raises error when degree=0 and include_bias=False,
    and output a single constant column when include_bias=True
    )r   r   r   FrŸ   zWSetting degree to zero and include_bias to False would result in an empty output array.r„   )r   r   zoSetting both min_degree and max_degree to zero and include_bias to False would result in an empty output array.Tr%   N)r   Zonesr   ry   rz   r{   r   r   r°   r©   Úissparser‘   r   r;   )r   r¢   r‡   Z_XÚoutputr   r   r   Ú1test_polynomial_features_behaviour_on_zero_degree  s"    
ÿÿ

rÈ   )>Únumpyr   ry   Zscipyr   Zscipy.sparser   r½   Zsklearn.utils._testingr   Znumpy.testingr   r   Zscipy.interpolater   Zsklearn.linear_modelr   Zsklearn.pipeliner	   Zsklearn.preprocessingr
   r   r   ÚmarkZparametrizer    r,   r5   r<   rr   rC   rS   rZ   r[   rb   rj   ro   rw   r|   r�   r‚   rˆ   Zfixturer‹   Úslicer°   r©   r–   r™   r�   r£   ÚintZfloat32Zfloat64r®   r³   r¹   r¿   rÂ   rÃ   rÅ   rÈ   r   r   r   r   Ú<module>   sŒ  

	&
þ

"ü("üöþ


&5	



üþ	


øþþ

ìþþL


øþ



úþ
 ÿ
üþ	
ôþ

þ
öþ
