
    ri                     H   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jV                  jY                  deef      d        Z-ejV                  jY                  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jV                  jY                  dddg      d        Z/d Z0ejV                  jY                  dg d      ejV                  jY                  ddd g      d!               Z1ejV                  jY                  d e2dd"            ejV                  jY                  d# e2d d"            ejV                  jY                  dd$d%g      ejV                  jY                  dd&dg      d'                             Z3ejV                  jY                  d(d)gd*d+g      d,        Z4ejV                  jY                  g d-d$d d ejj                  d dgd d.gd/d0gg      fd$d  ejj                  g d1       ejj                  ddgd2d.gd/d0gg      fd$d2d ejj                  d dgdd/gd2d3gd/d0gg      fd%d d ejj                  d dgd d gd/d0gg      fd%d  ejj                  g d1       ejj                  ddgd"d.gd/d0gg      fg      d4        Z6ejV                  jY                  d(d)gd*d+g      d5        Z7d6 Z8d7 Z9ejV                  jY                  dd d"g      d8        Z:ejV                  jY                  d(d)gd*d+g      ejV                  jY                  dg d9      d:               Z;d; Z<ejV                  jY                  d e2dd             ejV                  jY                  dd$d%g      ejV                  jY                  dg d<      ejV                  jY                  d=d>d?g      d@                             Z=ejV                  jY                  d#d"d3g      ejV                  jY                  d=d?d>g      ejV                  jY                  dd d2g      ejV                  jY                  dg d<      ejV                  jY                  dAd>d?g      dB                                    Z>ejV                  jY                  dg d<      ejV                  jY                  dAd>d?g      dC               Z?ejV                  jY                  dg d<      ejV                  jY                  dAd>d?g      dD               Z@ejV                  jY                  dddEidFfddGidFfddHidFfddIidJfg      dK        ZA ej                         dL        ZCejV                  jY                  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jV                  jY                  dPdge*z   e)z         dQ               ZE ej                         dR        ZFejV                  jY                  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jV                  jY                  dPdge*z   e)z         d\               ZGd] ZHejV                  jY                  g d^dd?d>eIfdd?d>eIfdd?d>ej                  fdd?d>ej                  fd d>d>ej                  fd d>d?ej                  fd2d>d>ej                  fd2d>d?ej                  fg      ejV                  jY                  d_e)      d`               ZLejV                  jY                  g d^dd?d>eIfdd?d>eIfdd?d>ej                  fdd?d>ej                  fd d>d>ej                  fd d>d?ej                  fg      ejV                  jY                  dae*      db               ZMejV                  jY                  dcg dd      ejV                  jY                  deg df      ejV                  jY                  dgd?d>g      ejV                  jY                  d=d?d>g      ejV                  jY                  dae*      dh                                    ZNejV                  jY                  g d^dd?d>ej                  fdd?d>ej                  fd d>d>ej                  fd d>d?ej                  fg      ejV                  jY                  dae*      di               ZOejV                  jY                  g djg dk      ejV                  jY                  dae*      dl               ZPejV                  jY                  d=dggg dm      ejV                  jY                  dae*      dn               ZQejV                  jY                  g dog dp      ejV                  jY                  dae*      dq               ZRejV                  jY                  dgd?d>g      ejV                  jY                  d=d?d>g      ejV                  jY                  dae*      dr                      ZSejV                  jY                  dsdtdud eI ej                   ej                  ej                        j                        dz         fdvd eI ej                   ej                  ej                        j                              fg      ejV                  jY                  dgd?d>g      ejV                  jY                  d=d?d>g      ejV                  jY                  dae*      dw                             ZXejV                  jY                  dgd?d>g      ejV                  jY                  d=d?d>g      ejV                  jY                  dae*      dx                      ZYejV                  jY                  dye*e)z         dz        ZZd{ Z[ejV                  j                  ej                  d|k(  d}d?~      ejV                  jY                  dae*      d               Z^ejV                  jY                  d e!       e      ejV                  jY                  dgd?d>g      ejV                  jY                  d=d?d>g      ejV                  jY                  dg d      d                             Z_ejV                  jY                  d e!       e      d        Z`y)    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                 *   t        j                  d      j                  dd      }d } | |        j                  |            sJ  | | d      j                  |            sJ t        j                   | d      j                  |            sJ y)	z+Test that output array has the given order.
         c                 @    t        j                  | j                        S )N)np	isfortranT)as    i/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/sklearn/preprocessing/tests/test_polynomial.pyis_c_contiguousz?test_polynomial_and_spline_array_order.<locals>.is_c_contiguous/   s    ||ACC      CorderFN)r!   arangereshapefit_transformr"   )r   Xr&   s      r%   &test_polynomial_and_spline_array_orderr0   *   s~     			"a#A! 35..q12223S>77:;;;<<#44Q7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 | j	                  |       ddd       y# 1 sw Y   yxY w)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   sJ     qc
