
    *YHh                        d dl Z d dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZ d d	lmZ d d
lmZ d dlmZmZmZmZ ej>                  jA                  deef      d        Z!ej>                  jA                  dddggidfdddgddggidfddgd ggidfg      d        Z"ej>                  jA                  dddg      d        Z#d Z$ej>                  jA                  dg d      ej>                  jA                  dddg      d               Z%ej>                  jA                  d e&dd            ej>                  jA                  d  e&dd            ej>                  jA                  dd!d"g      ej>                  jA                  dd#dg      d$                             Z'ej>                  jA                  d%d&gd'd(g      d)        Z(ej>                  jA                  g d*d!dd ejR                  d dgdd+gd,d-gg      fd!d ejR                  g d.       ejR                  ddgd/d+gd,d-gg      fd!d/d ejR                  d dgdd,gd/d0gd,d-gg      fd"dd ejR                  d dgddgd,d-gg      fd"d ejR                  g d.       ejR                  ddgdd+gd,d-gg      fg      d1        Z*ej>                  jA                  d%d&gd'd(g      d2        Z+d3 Z,d4 Z-ej>                  jA                  dddg      d5        Z.ej>                  jA                  d%d&gd'd(g      ej>                  jA                  dg d6      d7               Z/d8 Z0ej>                  jA                  d e&dd            ej>                  jA                  dd!d"g      ej>                  jA                  dg d9      ej>                  jA                  d:d;d<g      d=                             Z1ej>                  jA                  d dd0g      ej>                  jA                  d:d<d;g      ej>                  jA                  ddd/g      ej>                  jA                  dg d9      ej>                  jA                  d>d;d<g      d?                                    Z2ej>                  jA                  ddd@idAfddBidAfddCidAfddDidEfg      dF        Z3 ejh                         dG        Z5ej>                  jA                  dHdd<d; e6dd      fdd;d; e6dd      fdd<d<d dgfdd;d<dgfdId<d;g dJfdId;d;ddgfdId<d<d gfdId;d<g fg      ej>                  jA                  dKdgez   ez         dL               Z7 ejh                         dM        Z8ej>                  jA                  dHdd<d; e6d d,      fdd;d; e6dd,      fdd<d<g dNfdd;d<g dOfdPd<d;g dQfdPd;d;g dRfdPd<d<d d/gfdPd;d<d/gfdd<d; e6dd      fdd;d; e6dd      fdd<d<g dNfdd;d<g dOfdId<d;g dSfdId;d; e6dd      fdId<d<d d/gfdId;d<d/gfdTd<d;g dUfdTd;d;g dVfdTd<d<d gfdTd;d<g fg      ej>                  jA                  dKdgez   ez         dW               Z9dX Z:ej>                  jA                  g dYdd<d;e;fdd<d;e;fdd<d;ejx                  fdd<d;ejz                  fdd;d;ejz                  fdd;d<ejz                  fd/d;d;ejz                  fd/d;d<ejz                  fg      ej>                  jA                  dZe      d[               Z>ej>                  jA                  g dYdd<d;e;fdd<d;e;fdd<d;ejx                  fdd<d;ejz                  fdd;d;ejz                  fdd;d<ejz                  fg      ej>                  jA                  d\e      d]               Z?ej>                  jA                  d^g d_      ej>                  jA                  d`g da      ej>                  jA                  dbd<d;g      ej>                  jA                  d:d<d;g      ej>                  jA                  d\e      dc                                    Z@ej>                  jA                  g dYdd<d;ejx                  fdd<d;ejz                  fdd;d;ejz                  fdd;d<ejz                  fg      ej>                  jA                  d\e      dd               ZAej>                  jA                  g deg df      ej>                  jA                  d\e      dg               ZBej>                  jA                  d:dbgg dh      ej>                  jA                  d\e      di               ZCej>                  jA                  g djg dk      ej>                  jA                  d\e      dl               ZDej>                  jA                  dbd<d;g      ej>                  jA                  d:d<d;g      ej>                  jA                  d\e      dm                      ZEej>                  jA                  dndodpd e; ej                   ej                  ej                        j                        dz         fdqd e; ej                   ej                  ej                        j                              fg      ej>                  jA                  dbd<d;g      ej>                  jA                  d:d<d;g      ej>                  jA                  d\e      dr                             ZJej>                  jA                  dbd<d;g      ej>                  jA                  d:d<d;g      ej>                  jA                  d\e      ds                      ZKej>                  jA                  dteez         du        ZLdv ZMej>                  j                  e j                  dwk(  dxd<y      ej>                  jA                  d\e      dz               ZPy){    N)assert_allcloseassert_array_equal)sparse)BSpline)random)LinearRegression)Pipeline)KBinsDiscretizerPolynomialFeaturesSplineTransformer)_get_sizeof_LARGEST_INT_t)assert_array_almost_equal)CSC_CONTAINERSCSR_CONTAINERSparse_version
sp_version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    d/var/www/html/planif/env/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_orderr'      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.r)   r   matchN )pytestraises
ValueErrorr   fitparamserr_msgr&   s      r   (test_spline_transformer_input_validationr5   *   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   r)   r            )degreer(   r7   N)r   r#   r$   r   r%   )r7   r&   r(   _s       r   %test_spline_transformer_integer_knotsrA   :   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 features name.r;   r   r   r>   T)n_knotsr?   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   r1   get_feature_names_outr   )r&   spltfeature_namess      r   %test_spline_transformer_feature_namesr[   D   s    
		"b!$AQqtDHHKD..0M	
  QquEII!LD..Sz:M		
