a
    �ù»jV«  ã                   @   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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g d¢¡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! "g d1¢d&d!de +d dgd!d2gd3d4gg¡fd&d!e +g d5¢¡e +ddgd6d2gd3d4gg¡fd&d6de +d dgdd3gd6d7gd3d4gg¡fd'd!de +d dgd!d!gd3d4gg¡fd'd!e +g d5¢¡e +ddgd$d2gd3d4g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„ ƒZ0ej! "d+d,gd-d.g¡ej! "d g dB¢¡dCdD„ ƒƒZ1dEdF„ Z2ej!j3e edGƒk dHdI�ej! "d e(dd!ƒ¡ej! "dd&d'g¡ej! "dg dJ¢¡ej! "dKdLdMg¡dNdO„ ƒƒƒƒƒZ4ej!j3e edGƒkdHdI�dPdQ„ ƒZ5ej! "d%d$d7g¡ej! "dKdMdLg¡ej! "d d!d6g¡ej! "dg dJ¢¡ej! "dRdLdMg¡dSdT„ ƒƒƒƒƒZ6ej! "dd dUidVfd dWidVfd dXidVfd dYidZfg¡d[d\„ ƒZ7e 8¡ d]d^„ ƒZ9ej! "d_d!dMdLe:ddƒfd!dLdLe:ddƒfd!dMdMd dgfd!dLdMdgfd`dMdLg da¢fd`dLdLdd!gfd`dMdMd gfd`dLdMg fg¡ej! "dbdge e ¡dcdd„ ƒƒZ;e 8¡ dedf„ ƒZ<ej! "d_ddMdLe:d d3ƒfddLdLe:dd3ƒfddMdMg dg¢fddLdMg dh¢fdidMdLg dj¢fdidLdLg dk¢fdidMdMd d6gfdidLdMd6gfd!dMdLe:ddƒfd!dLdLe:ddƒfd!dMdMg dg¢fd!dLdMg dh¢fd`dMdLg dl¢fd`dLdLe:d!dƒfd`dMdMd d6gfd`dLdMd6gfdmdMdLg dn¢fdmdLdLg do¢fdmdMdMd gfdmdLdMg fg¡ej! "dbdge e ¡dpdq„ ƒƒZ=drds„ Z>ej! "g dt¢ddMdLe?fddMdLe?fddMdLej@fddMdLejAfd!dLdLejAfd!dLdMejAfd6dLdLejAfd6dLdMejAfg¡ej! "due¡dvdw„ ƒƒZBej! "g dt¢ddMdLe?fddMdLe?fddMdLej@fddMdLejAfd!dLdLejAfd!dLdMejAfg¡ej! "dxe¡dydz„ ƒƒZCej! "d{g d|¢¡ej! "d}g d~¢¡ej! "ddMdLg¡ej! "dKdMdLg¡ej! "dxe¡d€d�„ ƒƒƒƒƒZDej! "g dt¢ddMdLej@fddMdLejAfd!dLdLejAfd!dLdMejAfg¡ej! "dxe¡d‚dƒ„ ƒƒZEej! "g d„¢g d…¢¡ej! "dxe¡d†d‡„ ƒƒZFej! "dKdgg dˆ¢¡ej! "dxe¡d‰dŠ„ ƒƒZGej! "g d‹¢g dŒ¢¡ej! "dxe¡d�dŽ„ ƒƒZHej! "ddMdLg¡ej! "dKdMdLg¡ej! "dxe¡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! "ddMdLg¡ej! "dKdMdLg¡ej! "dxe¡d•d–„ ƒƒƒƒZNej! "ddMdLg¡ej! "dKdMdLg¡ej! "dxe¡d—d˜„ ƒƒƒZOej! "d™ee ¡dšd›„ ƒZPdœd�„ ZQej!jRe jSdžkdŸdMd �ej! "dxe¡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)ÚCSC_CONTAINERSÚCSR_CONTAINERSÚparse_versionÚ
sp_versionÚestc                 C   sd   t  d¡ dd¡}dd„ }|| ƒ  |¡ƒs.J ‚|| dd� |¡ƒsFJ ‚t  | dd� |¡¡s`J ‚d	S )
z+Test that output array has the given order.é
   é   é   c                 S   s   t  | j¡S )N)ÚnpÚ	isfortranÚT)Úa© r   úQE:\soccer\ml_env\Lib\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_transformr   )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   sR   dgdgg}t jt|d��$ tf i | ¤Ž |¡ W d  ƒ n1 sD0    Y  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    
r3   Ú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'   r4   N)r   r"   r#   r   r$   )r4   r%   r'   Ú_r   r   r   Ú%test_spline_transformer_integer_knots<   s    "ÿþr=   c                  C   sp   t  d¡ dd¡} tdddd� | ¡}| ¡ }t|g d¢ƒ tdddd� | ¡}| d	d
g¡}t|g d¢ƒ dS )z<Test that SplineTransformer generates correct features name.r7   r   r   r:   T)Ún_knotsr;   Úinclude_bias)
Z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   Úb)Z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_namesF   s    þþrD   )ÚconstantÚlinearr5   r6   r;   r:   c                 C   sh   t  d¡ dd¡}t|| d� |¡}| ddg¡}t|ƒ|jksDJ ‚| |¡}|j	d t|ƒksdJ ‚dS )	zsTest feature names are correct for different extrapolations and degree.

    Non-regression test for gh-25292.
    r7   r   r   )r;   r4   r   r@   r(   N)
r   r"   r#   r   r/   rA   ÚlenÚn_features_out_Ú	transformÚshape)r4   r;   r%   rB   rC   ÚX_transr   r   r   Ú7test_split_transform_feature_names_extrapolation_degreel   s    

rL   r   r>   ÚuniformÚquantilerE   c                 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   r6   T)r>   r;   r'   r?   r4   ©Zaxis)r   ÚlinspaceÚr_r   r/   r   ÚsumrI   )r;   r>   r'   r4   r%   ZX_trainZX_testrB   r   r   r   Ú+test_spline_transformer_unity_decomposition   s    	*û
rT   Ú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   rO   Nr   Úsplineé   r:   rE   ©r>   r;   r?   r4   Úols©Zfit_intercept©Zstepsçü©ñÒMbP?©Úrtol)	r   rQ   Úsinr   r   r   r/   r   Úpredict)rU   rV   r%   ÚyÚpiper   r   r   Ú)test_spline_transformer_linear_regressionœ   s     üþ	öÿrf   )r'   r>   Úsample_weightÚexpected_knotsé   é   é   )r   r   r(   r(   r   r:   r(   é   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   r:   rl   rj   r   ri   rk   )r%   r'   r>   rg   N)r   Úarrayr   Z_get_base_knot_positionsr   )r'   r>   rg   rh   r%   Z
base_knotsr   r   r   Ú/test_spline_transformer_get_base_knot_positions³   s
    4ÿrn   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   ri   r:   )r   rb   Úpi)Úxr   r   r   Úf×   s    z=test_spline_transformer_periodic_linear_regression.<locals>.fr   r(   ée   NrY   r7   r:   r6   r[   r\   r]   r^   éÿÿÿÿr   i-  g{®Gáz„?)Zatolra   rO   éÈ   r_   r`   )r   rQ   r   r   r   r/   rc   r   )rU   rV   rq   r%   re   ZX_Zpredictionsr   r   r   Ú2test_spline_transformer_periodic_linear_regressionÒ   s&    üþ	öÿ
 ru   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   r6   g      ð¿ç        ç      ð?©r;   r4   r'   éýÿÿÿrl   r   )r   rQ   r   r$   rm   r   r"   r   )r%   r;   ÚtransformerÚXtZcoefZsplZXsplr   r   r   Ú0test_spline_transformer_periodic_spline_backportò   s    ÿ
