
    /ii                        d dl Z 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 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m Z m!Z! d dl"m#Z# d dl$m%Z%m&Z&m'Z' d dl(m)Z)m*Z* ej+        ,                    deef          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             Z.ej+        ,                    dddg          d             Z/d Z0ej+        ,                    dg d          ej+        ,                    ddd g          d!                         Z1ej+        ,                    d e2dd"                    ej+        ,                    d# e2d d"                    ej+        ,                    dd$d%g          ej+        ,                    dd&dg          d'                                                 Z3ej+        ,                    d(d)gd*d+g          d,             Z4ej+        ,                    g d-d$d d ej5        d dgd d.gd/d0gg          fd$d  ej5        g d1           ej5        ddgd2d.gd/d0gg          fd$d2d ej5        d dgdd/gd2d3gd/d0gg          fd%d d ej5        d dgd d gd/d0gg          fd%d  ej5        g d1           ej5        ddgd"d.gd/d0gg          fg          d4             Z6ej+        ,                    d(d)gd*d+g          d5             Z7d6 Z8d7 Z9ej+        ,                    dd d"g          d8             Z:ej+        ,                    d(d)gd*d+g          ej+        ,                    dg d9          d:                         Z;d; Z<ej+        ,                    d e2dd                     ej+        ,                    dd$d%g          ej+        ,                    dg d<          ej+        ,                    d=d>d?g          d@                                                 Z=ej+        ,                    d#d"d3g          ej+        ,                    d=d?d>g          ej+        ,                    dd d2g          ej+        ,                    dg d<          ej+        ,                    dAd>d?g          dB                                                             Z>ej+        ,                    dg d<          ej+        ,                    dAd>d?g          dC                         Z?ej+        ,                    dg d<          ej+        ,                    dAd>d?g          dD                         Z@ej+        ,                    dddEidFfddGidFfddHidFfddIidJfg          dK             ZA ejB                    dL             ZCej+        ,                    dMd d?d> eDdd          fd d>d> eDdd          fd d?d?d dgfd d>d?dgfdNd?d>g dOfdNd>d>dd gfdNd?d?d gfdNd>d?g fg          ej+        ,                    dPdge*z   e)z             dQ                         ZE ejB                    dR             ZFej+        ,                    dMdd?d> eDd d/          fdd>d> eDdd/          fdd?d?g dSfdd>d?g dTfdUd?d>g dVfdUd>d>g dWfdUd?d?d d2gfdUd>d?d2gfd d?d> eDdd          fd d>d> eDdd          fd d?d?g dSfd d>d?g dTfdNd?d>g dXfdNd>d> eDd d          fdNd?d?d d2gfdNd>d?d2gfdYd?d>g dZfdYd>d>g d[fdYd?d?d gfdYd>d?g fg          ej+        ,                    dPdge*z   e)z             d\                         ZGd] ZHej+        ,                    g d^dd?d>eIfdd?d>eIfdd?d>ejJ        fdd?d>ejK        fd d>d>ejK        fd d>d?ejK        fd2d>d>ejK        fd2d>d?ejK        fg          ej+        ,                    d_e)          d`                         ZLej+        ,                    g d^dd?d>eIfdd?d>eIfdd?d>ejJ        fdd?d>ejK        fd d>d>ejK        fd d>d?ejK        fg          ej+        ,                    dae*          db                         ZMej+        ,                    dcg dd          ej+        ,                    deg df          ej+        ,                    dgd?d>g          ej+        ,                    d=d?d>g          ej+        ,                    dae*          dh                                                             ZNej+        ,                    g d^dd?d>ejJ        fdd?d>ejK        fd d>d>ejK        fd d>d?ejK        fg          ej+        ,                    dae*          di                         ZOej+        ,                    g djg dk          ej+        ,                    dae*          dl                         ZPej+        ,                    d=dggg dm          ej+        ,                    dae*          dn                         ZQej+        ,                    g dog dp          ej+        ,                    dae*          dq                         ZRej+        ,                    dgd?d>g          ej+        ,                    d=d?d>g          ej+        ,                    dae*          dr                                     ZSej+        ,                    dsdtdud eI ejT         ejU        ejV                  jW                  dz             fdvd eI ejT         ejU        ejV                  jW                            fg          ej+        ,                    dgd?d>g          ej+        ,                    d=d?d>g          ej+        ,                    dae*          dw                                                 ZXej+        ,                    dgd?d>g          ej+        ,                    d=d?d>g          ej+        ,                    dae*          dx                                     ZYej+        ,                    dye*e)z             dz             ZZd{ Z[ej+        \                    ej]        d|k    d}d?~          ej+        ,                    dae*          d                         Z^ej+        ,                    d e!            e          ej+        ,                    dgd?d>g          ej+        ,                    d=d?d>g          ej+        ,                    dg d          d                                                 Z_ej+        ,                    d e!            e          d             Z`dS )    N)assert_allcloseassert_array_equal)sparse)BSpline)random)config_context)LinearRegression)Pipeline)KBinsDiscretizerPolynomialFeaturesSplineTransformer)_get_sizeof_LARGEST_INT_t)_convert_to_numpy_get_namespace_device_dtype_ids_is_numpy_namespacedeviceget_namespace)yield_namespace_device_dtype_combinations)	_get_mask)_array_api_for_testsassert_allclose_dense_sparseassert_array_almost_equal)CSC_CONTAINERSCSR_CONTAINERSestc                 f   t          j        d                              dd          }d } | |                                 |                    sJ  | | d                              |                    sJ t          j         | d                              |                    sJ dS )	z+Test that output array has the given order.
         c                 4    t          j        | j                  S )N)np	isfortranT)as    q/var/www/html/bet.cuttalo.com/ml/venv/lib/python3.11/site-packages/sklearn/preprocessing/tests/test_polynomial.pyis_c_contiguousz?test_polynomial_and_spline_array_order.<locals>.is_c_contiguous/   s    |AC       CorderFN)r!   arangereshapefit_transformr"   )r   Xr&   s      r%   &test_polynomial_and_spline_array_orderr0   *   s     		"a##A! ! ! ?3355..q1122222?33S>>>77::;;;;;<#44Q778888888r'   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                     dgdgg}t          j        t          |          5  t          di |                     |           ddd           dS # 1 swxY w Y   dS )zATest that we raise errors for invalid input in SplineTransformer.r2   r   matchN )pytestraises
