U
    _»{jÍ¡  ã                   @   sÂ	  d dl Z d dlZd dl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 d dlmZ d dlmZmZmZ d d	lmZmZmZ d d
lmZ d dlmZmZ ej  deef¡dd„ ƒZ!ej  dddggidfdddgddggidfddgd ggidfg¡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/d0„ ƒZ(ej  dd&d1d2gd'd"de )d dgd"d3gd4d5gg¡fd'd"e )d d ddd d"dg¡e )ddgd6d3gd4d5gg¡fd'd6de )d dgdd4gd6d7gd4d5gg¡fd(d"de )d dgd"d"gd4d5gg¡fd(d"e )d d ddd d"dg¡e )ddgd%d3gd4d5gg¡fg¡d8d9„ ƒZ*ej  d+d,gd-d.g¡d:d;„ ƒZ+d<d=„ Z,d>d?„ Z-ej  d!d"d%g¡d@dA„ ƒZ.ej  d+d,gd-d.g¡ej  d!ddd"d6d%g¡dBdC„ ƒƒZ/dDdE„ Z0ejj1eedFƒk dGdH�ej  d!e&dd"ƒ¡ej  dd'd(g¡ej  ddIdd ddg¡ej  dJdKdLg¡dMdN„ ƒƒƒƒƒZ2ejj1eedFƒkdGdH�dOdP„ ƒZ3ej  d&d%d7g¡ej  dJdLdKg¡ej  d!d"d6g¡ej  ddIdd ddg¡ej  dQdKdLg¡dRdS„ ƒƒƒƒƒZ4ej  dd!dTidUfd!dVidUfd!dWidUfd!dXidYfg¡dZd[„ ƒZ5e 6¡ d\d]„ ƒZ7ej  d^d"dLdKe8ddƒfd"dKdKe8ddƒfd"dLdLd dgfd"dKdLdgfd_dLdKd dd"gfd_dKdKdd"gfd_dLdLd gfd_dKdLg fg¡ej  d`dKej9ej:g¡dadb„ ƒƒZ;e 6¡ dcdd„ ƒZ<ej  d^ddLdKe8d d4ƒfddKdKe8dd4ƒfddLdLd ddd6gfddKdLddd6gfdedLdKd d"d6d%gfdedKdKd"d6d%gfdedLdLd d6gfdedKdLd6gfd"dLdKe8ddƒfd"dKdKe8ddƒfd"dLdLd ddd6gfd"dKdLddd6gfd_dLdKd d"d6d%d4dfd3dggfd_dKdKe8d"dƒfd_dLdLd d6gfd_dKdLd6gfdhdLdKd d4dfd3dggfdhdKdKd4dfd3dggfdhdLdLd gfdhdKdLg fg¡ej  d`dKej9ej:g¡didj„ ƒƒZ=dkdl„ Z>ej  dmdJdndogddLdKe?fddLdKe?fddLdKej@fddLdKejAfd"dKdKejAfd"dKdLejAfd6dKdKejAfd6dKdLejAfg¡dpdq„ ƒZBej  dmdJdndogddLdKe?fddLdKe?fddLdKej@fddLdKejAfd"dKdKejAfd"dKdLejAfg¡drds„ ƒZCej  dtdd6d%g¡ej  dudvdwdxdydzg¡ej  dndLdKg¡ej  dJdLdKg¡d{d|„ ƒƒƒƒZDej  dmdJdndogddLdKej@fddLdKejAfd"dKdKejAfd"dKdLejAfg¡d}d~„ ƒZEej  ddmdngd€d�d‚dƒd„d…d†d‡dˆd‰dŠd‹g¡dŒd�„ ƒZFej  dJdngdŽd-d.d�g¡d�d‘„ ƒZGej  dmd’dngd“d‚d”d•d–d—dˆd˜d™dšg
¡d›dœ„ ƒZHej  dndLdKg¡ej  dJdLdKg¡d�dž„ ƒƒZIej  dŸd d¡de?e Je KejL¡jM¡d ƒfd¢de?e Je KejL¡jM¡ƒfg¡ej  dndLdKg¡ej  dJdLdKg¡d£d¤„ ƒƒƒZNej  dndLdKg¡ej  dJdLdKg¡d¥d¦„ ƒƒZOd§d¨„ ZPd©dª„ ZQejjRe jSd«kd¬dLd­�d®d¯„ ƒZTdS )°é    N)Úassert_allcloseÚassert_array_equal)Úsparse)ÚBSpline)Úrandom)ÚLinearRegression)ÚPipeline)ÚKBinsDiscretizerÚPolynomialFeaturesÚSplineTransformer)Ú_calc_expanded_nnzÚ_calc_total_nnzÚ_get_sizeof_LARGEST_INT_t)Úassert_array_almost_equal)Úparse_versionÚ
sp_versionÚ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   új/var/www/html/bwave/python/venv/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%   zparams, err_msgÚknotsé   z0Number of knots, knots.shape\[0\], must be >= 2.r   z*knots.shape\[1\] == n_features is violatedz(knots must be sorted without duplicates.c              	   C   s:   dgdgg}t jt|d�� tf | Ž |¡ W 5 Q R X dS )zATest that we raise errors for invalid input in SplineTransformer.r'   r   ©ÚmatchN©ÚpytestÚraisesÚ
ValueErrorr   Úfit©ÚparamsÚerr_msgr$   r   r   r   Ú(test_spline_transformer_input_validation'   s    
r2   Ú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'   r   é   é   é   )Údegreer&   r3   N)r   r    r!   r   r"   )r3   r$   r&   Ú_r   r   r   Ú%test_spline_transformer_integer_knots7   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.r6   r   r   r9   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   r.   Úget_feature_names_outr   )r$   ÚspltÚfeature_namesr   r   r   Ú%test_spline_transformer_feature_namesA   s>    öþøþrC   ÚconstantÚlinearr:   r9   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.
    r6   r   r   )r:   r3   r   r?   r'   N)r   r    r!   r   r.   r@   ÚlenÚn_features_out_r#   Ú	transformÚshape)r3   r:   r$   rA   rB   ÚX_transr   r   r   Ú7test_split_transform_feature_names_extrapolation_degreeg   s    