"r}   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…g d¢f ƒ dS )zJTest if shifted knots result in the same transformation up to permutation.r   r   rr   Nr:   r6   rw   rx   ç      @ç      @ç      @ç       @ry   g      "@)rl   r   r(   r   r:   )r   rQ   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¤J ‚|| }q|t j|dd�}t  	|¡ ¡ dksÒJ ‚dS )z?Test that spline transformation is smooth at first / last knot.rv   r   i'  Nr6   rw   rx   r~   r   r€   r�   ry   r(   r   rP   )
r   rQ   r   r$   ÚmaxÚminrG   ÚrangeÚdiffÚabs)	r;   r%   r{   r|   ÚdeltaZtolZdXtÚdr†   r   r   r   Ú3test_spline_transformer_periodic_splines_smoothness  s     ý


rŠ   )r(   r   r:   rl   r   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�}| |¡ d}t	j
t|d�� | dgg¡ W d  ƒ n1 �s0    Y  t	j
t|d�� | dgg¡ W d  ƒ n1 �sN0    Y  dS )z1Test that B-spline extrapolation works correctly.rs   r(   rO   NrY   rl   rE   r[   r\   r]   iöÿÿÿr   rF   Úerrorú0X contains values beyond the limits of the knotsr)   )r   rQ   Zsqueezer   r   r   r/   r   rc   r,   r-   r.   rI   )rU   rV   r;   r%   rd   re   rB   Úmsgr   r   r   Ú%test_spline_transformer_extrapolationA  sN    üþ	öÿüþ	öÿÿ
.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û| rt   r(   r   r   rN   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>   rB   ZsplinesZkbdZkbinsr   r   r   Ú'test_spline_transformer_kbindiscretizery  s    ÿ

r”   ú1.8.0ú9The option `sparse_output` is available as of scipy 1.8.0)Úreason)r‹   rE   rF   r5   r6   r?   FTc                 C   s|  t j |¡}| d¡ dd¡}t| |||dd�}t| |||dd�}| |¡ | |¡ | |¡}	| |¡}
t 	|	¡r~|	j
dks‚J ‚t|
|	 ¡ ƒ t j|dd	�}t j|dd	�}t jt  |d |d
¡t  ||d d
¡f }|dk�r^d}tjt|d�� | |¡ W d   ƒ n1 �s0    Y  d}tjt|d�� | |¡ W d   ƒ n1 �sR0    Y  nt| |¡| |¡ ¡ ƒ d S )Nrt   é(   r   F)r;   r'   r4   r?   Úsparse_outputTÚcsrr   rP   r   r‹   rŒ   r)   zOut of bounds)r   r   r‘   r’   r#   r   r/   rI   r   ÚissparseÚformatr   ÚtoarrayZaminZamaxrR   rQ   r,   r-   r.   )r;   r'   r4   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�  sJ    ûû