ValueErrorr   fitparamserr_msgr/   s      r%   (test_spline_transformer_input_validationr>   7   s     qc
A	z	1	1	1 + +##F##''***+ + + + + + + + + + + + + + + + + +    AAAextrapolationcontinueperiodicc                     t          j        d                              dd          }ddgddgddgddgddgg}t          d	|| 
                              |          }dS )zATest that SplineTransformer accepts integer value knot positions.   r   r   r   r2   r            )degreer1   r@   N)r!   r,   r-   r   r.   )r@   r/   r1   _s       r%   %test_spline_transformer_integer_knotsrJ   G   st     		"b!$$AVaVaVb"XBx8E]	 	 	mA AAr'   c                     t          j        d                              dd          } t          ddd                              |           }|                                }t          |g d           t          ddd                              |           }|                    d	d
g          }t          |g d           dS )z<Test that SplineTransformer generates correct feature names.rD   r   r   rG   T)n_knotsrH   include_bias)
x0_sp_0x0_sp_1x0_sp_2x0_sp_3x0_sp_4x1_sp_0x1_sp_1x1_sp_2x1_sp_3x1_sp_4Fr$   b)a_sp_0a_sp_1a_sp_2a_sp_3b_sp_0b_sp_1b_sp_2b_sp_3N)r!   r,   r-   r   r:   get_feature_names_outr   )r/   spltfeature_namess      r%   %test_spline_transformer_feature_namesrd   Q   s    
	"b!$$AQqtDDDHHKKD..00M	
 	
 	
    QquEEEII!LLD..Sz::M		
 		
 		
    r'   )constantlinearrA   rB   rH   rG   c                 j   t          j        d                              dd          }t          ||                               |          }|                    ddg          }t          |          |j        k    sJ |                    |          }|j	        d         t          |          k    sJ dS )	zsTest feature names are correct for different extrapolations and degree.

    Non-regression test for gh-25292.
    rD   r   r   )rH   r@   r$   rX   r2   N)
r!   r,   r-   r   r:   ra   lenn_features_out_	transformshape)r@   rH   r/   rb   rc   X_transs         r%   7test_split_transform_feature_names_extrapolation_degreerm   w   s     		"b!$$AF-HHHLLQOOD..Sz::M}!55555nnQG=s=11111111r'   r   rL   uniformquantilere   c                    t          j        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    r|| z   }t          || |d|          }|                    |           ||fD ]9}t          t          j        |                    |          d	          d           :dS )
zTest 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   r2   d   Nr   rB   T)rL   rH   r1   rM   r@   axis)r!   linspacer_r   r:   r   sumrj   )rH   rL   r1   r@   r/   X_trainX_testrb   s           r%   +test_spline_transformer_unity_decompositionry      s     	Aq#qqq$w'AeaSE1SSqS!!!V9se+,Gqt!tQQQwZF
""F"#  D 	HHWv > >t~~a00q9991====> >r'   bias	interceptTFFTc           	      h   t          j        ddd          dddf         }t          j        |dddf                   dz   }t          dt	          dd| d	
          fdt          |          fg          }|                    ||           t          |                    |          |d           dS )z7Test that B-splines fit a sinusodial curve pretty well.r   r   rq   Nr   spline   rG   re   rL   rH   rM   r@   olsfit_interceptstepsMbP?rtol)	r!   rt   sinr
   r   r	   r:   r   predict)rz   r{   r/   ypipes        r%   )test_spline_transformer_linear_regressionr      s     	Ar34(A
qAw!A !!%",	   $9===>
  D 	HHQNNNDLLOOQT222222r'   )r1   rL   sample_weightexpected_knots         )r   r   r2   r2   r   rG   r2      r   c           
          t          j        ddgddgddgddgddgddgddgg          }t          j        || ||	          }t	          ||           d
S )zJCheck the behaviour to find knot positions with and without sample_weight.r   r   rG   r   r   r   r   r   )r/   r1   rL   r   N)r!   arrayr   _get_base_knot_positionsr   )r1   rL   r   r   r/   
base_knotss         r%   /test_spline_transformer_get_base_knot_positionsr      sv    0 	1a&1a&1a&1a&1a&1a&1b'JKKA";
5'  J J/////r'   c           	         d }t          j        ddd          dddf         }t          dt          dd| d	
          fdt	          |          fg          }|                    | ||dddf                              t          j        ddd          dddf         }|                    |          }t          | ||dddf                   dd           t          |dd         |dd         d           dS )z5Test that B-splines fit a periodic curve pretty well.c                     t          j        dt           j        z  | z            t          j        dt           j        z  | z            z
  dz   S )Nr   r   rG   )r!   r   pi)xs    r%   fz=test_spline_transformer_periodic_linear_regression.<locals>.f   s:    va"%i!m$$rva"%i!m'<'<<q@@r'   r   r2   e   Nr   rD   rG   rB   r   r   r   r   r   i-  g{Gz?)atolr   rq      r   r   )r!   rt   r
   r   r	   r:   r   r   )rz   r{   r   r/   r   X_predictionss          r%   2test_spline_transformer_periodic_linear_regressionr      sB   
A A A 	Aq#qqq$w'A !!%",	   $9===>
  D 	HHQ!AAAqD'

 
RC	 	 D	)B,,r""KK2aaad84dCCCCK#&CG(<4HHHHHHr'   c                  x   t          j        ddd          dddf         } d}t          |ddgdgd	gg
          }|                    |           }t          j        d	dgdd	gd	dgdd	gg          }t          t          j        dd          ||d          } || dddf                   }t          ||           dS )z@Test that the backport of extrapolate="periodic" works correctlyg      @r   Nr   rB   g                    ?rH   r@   r1   r   r   )r!   rt   r   r.   r   r   r,   r   )r/   rH   transformerXtcoefsplXspls          r%   0test_spline_transformer_periodic_spline_backportr      s    