rK   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   r5   T)r=   r:   r&   r>   r3   ©Zaxis)r   ÚlinspaceÚr_r   r.   r   ÚsumrH   )r:   r=   r&   r3   r$   ZX_trainZX_testrA   r   r   r   Ú+test_spline_transformer_unity_decompositionz   s    	*û
rS   Ú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   rN   Nr   Úsplineé   r9   rD   ©r=   r:   r>   r3   Úols©Zfit_intercept©Zstepsçü©ñÒMbP?©Úrtol)	r   rP   Úsinr   r   r   r.   r   Úpredict)rT   rU   r$   ÚyÚpiper   r   r   Ú)test_spline_transformer_linear_regression—   s     üþ	öÿrc   Ú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 )zJCheck the behaviour to find knot positions with and without sample_weight.r   r   r9   ri   rg   r   rf   rh   )r$   r&   r=   rd   N)r   Úarrayr   Z_get_base_knot_positionsr   )r&   r=   rd   re   r$   Z
base_knotsr   r   r   Ú/test_spline_transformer_get_base_knot_positions®   s    4   ÿrk   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   rf   r9   )r   r_   Úpi)Úxr   r   r   ÚfÒ   s    z=test_spline_transformer_periodic_linear_regression.<locals>.fr   r'   ée   NrV   r6   r9   r5   rX   rY   rZ   r[   éÿÿÿÿr   i-  g{®Gáz„?)Zatolr^   rN   éÈ   r\   r]   )r   rP   r   r   r   r.   r`   r   )rT   rU   rn   r$   rb   ZX_Zpredictionsr   r   r   Ú2test_spline_transformer_periodic_linear_regressionÍ   s&    üþ	öÿ
 rr   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   r5   g      ð¿ç        ç      ð?©r:   r3   r&   éýÿÿÿri   r   )r   rP   r   r"   rj   r   r    r   )r$   r:   ÚtransformerÚXtZcoefZsplZXsplr   r   r   Ú0test_spline_transformer_periodic_spline_backportí   s      ÿ
"rz   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 )zJTest if shifted knots result in the same transformation up to permutation.r   r   ro   Nr9   r5   rt   ru   ç      @ç      @ç      @ç       @rv   g      "@ri   r'   r   )r   rP   r   r"   r   )r$   Ztransformer_1Ztransformer_2ZXt_1ZXt_2r   r   r   Ú4test_spline_transformer_periodic_splines_periodicityÿ   s    ýý