"ÿ
*,ÿrž   c                  C   sN   dgdgg} t jtdd��  tdd� | ¡ W d  ƒ n1 s@0    Y  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sjJ ‚dS )z8Test that transform results in n_features_out_ features.r•   r–   )r>   r;   r?   r4   r™   r   r(   r   N)r   r   r,   Úskipr   r   rQ   r/   rI   rJ   rH   )r>   r?   r;   r4   r™   rB   r%   r   r   r   Ú&test_spline_transformer_n_features_outÒ  s    
û
r¡   )rs   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   sR   dgdgg}t jt|d��$ tf i | ¤Ž |¡ W d  ƒ n1 sD0    Y  dS )zBTest that we raise errors for invalid input in PolynomialFeatures.r(   r   r)   N)r,   r-   r.   r
   r/   r0   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 )Nrj   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:   )r   r   r:   ÚX_containerc           
      C   s‚   | \}}|dur||ƒ}t |||d� |¡}| |¡}	|durF|	 ¡ }	t|	|dd…|f ƒ |jdkr~|jj|j|jfks~J ‚dS )z9Test PolynomialFeatures on single feature up to degree 3.N©r;   r?   Úinteraction_onlyr   ©	r
   r/   rI   r�   r   Ún_output_features_Zpowers_rJ   Zn_features_in_)
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 )Nrj   r¢   r(   r   r   r:   )r   r"   r#   r¤   )r%   Úx1Úx2r¥   r   r   r   Útwo_features_degree3*  s"    öÿr³   )r   r(   r   rl   )r(   r   rl   ©r   r   )r   r:   rl   r   )r:   rl   r   )r   r:   rl   r   rj   é   ri   é	   ©r:   r:   )r   rj   rµ   ri   r¶   )rj   rµ   ri   r¶   c           
      C   s‚   | \}}|dur||ƒ}t |||d� |¡}| |¡}	|durF|	 ¡ }	t|	|dd…|f ƒ |jdkr~|jj|j|jfks~J ‚dS )z5Test PolynomialFeatures on 2 features up to degree 3.Nr©   r   r«   )
r³   r;   r?   rª   r­   r¨   r%   r¥   r®   r¯   r   r   r   Ú%test_polynomial_features_two_features@  s    #ÿþ