A	z	1 +#F#''*+ + +   AAextrapolationcontinueperiodicc                     t        j                  d      j                  dd      }ddgddgddgddgddgg}t        d	|| 
      j	                  |      }y)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   s`     			"b!$AVaVaVb"XBx8E]	mA r'   c                  @   t        j                  d      j                  dd      } t        ddd      j	                  |       }|j                         }t        |g d       t        ddd      j	                  |       }|j                  d	d
g      }t        |g d       y)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HHKD..0M	
  QquEII!LD..Sz:M		
r'   )constantlinearrA   rB   rH   rG   c                 <   t        j                  d      j                  dd      }t        ||       j	                  |      }|j                  ddg      }t        |      |j                  k(  sJ |j                  |      }|j                  d   t        |      k(  sJ y)	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LLQOD..Sz:M}!5!5555nnQG==s=1111r'   r   rL   uniformquantilere   c                 h   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|      }|j	                  |       ||fD ]2  }t        t        j                  |j                  |      d	      d       4 y)
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#q$w'AeeaSE1SqS!V9se+,Gqt!tQwZF
"F"#D 	HHWv >t~~a0q91=>r'   bias	interceptTFFTc           	      .   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      }|j                  ||       t        |j                  |      |d       y)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NDLLOQT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	        ||       y
)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      sb    0 	1a&1a&1a&1a&1a&1a&1b'J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      }|j                  | ||dddf                t        j                  ddd      dddf   }|j                  |      }t        | ||dddf         dd       t        |dd |dd d       y)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<    vva"%%i!m$rvva"%%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      s    
A 	Aq#q$w'A !!%",	 $9=>
D 	HHQ!AqD'
 
RC	 D	)B,,r"KK2ad84dCK#&C(<4Hr'   c                  J   t        j                  ddd      dddf   } d}t        |ddgdgd	gg
      }|j                  |       }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        ||       y)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 88c3Z#sc3Z#sDED
"))B"D&*
=CqAw<DBr'   c            
         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      }|j                  |       }|j                  |       }t	        ||ddg df          y)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$q/123r'   c           
      ,   t        j                  ddd      dddf   }t        | ddgdgdgd	gd
gdgg      }|j                  |      }|j	                         |j                         z
  t        |      z  }d|z  }|}t        d| dz         D ]F  }t        j                  |d      }t        j                  |      j	                         |k  sJ ||z  }H t        j                  |d      }t        j                  |      j	                         dkD  sJ y)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   %  s    	BF#AtG,A# usecUSEC53%8K
 
	"	"1	%BUUWquuw#a&(E
u*C
C 1fqj! wws#vvd|!C'''Ul 773QD66$<!!!r'   )r2   r   rG   r   r   c           	         t        j                  ddd      dddf   }|j                         }t        dt	        d|| d      gd	t        |
      gg      }|j                  ||       t        |j                  dgdgg      ddg       t        dt	        d|| d      gd	t        |
      gg      }|j                  ||       t        |j                  dgdgg      ddg       t	        d|| d      }|j                  |       d}t        j                  t        |      5  |j                  dgg       ddd       t        j                  t        |      5  |j                  dgg       ddd       y# 1 sw Y   AxY w# 1 sw Y   yxY w)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NDLL3%!.Q8  !!!%"*	 $9=>	
D 	HHQNDLL3%!.a9 &t7D 	HHQK
>C	z	-  w 	z	- u     s   "E6F6E?Fc                 .   t         j                  j                  |       }|j                  d      j	                  dd      }d}|dz   }t        |ddd      }|j                  |      }t        |ddd	
      }|j                  |      }t        ||d       y)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
3C		#sA&AFqjG$D   #G
/	C a E GU/r'   )r   re   rf   rA   rB   rM   FTc                 :   t         j                  j                  |      }|j                  d      j	                  dd      }t        | |||d      }t        | |||d      }|j                  |       |j                  |       |j                  |      }	|j                  |      }
t        j                  |	      r|	j                  dk(  sJ t        |
|	j                                t        j                  |d	      }t        j                  |d	      }t         j                  t        j                   |dz
  |d
      t        j                   ||dz   d
      f   }|dk(  rod}t#        j$                  t&        |      5  |j                  |       d d d        d}t#        j$                  t&        |      5  |j                  |       d d d        y t        |j                  |      |j                  |      j                                y # 1 sw Y   zxY w# 1 sw Y   y xY w)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
3C		#r1%A"#!J $#!K NN1OOA **1-N((+M??>*~/D/D/MMMM>#9#9#;< GGAAEGGAAEee
EAIub)2;;ueai+LLG B]]:S1 	*  )	*]]:S1 	+!!'*	+ 	+ 	  );+@+@+I+Q+Q+S	
	* 	*	+ 	+s   :H1HHHr   c                     t        | ||||      }t        j                  ddd      dddf   }|j                  |       |j	                  |      j
                  d   |j                  k(  sJ y)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     sm     !##D 	Aq"ag&AHHQK>>!""1%)=)====r'   c                    t        j                  ddgddgddgddgddggt         j                        }|j                         }t         j                  |d<   d}t        j                  t        t        j                  |      	      5  t        ddd
|       }|j                  |       ddd       t        ddd| |      }|j                  |      }|j                  |      j                  |      }t        ||       |j                  |g d      }t        ||       |j                  |      ddd   }	|j                  |      j                  |ddd         }
t        |	|
       t        |t         j                        }t        j                   ||j"                  d   j$                  j&                  d   d      }||   dk(  j)                         sJ |j                  |      }t+        j,                  |      r|j/                         }|dk\  j)                         sJ |dk  j)                         sJ |j                  |      }|j                  |      }t        ||    ||           y# 1 sw Y   xY w)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    sk    	1a&1a&1a&1a&1a&9LAFFHE&&E$K WC	z3	8 $""'	
 	U#$ ##F **51O%zz%0::5A 2JK *0)=)=_ *> *& !2TU "(!5!5e!<SqS!A'-zz%'8'B'B51:'N$ "$D
 'Hyy6+;+;A+>+@+@+F+Fq+IPQR,-277999 **51O')113q %%'''q %%''' &&q)K**51O %%&9I8I(Js$ $s   !I--I7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| |      }|j	                  |       |j                  |      }t        |t         j                        }t        j                  ||j                  d   j                  j                  d   d	      }||   dk(  j                         sJ y
)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266266"2RVVQK!@A##F JJ !!'!1!12C!D*BFF3Hyy6+;+;A+>+@+@+F+Fq+IPQR&'78A=BB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 | j	                  |       ddd       y# 1 sw Y   yxY w)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  sJ     qc
A	z	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  sL    
		!Q

]#A
		2<<?Aq!tQT23Aa4Kr'   z/degree, include_bias, interaction_only, indicesr   rG   )r   r   rG   X_containerc                 J   | \  }}| ||      }t        |||      j                  |      }|j                  |      }	||	j                         }	t	        |	|dd|f          |j
                  dkD  r2|j                  j                  |j
                  |j                  fk(  sJ yy)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N	LCS
	c!f  ,,q/CkkmC1g:'	q zzB$9$92;L;L#MMMM !r'   c                  p   t        j                  d      j                  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	
1bqb5B	
1ab5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                 J   | \  }}| ||      }t        |||      j                  |      }|j                  |      }	||	j                         }	t	        |	|dd|f          |j
                  dkD  r2|j                  j                  |j
                  |j                  fk(  sJ yy)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N	LCS
	c!f  ,,q/CkkmC1g:'	q zzB$9$92;L;L#MMMM !r'   c                     t        j                  d      j                  dd      } t        dd      j	                  |       }|j                         }t        g d|       t        |      |j                  |       j                  d   k(  sJ t        dd	      j	                  |       }|j                  g d
      }t        g d|       t        |      |j                  |       j                  d   k(  sJ t        dd	      j	                  |       }|j                  g d
      }t        g d|       t        |      |j                  |       j                  d   k(  sJ t        ddd      j	                  |       }|j                  g d
      }t        ddg|       t        |      |j                  |       j                  d   k(  sJ t        dd      j	                  |       }|j                  g d      }t        g d|       y )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AD..0MR }!2!8!8!;;;;QU;??BD..?M	
* 	-0 }!2!8!8!;;;;V%@DDQGD..?M	
$ 	'* }!2!8!8!;;;;D4	c!f 	 ..?MW~}5}!2!8!8!;;;; QT:>>qAD../QRM>Nr'   )degrM   r  r   csc_containerc                    t         j                  j                  |      }|j                  ddd      } ||      }t	        | ||      }	|	j                  |j                  |            }
|	j                  |j                  |            }t        j                  |
      r|
j                  dk(  sJ |
j                  |j                  k(  sJ t        |
j                         |       y )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
3CAq(#A!E
,9IC u||E23F  %1H??6"v}}'===<<8>>)))fnn.9r'   csr_containerc                    t         j                  j                  |      }|j                  ddd      } ||      }t	        | ||      }	|	j                  |j                  |            }
|	j                  |j                  |d            }t        j                  |
      r|
j                  dk(  sJ |
j                  |j                  k(  sJ t        |
j                         |       y )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
3CAq(#A!E
,9IC u||E23F  %e!<=H??6"v}}'===<<8>>)))fnn.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                  |       |j                  }t        j                  | d|||      }	|t	        |	D 
cg c]  }
d c}
      k(  sJ yc c}
w )z?
    Test that n_output_features_ is calculated correctly.
    r2   r   )rH   r  rM   rW  
min_degree
max_degreer  rM   N)r   r:   r  _combinationsrv   )rW  rZ  r[  r  rM   rR  r   r   
num_comboscombosrI   s              r%   test_num_combinationsr_  `  s     	saS:>"2345A
)!C
 GGAJ''J--)!F 0Aa011110s   "	A7