r   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.rs   r   i'  Nr5   rt   ru   r{   r|   r}   r~   rv   r'   r   rO   )r   rP   r   r"   ÚmaxÚminrF   ÚrangeÚdiffÚabsr#   )	r:   r$   rx   ry   ÚdeltaZtolZdXtÚdrƒ   r   r   r   Ú3test_spline_transformer_periodic_splines_smoothness  s     ý


r‡   c              	   C   s0  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�}| |¡ d}t	j
t|d�� | dgg¡ W 5 Q R X t	j
t|d�� | dgg¡ W 5 Q R X dS )z1Test that B-spline extrapolation works correctly.rp   r'   rN   NrV   ri   rD   rX   rY   rZ   iöÿÿÿr   rE   Úerrorú0X contains values beyond the limits of the knotsr(   )r   rP   Zsqueezer   r   r   r.   r   r`   r+   r,   r-   rH   )rT   rU   r:   r$   ra   rb   rA   Úmsgr   r   r   Ú%test_spline_transformer_extrapolation<  sT    üþ	öÿüþ	öÿ   ÿ
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û| rq   r'   r   r   rM   T)r=   r:   r&   r>   zonehot-dense)Ún_binsÚencodeZstrategyg‚vIhÂ%<=r]   N)	r   r   ÚRandomStateÚrandnr!   r   r"   r	   r   )Úrngr$   rŒ   r=   rA   ZsplinesZkbdZkbinsr   r   r   Ú'test_spline_transformer_kbindiscretizert  s       ÿ

r‘   ú1.8.0ú9The option `sparse_output` is available as of scipy 1.8.0)Úreasonrˆ   r>   FTc              	   C   sP  t j |¡}| d¡ dd¡}t| |||dd�}t| |||dd�}| |¡ | |¡ | |¡}	| |¡}
t 	|	¡r~|	j
dks‚t‚t|
|	 ¡ ƒ t j|dd	�}t j|dd	�}t jt  |d |d
¡t  ||d d
¡f }|dk�r2d}tjt|d�� | |¡ W 5 Q R X d}tjt|d�� | |¡ W 5 Q R X nt| |¡| |¡ ¡ ƒ d S )Nrq   é(   r   F)r:   r&   r3   r>   Úsparse_outputTÚcsrr   rO   r   rˆ   r‰   r(   zOut of bounds)r   r   rŽ   r�   r!   r   r.   rH   r   ÚissparseÚformatr#   r   ÚtoarrayZaminZamaxrQ   rP   r+   r,   r-   )r:   r&   r3   r>   Zglobal_random_seedr�   r$   Z
splt_denseZsplt_sparseZX_trans_sparseZX_trans_denseZX_minZX_maxZX_extrarŠ   r   r   r   Ú%test_spline_transformer_sparse_outputˆ  sL    ûû



"ÿ
 ÿr›   c               	   C   s:   dgdgg} t jtdd�� tdd� | ¡ W 5 Q R X dS )zDTest that SplineTransformer with sparse=True raises for scipy<1.8.0.r'   r   zscipy>=1.8.0r(   T)r–   Nr*   )r$   r   r   r   Ú?test_spline_transformer_sparse_output_raise_error_for_old_scipyÂ  s    rœ   r–   c                 C   sn   |rt tdƒk rt d¡ t| ||||d�}t ddd¡dd…df }| |¡ | |¡j	d |j
ksjt‚dS )z8Test that transform results in n_features_out_ features.r’   r“   )r=   r:   r>   r3   r–   r   r'   r   N)r   r   r+   Úskipr   r   rP   r.   rH   rI   rG   r#   )r=   r>   r:   r3   r–   rA   r$   r   r   r   Ú&test_spline_transformer_n_features_outÍ  s    
û
rž   )rp   r   z&degree=\(min_degree, max_degree\) must)r   g      ø?©r9   r   )r'   r   r9   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   r(   N)r+   r,   r-   r
   r.   r/   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 )Nrg   r   r9   )r   r    ZnewaxisÚhstackZ	ones_like)r$   ÚPr   r   r   Úsingle_feature_degree3ù  s     r£   z/degree, include_bias, interaction_only, indices©r   r9   Ú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
   r.   rH   rš   r   Ún_output_features_Zpowers_rI   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 )Nrg   rŸ   r'   r   r   r9   )r   r    r!   r¡   )r$   Úx1Úx2r¢   r   r   r   Útwo_features_degree3(  s"    öÿr°   ©r   r   é   é	   ©r9   r9   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   r9   r   T©r:   r>   Ú1Zx0r®   r¯   zx0^2zx0 x1zx0 x2zx1^2zx1 x2zx2^2r'   Fr   r?   Ú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
   r.   r@   r   rF   rH   rI   r#   )r$   ÚpolyrB   r   r   r   Útest_polynomial_feature_namesr  sŒ    þíêðí  ÿþr»   Údegr§   Údtypec           
      C   sŒ   t j d¡}| ddd¡}t |¡}t| ||d�}| | |¡¡}| | |¡¡}	t 	|¡rf|j