BR  D)AF $Zu7M  K 
	"	"1	%	%B 8c3Z#sc3Z#sDEED
")B""D&*
=
=C3qAw<<DBr'   c            
      J   t          j        ddd          dddf         } t          dddgdgd	gd
gdgdgg          }t          dddgd	gd
gdgdgdgg          }|                    |           }|                    |           }t	          ||ddg df                    dS )zJTest if shifted knots result in the same transformation up to permutation.r   r   r   NrG   rB   r   r         @      @      @       @r   g      "@)r   r   r2   r   rG   )r!   rt   r   r.   r   )r/   transformer_1transformer_2Xt_1Xt_2s        r%   4test_spline_transformer_periodic_splines_periodicityr     s    
Ar34(A% usecUSEC53%8  M & usecUSEC53%8  M &&q))D&&q))DD$qqq///1233333r'   c           
      j   t          j        ddd          dddf         }t          | ddgdgdgd	gd
gdgg          }|                    |          }|                                |                                z
  t          |          z  }d|z  }|}t          d| dz             D ]I}t          j        |d          }t          j	        |                                          |k     sJ ||z  }Jt          j        |d          }t          j	        |                                          dk    sJ dS )z?Test that spline transformation is smooth at first / last knot.r   r   i'  NrB   r   r   r   r   r   r   r   r2   r   rr   )
r!   rt   r   r.   maxminrh   rangediffabs)	rH   r/   r   r   deltatoldXtdr   s	            r%   3test_spline_transformer_periodic_splines_smoothnessr   %  sF    	BF##AAAtG,A# usecUSEC53%8  K
 
	"	"1	%	%BUUWWquuww#a&&(E
u*C
C 1fqj!!  ws###vd||!!C''''Ul
 73QD6$<<!!!!!!r'   )r2   r   rG   r   r   c           	         t          j        ddd          dddf         }|                                }t          dt	          d|| d          gd	t          |
          gg          }|                    ||           t          |                    dgdgg          ddg           t          dt	          d|| d          gd	t          |
          gg          }|                    ||           t          |                    dgdgg          ddg           t	          d|| d          }|                    |           d}t          j
        t          |          5  |                    dgg           ddd           n# 1 swxY w Y   t          j
        t          |          5  |                    dgg           ddd           dS # 1 swxY w Y   dS )z1Test that B-spline extrapolation works correctly.r   r2   rq   Nr   r   re   r   r   r   ir   rf   error2`X` contains values beyond the limits of the knotsr4   )r!   rt   squeezer
   r   r	   r:   r   r   r7   r8   r9   rj   )rz   r{   rH   r/   r   r   rb   msgs           r%   %test_spline_transformer_extrapolationr   L  s   
 	B34(A			A  !!!%",	   $9===>	
 D 	HHQNNNDLL3%!..Q888  !!!%"*	   $9===>	
 D 	HHQNNNDLL3%!..a999 &t7  D 	HHQKKK
>C	z	-	-	-    w                             	z	-	-	-  u                 s$    FFF*GGGc                 h   t           j                            |           }|                    d                              dd          }d}|dz   }t          |ddd          }|                    |          }t          |ddd	
          }|                    |          }t          ||d           dS )zCTest that a B-spline of degree=0 is equivalent to KBinsDiscretizer.r   r2   r   r   ro   T)rL   rH   r1   rM   zonehot-denseaveraged_inverted_cdf)n_binsencodestrategyquantile_methodgvIh%<=r   N)	r!   r   RandomStaterandnr-   r   r.   r   r   )	global_random_seedrngr/   r   rL   rb   splineskbdkbinss	            r%   'test_spline_transformer_kbindiscretizerr     s    
)

 2
3
3C		#sA&&AFqjG$  D   ##G
/	  C a  E GU//////r'   )r   re   rf   rA   rB   rM   FTc                    t           j                            |          }|                    d                              dd          }t          | |||d          }t          | |||d          }|                    |           |                    |           |                    |          }	|                    |          }
t          j	        |	          r|	j
        dk    sJ t          |
|	                                           t          j        |d	          }t          j        |d	          }t           j        t          j        |dz
  |d
          t          j        ||dz   d
          f         }|dk    rd}t#          j        t&          |          5  |                    |           d d d            n# 1 swxY w Y   d}t#          j        t&          |          5  |                    |           d d d            d S # 1 swxY w Y   d S t          |                    |          |                    |                                                     d S )Nr   (   r   F)rH   r1   r@   rM   sparse_outputTcsrr   rr   r   r   r   r4   zOut of bounds)r!   r   r   r   r-   r   r:   rj   r   issparseformatr   toarrayaminamaxru   rt   r7   r8   r9   )rH   r1   r@   rM   r   r   r/   
splt_densesplt_sparseX_trans_sparseX_trans_denseX_minX_maxX_extrar   s                  r%   %test_spline_transformer_sparse_outputr     s    )

 2