c                     |t        ddd|            }|j                         }t        | ||      }|j                  |j	                  |            }	|j                  |j	                  |            }
t        j                  |	      r|	j                  dk(  sJ |	j                  |
j                  k(  sJ t        |	j                         |
       y )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_floatsrf    s     -b#DVWXEA
,9IC u||E23F  %1H??6"v}}'===<<8>>)))fnn.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                 v    |t        ddd|            }d|| d d f<   |j                         }t        |d|      }|j                  |      }|j                  |      }	t	        j
                  |      r|j                  dk(  sJ |j                  |	j                  k(  sJ t        |j                         |	       y )	NrG   r   r   rc  r   FrI  r   	re  r   r   r.   r   r   r   r   r   )
rg  rE  r  rR  r   rT  r/   r   rU  rP  s
             r%   'test_polynomial_features_csr_X_zero_rowrl    s    * -2sASTUE"E.!
A
SuGW
XCu%F  #H??6"v}}'===<<8>>)))fnn.9r'   ))TTr|   r}   )FFc                 d    |t        ddd|            }|j                         }t        d| |      }|j                  |      }|j                  |      }t	        j
                  |      r|j                  dk(  sJ |j                  |j                  k(  sJ t        |j                         |       y )Nra  r   rb  rc  r   rI  r   rk  )	rM   r  rR  r   rT  r/   r   rU  rP  s	            r%   'test_polynomial_features_csr_X_degree_4rn    s     -b#DVWXEA
	7GC u%F  #H??6"v}}'===<<8>>)))fnn.9r'   )rE  dimr  )
)r   r2   Trh  )rG   r2   T)rG   r   T)rG   rG   T)r   r2   Fri  )rG   r2   F)rG   r   F)rG   rG   Fc                 b    |t        d|d|            }|j                         }t        | |      }|j                  |      }|j                  |      }	t	        j
                  |      r|j                  dk(  sJ |j                  |	j                  k(  sJ t        |j                         |	       y )Nra  rb  rc  )r  r   rk  )