dksjt‚|j|	jkszt‚t| ¡ |	ƒ d S )Nr   r   ©rN   r   ©r>   r§   Zcsc)r   r   rŽ   Úrandintr   Ú
csc_matrixr
   r"   Úastyper˜   r™   r#   r½   r   rš   )
r¼   r>   r§   r½   r�   r$   ZX_cscr   ZXt_cscÚXt_denser   r   r   Útest_polynomial_features_csc_X¾  s    
  ÿrÄ   c           
      C   s�   t j d¡}| ddd¡}t |¡}t| ||d�}| | |¡¡}| |j|dd�¡}	t 	|¡rj|j
dksnt‚|j|	jks~t‚t| ¡ |	ƒ d S )Nr   r   r¾   r¿   F)Úcopyr—   )r   r   rŽ   rÀ   r   Ú
csr_matrixr
   r"   rÂ   r˜   r™   r#   r½   r   rš   )
r¼   r>   r§   r½   r�   r$   ÚX_csrr   ÚXt_csrrÃ   r   r   r   Útest_polynomial_features_csr_XÛ  s    
  ÿrÉ   Ú
n_featureszmin_degree, max_degree)r   r'   )r   r   )r'   r9   )r   ri   )r9   ri   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
   r.   r©   Z_combinationsrR   r#   )	rÊ   rÌ   rÍ   r§   r>   rm   r   Z
num_combosZcombosr   r   r   Útest_num_combinationsö  s     ý
ûrÐ   c           	      C   s„   t ddddd� ¡ }| ¡ }t| ||d�}| | |¡¡}| | |¡¡}t |¡r^|jdksbt	‚|j
|j
ksrt	‚t| ¡ |ƒ d S )Néè  r   ç      à?r   ©Zrandom_stater¿   r—   )Úsparse_randomÚtocsrrš   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   r9   T)r'   r9   T)r   r9   T)r   r   F)r'   r   F)r   r   F)r   r9   F)r'   r9   F)r   r9   Fc                 C   sˆ   t ddddd� ¡ }d|| d d …f< | ¡ }t|d|d�}| |¡}| |¡}t |¡rb|jd	ksft‚|j	|j	ksvt‚t
| ¡ |ƒ d S )
Nr9   r   ru   r   rÓ   rt   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_row1  s    

rÙ   )TT)FFc                 C   sx   t ddddd� ¡ }| ¡ }td| |d�}| |¡}| |¡}t |¡rR|jdksVt‚|j	|j	ksft‚t
| ¡ |ƒ d S )	NrÑ   r   rÒ   r   rÓ   ri   r¿   r—   rØ   )r>   r§   rÇ   r$   r   rÈ   rÃ   r   r   r   Ú'test_polynomial_features_csr_X_degree_4R  s      ÿ

rÚ   Údim)r   r'   T)r9   r'   T)r9   r   T)r9   r9   T)r   r'   F)r9   r'   F)r9   r   F)r9   r9   Fc                 C   sv   t d|ddd� ¡ }| ¡ }t| |d�}| |¡}| |¡}t |¡rP|jdksTt‚|j	|j	ksdt‚t
| ¡ |ƒ d S )NrÑ   rÒ   r   rÓ   ©r§   r—   rØ   )r¼   rÛ   r§   rÇ   r$   r   rÈ   rÃ   r   r   r   Ú(test_polynomial_features_csr_X_dim_edgese  s    

rÝ   c              	      sl  ‡ fdd„}d}d}t j}t jddt jd�}t  |d |d |d |d g¡}t j|d |d |d |d gt jd�}tj|||ff||f|d	�}	tˆ |dd
�}
|
j|dd|
j	|
j
d�}|t  t j¡jkröd}tjt|d�� |
 |	¡ W 5 Q R X dS |
 |	¡}| ¡ \}}|| }|||tˆ  ƒ |d ƒ| }|�rFdg|d  ng }|�r^dg|d  ng }tdƒD �]}|d|  }|d| d  }|d|  }|d| d  }|�rÂ| d¡ | d¡ | ||g¡ | |t|ƒ |t|ƒ g¡ ˆ �sF| || || || g¡ | ||||ƒ| ||||ƒ| ||||ƒ| g¡ n&| || g¡ | ||||ƒ| ¡ �qjt|ƒd dtˆ  ƒ  }|
