
    Ki                     6   S SK r S SKrS SKrS SKrS SKJrJr  S SKJ	r	  S SK
Jr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJrJrJr  S S
KJr  S SKJrJrJrJrJ r J!r!  S SK"J#r#  S SK$J%r%J&r&J'r'  S SK(J)r)J*r*  \RV                  RY                  S\\45      S 5       r-\RV                  RY                  SSS//0S4SSS/SS//0S4SS/S //0S4/5      S 5       r.\RV                  RY                  SSS/5      S 5       r/S r0\RV                  RY                  S/ SQ5      \RV                  RY                  SSS /5      S! 5       5       r1\RV                  RY                  S\2" SS"5      5      \RV                  RY                  S#\2" S S"5      5      \RV                  RY                  SS$S%/5      \RV                  RY                  SS&S/5      S' 5       5       5       5       r3\RV                  RY                  S(S)/S*S+/5      S, 5       r4\RV                  RY                  / S-QS$S S\Rj                  " S S/S S./S/S0//5      4S$S \Rj                  " / S1Q5      \Rj                  " SS/S2S./S/S0//5      4S$S2S\Rj                  " S S/SS//S2S3/S/S0//5      4S%S S\Rj                  " S S/S S /S/S0//5      4S%S \Rj                  " / S1Q5      \Rj                  " SS/S"S./S/S0//5      4/5      S4 5       r6\RV                  RY                  S(S)/S*S+/5      S5 5       r7S6 r8S7 r9\RV                  RY                  SS S"/5      S8 5       r:\RV                  RY                  S(S)/S*S+/5      \RV                  RY                  S/ S9Q5      S: 5       5       r;S; r<\RV                  RY                  S\2" SS 5      5      \RV                  RY                  SS$S%/5      \RV                  RY                  S/ S<Q5      \RV                  RY                  S=S>S?/5      S@ 5       5       5       5       r=\RV                  RY                  S#S"S3/5      \RV                  RY                  S=S?S>/5      \RV                  RY                  SS S2/5      \RV                  RY                  S/ S<Q5      \RV                  RY                  SAS>S?/5      SB 5       5       5       5       5       r>\RV                  RY                  S/ S<Q5      \RV                  RY                  SAS>S?/5      SC 5       5       r?\RV                  RY                  S/ S<Q5      \RV                  RY                  SAS>S?/5      SD 5       5       r@\RV                  RY                  SSSE0SF4SSG0SF4SSH0SF4SSI0SJ4/5      SK 5       rA\R                  " 5       SL 5       rC\RV                  RY                  SMS S?S>\D" SS5      4S S>S>\D" SS5      4S S?S?S S/4S S>S?S/4SNS?S>/ SOQ4SNS>S>SS /4SNS?S?S /4SNS>S?/ 4/5      \RV                  RY                  SPS/\*-   \)-   5      SQ 5       5       rE\R                  " 5       SR 5       rF\RV                  RY                  SMSS?S>\D" S S/5      4SS>S>\D" SS/5      4SS?S?/ SSQ4SS>S?/ STQ4SUS?S>/ SVQ4SUS>S>/ SWQ4SUS?S?S S2/4SUS>S?S2/4S S?S>\D" SS5      4S S>S>\D" SS5      4S S?S?/ SSQ4S S>S?/ STQ4SNS?S>/ SXQ4SNS>S>\D" S S5      4SNS?S?S S2/4SNS>S?S2/4SYS?S>/ SZQ4SYS>S>/ S[Q4SYS?S?S /4SYS>S?/ 4/5      \RV                  RY                  SPS/\*-   \)-   5      S\ 5       5       rGS] rH\RV                  RY                  / S^QSS?S>\I4SS?S>\I4SS?S>\R                  4SS?S>\R                  4S S>S>\R                  4S S>S?\R                  4S2S>S>\R                  4S2S>S?\R                  4/5      \RV                  RY                  S_\)5      S` 5       5       rL\RV                  RY                  / S^QSS?S>\I4SS?S>\I4SS?S>\R                  4SS?S>\R                  4S S>S>\R                  4S S>S?\R                  4/5      \RV                  RY                  Sa\*5      Sb 5       5       rM\RV                  RY                  Sc/ SdQ5      \RV                  RY                  Se/ SfQ5      \RV                  RY                  SgS?S>/5      \RV                  RY                  S=S?S>/5      \RV                  RY                  Sa\*5      Sh 5       5       5       5       5       rN\RV                  RY                  / S^QSS?S>\R                  4SS?S>\R                  4S S>S>\R                  4S S>S?\R                  4/5      \RV                  RY                  Sa\*5      Si 5       5       rO\RV                  RY                  / SjQ/ SkQ5      \RV                  RY                  Sa\*5      Sl 5       5       rP\RV                  RY                  S=Sg// SmQ5      \RV                  RY                  Sa\*5      Sn 5       5       rQ\RV                  RY                  / SoQ/ SpQ5      \RV                  RY                  Sa\*5      Sq 5       5       rR\RV                  RY                  SgS?S>/5      \RV                  RY                  S=S?S>/5      \RV                  RY                  Sa\*5      Sr 5       5       5       rS\RV                  RY                  SsStSuS\I" \R                  " \R                  " \R                  5      R                  5      S-   5      4SvS\I" \R                  " \R                  " \R                  5      R                  5      5      4/5      \RV                  RY                  SgS?S>/5      \RV                  RY                  S=S?S>/5      \RV                  RY                  Sa\*5      Sw 5       5       5       5       rX\RV                  RY                  SgS?S>/5      \RV                  RY                  S=S?S>/5      \RV                  RY                  Sa\*5      Sx 5       5       5       rY\RV                  RY                  Sy\*\)-   5      Sz 5       rZS{ r[\RV                  R                  \R                  S|:H  S}S?S~9\RV                  RY                  Sa\*5      S 5       5       r^\RV                  RY                  S\!" 5       \S9\RV                  RY                  SgS?S>/5      \RV                  RY                  S=S?S>/5      \RV                  RY                  S/ SQ5      S 5       5       5       5       r_\RV                  RY                  S\!" 5       \S9S 5       r`g)    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                 @   [         R                  " S5      R                  SS5      nS nU" U " 5       R                  U5      5      (       d   eU" U " SS9R                  U5      5      (       d   e[         R                  " U " SS9R                  U5      5      (       d   eg)	z+Test that output array has the given order.
         c                 B    [         R                  " U R                  5      $ )N)np	isfortranT)as    m/var/www/html/dynamic-report/venv/lib/python3.13/site-packages/sklearn/preprocessing/tests/test_polynomial.pyis_c_contiguous?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_orderr1   *   s     			"a#A! 35..q122223S>77:;;;;<<#44Q7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                     S/S//n[         R                  " [        US9   [        S0 U D6R	                  U5        SSS5        g! , (       d  f       g= f)zATest that we raise errors for invalid input in SplineTransformer.r3   r   matchN )pytestraises
ValueErrorr   fitparamserr_msgr0   s      r%   (test_spline_transformer_input_validationr?   7   sA     qc
A	z	1#F#''* 
2	1	1   A
Aextrapolationcontinueperiodicc                     [         R                  " S5      R                  SS5      nSS/SS/SS/SS/SS//n[        S	X S
9R	                  U5      ng)zATest that SplineTransformer accepts integer value knot positions.   r   r   r   r3   r            )degreer2   rA   N)r!   r-   r.   r   r/   )rA   r0   r2   _s       r%   %test_spline_transformer_integer_knotsrK   G   s^     			"b!$AVaVaVb"XBx8E	mA r(   c                  6   [         R                  " S5      R                  SS5      n [        SSSS9R	                  U 5      nUR                  5       n[        U/ SQ5        [        SSSS9R	                  U 5      nUR                  S	S
/5      n[        U/ SQ5        g)z<Test that SplineTransformer generates correct feature names.rE   r   r   rH   T)n_knotsrI   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   )r0   spltfeature_namess      r%   %test_spline_transformer_feature_namesre   Q   s    
		"b!$AQqtDHHKD..0M	
  QquEII!LD..Sz:M		