rE  ro  r  rR  r   rT  r/   r   rU  rP  s
             r%   (test_polynomial_features_csr_X_dim_edgesrq    s    & dC3EFE 	A
S3C
DCu%F  #H??6"v}}'===<<8>>)))fnn.9r'   c           
      Z     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	      }|j                  |d
d|j                  |j                        }|t        j                  t         j                        j                  kD  r8d}t        j                  t        |      5  |j                  |
       ddd       y|j!                  |
      }|j#                         \  }}||z   } |||	t%                   |	d         |z   }|r	dg|dz
  z  ng }|r	d
g|dz
  z  ng }t'        d      D ]  }|d|z     }|d|z  dz      }|	d|z     }|	d|z  dz      }|r"|j)                  d       |j)                  d
       |j+                  ||g       |j+                  |t%        |      z   |t%        |      z   g        sS|j+                  ||z  ||z  ||z  g       |j+                   ||||      |z    ||||      |z    ||||      |z   g       |j+                  ||z  g       |j)                   ||||      |z           t%        |      dz   dt%                z  z   }|j,                  |dz   k(  sJ |j.                  |k(  sJ |j0                  ||dz   fk(  sJ |j2                  j.                  |j4                  j.                  cxk(  rt         j                  k(  sJ  J |j4                  j                         t        j                  t         j6                        j                  kD  sJ |rt9        t'        |dz
              ng }|j+                  |dz
  g|z  |dz
  g|z  z          t;        |j<                  |       t?        ||       t?        ||       y# 1 sw Y   yxY w)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  sP    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  rv  	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_targetrt  r   r   x_idxy_idxnnz_per_rowrow_nonzero_targets   `                           r%   ;test_csr_polynomial_expansion_index_overflow_non_regressionr    sV    / IJJ99Q*D
((IM9q=)a-QO
PC ((	aaaaHPRPXPXC 		Sz*%	A
 
)Q
B ++,,__ ,  "((277+///> 	 ]]:S1 	FF1I	q!G&0K(<7j#c.>*>&?"@#a&I
!	"  ,81#Q'RK2>!	A.B1X QKQOAE
AEAIq!%%a(Aq6"!!S&&L0A(AB	
  Aq1ua!e45%%!*eU;>UU!*eU;>UU!*eU;>UU Aw'%%j%7:QQ/6 l#a'!c6F2F.G*GGK  $4q$8888==J&&&==Y(81(<====>>7??#8#8DBHHDDDDD?? 288BHH#5#9#99997CeIM23	Q+%Q+(EE GLL+.{$67{$67w	s   1P!!P*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}	|	j                  ||dz   z  dz  |	d   z          |	j                  ||dz   z  |dz   z  dz  |	d   z           ||||ff      }
t        |||       }|j                  |d| |j                  |j                        }|t        j                  t         j                        j                  kD  r8d	}t        j                  t        |
      5  |j!                  |
       ddd       y|j#                  |
      }|t        j                  t         j                        j                  kD  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J  J |j.                  |k(  sJ |r|d   t        j0                  d      k(  sJ t3        |      D ]$  }|d|	|   f   t        j0                  d      k(  r$J  ||z  }| dk(  r|d|z   z  }|j(                  |	| dz
     dz   |z
  k(  sJ y# 1 sw Y   yxY w)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   rx  rY  ry  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"((2882D2H2H HBHHbhhM
((A3m
,C
((JN#=
9C 	Q\** J*q.9Q>AQRSATTUj1n%a8A=@PQR@SS 	tc3Z()A	)V
B ++,,__ ,  "((277+///> 	 ]]:S1 	FF1I	q!G!1BHHRXX4F4J4J!JRXXPRPXPXN&1*0@,@(AAAN|$~5L==AGG###==Q 5 56666>>7??#8#8JNJJJJJ;;,&&&t}c 2222^$ Gq*3//0FMM#4FFFFG 
*F{!j.   $4VaZ$@1$Dv$MMMM/	s   3LLc                    t        j                  t         j                        j                  dz  }dg}dg}|dz
  g} ||||ff      }t	        | |d      }d}	t        j                  t        |	      5  |j                  |       d d d        t        j                  t        |	      5  |j                  |       d d d        y # 1 sw Y   ?xY w# 1 sw Y   y xY w)	Nr   r   r   r2   r%  rx  ry  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   4C)CCCsparse_containerc                 n   t        j                  d      }t        dd      }d}t        j                  t
        |      5  |j                  |       ddd       t        dd      }d	}t        j                  t
        |      5  |j                  |       ddd       | | |      fD ]s  }t        dd
      }|j                  |      }t        j                  |      r|j                         }t        |t        j                  |j                  d   df             u y# 1 sw Y   xY w# 1 sw Y   xY w)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 V%@D	8  