j|d k�sžt‚|j|k�s®t‚|j||d fk�sÆt‚|jj|jj  k�rèt jk�sîn t‚|j ¡ t  t j¡jk�st‚|�r"tt|d ƒƒng }| |d g| |d g|  ¡ t |j!|ƒ t"||ƒ t"||ƒ dS )a°  Check the automatic index dtype promotion to `np.int64` when needed.

    This ensures that sufficiently large input configurations get
    properly promoted to use `np.int64` for index and indptr representation
    while preserving data integrity. Non-regression test for gh-16803.

    Note that this is only possible for Python runtimes with a 64 bit address
    space. On 32 bit platforms, a `ValueError` is raised instead.
    c                    sH   ˆ r(| | |d d|  d  d | S | | |d | d  | S d S )Nr   r9   r'   r   )r†   ÚiÚjrÜ   r   r   Údegree_2_calc�  s    $zRtest_csr_polynomial_expansion_index_overflow_non_regression.<locals>.degree_2_calcé   iÁÔ r'   r   )r½   r   )rI   r½   ©r§   r>   r:   r   rË   útThe output that would result from the current configuration would have \d* features which is too large to be indexedr(   Nr9   )#r   Úfloat32r    Úint64rj   r   rÆ   r
   Ú_num_combinationsr§   r>   ÚiinfoÚintpr€   r+   r,   r-   r.   r"   ZnonzeroÚintr‚   ÚappendÚextendr©   r#   r½   rI   Úindptrrª   Úint32Úlistr   Údatar   )r§   r>   rà   Z	n_samplesrÊ   Z
data_dtyperï   ÚrowÚcolr$   ÚpfÚnum_combinationsrŠ   rJ   Zrow_nonzeroZcol_nonzeroZn_degree_1_features_outZmax_degree_2_idxZdata_targetZcol_nonzero_targetrÞ   rm   ra   Zx_idxZy_idxZnnz_per_rowZrow_nonzero_targetr   rÜ   r   Ú;test_csr_polynomial_expansion_index_overflow_non_regression�  sž    " ÿ
ý  ÿûÿ
ÿÿ

ÿýÿÿ(ÿ
rô   zdegree, n_features)r   éÿÿ  )r9   i(	  )r9   rõ   c              	   C   s,  dg}dg}|d g}|d t |ƒ g}| ||d  d |d  ¡ | ||d  |d  d |d  ¡ t |||ff¡}t||| d�}	|	j|d| |	j|	jd�}
|
t 	tj
¡jkrâd}tjt|d	�� |	 |¡ W 5 Q R X d
S ttdƒk �ržd}t 	tj¡j}|| }td| d ƒD ]R}t|j||ƒ}t|||ƒd }||d 7 }t||ƒ|k}|| �od||kO }�q|�ržd}tjt|d	�� |	 |¡}W 5 Q R X d
S ttdƒk �rò|dk�rò| dk�rò|�sòd}tjt|d	�� |	 |¡}W 5 Q R X d
S |	 |¡}|
t 	tj¡jk�rtjntj}d| d t | ƒ  }t |ƒ| }|j|jk�sPt‚|jd|	jfk�sft‚|jj|jj  k�r†|k�sŒn t‚|j|k�sœt‚|�rº|d t d¡k�sºt‚t|ƒD ]&}|d|| f t d¡k�sÂt‚�qÂ|| }| dk�r|d| 9 }|	j|| d  d | k�s(t‚d
S )zšTests known edge-cases to the dtype promotion strategy and custom
    Cython code, including a current bug in the upstream
    `scipy.sparse.hstack`.
    ru   r   r'   r   rg   râ   rË   rã   r(   Nr’   Fz>In scipy versions `<1.8.0`, the function `scipy.sparse.hstack`z1.9.2rõ   z>In scipy versions `<1.9.2`, the function `scipy.sparse.hstack`©r   r   r9   ) ré   rê   r   rÆ   r
   ræ   r§   r>   r   rç   rè   r€   r+   r,   r-   r.   r   r   rí   r‚   r   rì   r   r"   rå   r½   r#   rI   r©   rª   ZnnzÚapprox)r:   rÊ   r§   r>   rï   rð   rñ   Úexpected_indicesr$   rò   ró   rŠ   Zhas_bugZ	max_int32Zcumulative_sizer¼   Z