r¸   c                  C   sj  t  d¡ dd¡} tddd� | ¡}| ¡ }tg d¢|ƒ t|ƒ| | ¡j	d ksVJ ‚tdd	d� | ¡}| g d
¢¡}tg d¢|ƒ t|ƒ| | ¡j	d ks J ‚tdd	d� | ¡}| g d
¢¡}tg d¢|ƒ t|ƒ| | ¡j	d ksêJ ‚tdddd� | ¡}| g d
¢¡}tddg|ƒ t|ƒ| | ¡j	d k�s8J ‚tddd� | ¡}| g d¢¡}tg d¢|ƒ 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(   F)r   r@   Úc)r   r@   r¼   úa^2úa búa cúb^2úb cúc^2úa^3úa^2 búa^2 cúa b^2úa b cúa c^2úb^3úb^2 cúb c^2úc^3r§   )r½   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÆ   rÇ   rÈ   rÉ   rÊ   rË   rÌ   r·   r©   r»   rÇ   )úF40Dõ   â˜®õ   ×�)r»   rÍ   rÎ   rÏ   )
r   r"   r#   r
   r/   rA   r   rG   rI   rJ   )r%   ÚpolyrC   r   r   r   Útest_polynomial_feature_namesq  sB    þêíÿþrÑ   )Údegr?   rª   ÚdtypeÚcsc_containerc                 C   sŠ   t j d¡}| ddd¡}||ƒ}t| ||d�}| | |¡¡}	| | |¡¡}
t |	¡rd|	j	dkshJ ‚|	j
|
j
ksxJ ‚t|	 ¡ |
ƒ d S )Nr   r   ©rO   r   ©r?   rª   Zcsc©r   r   r‘   Úrandintr
   r$   Úastyper   r›   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Û   Úcsr_containerc                 C   sŽ   t j d¡}| ddd¡}||ƒ}t| ||d�}| | |¡¡}	| |j|dd�¡}
t |	¡rh|	j	dkslJ ‚|	j
|
j
ks|J ‚t|	 ¡ |
ƒ d S )Nr   r   rÕ   rÖ   F)Úcopyrš   r×   )rÒ   r?   rª   rÓ   rÜ   r“   r%   ÚX_csrr   ÚXt_csrrÚ   r   r   r   Útest_polynomial_features_csr_XÝ  s    ÿrà   Ú
n_features)r(   rl   r   zmin_degree, max_degree))r   r(   )r   r   )r(   r:   )r   rl   )r:   rl   rª   c           
      C   sj   |dgdg| d gffƒ}t |||d�}| |¡ |j}t j| d|||d�}	|tdd„ |	D ƒƒksfJ ‚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>  ó    z)test_num_combinations.<locals>.<listcomp>N)r
   r/   r¬   Z_combinationsrS   )
rá   rã   rä   rª   r?   rÜ   rp   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sbJ ‚|j|	jksrJ ‚t	| ¡ |	ƒ d S )Néè  r   ç      à?r   ©Zrandom_staterÖ   rš   )
Úsparse_randomr�   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_indexrÒ   rª   ))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 |¡rb|jd	ksfJ ‚|j|jksvJ ‚t| ¡ |ƒ d S )
Nr:   r   rx   r   rë   rw   FrÖ   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_row6  s    

rò   ))TTrW   rX   )FFc                 C   sx   |t ddddd�ƒ}| ¡ }td| |d�}| |¡}| |¡}t |¡rR|jdksVJ ‚|j|jksfJ ‚t| ¡ |ƒ d S )	Nré   r   rê   r   rë   rl   rÖ   rš   rñ   )r?   rª   rÜ   rÞ   r%   r   rß   rÚ   r   r   r   Ú'test_polynomial_features_csr_X_degree_4Z  s    ÿ

ró   )rÒ   Údimrª   )
)r   r(   Trï   )r:   r(   T)r:   r   T)r:   r:   T)r   r(   Frð   )r:   r(   F)r:   r   F)r:   r:   Fc           	      C   sv   |t d|ddd�ƒ}| ¡ }t| |d�}| |¡}| |¡}t |¡rP|jdksTJ ‚|j|jksdJ ‚t| ¡ |ƒ d S )Nré   rê   r   rë   ©rª   rš   rñ   )	rÒ   rô   rª   rÜ   rÞ   r%   r   rß   rÚ   r   r   r   Ú(test_polynomial_features_csr_X_dim_edgesp  s    

rö   c              	      s€  ‡ 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�}	||||	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 d  ƒ n1 sü0    Y  dS | |
¡}| ¡ \}}|| }|||	tˆ  ƒ |	d ƒ| }|�rZdg|d  ng }|�rrdg|d  ng }tdƒD �]}|d|  }|d| d  }|	d|  }|	d| d  }|�rÖ| d¡ | d¡ | ||g¡ | |t|ƒ |t|ƒ g¡ ˆ �sZ| || || || g¡ | ||||ƒ| ||||ƒ| ||||ƒ| g¡ n&| || g¡ | ||||ƒ| ¡ �q~t|ƒd dtˆ  ƒ  }|j|d k�s²J ‚|j|k�sÂJ ‚|j||d fk�sÚJ ‚|jj|jj  k�rüt jk�sn J ‚|j ¡ t  	t j¡jk�s J ‚|�r6t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   r:   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   )rJ   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)   Nr:   ) r   Úfloat32r"   Úint64rm   r
   Ú_num_combinationsrª   r?   ÚiinfoÚintprƒ   r,   r-   r.   r/   r$   ZnonzeroÚintr…   ÚappendÚextendr¬   rÓ   rJ   Úindptrr­   Úint32Úlistr   Údatar   )rª   r?   rÜ   rù   Z	n_samplesrá   Z