3
3C		#r1%%A"#!  J $#!  K NN1OOA **1--N((++M?>**M~/D/M/M/M/MM>#9#9#;#;<<< GAAEGAAEe
EAIub))2;ueai+L+LLG B]:S111 	* 	*  )))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*]:S111 	+ 	+!!'***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	  ));+@+@+I+I+Q+Q+S+S	
 	
 	
 	
 	
s$   F;;F?F?#HH
H
r   c                     t          | ||||          }t          j        ddd          dddf         }|                    |           |                    |          j        d         |j        k    sJ dS )z8Test that transform results in n_features_out_ features.)rL   rH   rM   r@   r   r   r2   r   N)r   r!   rt   r:   rj   rk   ri   )rL   rM   rH   r@   r   rb   r/   s          r%   &test_spline_transformer_n_features_outr     s     !##  D 	Aq"aaag&AHHQKKK>>!"1%)=======r'   c                    t          j        ddgddgddgddgddggt           j                  }|                                }t           j        |d<   d}t          j        t          t          j	        |          	          5  t          ddd
|           }|                    |           ddd           n# 1 swxY w Y   t          ddd| |          }|                    |          }|                    |                              |          }t          ||           |                    |g d          }t          ||           |                    |          ddd         }	|                    |                              |ddd                   }
t          |	|
           t          |t           j                  }t          j        ||j        d         j        j        d         d          }||         dk                                    sJ |                    |          }t+          j        |          r|                                }|dk                                    sJ |dk                                    sJ |                    |          }|                    |          }t          ||          ||                     dS )zTest that SplineTransformer handles missing values correctly.
    We only test for knots="uniform", since for "quantile" the metrics are calculated
    differently with nans present and a different result is thus expected.
    r2   r   rG   r   r   dtype)rG   r   zJInput X contains NaN values and `SplineTransformer` is configured to errorr4   r   )rH   rL   handle_missingr@   NzerosrH   rL   r   r@   r   )r2   r2   r2   r2   r2   )r   r   rr   )r!   r   float64copynanr7   r8   r9   reescaper   r.   r:   rj   r   r   repeat	bsplines_crk   allr   r   r   )r@   r   r/   X_nanr   r   X_nan_transformX_nan_fit_then_transform"X_nan_transform_with_sample_weightX_nan_transform_same_shape X_nan_transform_different_shapesnan_maskencoded_nan_maskX_transforms                 r%   .test_spline_transformer_handles_missing_valuesr    s6    	1a&1a&1a&1a&1a&9LLLAFFHHE&E$K WC	z3	8	8	8 $ $""'	
 
 
 	U###$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ##  F **511O%zz%00::5AA 2JKKK *0)=)=___ *> * *& !2TUUU "(!5!5e!<!<SSqS!A'-zz%'8'8'B'B51:'N'N$ "$D  
 ''Hy6+;A+>+@+Fq+IPQRRR,-27799999 **511O'' 4)1133q %%'''''q %%''''' &&q))K**511O %%&9I8I(J    s   )B77B;>B;c                    t          j        ddgddgddgddgddgg          }t          j        t           j        t           j        gt           j        dgg          }t          ddd| |          }|                    |           |                    |          }t          |t           j                  }t          j        ||j        d         j	        j
        d         d	          }||         dk                                    sJ d
S )zZTest that SplineTransformer encodes missing values to zeros even for
    all-nan-features.r2   r   rG   r   r   r   r   r   rr   N)r!   r   r   r   r:   rj   r   r   r   r   rk   r   )r@   r   r/   X_nan_full_columnr   all_missing_column_encodedr  r  s           r%   (test_spline_transformer_handles_all_nansr
  8  s	    	1a&1a&1a&1a&1a&9::A2626"2RVQK!@AA##  F JJ !!!!'!1!12C!D!D*BF33Hy6+;A+>+@+Fq+IPQRRR&'78A=BBDDDDDDDr'   )r   r   z&degree=\(min_degree, max_degree\) must)r   g      ?rG   r   )r2   r   rG   z'int or tuple \(min_degree, max_degree\)c                     dgdgg}t          j        t          |          5  t          di |                     |           ddd           dS # 1 swxY w Y   dS )zBTest that we raise errors for invalid input in PolynomialFeatures.r2   r   r4   Nr6   )r7   r8   r9   r   r:   r;   s      r%   )test_polynomial_features_input_validationr  R  s     qc
A	z	1	1	1 , ,$$V$$((+++, , , , , , , , , , , , , , , , , ,r?   c                      t          j        d          d d t           j        f         } t          j        t          j        |           | | dz  | dz  g          }| |fS )Nr   r   rG   )r!   r,   newaxishstack	ones_like)r/   Ps     r%   single_feature_degree3r  c  sO    
	!QQQ
]#A
	2<??Aq!tQT233Aa4Kr'   z/degree, include_bias, interaction_only, indicesr   rG   )r   r   rG   X_containerc                 T   | \  }}| ||          }t          |||                              |          }|                    |          }	||	                                }	t	          |	|dd|f                    |j        dk    r|j        j        |j        |j        fk    sJ dS dS )z9Test PolynomialFeatures on single feature up to degree 3.NrH   rM   interaction_onlyr   	r   r:   rj   r   r   n_output_features_powers_rk   n_features_in_)