max_indptrZmax_indicesZneeds_int64rJ   Zexpected_dtypeZnon_bias_termsZexpected_nnzÚidxÚoffsetr   r   r   Ú,test_csr_polynomial_expansion_index_overflowõ  sŽ    
ÿÿ  ÿûÿ
ÿþýü
 &$
rû   c           	   	   C   s˜   t  t j¡jd }dg}dg}|d g}t |||ff¡}t| |dd�}d}tjt	|d�� | 
|¡ W 5 Q R X tjt	|d�� | |¡ W 5 Q R X d S )	Nr   ru   r   r'   r±   râ   rã   r(   )r   rç   rå   r€   r   rÆ   r
   r+   r,   r-   r.   r"   )	r§   r>   rÊ   rï   rð   rñ   r$   rò   rŠ   r   r   r   Ú0test_csr_polynomial_expansion_too_large_to_indexl  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ö   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
   r+   r,   r-   r"   r   rÆ   rÁ   r˜   rš   r   rI   )r$   rº   r1   Z_XÚoutputr   r   r   Ú1test_polynomial_features_behaviour_on_zero_degree�  s"    
ÿÿ

rþ   c                  C   s:   t jdkst jdkr$t jdkr$d} nd} tƒ | ks6t‚d S )NÚwin32ì        Z
emscriptenrf   é   )ÚsysÚplatformÚmaxsizer   r#   )Zexpected_sizer   r   r   Útest_sizeof_LARGEST_INT_tŸ  s    
ÿÿr  rÿ   zyOn Windows, scikit-learn is typically compiled with MSVC that does not support int128 arithmetic (at the time of writing))r”   Úrunc            
   	   C   s  t t tj¡jd d ƒ} dg}dg}| d g}| d g}| t | | d  d |d  ƒ¡ | t | | d  | d  d |d  ƒ¡ t |||ff¡}tdddd	�}t	j
d
krÚd}tjt|d�� | |¡ W 5 Q R X n6| |¡}tdƒD ]"}	|d||	 f t d¡ksìt‚qìd S )NgUUUUUUÕ?r9   ru   r   r'   r   rg   Frâ   r   rã   r(   )ré   r   rç   rå   r€   rê   r   rÆ   r
   r  r  r+   r,   r-   r"   r‚   r÷   r#   )
rÊ   rï   rð   rñ   rø   r$   rò   rŠ   rJ   rù   r   r   r   Ú*test_csr_polynomial_expansion_windows_fail­  s,    
ÿÿ"ÿ
ÿ
r  )Ur  Únumpyr   r+   Znumpy.testingr   r   Zscipyr   Zscipy.interpolater   Zscipy.sparser   rÔ   Zsklearn.linear_modelr   Zsklearn.pipeliner   Zsklearn.preprocessingr	   r
   r   Z/sklearn.preprocessing._csr_polynomial_expansionr   r   r   Zsklearn.utils._testingr   Zsklearn.utils.fixesr   r   ÚmarkZparametrizer%   r2   r<   rC   rK   r‚   rS   rc   rj   rk   rr   rz   r   r‡   r‹   r‘   Zskipifr›   rœ   rž   r    Zfixturer£   ÚslicerÆ   rÁ   r­   r°   rµ   r»   ré   rä   Zfloat64rÄ   rÉ   rÐ   rÖ   rÙ   rÚ   rÝ   rô   Úsqrtrç   rå   r€   rû   rü   rþ   r  Zxfailr  r  r   r   r   r   Ú<module>   s   
ýþ

	&
þ

"ü("üöþ


&6
þ ÿ0
þ
 ÿ



üþ	


øþþ

ìþþL


øþ



úþ
 ÿ
üþ	
ôþ

þ
öþ
rõþeú