r   )constantlinearr8   r9   r?   r>   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.
    r;   r   r   )r?   r7   r   rO   r)   N)
r   r#   r$   r   r1   rX   lenn_features_out_	transformshape)r7   r?   r&   rY   rZ   X_transs         r   7test_split_transform_feature_names_extrapolation_degreerd   j   s     			"b!$AF-HLLQOD..Sz:M}!5!5555nnQG==s=1111r   r   rC   uniformquantiler\   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   r)   d   Nr   r9   T)rC   r?   r(   rD   r7   axis)r   linspacer_r   r1   r   sumra   )r?   rC   r(   r7   r&   X_trainX_testrY   s           r   +test_spline_transformer_unity_decompositionrp   }   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   rh   Nr   spline   r>   r\   rC   r?   rD   r7   olsfit_interceptstepsMbP?rtol)	r   rk   sinr	   r   r   r1   r   predict)rq   rr   r&   ypipes        r   )test_spline_transformer_linear_regressionr      s     	Ar34(A
qAw!A !!%",	 $9=>
D 	HHQNDLLOQT2r   )r(   rC   sample_weightexpected_knots         )r   r   r)   r)   r   r>   r)      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   r>   r   r   r   r   r   )r&   r(   rC   r   N)r   arrayr   _get_base_knot_positionsr   )r(   rC   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   r>   )r   r   pi)xs    r   fz=test_spline_transformer_periodic_linear_regression.<locals>.f   s<    vva"%%i!m$rvva"%%i!m'<<q@@r   r   r)   e   Nrv   r;   r>   r9   rx   ry   rz   r|   r   i-  g{Gz?)atolr   rh      r~   r   )r   rk   r	   r   r   r1   r   r   )rq   rr   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   r9   g                    ?r?   r7   r(   r   r   )r   rk   r   r%   r   r   r#   r   )r&   r?   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   Nr>   r9   r   r         @      @      @       @r   g      "@)r   r   r)   r   r>   )r   rk   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'  Nr9   r   r   r   r   r   r   r   r)   r   ri   )
r   rk   r   r%   maxminr_   rangediffabs)	r?   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   )r)   r   r>   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   r)   rh   Nrv   r   r\   rx   ry   rz   ir   r]   error0X contains values beyond the limits of the knotsr+   )r   rk   squeezer	   r   r   r1   r   r   r.   r/   r0   ra   )rq   rr   r?   r&   r   r   rY   msgs           r   %test_spline_transformer_extrapolationr   ?  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   r)   r   r   rf   T)rC   r?   r(   rD   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   rC   rY   splineskbdkbinss	            r   'test_spline_transformer_kbindiscretizerr   w  s    
))

 2