r  rH   rM   r  indicesr  r/   r  tfouts
             r%   $test_polynomial_features_one_featurer   j  s    . "DAqKNN	LCS
 
 
	c!ff  ,,q//CkkmmC111g:'''	q  zB$92;L#MMMMM ! MMr'   c                     t          j        d                              d          } | d d d df         }| d d dd f         }t          j        |dz  |dz  z  |dz  |dz  z  |dz  |dz  z  |dz  |dz  z  |dz  |dz  z  |dz  |dz  z  |dz  |dz  z  |dz  |dz  z  |dz  |dz  z  |dz  |dz  z  g
          }| |fS )Nr   r  r2   r   r   rG   )r!   r,   r-   r  )r/   x1x2r  s       r%   two_features_degree3r$    s    
	!V$$A	
111bqb5B	
111abb5B
	EBEMEBEMEBEMEBEMEBEMEBEMEBEMEBEMEBEMEBEM	
	 	A a4Kr'   )r   r2   r   r   )r2   r   r   r   r   )r   rG   r   r   )rG   r   r   )r   rG   r   r   r      r   	   rG   rG   )r   r   r&  r   r'  )r   r&  r   r'  c                 T   | \  }}| ||          }t          |||                              |          }|                    |          }	||	                                }	t	          |	|dd|f                    |j        dk    r|j        j        |j        |j        fk    sJ dS dS )z5Test PolynomialFeatures on 2 features up to degree 3.Nr  r   r  )
r$  rH   rM   r  r  r  r/   r  r  r  s
             r%   %test_polynomial_features_two_featuresr*    s    F  DAqKNN	LCS
 
 
	c!ff  ,,q//CkkmmC111g:'''	q  zB$92;L#MMMMM ! MMr'   c                     t          j        d                              dd          } t          dd                              |           }|                                }t          g d|           t          |          |                    |           j	        d         k    sJ t          dd	                              |           }|                    g d
          }t          g d|           t          |          |                    |           j	        d         k    sJ t          dd	                              |           }|                    g d
          }t          g d|           t          |          |                    |           j	        d         k    sJ t          ddd                              |           }|                    g d
          }t          ddg|           t          |          |                    |           j	        d         k    sJ t          dd                              |           }|                    g d          }t          g d|           d S )N   r   rG   r   TrH   rM   )
1x0r"  r#  zx0^2zx0 x1zx0 x2zx1^2zx1 x2zx2^2r2   F)r$   rX   r   )r$   rX   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  )r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r(  r  r.  r:  )F40D   ☮   א)r.  r@  rA  rB  )
r!   r,   r-   r   r:   ra   r   rh   rj   rk   )r/   polyrc   s      r%   test_polynomial_feature_namesrD    s   
	"b!$$AQT:::>>qAAD..00MRRR   }!2!2!8!;;;;;QU;;;??BBD..??M	
 	
 	
* 	-  0 }!2!2!8!;;;;;V%@@@DDQGGD..??M	
 	
 	
$ 	'  * }!2!2!8!;;;;;D4  	c!ff 	 ..??MW~}555}!2!2!8!;;;;; QT:::>>qAAD../Q/Q/QRRM>>>NNNNNr'   )degrM   r  r   csc_containerc                    t           j                            |          }|                    ddd          } ||          }t	          | ||          }	|	                    |                    |                    }
|	                    |                    |                    }t          j        |
          r|
j	        dk    sJ |
j
        |j
        k    sJ t          |
                                |           d S )Nr   r   rq   r   rM   r  cscr!   r   r   randintr   r.   astyper   r   r   r   r   r   )rE  rM   r  r   rF  r   r   r/   X_cscr   Xt_cscXt_denses               r%   test_polynomial_features_csc_XrQ  "  s    " )

 2
3
3CAq(##AM!E
,9I  C u||E2233F  %11H?6""=v}'='='='=<8>))))fnn..99999r'   csr_containerc                    t           j                            |          }|                    ddd          } ||          }t	          | ||          }	|	                    |                    |                    }
|	                    |                    |d                    }t          j        |
          r|
j	        dk    sJ |
j
        |j
        k    sJ t          |
                                |           d S )Nr   r   rH  rI  F)r   r   rK  )rE  rM   r  r   rR  r   r   r/   X_csrr   Xt_csrrP  s               r%   test_polynomial_features_csr_XrV  B  s     )

 2
3
3CAq(##AM!E
,9I  C u||E2233F  %e!<!<==H?6""=v}'='='='=<8>))))fnn..99999r'   
n_features)r2   r   r   zmin_degree, max_degree))r   r2   )r   r   )r2   rG   )r   r   )rG   r   r  c                      |dgdg| dz
  gff          }t          |||          }|                    |           |j        }t          j        | d|||          }	|t	          d |	D                       k    sJ dS )z?
    Test that n_output_features_ is calculated correctly.
    r2   r   )rH   r  rM   rW  