z	1 1 "1%& =!>##B'??6"^^%F6277AGGAJ?#;<=  s    DD+D(+D4c                      t         j                  dk(  s&t         j                  dk  rt         j                  dk7  rd} nd} t               | k(  sJ y )Nwin32        
emscriptenr      )sysplatformmaxsizer   )expected_sizes    r%   test_sizeof_LARGEST_INT_tr    sB     ||wu!=$&-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}|j                  t        ||dz   z  dz  |d   z                |j                  t        ||dz   z  |dz   z  dz  |d   z                 | |||ff      }t        ddd	      }t        j                  d
k  r8d}t        j                  t        |      5  |j                  |       d d d        y |j                  |      }	t        d      D ]$  }
|	d||
   f   t        j                  d      k(  r$J  y # 1 sw Y   y xY w)NgUUUUUU?rG   r   r   r2   r   r   Frx  r  ry  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    RXXbhh'++6:;J5D#C>
C 	Q J*q.)Q.1A!1DDE J*q.)Z!^<ADTUVDWWX 	tc3Z()A	Uq	QB
{{e: 	
 ]]:S1 	 Q	  	  ""1%8 	KC1.s334c8JJJJ	K		  	 s   1EEz$array_namespace, device_, dtype_name)ids)r   r%  rG   r(  c                 N   t        ||      }| \  }}	|j                  |      }