data_dtyper	  ÚrowÚcolr%   ÚpfÚnum_combinationsr�   rK   Zrow_nonzeroZcol_nonzeroZn_degree_1_features_outZmax_degree_2_idxZdata_targetZcol_nonzero_targetr÷   rp   rd   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   éÿÿ  )r:   i(	  )r:   r  c                 C   s¤  dg}|d t  t j¡jkr"t jnt j}t jdg|d�}t j|d g|d�}|d t|ƒ g}	|	 ||d  d |	d  ¡ |	 ||d  |d  d |	d  ¡ ||||ffƒ}
t||| d�}|j	|d| |j
|jd�}|t  t j¡jk�r.d	}tjt|d
�� | |
¡ W d  ƒ n1 �s 0    Y  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}|| �o°||kO }�qd|�r d}tjt|d
�� | |
¡}W d  ƒ n1 �sò0    Y  dS ttdƒk �rj|dk�rj| dk�rj|�sjd}tjt|d
�� | |
¡}W d  ƒ n1 �s\0    Y  dS | |
¡}|t  t j¡jk�rŽt jnt j}d| d t| ƒ  }t|ƒ| }|j|
jk�sÈJ ‚|jd|jfk�sÞJ ‚|jj|jj  k�rþ|k�sn J ‚|j|k�sJ ‚|�r2|d t d¡k�s2J ‚t|ƒD ]&}|d|	| f t d¡k�s:J ‚�q:|| }| dk�r€|d| 9 }|j|	| d  d | k�s J ‚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`.
    rx   r(   r   rû   r   rj   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   r:   )r   r  r  rƒ   rÿ   rm   r  r  r
   r   rª   r?   r  r,   r-   r.   r/   r   r   r…   r   r  r   r$   rÓ   rJ   r¬   r­   ZnnzÚapprox)r;   rá   rª   r?   rÜ   r	  Zindices_dtyper
  r  Úexpected_indicesr%   r  r  r�   Zhas_bugZ	max_int32Zcumulative_sizerÒ   Z
max_indptrZmax_indicesZneeds_int64rK   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}||||ffƒ}t| |dd�}d}	tjt|	d�� | |¡ W d   ƒ n1 sx0    Y  tjt|	d�� | 	|¡ W d   ƒ n1 s°0    Y  d S )	Nr   rx   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_index|  s    
ÿÿ(r  Úsparse_containerc                 C   sò   t  d¡}tddd�}d}tjt|d�� | |¡ W d  ƒ n1 sH0    Y  tddd�}d	}tjt|d�� | |¡ W d  ƒ n1 s�0    Y  || |ƒ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)   Nr  zoSetting both min_degree and max_degree to zero and include_bias to False would result in an empty output array.Tr(   )r   Zonesr
   r,   r-   r.   r$   r   r›   r�   r   rJ   )r  r%   rÐ   r2   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s6J ‚d S )NÚwin32ì        Z
emscriptenri   é   )ÚsysÚplatformÚmaxsizer   )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  ƒ¡ | |||ffƒ}tdddd	�}tjd
krìd}t	j
t|d�� | |¡ W d   ƒ n1 sà0    Y  n6| |¡}	tdƒD ]"}
|	d||
 f t	 d¡ksþJ ‚qþd S )NgUUUUUUÕ?r:   rx   r   r(   r   rj   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�   rK   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   r   r   ÚmarkZparametrizer&   r3   r=   rD   rL   r…   rT   rf   rm   rn   ru   r}   r‚   rŠ   rŽ   r”   Zskipifrž   rŸ   r¡   r£   Zfixturer¦   Úslicer°   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õþg
ú