r(   )constantlinearrB   rC   rI   rH   c                 :   [         R                  " S5      R                  SS5      n[        XS9R	                  U5      nUR                  SS/5      n[        U5      UR                  :X  d   eUR                  U5      nUR                  S   [        U5      :X  d   eg)	zkTest feature names are correct for different extrapolations and degree.

Non-regression test for gh-25292.
rE   r   r   )rI   rA   r$   rY   r3   N)
r!   r-   r.   r   r;   rb   lenn_features_out_	transformshape)rA   rI   r0   rc   rd   X_transs         r%   7test_split_transform_feature_names_extrapolation_degreern   w   s     			"b!$AFHLLQOD..Sz:M}!5!5555nnQG==s=1111r(   r   rM   uniformquantilerf   c                 b   [         R                  " SSS5      SS2S4   n[         R                  S//USSS2SS24   S//4   nUSSS2SS24   nUS:X  a  X-   n[        UU USUS9nUR	                  U5        XV4 H1  n[        [         R                  " UR                  U5      SS	9S5        M3     g)
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   r3   d   Nr   rC   T)rM   rI   r2   rN   rA   axis)r!   linspacer_r   r;   r   sumrk   )rI   rM   r2   rA   r0   X_trainX_testrc   s           r%   +test_spline_transformer_unity_decompositionrz      s     	Aq#q$w'AeeaSE1SqS!V9se+,Gqt!tQwZF
""#D 	HHWt~~a0q91= r(   bias	interceptTFFTc           
         [         R                  " SSS5      SS2S4   n[         R                  " USS2S4   5      S-   n[        S[	        SSU S	S
94S[        US94/S9nUR                  X#5        [        UR                  U5      USS9  g)z7Test that B-splines fit a sinusodial curve pretty well.r   r   rr   Nr   spline   rH   rf   rM   rI   rN   rA   olsfit_interceptstepsMbP?rtol)	r!   ru   sinr
   r   r	   r;   r   predict)r{   r|   r0   ypipes        r%   )test_spline_transformer_linear_regressionr      s     	Ar34(A
qAw!A !!%",	 $9=>
D 	HHQNDLLOQT2r(   )r2   rM   sample_weightexpected_knots         )r   r   r3   r3   r   rH   r3      r   c           
          [         R                  " SS/SS/SS/SS/SS/SS/SS//5      n[        R                  " X@XS	9n[	        XS5        g
)zJCheck the behaviour to find knot positions with and without sample_weight.r   r   rH   r   r   r   r   r   )r0   r2   rM   r   N)r!   arrayr   _get_base_knot_positionsr   )r2   rM   r   r   r0   
base_knotss         r%   /test_spline_transformer_get_base_knot_positionsr      s\    0 	1a&1a&1a&1a&1a&1a&1b'JKA";;
'J J/r(   c           
      v   S n[         R                  " SSS5      SS2S4   n[        S[        SSU S	S
94S[	        US94/S9nUR                  X2" USS2S4   5      5        [         R                  " SSS5      SS2S4   nUR                  U5      n[        Xb" USS2S4   5      SSS9  [        USS USS SS9  g)z5Test that B-splines fit a periodic curve pretty well.c                     [         R                  " S[         R                  -  U -  5      [         R                  " S[         R                  -  U -  5      -
  S-   $ )Nr   r   rH   )r!   r   pi)xs    r%   f=test_spline_transformer_periodic_linear_regression.<locals>.f   s<    vva"%%i!m$rvva"%%i!m'<<q@@r(   r   r3   e   Nr   rE   rH   rC   r   r   r   r   r   i-  g{Gz?)atolr   rr      r   r   )r!   ru   r
   r   r	   r;   r   r   )r{   r|   r   r0   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                  F   [         R                  " SSS5      SS2S4   n Sn[        USS/S/S	//S
9nUR                  U 5      n[         R                  " S	S/SS	/S	S/SS	//5      n[        [         R                  " SS5      XAS5      nU" U SS2S4   5      n[        X65        g)z@Test that the backport of extrapolate="periodic" works correctlyg      @r   Nr   rC   g                    ?rI   rA   r2   r   r   )r!   ru   r   r/   r   r   r-   r   )r0   rI   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            
      
   [         R                  " SSS5      SS2S4   n [        SSS/S/S	/S
/S/S//S9n[        SSS/S	/S
/S/S/S//S9nUR                  U 5      nUR                  U 5      n[	        X4SS2/ SQ4   5        g)zJTest if shifted knots result in the same transformation up to permutation.r   r   r   NrH   rC   r   r         @      @      @       @r   g      "@)r   r   r3   r   rH   )r!   ru   r   r/   r   )r0   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Dq/123r(   c           
      *   [         R                  " SSS5      SS2S4   n[        U SS/S/S/S	/S
/S//S9nUR                  U5      nUR	                  5       UR                  5       -
  [        U5      -  nSU-  nUn[        SU S-   5       HF  n[         R                  " USS9n[         R                  " U5      R	                  5       U:  d   eX-  nMH     [         R                  " USS9n[         R                  " U5      R	                  5       S:  d   eg)z?Test that spline transformation is smooth at first / last knot.r   r   i'  NrC   r   r   r   r   r   r   r   r3   r   rs   )
r!   ru   r   r/   maxminri   rangediffabs)	rI   r0   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'''l " 773QD66$<!!!r(   )r3   r   rH   r   r   c           
         [         R                  " SSS5      SS2S4   nUR                  5       n[        S[	        SUU SS9/S	[        US
9//5      nUR                  X45        [        UR                  S/S//5      SS/5        [        S[	        SUU SS9/S	[        US
9//5      nUR                  X45        [        UR                  S/S//5      SS/5        [	        SX SS9nUR                  U5        Sn[        R                  " [        US9   UR                  S//5        SSS5        [        R                  " [        US9   UR                  S//5        SSS5        g! , (       d  f       ND= f! , (       d  f       g= f)z1Test that B-spline extrapolation works correctly.r   r3   rr   Nr   r   rf   r   r   r   ir   rg   error2`X` contains values beyond the limits of the knotsr5   )r!   ru   squeezer
   r   r	   r;   r   r   r8   r9   r:   rk   )r{   r|   rI   r0   r   r   rc   msgs           r%   %test_spline_transformer_extrapolationr   L  s~   
 	B34(A			A  !!!%",	 $9=>	
D 	HHQNDLL3%!.Q8  !!!%"*	 $9=>	
D 	HHQNDLL3%!.a9 &7D 	HHQK
>C	z	-w 
.	z	-u 
.	- 
.	-	-	-s   E!E2!
E/2
F c                    [         R                  R                  U 5      nUR                  S5      R	                  SS5      nSnUS-   n[        USSSS9nUR                  U5      n[        USSS	S
9nUR                  U5      n[        XhSS9  g)zCTest that a B-spline of degree=0 is equivalent to KBinsDiscretizer.r   r3   r   r   rp   T)rM   rI   r2   rN   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rngr0   r   rM   rc   splineskbdkbinss	            r%   'test_spline_transformer_kbindiscretizerr     s    
))

 2
3C		#sA&AFqjG$D   #G
/	C a E G/r(   )r   rf   rg   rB   rC   rN   FTc                 B   [         R                  R                  U5      nUR                  S5      R	                  SS5      n[        U UUUSS9n[        U UUUSS9nUR                  U5        UR                  U5        UR                  U5      n	UR                  U5      n
[        R                  " U	5      (       a  U	R                  S:X  d   e[        XR                  5       5        [         R                  " USS	9n[         R                  " USS	9n[         R                  [         R                   " US-
  US
5      [         R                   " XS-   S
5      4   nUS:X  ak  Sn["        R$                  " [&        US9   UR                  U5        S S S 5        Sn["        R$                  " [&        US9   UR                  U5        S S S 5        g [        UR                  U5      UR                  U5      R                  5       5        g ! , (       d  f       N}= f! , (       d  f       g = f)Nr   (   r   F)rI   r2   rA   rN   sparse_outputTcsrr   rs   r   r   r   r5   zOut of bounds)r!   r   r   r   r.   r   r;   rk   r   issparseformatr   toarrayaminamaxrv   ru   r8   r9   r:   )rI   r2   rA   rN   r   r   r0   
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;;uai+LLG B]]:S1  ) 2]]:S1!!'* 21 	  );+@+@+I+Q+Q+S	
 21 21s   6G?+H?
H
Hr   c                     [        U UUUUS9n[        R                  " SSS5      SS2S4   nUR                  U5        UR	                  U5      R
                  S   UR                  :X  d   eg)z8Test that transform results in n_features_out_ features.)rM   rI   rN   rA   r   r   r3   r   N)r   r!   ru   r;   rk   rl   rj   )rM   rN   rI   rA   r   rc   r0   s          r%   &test_spline_transformer_n_features_outr     sm     !##D 	Aq"ag&AHHQK>>!""1%)=)====r(   c                    [         R                  " SS/SS/SS/SS/SS//[         R                  S9nUR                  5       n[         R                  US'   Sn[
        R                  " [        [        R                  " U5      S	9   [        SSS
U S9nUR                  U5        SSS5        [        SSSU US9nUR                  U5      nUR                  U5      R                  U5      n[        Xg5        UR                  U/ SQS9n[        Xh5        UR                  U5      SSS2   n	UR                  U5      R                  USSS2   5      n
[        X5        [        U[         R                  5      n[         R                   " XR"                  S   R$                  R&                  S   SS9nXl   S:H  R)                  5       (       d   eUR                  U5      n[*        R,                  " U5      (       a  UR/                  5       nUS:  R)                  5       (       d   eUS:*  R)                  5       (       d   eUR                  U5      nUR                  U5      n[        X)    Xl)    5        g! , (       d  f       GN= f)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.
r3   r   rH   r   r   dtype)rH   r   zJInput X contains NaN values and `SplineTransformer` is configured to errorr5   r   )rI   rM   handle_missingrA   NzerosrI   rM   r   rA   r   )r3   r3   r3   r3   r3   )r   r   rs   )r!   r   float64copynanr8   r9   r:   reescaper   r/   r;   rk   r   r   repeat	bsplines_crl   allr   r   r   )rA   r   r0   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    s\    	1a&1a&1a&1a&1a&9LAFFHE&&E$K WC	z3	8""'	
 	U# 
9 ##F **51O%zz%0::5A K *0)=)=_ *> *& !U "(!5!5e!<SqS!A'-zz%'8'B'B51:'N$ "
 'Hyy+;+;A+>+@+@+F+Fq+IPQR-2779999 **51O'')113q %%''''q %%'''' &&q)K**51O %&8I(Js 
9	8s   I--
I<c                    [         R                  " SS/SS/SS/SS/SS//5      n[         R                  " [         R                  [         R                  /[         R                  S//5      n[        SSSU US9nUR	                  U5        UR                  U5      n[        U[         R                  5      n[         R                  " XdR                  S   R                  R                  S   SS	9nXW   S:H  R                  5       (       d   eg
)zVTest that SplineTransformer encodes missing values to zeros even for
all-nan-features.r3   r   rH   r   r   r   r   r   rs   N)r!   r   r   r   r;   rk   r   r   r   r   rl   r   )rA   r   r0   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+;+;A+>+@+@+F+Fq+IPQR&8A=BBDDDDr(   )r   r   z&degree=\(min_degree, max_degree\) must)r   g      ?rH   r   )r3   r   rH   z'int or tuple \(min_degree, max_degree\)c                     S/S//n[         R                  " [        US9   [        S0 U D6R	                  U5        SSS5        g! , (       d  f       g= f)zBTest that we raise errors for invalid input in PolynomialFeatures.r3   r   r5   Nr7   )r8   r9   r:   r   r;   r<   s      r%   )test_polynomial_features_input_validationr  R  sA     qc
A	z	1$V$((+ 
2	1	1r@   c                      [         R                  " S5      S S 2[         R                  4   n [         R                  " [         R                  " U 5      X S-  U S-  /5      nX4$ )Nr   r   rH   )r!   r-   newaxishstack	ones_like)r0   Ps     r%   single_feature_degree3r  c  sH    
		!Q

]#A
		2<<?A!tQT23A4Kr(   z/degree, include_bias, interaction_only, indicesr   rH   )r   r   rH   X_containerc                 F   U u  pgUb  U" U5      n[        XUS9R                  U5      nUR                  U5      n	Ub  U	R                  5       n	[	        XSS2U4   5        UR
                  S:  a3  UR                  R                  UR
                  UR                  4:X  d   egg)z9Test PolynomialFeatures on single feature up to degree 3.NrI   rN   interaction_onlyr   	r   r;   rk   r   r   n_output_features_powers_rl   n_features_in_)
r  rI   rN   r  indicesr  r0   r  tfouts
             r%   $test_polynomial_features_one_featurer"  j  s    . "DAN	CS
	c!f  ,,q/CkkmC1g:'	q zzB$9$92;L;L#MMMM !r(   c                  r   [         R                  " S5      R                  S5      n U S S 2S S24   nU S S 2SS 24   n[         R                  " US-  US-  -  US-  US-  -  US-  US-  -  US-  US-  -  US-  US-  -  US-  US-  -  US-  US-  -  US-  US-  -  US-  US-  -  US-  US-  -  /
5      nX4$ )Nr   r  r3   r   r   rH   )r!   r-   r.   r  )r0   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 4Kr(   )r   r3   r   r   )r3   r   r   r   r   )r   rH   r   r   )rH   r   r   )r   rH   r   r   r      r   	   rH   rH   )r   r   r(  r   r)  )r   r(  r   r)  c                 F   U u  pgUb  U" U5      n[        XUS9R                  U5      nUR                  U5      n	Ub  U	R                  5       n	[	        XSS2U4   5        UR
                  S:  a3  UR                  R                  UR
                  UR                  4:X  d   egg)z5Test PolynomialFeatures on 2 features up to degree 3.Nr  r   r  )
r&  rI   rN   r  r  r  r0   r  r   r!  s
             r%   %test_polynomial_features_two_featuresr,    s    F  DAN	CS
	c!f  ,,q/CkkmC1g:'	q zzB$9$92;L;L#MMMM !r(   c                     [         R                  " S5      R                  SS5      n [        SSS9R	                  U 5      nUR                  5       n[        / SQU5        [        U5      UR                  U 5      R                  S   :X  d   e[        SS	S9R	                  U 5      nUR                  / S
Q5      n[        / SQU5        [        U5      UR                  U 5      R                  S   :X  d   e[        SS	S9R	                  U 5      nUR                  / S
Q5      n[        / SQU5        [        U5      UR                  U 5      R                  S   :X  d   e[        SSSS9R	                  U 5      nUR                  / S
Q5      n[        SS/U5        [        U5      UR                  U 5      R                  S   :X  d   e[        SSS9R	                  U 5      nUR                  / SQ5      n[        / SQU5        g )N   r   rH   r   TrI   rN   )
1x0r$  r%  zx0^2zx0 x1zx0 x2zx1^2zx1 x2zx2^2r3   F)r$   rY   r   )r$   rY   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  )r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  r*  r  r0  r<  )F40D   ☮   א)r0  rB  rC  rD  )
r!   r-   r.   r   r;   rb   r   ri   rk   rl   )r0   polyrd   s      r%   test_polynomial_feature_namesrF    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(   )degrN   r  r   csc_containerc                    [         R                  R                  U5      nUR                  SSS5      nU" U5      n[	        XUS9n	U	R                  UR                  U5      5      n
U	R                  UR                  U5      5      n[        R                  " U
5      (       a  U
R                  S:X  d   eU
R                  UR                  :X  d   e[        U
R                  5       U5        g )Nr   r   rr   r   rN   r  cscr!   r   r   randintr   r/   astyper   r   r   r   r   r   )rG  rN   r  r   rH  r   r   r0   X_cscr   Xt_cscXt_denses               r%   test_polynomial_features_csc_XrS  "  s    " ))

 2
3CAq(#A!E
9IC u||E23F  %1H??6""v}}'===<<8>>)))fnn.9r(   csr_containerc                    [         R                  R                  U5      nUR                  SSS5      nU" U5      n[	        XUS9n	U	R                  UR                  U5      5      n
U	R                  UR                  USS95      n[        R                  " U
5      (       a  U
R                  S:X  d   eU
R                  UR                  :X  d   e[        U
R                  5       U5        g )Nr   r   rJ  rK  F)r   r   rM  )rG  rN   r  r   rT  r   r   r0   X_csrr   Xt_csrrR  s               r%   test_polynomial_features_csr_XrX  B  s     ))

 2
3CAq(#A!E
9IC u||E23F  %e!<=H??6""v}}'===<<8>>)))fnn.9r(   
n_features)r3   r   r   zmin_degree, max_degree))r   r3   )r   r   )r3   rH   )r   r   )rH   r   r  c                     U" S/S/U S-
  /445      n[        UUUS9nUR                  U5        UR                  n[         R                  " U SUUUS9n	U[	        U	 V
s/ s H  n
SPM     sn
5      :X  d   egs  sn
f )z7
Test that n_output_features_ is calculated correctly.
r3   r   )rI   r  rN   rY  
min_degree
max_degreer  rN   N)r   r;   r  _combinationsrw   )rY  r\  r]  r  rN   rT  r   r   
num_comboscombosrJ   s              r%   test_num_combinationsra  `  s     	saS:>"2345A
)!C
 GGAJ''J--)!F 0Aa011110s   A6
c           	         U" [        SSSUS95      nUR                  5       n[        XUS9nUR                  UR	                  U5      5      n	UR                  UR	                  U5      5      n
[
        R                  " U	5      (       a  U	R                  S:X  d   eU	R                  U
R                  :X  d   e[        U	R                  5       U
5        g )N  r         ?random_staterK  r   )
sparse_randomr   r   r/   rO  r   r   r   r   r   )rG  rN   r  r   rT  r   rV  r0   r   rW  rR  s              r%   %test_polynomial_features_csr_X_floatsrh    s     -b#DVWXEA
9IC u||E23F  %1H??6""v}}'===<<8>>)))fnn.9r(   )zero_row_indexrG  r  ))r   r   T)r3   r   Tr   r   T)r   rH   T)r3   rH   T)r   rH   T)r   r   F)r3   r   Fr   r   F)r   rH   F)r3   rH   F)r   rH   Fc           	      x   U" [        SSSUS95      nSXPS S 24'   UR                  5       n[        USUS9nUR                  U5      nUR                  U5      n	[        R
                  " U5      (       a  UR                  S:X  d   eUR                  U	R                  :X  d   e[        UR                  5       U	5        g )	NrH   r   r   re  r   FrK  r   	rg  r   r   r/   r   r   r   r   r   )
ri  rG  r  rT  r   rV  r0   r   rW  rR  s
             r%   'test_polynomial_features_csr_X_zero_rowrn    s    * -2sASTUE"E!
A
SuGW
XCu%F  #H??6""v}}'===<<8>>)))fnn.9r(   ))TTr}   r~   )FFc           	      f   U" [        SSSUS95      nUR                  5       n[        SXS9nUR                  U5      nUR                  U5      n[        R
                  " U5      (       a  UR                  S:X  d   eUR                  UR                  :X  d   e[        UR                  5       U5        g )Nrc  r   rd  re  r   rK  r   rm  )	rN   r  rT  r   rV  r0   r   rW  rR  s	            r%   'test_polynomial_features_csr_X_degree_4rp    s     -b#DVWXEA
	C u%F  #H??6""v}}'===<<8>>)))fnn.9r(   )rG  dimr  )
)r   r3   Trj  )rH   r3   T)rH   r   T)rH   rH   T)r   r3   Frk  )rH   r3   F)rH   r   F)rH   rH   Fc           	      d   U" [        SUSUS95      nUR                  5       n[        XS9nUR                  U5      nUR                  U5      n	[        R
                  " U5      (       a  UR                  S:X  d   eUR                  U	R                  :X  d   e[        UR                  5       U	5        g )Nrc  rd  re  )r  r   rm  )
rG  rq  r  rT  r   rV  r0   r   rW  rR  s
             r%   (test_polynomial_features_csr_X_dim_edgesrs    s    & dC3EFE 	A
S
DCu%F  #H??6""v}}'===<<8>>)))fnn.9r(   c           
        ^  U 4S jnSnSn[         R                  n[         R                  " SS[         R                  S9n[         R                  " US-
  US-
  US-
  US-
  /5      n[         R                  " US-
  US-
  US-
  US-
  /[         R                  S9n	U" XxU	44XE4US9n
[        T USS	9nUR                  US
SUR                  UR                  S9nU[         R                  " [         R                  5      R                  :  a6  Sn[        R                  " [        US9   UR                  U
5        SSS5        gUR!                  U
5      nUR#                  5       u  nnXQ-   nU" XY[%        T (       + 5         U	S   5      U-   nU(       a	  S/US-
  -  O/ nU(       a	  S
/US-
  -  O/ n['        S5       GH  nUSU-     nUSU-  S-      nU	SU-     nU	SU-  S-      nU(       a"  UR)                  S5        UR)                  S
5        UR+                  UU/5        UR+                  U[%        U5      -   U[%        U5      -   /5        T (       dT  UR+                  UU-  UU-  UU-  /5        UR+                  U" UUU5      U-   U" UUU5      U-   U" UUU5      U-   /5        M  UR+                  UU-  /5        UR)                  U" UUU5      U-   5        GM      [%        U5      S-   S[%        T (       + 5      -  -   nUR,                  US-   :X  d   eUR.                  U:X  d   eUR0                  UUS-   4:X  d   eUR2                  R.                  UR4                  R.                  s=:X  a  [         R                  :X  d   e   eUR4                  R                  5       [         R                  " [         R6                  5      R                  :  d   eU(       a  [9        ['        US-
  5      5      O/ nUR+                  US-
  /U-  US-
  /U-  -   5        [;        UR<                  U5        [?        UU5        [?        UU5        g! , (       d  f       g= f)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                 j   > T(       a  X-  US-  SU-  -   S-  -
  S-
  U-   $ X-  US-  U-   S-  -
  U-   $ )Nr   rH   r3   r7   )r   ijr  s      r%   degree_2_calcRtest_csr_polynomial_expansion_index_overflow_non_regression.<locals>.degree_2_calc  sL    5AqD1q5LQ..2Q665AqD1H?*Q..r(      i r3   r   r   r   )rl   r   r  rN   rI   r   r[  tThe output that would result from the current configuration would have \d* features which is too large to be indexedr5   NrH   ) r!   float32r-   int64r   r   _num_combinationsr  rN   iinfointpr   r8   r9   r:   r;   r/   nonzerointr   appendextendr  r   rl   indptrr  int32listr   datar   )r  rN   rT  rx  	n_samplesrY  
data_dtyper  rowcolr0   pfnum_combinationsr   rm   row_nonzerocol_nonzeron_degree_1_features_outmax_degree_2_idxdata_targetcol_nonzero_targetrv  r   r   x_idxy_idxnnz_per_rowrow_nonzero_targets   `                           r%   ;test_csr_polynomial_expansion_index_overflow_non_regressionr    sG    / 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 2q!G&0K(7jc.>*>&?"@#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 21s   $P==
Qzdegree, n_features)r     )rH   i(	  )rH   r  c                 ^   S/nUS-
  [         R                  " [         R                  5      R                  ::  a  [         R                  O[         R                  n[         R
                  " S/US9n[         R
                  " US-
  /US9nUS-
  [        U5      -   /n	U	R                  XS-   -  S-  U	S   -   5        U	R                  XS-   -  US-   -  S-  U	S   -   5        U" XWU445      n
[        X#U S9nUR                  USU UR                  UR                  S9nU[         R                  " [         R                  5      R                  :  a6  S	n[        R                  " [        US
9   UR!                  U
5        SSS5        gUR#                  U
5      nU[         R                  " [         R                  5      R                  :  a  [         R                  O[         R                  nSU S-
  [        U(       + 5      -  -   n[        U5      U-   nUR$                  U
R$                  :X  d   eUR&                  SUR(                  4:X  d   eUR*                  R$                  UR,                  R$                  s=:X  a  U:X  d   e   eUR.                  U:X  d   eU(       a  US   [        R0                  " S5      :X  d   e[3        U5       H'  nUSU	U   4   [        R0                  " S5      :X  a  M'   e   X!-  nU S:X  a  USU-   -  nUR(                  XS-
     S-   U-
  :X  d   eg! , (       d  f       g= f)zTests known edge-cases to the dtype promotion strategy and custom
Cython code, including a current bug in the upstream
`scipy.sparse.hstack`.
r   r3   r   r   r   r   r{  r[  r|  r5   Nr   r   rH   )r!   r  r  r   r~  r   r  r  r   r  r  rN   r  r8   r9   r:   r;   r/   r   rl   r  r  r  nnzapproxr   )rI   rY  r  rN   rT  r  indices_dtyper  r  expected_indicesr0   r  r  r   rm   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\** Jq.9Q>AQRSATTU1n%a8A=@PQR@SS 	t3Z()A	)V
B ++,,__ ,  "((277+///> 	 ]]:S1FF1I 2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^$q*3//0FMM#4FFFF % *F{!j.   $4aZ$@1$Dv$MMMM/ 21s   'L
L,c                    [         R                  " [         R                  5      R                  S-  nS/nS/nUS-
  /nU" XEU445      n[	        XSS9nSn	[
        R                  " [        U	S9   UR                  U5        S S S 5        [
        R                  " [        U	S9   UR                  U5        S S S 5        g ! , (       d  f       NB= f! , (       d  f       g = f)	Nr   r   r   r3   r'  r{  r|  r5   )
r!   r  r~  r   r   r8   r9   r:   r;   r/   )
r  rN   rT  rY  r  r  r  r0   r  r   s
             r%   0test_csr_polynomial_expansion_too_large_to_indexr    s     "((#''1,J5D#C>
Ct3Z()A	)V
B	6  
z	-
q	 
.	z	-
 
.	- 
.	-	-	-s   .B<!C<
C

Csparse_containerc                 z   [         R                  " S5      n[        SSS9nSn[        R                  " [
        US9   UR                  U5        SSS5        [        SSS9nS	n[        R                  " [
        US9   UR                  U5        SSS5        X" U5      4 Hx  n[        SS
S9nUR                  U5      n[        R                  " U5      (       a  UR                  5       n[        U[         R                  " UR                  S   S45      5        Mz     g! , (       d  f       N= f! , (       d  f       N= f)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.r5   Nr  zoSetting both min_degree and max_degree to zero and include_bias to False would result in an empty output array.Tr3   )r!   onesr   r8   r9   r:   r/   r   r   r   r   rl   )r  r0   rE  r>   _Xoutputs         r%   1test_polynomial_features_behaviour_on_zero_degreer    s   
 	AQU;D	"  
z	11 
2 V%@D	8  
z	11 
2 "1%&!>##B'??6""^^%F6277AGGAJ?#;< ' 
2	1 
2	1s   D;D,
D),
D:c                      [         R                  S:X  d(  [         R                  S::  a  [         R                  S:w  a  Sn OSn [        5       U :X  d   eg )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                    [        [        R                  " [        R                  5      R                  S-  S-   5      nS/nS/nUS-
  /nUS-
  /nUR                  [        XS-   -  S-  US   -   5      5        UR                  [        XS-   -  US-   -  S-  US   -   5      5        U " X#U445      n[        SSSS	9n[        R                  S
::  a6  Sn[        R                  " [        US9   UR                  U5        S S S 5        g UR                  U5      n	[        S5       H&  n
U	SXZ   4   [        R                  " S5      :X  a  M&   e   g ! , (       d  f       g = f)NgUUUUUU?rH   r   r   r3   r   r   Fr{  r  r|  r5   )r  r!   r  r~  r   r  r   r  r  r8   r9   r:   r/   r   r  )rT  rY  r  r  r  r  r0   r  r   rm   r  s              r%   *test_csr_polynomial_expansion_windows_failr    si    RXXbhh'++6:;J5D#C>
C 	Q Jq.)Q.1A!1DDE Jq.)Z!^<ADTUVDWWX 	t3Z()A	Uq	QB
{{e: 	
 ]]:S1Q 21 ""1%8C1.334c8JJJJ 	 21s   +E
Ez$array_namespace, device_, dtype_name)ids)r   r'  rH   r*  c                 4   [        XE5      nU u  pUR                  U5      n
UR                  XS9n[        SS9   [	        XUS9R                  U
5      n[	        XUS9R                  U5      nUR                  U
5      nUR                  U5      n[        [        XS9U5        [        U5      S   R                  UR                  :X  d   e[        U5      [        U5      :X  d   eUR                  UR                  :X  d   e SSS5        g! , (       d  f       g= f)zNTest array API compliance for PolynomialFeatures on 2 features up to degree 3.r   Tarray_api_dispatchr  )xpr   N)r   rO  asarrayr   r   r;   rk   r   r   r   __name__r   r   )r&  rI   rN   r  array_namespacedevice_
dtype_namer  r0   rJ   X_npX_xptf_nptf_xpout_npout_xps                   r%   -test_polynomial_features_array_api_compliancer  6  s    $ 
o	7BDA88JD::d:+D	4	0"GW

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

#d) 	 &&)&8&AV$Q'00BKK???f~---||tzz))) 
1	0	0s   CD		
Dc                    [        X5      n[        R                  " S5      R                  S5      R	                  U5      nUR                  XAS9nSn[        SS9   [        SS9R                  U5      n[        U5      (       a  UR                  U5        O3[        R                  " [        US	9   UR                  U5        S
S
S
5        S
S
S
5        g
! , (       d  f       N= f! , (       d  f       g
= f)zgTest 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*   r5   N)r   r!   r-   r.   rO  r  r   r   r;   r   rk   r8   r9   r:   )r  r  r  r  r0   r  r   r  s           r%   4test_polynomial_features_array_api_raises_on_order_Fr  \  s     
o	7B
		!V$++J7A::a:(D
NC	4	0c*..t4r""LLz5T" 6 
1	0
 65 
1	0s%   AC".C C"
C	C""
C0)ar   r  numpyr!   r8   numpy.testingr   r   scipyr   scipy.interpolater   scipy.sparser   rg  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parametrizer1   r?   rK   re   rn   r   rz   r   r   r   r   r   r   r   r   r   r   r   r  r  r  fixturer  slicer"  r&  r,  rF  r  r}  r   rS  rX  ra  rh  rn  rp  rs  r  sqrtr  r~  r   r  r  r  r  xfailr  r  r  r  r7   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, ;	AtRXX1v1v2w&?@AHH*+HHq!fq!fq"g./		
 
AtRXX1v1v2wB&HIJ	QbhhAAB'@ABHH*+HHq!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(   