|j                  |
|      }t        d      5  t	        |||      j                  |
      }t	        |||      j                  |      }|j                  |
      }|j                  |      }t        t        ||      |       t        |      d   j                  |j                  k(  sJ t        |      t        |      k(  sJ |j                  |j                  k(  sJ 	 ddd       y# 1 sw Y   yxY w)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	7BDAq88JD::d7:+D	4	0 *"GW

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

#d) 	 &&)&R8&AV$Q'00BKK???f~---||tzz)))* * *s   CDD$c                    t        | |      }t        j                  d      j                  d      j	                  |      }|j                  ||      }d}t        d      5  t        d      j                  |      }t        |      r|j                  |       n5t        j                  t        |	      5  |j                  |       d
d
d
       d
d
d
       y
# 1 sw Y   xY w# 1 sw Y   y
xY w)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	7B
		!V$++J7A::a:(D
NC	4	0 #c*..t4r"LLz5 #T"## #
# ## #s%   !AC$5CC$C!	C$$C-)ar   r  numpyr!   r7   numpy.testingr   r   scipyr   scipy.interpolater   scipy.sparser   re  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  rz  r   rQ  rV  r_  rf  rl  rn  rq  r  sqrtr}  r{  r   r  r  r  r  xfailr  r  r  r  r6   r'   r%   <module>r     s   	 
   =  % 0 * 1 % 
  * 
 !35F GH	9 I	9 
QC5	NO
QFQF#	$&ST
QC!:	 JK++ :z*BC D#L 2 Aq6*2 +	
2 5A;/E!QK09j"9::z*BC> D ; 1 0>2 &+.0NO3 P3, ;	AtXRXX1v1v2w&?@ABHH*+BHHq!fq!fq"g./		
 
AtXRXX1v1v2wB&HIJ	QhbhhAAB'@ABBHH*+BHHq!fq!fq"g./		
(0)(0 &+.0NOI PI>$4, Aq6*#" +#"L &+.0NO?33 4 P3l02 5A;/9j"9:L %7-
 8 ; 0-
` QG,$7Aq6*L 5$-8> 9 + 8 ->" L 5$-8F 9FR L 5$-8E 9E, 
G	GH
H	HI
F	FG
I	 JK	,,   5	
D%tT*+	
E5%4.)	
D$A	
E4!	ui(	1v&	taS!	b!	 (?.(PQN RN.  * 5	
D%q!%	
E5%1+&	
D$%	
E4#	ul+	y)	taV$	qc"	
D%tT*+	
E5%4.)	
D$%	
E4#	u67	uQ~.	taV$	qc"	uo.	|,	taS!	b!)2 (?.(PQN R34N.IOX 8	
D%	
D%	
D%$	
D%$	
E5"**%	
E4$	
E5"**%	
E4$	 .9: ::$ 8	
D%	
D%	
D%$	
D%$	
E5"**%	
E4$
 .9: :
:$ y1F +dE];$7.92 : 8 < 222 8	
D%$	
D%$	
E5"**%	
E4$	 .9: ::" 1" .9: :#$:$ '(@ .9: :	
:" & .9: : :" +dE];$7.9o8 : 8 <o8d  	 
C*../!345 
C*../01  +dE];$7.9BN : 8 <!&BNJ +dE];$7.9 : 8 <* +^n-LM= N=<8 LLG	6 	   .9"K :"KJ *-/'  
 +dE];$7#9:* ; 8 <*< *-/'  
#
#r'   