min_degree
max_degreer  rM   c                     g | ]}d S )r2   r6   ).0rI   s     r%   
<listcomp>z)test_num_combinations.<locals>.<listcomp>}  s    000Aa000r'   N)r   r:   r  _combinationsrv   )
rW  rZ  r[  r  rM   rR  r   r   
num_comboscomboss
             r%   test_num_combinationsrb  `  s     	saS:>"23455A
)!  C
 GGAJJJ'J-)!  F 0000011111111r'   c                     |t          ddd|                    }|                                }t          | ||          }|                    |                    |                    }	|                    |                    |                    }
t          j        |	          r|	j        dk    sJ |	j        |
j        k    sJ t          |	                                |
           d S )N  r         ?random_staterI  r   )
sparse_randomr   r   r.   rM  r   r   r   r   r   )rE  rM   r  r   rR  r   rT  r/   r   rU  rP  s              r%   %test_polynomial_features_csr_X_floatsri    s     M-b#DVWWWXXEA
,9I  C u||E2233F  %11H?6""=v}'='='='=<8>))))fnn..99999r'   )zero_row_indexrE  r  ))r   r   T)r2   r   Tr   r   T)r   rG   T)r2   rG   T)r   rG   T)r   r   F)r2   r   Fr   r   F)r   rG   F)r2   rG   F)r   rG   Fc                     |t          ddd|                    }d|| d d f<   |                                }t          |d|          }|                    |          }|                    |          }	t	          j        |          r|j        dk    sJ |j        |	j        k    sJ t          |                                |	           d S )	NrG   r   r   rf  r   FrI  r   	rh  r   r   r.   r   r   r   r   r   )
rj  rE  r  rR  r   rT  r/   r   rU  rP  s
             r%   'test_polynomial_features_csr_X_zero_rowro    s    * M-2sASTTTUUE"E.!!!
A
SuGW
X
X
XCu%%F  ##H?6""=v}'='='='=<8>))))fnn..99999r'   ))TTr|   r}   )FFc                     |t          ddd|                    }|                                }t          d| |          }|                    |          }|                    |          }t	          j        |          r|j        dk    sJ |j        |j        k    sJ t          |                                |           d S )Nrd  r   re  rf  r   rI  r   rn  )	rM   r  rR  r   rT  r/   r   rU  rP  s	            r%   'test_polynomial_features_csr_X_degree_4rq    s     M-b#DVWWWXXEA
	7G  C u%%F  ##H?6""=v}'='='='=<8>))))fnn..99999r'   )rE  dimr  )
)r   r2   Trk  )rG   r2   T)rG   r   T)rG   rG   T)r   r2   Frl  )rG   r2   F)rG   r   F)rG   rG   Fc                     |t          d|d|                    }|                                }t          | |          }|                    |          }|                    |          }	t	          j        |          r|j        dk    sJ |j        |	j        k    sJ t          |                                |	           d S )Nrd  re  rf  )r  r   rn  )
rE  rr  r  rR  r   rT  r/   r   rU  rP  s
             r%   (test_polynomial_features_csr_X_dim_edgesrt    s    & MdC3EFFF E 	A
S3C
D
D
DCu%%F  ##H?6""=v}'='='='=<8>))))fnn..99999r'   c           
           fd}d}d}t           j        }t          j        ddt           j                  }t          j        |dz
  |dz
  |dz
  |dz
  g          }t          j        |dz
  |dz
  |dz
  |dz
  gt           j                  }	 ||||	ff||f|          }
t           |d	          }|                    |d
d|j        |j                  }|t          j	        t           j
                  j        k    rLd}t          j        t          |          5  |                    |
           ddd           n# 1 swxY w Y   dS |                    |
          }|                                \  }}||z   } |||	t%                               |	d                   |z   }|r	dg|dz
  z  ng }|r	d
g|dz
  z  ng }t'          d          D ]R}|d|z           }|d|z  dz            }|	d|z           }|	d|z  dz            }|r*|                    d           |                    d
           |                    ||g           |                    |t%          |          z   |t%          |          z   g            se|                    ||z  ||z  ||z  g           |                     ||||          |z    ||||          |z    ||||          |z   g           |                    ||z  g           |                     ||||          |z              Tt%          |          dz   dt%                      z  z   }|j        |dz   k    sJ |j        |k    sJ |j        ||dz   fk    sJ |j        j        |j        j        cxk    rt           j        k    sn J |j                                        t          j	        t           j                  j        k    sJ |rt9          t'          |dz
                      ng }|                    |dz
  g|z  |dz
  g|z  z              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                 d    r| |z  |dz  d|z  z   dz  z
  dz
  |z   S | |z  |dz  |z   dz  z
  |z   S )Nr   rG   r2   r6   )r   ijr  s      r%   degree_2_calczRtest_csr_polynomial_expansion_index_overflow_non_regression.<locals>.degree_2_calc  sU     	/q5AqD1q5LQ..2Q66q5AqD1H?*Q..r'      i r2   r   r   r   )rk   r   r  rM   rH   r   rY  tThe output that would result from the current configuration would have \d* features which is too large to be indexedr4   NrG   ) r!   float32r,   int64r   r   _num_combinationsr  rM   iinfointpr   r7   r8   r9   r:   r.   nonzerointr   appendextendr  r   rk   indptrr  int32listr   datar   )r  rM   rR  ry  	n_samplesrW  
data_dtyper  rowcolr/   pfnum_combinationsr   rl   row_nonzerocol_nonzeron_degree_1_features_outmax_degree_2_idxdata_targetcol_nonzero_targetrw  r   r   x_idxy_idxnnz_per_rowrow_nonzero_targets   `                           r%   ;test_csr_polynomial_expansion_index_overflow_non_regressionr    s    / / / / / IJJ9Q***D
(IM9q=)a-QO
P
PC (	aaaaHPRPX  C 		Sz*%	 	 	A
 
)Q
 
 
B ++,_ ,   "(27++///> 	 ]:S111 	 	FF1III	 	 	 	 	 	 	 	 	 	 	 	 	 	 	q!!G&00K(<7j#c.>*>&?&?"@#a&II
!	"  ,8?1#Q''RK2>F!	A..B1XX  QKQOAE
AEAI 	)q!!!%%a(((Aq6"""!!S&&&L0A0A(AB	
 	
 	
   	Aq1ua!e4555%%!M*eU;;>UU!M*eU;;>UU!M*eU;;>UU    Aw'''%%j%77:QQ    l##a'!c6F2F.G.G*GGK $4q$88888=J&&&&=Y(81(<=====>7?#8DDDDBHDDDDDD?  28BH#5#5#999997CKeIM22333	Q+%Q+(EE   GL+...{$6777{$677777s   D<<E E zdegree, n_features)r     )rG   i(	  )rG   r  c                    dg}|dz
  t          j        t           j                  j        k    rt           j        nt           j        }t          j        dg|          }t          j        |dz
  g|          }|dz
  t          |          z   g}	|	                    ||dz   z  dz  |	d         z              |	                    ||dz   z  |dz   z  dz  |	d         z               ||||ff          }
t          |||           }|	                    |d| |j
        |j                  }|t          j        t           j                  j        k    rLd	}t          j        t          |
          5  |                    |
           ddd           n# 1 swxY w Y   dS |                    |
          }|t          j        t           j                  j        k    rt           j        nt           j        }d| dz
  t          |           z  z   }t          |          |z   }|j        |
j        k    sJ |j        d|j        fk    sJ |j        j        |j        j        cxk    r|k    sn J |j        |k    sJ |r |d         t          j        d          k    sJ t3          |          D ]*}|d|	|         f         t          j        d          k    sJ +||z  }| dk    r|d|z   z  }|j        |	| dz
           dz   |z
  k    sJ dS )zTests known edge-cases to the dtype promotion strategy and custom
    Cython code, including a current bug in the upstream
    `scipy.sparse.hstack`.
    r   r2   r   r   r   r   r{  rY  r|  r4   Nr   r   rG   )r!   r  r  r   r~  r   r  r  r   r  r  rM   r  r7   r8   r9   r:   r.   r   rk   r  r  r  nnzapproxr   )rH   rW  r  rM   rR  r  indices_dtyper  r  expected_indicesr/   r  r  r   rl   expected_dtypenon_bias_termsexpected_nnzidxoffsets                       r%   ,test_csr_polynomial_expansion_index_overflowr  k  s   4 5D *Q"(282D2D2H H HBHHbhM
(A3m
,
,
,C
(JN#=
9
9
9C 	Q\*** J*q.9Q>AQRSATTUUUj1n%a8A=@PQR@SS   	tc3Z())A	)V
 
 
B ++,_ ,   "(27++///> 	 ]:S111 	 	FF1III	 	 	 	 	 	 	 	 	 	 	 	 	 	 	q!!G!1BHRX4F4F4J!J!JRXXPRPXN&1*0@,@(A(AAAN|$$~5L=AG####=Q 566666>7?#8JJJJNJJJJJJ;,&&&& 3t}c 2 22222^$$ G Gq*3//0FM#4F4FFFFFF
*F{{!j.  $4VaZ$@1$Dv$MMMMMMMs   *FFFc                    t          j        t           j                  j        dz  }dg}dg}|dz
  g} ||||ff          }t	          | |d          }d}	t          j        t          |	          5  |                    |           d d d            n# 1 swxY w Y   t          j        t          |	          5  |	                    |           d d d            d S # 1 swxY w Y   d S )	Nr   r   r   r2   r%  r{  r|  r4   )
r!   r  r~  r   r   r7   r8   r9   r:   r.   )
r  rM   rR  rW  r  r  r  r/   r  r   s
             r%   0test_csr_polynomial_expansion_too_large_to_indexr    s|    "(##'1,J5D#C>
Ctc3Z())A	)V
 
 
B	6  
z	-	-	-  
q			              	z	-	-	-  
                 s$   1BBB9CC #C sparse_containerc                    t          j        d          }t          dd          }d}t          j        t
          |          5  |                    |           ddd           n# 1 swxY w Y   t          dd          }d	}t          j        t
          |          5  |                    |           ddd           n# 1 swxY w Y   | | |          fD ]}t          dd
          }|                    |          }t          j        |          r|	                                }t          |t          j        |j        d         df                     dS )zCheck 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.r4   Nr  zoSetting both min_degree and max_degree to zero and include_bias to False would result in an empty output array.Tr2   )r!   onesr   r7   r8   r9   r.   r   r   r   r   rk   )r  r/   rC  r=   _Xoutputs         r%   1test_polynomial_features_behaviour_on_zero_degreer    s   
 	AQU;;;D	"  
z	1	1	1  1               V%@@@D	8  
z	1	1	1  1               ""1%%& = =!>>>##B''?6"" 	&^^%%F627AGAJ?#;#;<<<<= =s$   A%%A),A)C  CCc                      t           j        dk    s t           j        dk    rt           j        dk    rd} nd} t                      | k    sJ d S )Nwin32        
emscriptenr      )sysplatformmaxsizer   )expected_sizes    r%   test_sizeof_LARGEST_INT_tr    sS     |wu!=!=$&&-777777r'   r  zyOn Windows, scikit-learn is typically compiled with MSVC that does not support int128 arithmetic (at the time of writing))reasonrunc                    t          t          j        t          j                  j        dz  dz             }dg}dg}|dz
  g}|dz
  g}|                    t          ||dz   z  dz  |d         z                        |                    t          ||dz   z  |dz   z  dz  |d         z                         | |||ff          }t          ddd	          }t          j        d
k    rMd}t          j
        t          |          5  |                    |           d d d            d S # 1 swxY w Y   d S |                    |          }	t          d          D ]*}
|	d||
         f         t          j        d          k    sJ +d S )NgUUUUUU?rG   r   r   r2   r   r   Fr{  r  r|  r4   )r  r!   r  r~  r   r  r   r  r  r7   r8   r9   r.   r   r  )rR  rW  r  r  r  r  r/   r  r   rl   r  s              r%   *test_csr_polynomial_expansion_windows_failr    s    RXbh''+6:;;J5D#C>
C 	Q J*q.)Q.1A!1DDEE   J*q.)Z!^<ADTUVDWWXX   	tc3Z())A	Uq	Q	Q	QB
{e: 	
 ]:S111 	  	 Q	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  	  ""1%%88 	K 	KC1.s334c8J8JJJJJJ	K 	Ks   D((D,/D,z$array_namespace, device_, dtype_name)ids)r   r%  rG   r(  c                    t          ||          }| \  }}	|                    |          }
|                    |
|          }t          d          5  t	          |||                              |
          }t	          |||                              |          }|                    |
          }|                    |          }t          t          ||          |           t          |          d         j
        |j
        k    sJ t          |          t          |          k    sJ |j        |j        k    sJ 	 ddd           dS # 1 swxY w Y   dS )zNTest array API compliance for PolynomialFeatures on 2 features up to degree 3.r   Tarray_api_dispatchr  )xpr   N)r   rM  asarrayr   r   r:   rj   r   r   r   __name__r   r   )r$  rH   rM   r  array_namespacedevice_
dtype_namer  r/   rI   X_npX_xptf_nptf_xpout_npout_xps                   r%   -test_polynomial_features_array_api_compliancer  6  s   $ 
ow	7	7BDAq88JD::d7:++D	4	0	0	0 * *"GW
 
 

#d)) 	 #GW
 
 

#d)) 	 &&&&)&R888&AAAV$$Q'0BK????f~~----|tz)))))* * * * * * * * * * * * * * * * * *s   C-EEEc                 >   t          | |          }t          j        d                              d                              |          }|                    ||          }d}t          d          5  t          d                              |          }t          |          r|
                    |           nHt          j        t          |	          5  |
                    |           d
d
d
           n# 1 swxY w Y   d
d
d
           d
S # 1 swxY w Y   d
S )zkTest that PolynomialFeatures with order='F' raises ValueError on
    array API namespaces other than numpy.r   r  r  zBPolynomialFeatures does not support order='F' for non-numpy arraysTr  r+   r)   r4   N)r   r!   r,   r-   rM  r  r   r   r:   r   rj   r7   r8   r9   )r  r  r  r  r/   r  r   r  s           r%   4test_polynomial_features_array_api_raises_on_order_Fr  \  s    
ow	7	7B
	!V$$++J77A::a:((D
NC	4	0	0	0 # #c***..t44r"" 	#LLz555 # #T"""# # # # # # # # # # # # # # ## # # # # # # # # # # # # # # # # #s7   4A$DC:.D:C>	>DC>	DDD)ar   r  numpyr!   r7   numpy.testingr   r   scipyr   scipy.interpolater   scipy.sparser   rh  sklearn._configr   sklearn.linear_modelr	   sklearn.pipeliner
   sklearn.preprocessingr   r   r   /sklearn.preprocessing._csr_polynomial_expansionr   sklearn.utils._array_apir   r   r   r   r   r   sklearn.utils._maskr   sklearn.utils._testingr   r   r   sklearn.utils.fixesr   r   markparametrizer0   r>   rJ   rd   rm   r   ry   r   r   r   r   r   r   r   r   r   r   r   r  r
  r  fixturer  slicer   r$  r*  rD  r  r}  r   rQ  rV  rb  ri  ro  rq  rt  r  sqrtr  r~  r   r  r  r  r  xfailr  r  r  r  r6   r'   r%   <module>r     s   				 



      = = = = = = = =       % % % % % % 0 0 0 0 0 0 * * * * * * 1 1 1 1 1 1 % % % % % %         
                     * ) ) ) ) )         
        !35F GHH	9 	9 IH	9 