3C		#sA&AFqjG$D   #G
/	C a E GU/r   )r   r\   r]   r8   r9   rD   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)r?   r(   r7   rD   sparse_outputTcsrr   ri   r   r   r   r+   zOut of bounds)r   r   r   r   r$   r   r1   ra   r   issparseformatr   toarrayaminamaxrl   rk   r.   r/   r0   )r?   r(   r7   rD   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 @]]: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.)rC   r?   rD   r7   r   r   r)   r   N)r   r   rk   r1   ra   rb   r`   )rC   rD   r?   r7   r   rY   r&   s          r   &test_spline_transformer_n_features_outr     sm     !##D 	Aq"ag&AHHQK>>!""1%)=)====r   )r   r   z&degree=\(min_degree, max_degree\) must)r   g      ?r>   r   )r)   r   r>   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.r)   r   r+   Nr-   )r.   r/   r0   r   r1   r2   s      r   )test_polynomial_features_input_validationr     sJ     qc
A	z	1 ,$V$((+, , ,r6   c                      t        j                  d      d d t         j                  f   } t        j                  t        j                  |       | | dz  | dz  g      }| |fS )Nr   r   r>   )r   r#   newaxishstack	ones_like)r&   Ps     r   single_feature_degree3r     sL    
		!Q

]#A
		2<<?Aq!tQT23Aa4Kr   z/degree, include_bias, interaction_only, indicesr   r>   )r   r   r>   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r?   rD   interaction_onlyr   	r   r1   ra   r   r   n_output_features_powers_rb   n_features_in_)
r   r?   rD   r   indicesr   r&   r   tfouts
             r   $test_polynomial_features_one_featurer     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   r)   r   r   r>   )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   r)   r   r   )r)   r   r   r   r   )r   r>   r   r   )r>   r   r   )r   r>   r   r   r      r   	   r>   r>   )r   r   r   r   r  )r   r   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   r?   rD   r   r   r   r&   r   r   r   s
             r   %test_polynomial_features_two_featuresr  1  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   r>   r   Tr?   rD   )
1x0r   r   zx0^2zx0 x1zx0 x2zx1^2zx1 x2zx2^2r)   F)r   rO   c)r   rO   r
  a^2a ba cb^2b cc^2a^3a^2 ba^2 ca b^2a b ca c^2b^3b^2 cb c^2c^3r   )r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  )F40D   ☮   א)r  r  r  r  )
r   r#   r$   r   r1   rX   r   r_   ra   rb   )r&   polyrZ   s      r   test_polynomial_feature_namesr  b  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   )degrD   r   dtype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   rh   r   rD   r   cscr   r   r   randintr   r%   astyper   r   r   r!  r   r   )r   rD   r   r!  r"  r   r   r&   X_cscr   Xt_cscXt_denses               r   test_polynomial_features_csc_Xr-    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   r$  r%  F)copyr   r'  )r   rD   r   r!  r.  r   r   r&   X_csrr   Xt_csrr,  s               r   test_polynomial_features_csr_Xr3    s     ))

 2
3CAq(#A!E
,9IC u||E23F  %e!<=H??6"v}}'===<<8>>)))fnn.9r   
n_features)r)   r   r   zmin_degree, max_degree))r   r)   )r   r   )r)   r>   )r   r   )r>   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.
    r)   r   )r?   r   rD   r4  
min_degree
max_degreer   rD   N)r   r1   r   _combinationsrm   )r4  r7  r8  r   rD   r.  r   r   
num_comboscombosr@   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_stater%  r   )
sparse_randomr   r   r%   r)  r   r   r   r!  r   )r   rD   r   r!  r.  r   r1  r&   r   r2  r,  s              r   %test_polynomial_features_csr_X_floatsrC    s     -b#DVWXEA
,9IC u||E23F  %1H??6"v}}'===<<8>>)))fnn.9r   )zero_row_indexr   r   ))r   r   T)r)   r   Tr   r   T)r   r>   T)r)   r>   T)r   r>   T)r   r   F)r)   r   Fr   r   F)r   r>   F)r)   r>   F)r   r>   Fc                 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 )	Nr>   r   r   r@  r   Fr%  r   	rB  r   r   r%   r   r   r   r!  r   )
rD  r   r   r.  r   r1  r&   r   r2  r,  s
             r   'test_polynomial_features_csr_X_zero_rowrI  '  s    * -2sASTUE"E.!
A
SuGW
XCu%F  #H??6"v}}'===<<8>>)))fnn.9r   ))TTrs   rt   )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 )Nr>  r   r?  r@  r   r%  r   rH  )	rD   r   r.  r   r1  r&   r   r2  r,  s	            r   'test_polynomial_features_csr_X_degree_4rK  K  s     -b#DVWXEA
	7GC u%F  #H??6"v}}'===<<8>>)))fnn.9r   )r   dimr   )
)r   r)   TrE  )r>   r)   T)r>   r   T)r>   r>   T)r   r)   FrF  )r>   r)   F)r>   r   F)r>   r>   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 )Nr>  r?  r@  )r   r   rH  )
r   rL  r   r.  r   r1  r&   r   r2  r,  s
             r   (test_polynomial_features_csr_X_dim_edgesrN  a  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   r>   r)   r-   )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 r)   r   r!  r   )rb   r!  r   rD   r?   r   r6  tThe output that would result from the current configuration would have \d* features which is too large to be indexedr+   Nr>   ) r   float32r#   int64r   r   _num_combinationsr   rD   iinfointpr   r.   r/   r0   r1   r%   nonzerointr   appendextendr   r!  rb   indptrr   int32listr   datar   )r   rD   r.  rS  	n_samplesr4  
data_dtyperd  rowcolr&   pfnum_combinationsr   rc   row_nonzerocol_nonzeron_degree_1_features_outmax_degree_2_idxdata_targetcol_nonzero_targetrQ  r   r   x_idxy_idxnnz_per_rowrow_nonzero_targets   `                           r   ;test_csr_polynomial_expansion_index_overflow_non_regressionru    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     )r>   i(	  )r>   rv  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t"        t%        d      k  rD|dk(  r?| dk(  r:|s8d}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(                  |j0                  j(                  cxk(  r|k(  sJ  J |j2                  |k(  sJ |r|d   t        j4                  d      k(  sJ t7        |      D ]$  }|d|	|   f   t        j4                  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# 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   r)   r   rU  r   r   rV  r6  rW  r+   Nz1.9.2rv  z>In scipy versions `<1.9.2`, the function `scipy.sparse.hstack`r   r   r>   )r   r[  rb  r   rY  r   r^  r_  r   rZ  r   rD   r\  r.   r/   r0   r1   r   r   r%   r!  rb   r   ra  r   nnzapproxr   )r?   r4  r   rD   r.  rd  indices_dtyperg  rh  expected_indicesr&   ri  rj  r   rc   expected_dtypenon_bias_termsexpected_nnzidxoffsets                       r   ,test_csr_polynomial_expansion_index_overflowr    sa   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	 	]7++%aK O]]:S1 	*&&q)G	*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MM		*s   3M*	M6*M36M?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   r)   r   rV  rW  r+   )
r   r[  rY  r   r   r.   r/   r0   r1   r%   )
r   rD   r.  r4  rd  rg  rh  r&   ri  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.r+   Nrx  zoSetting both min_degree and max_degree to zero and include_bias to False would result in an empty output array.Tr)   )r   onesr   r.   r/   r0   r%   r   r   r   r   rb   )r  r&   r  r4   _Xoutputs         r   1test_polynomial_features_behaviour_on_zero_degreer  v  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?r>   r   r   r)   r   r   FrV  r  rW  r+   )r^  r   r[  rY  r   r_  r   r  r  r.   r/   r0   r%   r   rz  )r.  r4  rd  rg  rh  r|  r&   ri  r   rc   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)Qr  numpyr   r.   numpy.testingr   r   scipyr   scipy.interpolater   scipy.sparser   rB  sklearn.linear_modelr   sklearn.pipeliner	   sklearn.preprocessingr
   r   r   /sklearn.preprocessing._csr_polynomial_expansionr   sklearn.utils._testingr   sklearn.utils.fixesr   r   r   r   markparametrizer'   r5   rA   r[   rd   r   rp   r   r   r   r   r   r   r   r   r   r   r   r   fixturer   slicer   r   r  r  r^  rX  float64r-  r3  r<  rC  rI  rK  rN  ru  sqrtr[  rY  r   r  r  r  r  xfailr  r  r-   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 ->" 
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QN : 8 <!&QNh +dE];$7.9 : 8 <* +^n-LM= N=<8 LLG	6 	   .9"K :"Kr   