QC5	NO
QFQF#	$&ST
QC!:	 JK + + + :z*BCC  DC# # #L 222  Aq6**2 2 +*	 
2 55A;;//EE!QKK009j"9:::z*BCC> > DC ;: 10 0/>2 &+.0NOO3 3 PO3, ;;;	AtXRX1v1v2w&?@@ABH***++BHq!fq!fq"g.//		
 
AtXRX1v1v2wB&HIIJ	QhbhAAB'@AABBH***++BHq!fq!fq"g.//		
 (0 0) (0 &+.0NOOI I POI>  $4 4 4, Aq6**#" #" +*#"L &+.0NOO???333 3 43 PO3l0 0 02 55A;;//9j"9::LLL  %77-
 -
 87  ;: 0/-
` QG,,$77Aq6**LLL  5$-88> > 98  +* 87 -,>" LLL  5$-88F F 98 FR LLL  5$-88E E 98 E, 
G	GH
H	HI
F	FG
I	 JK	 , , ,    5	
D%tT**+	
E5%%4..)	
D$A	
E4!	uiii(	1v&	taS!	b!	  (?.(PQQN N RQ N.   * 5	
D%q!%	
E5%%1++&	
D$%	
E4#	ulll+	yyy)	taV$	qc"	
D%tT**+	
E5%%4..)	
D$%	
E4#	u6667	uuQ~~.	taV$	qc"	uooo.	|||,	taS!	b!) 2 (?.(PQQN N RQ3 4N.IO IO IOX 888	
D%	
D%	
D%$	
D%$	
E5"*%	
E4$	
E5"*%	
E4$	  .99: : :9 :$ 888	
D%	
D%	
D%$	
D%$	
E5"*%	
E4$
 
 .99: : :9
 
:$ yyy11FFF  +dE];;$77.992 2 :9 87 <;  2122 888	
D%$	
D%$	
E5"*%	
E4$	  .99: : :9 :" 111   " .99: : :9# $:$ '(@@@  .99: : :9	 
:" &&&    .99: : :9  :" +dE];;$77.99o8 o8 :9 87 <;o8d  	 
CC**.//!3445 
CC**.//001   +dE];;$77.99BN BN :9 87 <;! &BNJ +dE];;$77.99  :9 87 <;* +^n-LMM= = NM=<8 8 8 LG	6 	    .99"K "K :9 "KJ *--//'   
 +dE];;$77#9#9#9::* * ;: 87 <; *< *--//'   
# # 
# # #r'   