
    Mpjb                       S r 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rSSK	r
SSK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JrJrJr  SSKJr  SSKJr  SS	K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)  SSK*J+r+  SSK,J-r-J.r.  SSK/J0r0  SSK1J2r2  SSK3J4r4J5r5J6r6  SSK7J8r8J9r9  SSK:J;r;  SSK<J=r=  SSK>J?r?J@r@JArAJBrB  SSKCJDrDJErE  SSKFJGrG  SSKHJIrIJJrJJKrKJLrL  SSKMJNrN  SSKOJPrPJQrQJRrRJSrS  SSKTJUrUJVrV  SSKWJXrXJYrYJZrZJ[r[J\r\J]r]J^r^  SSK_J`r`  SSKaJbrbJcrc  \" 5       rdS\dR                  R                  lg        S\dR                  R                  lg        S ri " S! S"\5      rj " S# S$\j5      rk " S% S&\\k5      rl " S' S(\l5      rm " S) S*\m5      rn " S+ S,\\5      ro " S- S.\5      rp " S/ S0\m5      rq " S1 S2\5      rrS3 rs\R                  R                  S4\@" S5\4/5      S64\@" S5\4S7/5      S64\@" S8S5\4/5      S64\@" S9S5\4/5      S64\@" S:\E4S5\" 5       4/5      S;4\?" S5\4S<\ " 5       4/5      S64\?" S5\" 5       4S<\ 4/5      S=4\?" S>S<\ 4/5      S=4\?" S5\4S8/5      S64/	5      S? 5       rvS@ rwSA rxSB rySC rzSD r{SE r|SF r}SG r~SH rSI rSJ rSK rSL rSM rSN r\R                  R                  SO/ SPQ5      SQ 5       r\R                  R                  SR\`5      SS 5       rST rSU rSV rSSW jrSX rSY rSZ r\R                  R                  S[/ S\Q5      S] 5       rS^ rS_ rS` r\R                  R                  SaSSa/5      Sb 5       r\R                  R                  SaSSa/5      Sc 5       rSd rSe r\R                  R                  Sf\A" \E" 5       \6" 5       5      \4\A" \E" 5       \5" 5       5      \4\A" \E" 5       5      Sg 4\@" / 5      Sh 4/5      Si 5       rSj rSk r\R                  GR4                  Sl 5       rSm rSn rSo rSp rSq rSr rSs rSt rSu r " Sv Sw\5      r\R                  R                  SxSySz/5      \R                  R                  S{\E" 5       \" 5       Sa// S|QS}9S~ 5       5       rS rS rS rS r " S S\5      rS rS rS rS rS \GR`                  " \@" S\m" 5       4S\p" 5       4/5      S4\@" S\m" 5       4SS\p" 5       4/5      S4\@" S\m" 5       4SS\p" 5       4/5      S4\@" S\m" 5       4S/5      S4\@" SS\o" 5       4/5      S4\@" SS\o" 5       4/5      S4\?" S\o" 5       4S\o" 5       4/5      S4\?" SS\o" 5       4S/5      S4// SQ5       5       r\R                  R                  S\5      S 5       rS rS rS rS rS rS r\R                  R                  SaSSa/5      S 5       r\R                  R                  S\Y\X/5      S 5       rS rS rS rS r\R                  R                  SSySz/5      S 5       rS r\R                  R                  SS\" SS5      /5      S 5       rS rS r\R                  R                  S\S" 5       5      S 5       rS r\" SS9\R                  R                  SSS/5      S 5       5       r\" SS9S 5       rS r\" SS9S 5       r\R                  R                  S/ SQ5      S 5       r " S S\5      r\R                  R                  S\" \" \V5      SS1-
  5      5      \" SS9S 5       5       r\R                  R                  S\" \" \V5      SS1-
  5      5      \" SS9S 5       5       r\R                  R                  S/ SQ5      S 5       r\" SS9S 5       r\R                  R                  SSSa/5      \" SS9S 5       5       r\" SS9S 5       r\" SS9S 5       r\" SS9\R                  R                  S\J\I/5      S 5       5       r\S 5       r\S 5       r\S 5       rg)z
Test the pipeline module.
    N)TemporaryDirectorymkdtemp)config_context)BaseEstimatorClassifierMixinTransformerMixincloneis_classifieris_regressor)MaxIterEstimatorRecordingAutoPropagatedCallbackRecordingCallbackskip_callback_test_if_wasm)KMeans)	load_iris)PCATruncatedSVD)DummyRegressor)HistGradientBoostingClassifierRandomForestClassifierRandomTreesEmbedding)NotFittedErrorUnsetMetadataPassedError)CountVectorizer)SelectKBest	f_classif)SimpleImputer)Nystroem)LassoLinearRegressionLogisticRegression)accuracy_scorer2_score)train_test_split)LocalOutlierFactor)FeatureUnionPipelinemake_pipeline
make_union)FunctionTransformerStandardScaler)SVC)"ConsumingNoFitTransformTransformerConsumingTransformer	_Registrycheck_recorded_metadata)get_tags)_atol_for_typeget_namespace_and_devicemove_to)yield_namespace_device_dtype_combinations)COMPOSITE_METHODSMETHODS)MinimalClassifierMinimalRegressorMinimalTransformer_array_api_for_testsassert_allcloseassert_array_almost_equalassert_array_equal)CSR_CONTAINERS)_check_feature_namescheck_is_fittedF)zthe pizza pizza beer copyrightzthe pizza burger beer copyrightz!the the pizza beer beer copyrightzthe burger beer beer copyrightzthe coke burger coke copyrightzthe coke burger burgerc                   "    \ rS rSrSrSS jrSrg)NoFit_   z*Small class to test parameter dispatching.Nc                     Xl         X l        g Nab)selfrH   rI   s      W/var/www/html/pdf-tiff/venv/lib/python3.13/site-packages/sklearn/tests/test_pipeline.py__init__NoFit.__init__b   s        rG   NN)__name__
__module____qualname____firstlineno____doc__rL   __static_attributes__ rN   rK   rC   rC   _   s
    4rN   rC   c                   .    \ rS rSrSS jrSS jrS rSrg)	NoTransg   Nc                     U $ rF   rV   rJ   Xys      rK   fitNoTrans.fith       rN   c                 4    U R                   U R                  S.$ )NrG   rG   )rJ   deeps     rK   
get_paramsNoTrans.get_paramsk   s    VV$&&))rN   c                     US   U l         U $ NrH   rH   )rJ   paramss     rK   
set_paramsNoTrans.set_paramsn   s    rN   rg   rF   F)rP   rQ   rR   rS   r^   rc   ri   rU   rV   rN   rK   rX   rX   g   s    *rN   rX   c                       \ rS rSrS rSrg)NoInvTransfs   c                     U$ rF   rV   rJ   r\   s     rK   	transformNoInvTransf.transformt       rN   rV   N)rP   rQ   rR   rS   rq   rU   rV   rN   rK   rm   rm   s   s    rN   rm   c                        \ rS rSrS rS rSrg)Transfx   c                     U$ rF   rV   rp   s     rK   rq   Transf.transformy   rs   rN   c                     U$ rF   rV   rp   s     rK   inverse_transformTransf.inverse_transform|   rs   rN   rV   N)rP   rQ   rR   rS   rq   rz   rU   rV   rN   rK   ru   ru   x   s    rN   ru   c                       \ rS rSrSS jrSrg)TransfFitParams   Nc                     X0l         U $ rF   
fit_paramsrJ   r\   r]   r   s       rK   r^   TransfFitParams.fit   s    $rN   r   rF   rP   rQ   rR   rS   r^   rU   rV   rN   rK   r}   r}      s    rN   r}   c                   V    \ rS rSrSS jrS rSS jrS rS rS r	\	=r
=rrSS	 jrS
rg)Mult   c                     Xl         g rF   mult)rJ   r   s     rK   rL   Mult.__init__   s    	rN   c                     gNTrV   rJ   s    rK   __sklearn_is_fitted__Mult.__sklearn_is_fitted__       rN   Nc                     U $ rF   rV   r[   s      rK   r^   Mult.fit   r`   rN   c                 H    [         R                  " U5      U R                  -  $ rF   npasarrayr   rp   s     rK   rq   Mult.transform       zz!}tyy((rN   c                 H    [         R                  " U5      U R                  -  $ rF   r   rp   s     rK   rz   Mult.inverse_transform   r   rN   c                 b    [         R                  " U5      U R                  -  R                  SS9$ )N   axis)r   r   r   sumrp   s     rK   predictMult.predict   s'    

1		)..A.66rN   c                 .    [         R                  " U5      $ rF   r   r   r[   s      rK   score
Mult.score   s    vvayrN   r   )r   rF   )rP   rQ   rR   rS   rL   r   r^   rq   rz   r   predict_probapredict_log_probadecision_functionr   rU   rV   rN   rK   r   r      s9    ))7 =DCMC%(9rN   r   c                   B    \ rS rSrSrS rS
S jrS rS
S jrSS jr	S	r
g)	FitParamT   zMock classifierc                     SU l         g )NF
successfulr   s    rK   rL   FitParamT.__init__   s	    rN   c                     X0l         SU l        g r   )r   fitted_rJ   r\   r]   should_succeeds       rK   r^   FitParamT.fit   s    (rN   c                     U R                   $ rF   r   rp   s     rK   r   FitParamT.predict   s    rN   c                 D    U R                  XUS9  U R                  U5      $ )N)r   )r^   r   r   s       rK   fit_predictFitParamT.fit_predict   s     n5||ArN   Nc                 <    Ub  X-  n[         R                  " U5      $ rF   r   )rJ   r\   r]   sample_weights       rK   r   FitParamT.score   s    $!AvvayrN   )r   r   rk   rO   )rP   rQ   rR   rS   rT   rL   r^   r   r   r   rU   rV   rN   rK   r   r      s     rN   r   c                       \ rS rSrSrS rSrg)DummyTransf   z(Transformer which store the column meansc                 n    [         R                  " USS9U l        [        R                  " 5       U l        U $ )Nr   r   )r   meanmeans_time
timestamp_r[   s      rK   r^   DummyTransf.fit   s(    ggaa( ))+rN   )r   r   N)rP   rQ   rR   rS   rT   r^   rU   rV   rN   rK   r   r      s
    2rN   r   c                   B    \ rS rSrSrS rS rS
S jrS
S jrS
S jr	Sr
g	)DummyEstimatorParams   z,Mock classifier that takes params on predictc                     gr   rV   r   s    rK   r   *DummyEstimatorParams.__sklearn_is_fitted__   r   rN   c                     U $ rF   rV   r[   s      rK   r^   DummyEstimatorParams.fit   r`   rN   c                     X l         U $ rF   got_attributerJ   r\   r   s      rK   r   DummyEstimatorParams.predict       *rN   c                     X l         U $ rF   r   r   s      rK   r   "DummyEstimatorParams.predict_proba   r   rN   c                     X l         U $ rF   r   r   s      rK   r   &DummyEstimatorParams.predict_log_proba   r   rN   r   Nrk   )rP   rQ   rR   rS   rT   r   r^   r   r   r   rU   rV   rN   rK   r   r      s    6rN   r   c            	         [        S/5      n [        R                  " [        5         U R	                  S//S/5        S S S 5        Sn[        S[        5       4/5      n [        R                  " [        US9   U R	                  S//S/5        S S S 5        [        5       n[        SU4/5      nUR                  SS9[        SS S US	.UR                  S
S9D6:X  d   eUR                  SS9  UR                  S:X  d   eUR                  b   e[        U5        [        5       n[        [        5      n[        SU4SU4/5      nUR                   S   UL d   eUR                   S   UL d   eSn[        S[        5       4SU4/5      n [        R                  " [        US9   U R	                  S//S/5        S S S 5        UR                  SS9  UR"                  S:X  d   e[        U5        [$        R&                  " S5      n[        R                  " [(        US9   UR                  SS9  S S S 5        [+        U5      nUR                   S   UR                   S   Ld   eUR                  SS9nUR                  SS9nUR                  S
S9 H  nUR-                  U5        M     UR                  S
S9 H  nUR-                  U5        M     UR-                  S5        UR-                  S5        UR-                  S5        UR-                  S5        Xg:X  d   eg ! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN= f! , (       d  f       GN)= f)N)r   r   r   zRLast step of Pipeline should implement fit or be the string 'passthrough'.*NoFit.*clfmatchsvcTrb   )svc__asvc__br   F皙?)r   anovaz<All intermediate steps should be transformers.*\bNoTrans\b.*t)svc__Cz]Invalid parameter 'C' for estimator SelectKBest(). Valid parameters are: ['k', 'score_func'].)anova__CrV   )r'   pytestraises	TypeErrorr^   rC   rX   rc   dictri   rH   rI   reprr,   r   r   named_stepsCreescape
ValueErrorr	   pop)	pipelinemsgr   pipefilter1pipe2rh   params2xs	            rK    test_pipeline_invalid_parametersr      s    !H	y	!qcUQC  
"	 
 %)*+H	y	,qcUQC  
- )CeS\N#D???% *Dc*-1__%_-H*   
 	OO3O55C<<55==J %C)$Ggw'%67D G$///E"c))) KC#wy)E3<89H	y	,qcUQC  
- 	OO3O55C<<J ))	C 
z	-% 
. $KEE"%*;*;E*BBBB __$_'FD)G__%_(

1 ) 5)A * JJu
JJwKKKK[ 
"	! 
-	,< 
-	, 
.	-s/   L6L#L5M
L #
L25
M
Mzmeta_estimators, class_namepcar   )identNpassthroughr   )r   Nscaler+   svdr   )dropr   c                     [        U 5      n [        R                  " SU SU S35      n[        R                  " [
        US9   U R                  S//5        S S S 5        g ! , (       d  f       g = f)Nz Expected an estimator instance (z"()), got estimator class instead (z).r   r   )r	   r   r   r   r   r   r^   )meta_estimators
class_namer   s      rK   3test_meta_estimator_raises_class_not_instance_errorr  +  sb      O,O
))
*:, 7((2|2	7C 
y	,aSE" 
-	,	,s   A
A-c                      [         R                  n [         R                  n[        / 5      nSn[        R
                  " [        US9   UR                  X5        S S S 5        g ! , (       d  f       g = f)Nz(The pipeline is empty. Please add steps.r   )irisdatatargetr'   r   r   r   r^   )r\   r]   r   r   s       rK   test_empty_pipeliner  D  sG    		AAB<D
4C	z	- 
.	-	-s   A""
A0c                  @    [        / 5      n [        U 5      nSU;   d   eg)z+Check that dir() works on an empty pipelinestepsN)r'   dir)r   attrss     rK   test_empty_pipeline_dirr  N  s"    B<DIEerN   c                     [         R                  " SS//5      n [        S[        5       4S[	        5       445      nUR                  U S S9  UR                  U 5        UR                  SS9  UR                  U S S9  UR                  U 5        g )Nr      transfr   r]   r   )r  )r   arrayr'   ru   r   r^   r   ri   r\   r   s     rK   test_pipeline_init_tupler  U  sw    
1a&Ah)E9;+?@ADHHQ$HJJqMOO=O)HHQ$HJJqMrN   c                  @   [         R                  n [         R                  n[        5       n[	        [
        SS9n[        SU4SU4/5      nUR                  X5        UR                  U 5        UR                  U 5        UR                  U 5        UR                  X5        g )Nr  kr   logistic)r  r  r  r!   r   r   r'   r^   r   r   r   r   )r\   r]   r   r   r   s        rK   test_pipeline_methods_anovar  a  s    		AA

C)q)Ggw'*c):;<DHHQNLLOq1JJqrN   c                     [        S[        5       4S[        5       4/5      n U R                  S S SS9  U R	                  S 5      (       d   eU R
                  S   R                  b   eU R
                  S   R                  b   e[        R                  " S5      n[        R                  " [        US9   U R                  S S SS9  S S S 5        g ! , (       d  f       g = f)Nr  r   T)r\   r]   clf__should_succeedz.fit() got an unexpected keyword argument 'bad'r   )clf__bad)r'   ru   r   r^   r   r   rH   rI   r   r   r   r   r   )r   r   s     rK   test_pipeline_fit_paramsr  p  s    h)E9;+?@ADHHttH6<<H%''///H%''/// ))D
EC	y	,td+ 
-	,	,s   2C
Cc                  x   [         R                  " SS//5      n [        S[        5       4S[	        5       4/5      nUR                  U S S9  UR                  U 5      S:X  d   eUR                  U S S9S:X  d   eUR                  U S S S9S:X  d   eUR                  U [         R                  " SS/5      S9S	:X  d   eg )
Nr   r  r  r   r     )r]   r   r      )r   r  r'   ru   r   r^   r   r  s     rK   %test_pipeline_sample_weight_supportedr!    s    
1a&Ah)E9;+?@ADHHQ$H::a=A::a4: A%%%::a4t:4999::arxxA'7:8A===rN   c                     [         R                  " SS//5      n [        S[        5       4S[	        5       4/5      nUR                  U S S9  UR                  U 5      S:X  d   eUR                  U S S9S:X  d   e[        R                  " S5      n[        R                  " [        US	9   UR                  U [         R                  " SS/5      S9  S S S 5        g ! , (       d  f       g = f)
Nr   r  r  r   r  r  r  z:score() got an unexpected keyword argument 'sample_weight'r   )r   r  r'   ru   r   r^   r   r   r   r   r   r   )r\   r   r   s      rK   'test_pipeline_sample_weight_unsupportedr#    s    
1a&Ah)E46?;<DHHQ$H::a=A::at:,111
))P
QC	y	,

1BHHaV$4
5 
-	,	,s   ''C
C%c                     [        S[        5       4/5      n [        R                  " S5      n[        R
                  " [        US9   U R                  SS9  S S S 5        [        R
                  " [        US9   U R                  SS9  S S S 5        [        R                  " S5      n[        R
                  " [        US9   U R                  SS9  S S S 5        g ! , (       d  f       N= f! , (       d  f       Ng= f! , (       d  f       g = f)	NclszInvalid parameter 'fake' for estimator Pipeline(steps=[('cls', LinearRegression())]). Valid parameters are: ['memory', 'steps', 'transform_input', 'verbose'].r   nope)fake)fake__estimatorzInvalid parameter 'invalid_param' for estimator LinearRegression(). Valid parameters are: ['copy_X', 'fit_intercept', 'n_jobs', 'positive', 'tol'].)cls__invalid_param)r'   r    r   r   r   r   r   ri   )r   	error_msgs     rK   $test_pipeline_raise_set_params_errorr+    s    e-/012D 			*I
 
z	3V$ 
4
 
z	3/ 
4 			UI 
z	362 
4	3 
4	3
 
4	3 
4	3s$   C7C(>C9
C%(
C69
Dc                  :   [         R                  n [         R                  n[        5       n[	        SSSS9n[        SU4SU4/5      nUR                  X5        UR                  U 5        UR                  U 5        UR                  U 5        UR                  X5        g )NfullmleT
svd_solvern_componentswhitenr   
classifier)r  r  r  r!   r   r'   r^   r   r   r   r   )r\   r]   r   r   r   s        rK   $test_pipeline_methods_pca_classifierr4    s    		AA

C
eD
ACeS\L##678DHHQNLLOq1JJqrN   c                     [         R                  n [        SSSS9n[        SS9n[	        SU4SU4/5      nUR                  U 5        UR                  U 5      R                  U R                  S   4:X  d   eUR                  UR                  U 5      5        [        UR                  U 5      UR                  UR                  U 5      5      5        g )	Nr-  r.  Tr/  )noveltyr   lofr   )r  r  r   r%   r'   r^   score_samplesshapefit_transformr<   rq   )r\   r   r7  r   s       rK   #test_pipeline_score_samples_pca_lofr;    s    		A eD
AC
T
*CeS\E3<01DHHQKa &&1771:-777GGCa !D&&q)3+<+<S]]1=M+NOrN   c                     [         R                  " S/S//5      n [         R                  " SS/5      n[        [        5       5      nUR	                  X5        SnSn[
        R                  " [        US9 nUR                  U 5        S S S 5        [        WR                  R                  [        5      (       d   eU[        UR                  R                  5      ;   d   eg ! , (       d  f       N_= f)Nr   r  z<'LogisticRegression' object has no attribute 'score_samples'z+'Pipeline' has no attribute 'score_samples'r   )r   r  r(   r!   r^   r   r   AttributeErrorr8  
isinstancevalue	__cause__str)r\   r]   r   	inner_msg	outer_msg	exec_infos         rK   4test_score_samples_on_pipeline_without_score_samplesrE    s    
1#sA
!QA +-.DHHQNNI=I	~Y	791 
8 ioo//@@@@IOO556666	 
8	7s   4C
C-c                  x   [         R                  n [         R                  nU R                  S   n[	        [
        R                  " U5      5      n[        5       n[        SSSS9n[        5       nXE4 H  n[        SU4SU4/5      nUR                  X5        UR                  U 5      n	U	R                  U4:X  d   eUR                  U 5      n
U
R                  X#4:X  d   eUR                  U 5      nUR                  X#4:X  d   eUR                  U 5      nUR                  X#4:X  d   eUR!                  X5        M     g )Nr   r  
randomizedT)r1  r0  r2  
preprocessr   )r  r  r  r9  lenr   uniquer+   r   r!   r'   r^   r   r   r   r   r   )r\   r]   	n_samples	n_classesscalerr   r   preprocessingr   r   proba	log_probar   s                rK   .test_pipeline_methods_preprocessing_classifierrQ    s!   		AA
IBIIaL!IF
1d
CC

C ,6EF ,,q/}},,,""1%{{y4444**1-	9"8888 2215 &&9*@@@@

1# 'rN   c                  *   [        5       n [        SSS9n[        5       n[        SSS9nU R                  [        R                  5      nUR                  U5      n[        SU4SU4/5      nUR                  [        R                  5      n[        Xu5        g )Nr   auto)random_staten_initrM  Kmeans)r+   r   r:  r  r  r   r'   r=   )rM  kmscaler_for_pipelinekm_for_pipelinescaledseparate_predr   pipeline_preds           rK   test_fit_predict_on_pipeliner]    s     F	Qv	.B )*!F;O !!$)),FNN6*M h 34x6QRSD$$TYY/Mm;rN   c                  r   [        5       n [        SS9n[        SU 4SU4/5      nSnSn[        R                  " [
        US9 n[        US5        S S S 5        [        WR                  R                  [
        5      (       d   eU[        UR                  R                  5      ;   d   eg ! , (       d  f       N_= f)	Nr-  r0  rM  r   z)'Pipeline' has no attribute 'fit_predict'z+'PCA' object has no attribute 'fit_predict'r   r   )r+   r   r'   r   r   r=  getattrr>  r?  r@  rA  )rM  r   r   rC  rB  rD  s         rK   0test_fit_predict_on_pipeline_without_fit_predictra    s     F

 Ch'%67D;I=I	~Y	79m$ 
8ioo//@@@@IOO556666 
8	7s   B((
B6c                  .   [        S[        5       4S[        5       4/5      n U R                  S S SSS9  U R                  S   R
                  S   (       d   eU R                  S   R                  (       d   eSU R                  S   R
                  ;  d   eg )Nr  r   T)r\   r]   transf__should_get_thisr  should_get_thisr   )r'   r}   r   r   r   r   r   r   s    rK   -test_fit_predict_with_intermediate_fit_paramsrf  &  s     h 12UIK4HIJD
$$   H%001BCCCE"----4#3#3H#=#H#HHHHrN   method_name)r   r   r   c                     [        S[        5       4S[        5       4/5      nUR                  S S 5        [	        X5      nU" S SS9  UR
                  S   R                  (       d   eg )Nr  r   T)r\   r   )r'   ru   r   r^   r`  r   r   )rg  r   methods      rK   (test_predict_methods_with_predict_paramsrj  2  s_     h)E3G3I+JKLDHHT4T'F
T&E"0000rN   csr_containerc                    [         R                  R                  5       nXR                  SS9-  n[         R                  n[        SSS9n[        SS9n[        SU4SU4/5      nUR                  X5        UR                  U5      nUR                  UR                  S   S	4:X  d   e[        US S 2S S
24   UR                  U5      5        [        US S 2S
4   UR                  X5      R                  5       5        [        SU4SU4/5      nU " U5      nUR                  Xr5      n[        XhR                  5       5        [!        U5      n	UR"                  S   S   U	R"                  S   S   Ld   eUR%                  SS9  UR                  X5      R                  UR                  S   S4:X  d   e[        S['        5       4SU4SU4/5      nUR                  X5      nUR                  UR                  S   S4:X  d   eSn
[        S['        5       4S[)        5       4/5      n[*        R,                  " [.        U
S9   UR                  U5        S S S 5        [        SU4SU445      nUR                  X5        g ! , (       d  f       N1= f)Nr   r   r  r1  rT  r   r  r   selectr  )	select__k   mockr   z>All estimators should implement fit and transform.*\bNoTrans\brq   no_transformr   )r  r  copyr   r  r   r   r&   r^   rq   r9  r=   r:  r>   raveltoarrayr	   transformer_listri   ru   rX   r   r   r   )rk  r\   r]   r   rn  fsX_transformedX_spX_sp_transformedfs2r   s              rK   test_feature_unionr}  @  s^    			AQAA
AA
6C1F	s|h%78	9BFF1LLLOM1771:q/111 mAssF3S5F5Fq5IJ}QU+V-A-A!-G-M-M-OP 
s|h%78	9BD''0m-E-E-GH )Cq!!$C,@,@,CA,FFFF MMAMA!''AGGAJ?::: 
)E3<(F9KL	MB$$Q*M1771:q/111 MC	VX.0KL	MB	y	,
q	 
- 
s|h%78	9BFF1L 
-	,s   9I66
Jc                     [        5       n [        5       n[        SU 4SU4/5      nUR                  S   U :X  d   eUR                  S   U:X  d   eUR                  R                  U :X  d   eUR                  R
                  U:X  d   eg)z6Check the behaviour of `named_transformers` attribute.r  noinvtransfN)ru   rm   r&   named_transformersr  r  )r  r  rx  s      rK   %test_feature_union_named_transformersr  p  s    XF-K	&)M;+GH	IB  *f444  /;>>>   ''6111  ,,;;;rN   c                      [        SS9n [        5       n[        X5      n[        UR                  6 u  p4US:X  d   eX@U4:X  d   eg )Nr-  r_  )r   r  )r   ru   r)   ziprw  )r   rr  funamestransformerss        rK   test_make_unionr  }  sO    

 C8D	C	Br223E%%%%;&&&rN   c                  X   [        SS9n [        5       n[        XSS9nUR                  [        X5      R                  :X  d   eSUR                  :X  d   e[
        R                  " S5      n[        R                  " [        US9   [        XSSS	.S
9  S S S 5        g ! , (       d  f       g = f)Nr-  r_  r  n_jobszEmake_union() got an unexpected keyword argument 'transformer_weights'r   
   r   )r   ru   transformer_weights)
r   ru   r)   rw  r  r   r   r   r   r   )r   rr  r  r   s       rK   test_make_union_kwargsr    s    

 C8D	Ca	(B*S"7"H"HHHH		>> ))OC 
y	,3"2JK 
-	,	,s   B
B)c                 6   ^ ^ [        5       nU U4S jUl        U$ )z>Helper to create a mock transformer with custom feature names.c                 N   > [        T5       Vs/ s H	  nT U 3PM     sn$ s  snf rF   )range)input_featuresi	base_name
n_featuress     rK   <lambda>)create_mock_transformer.<locals>.<lambda>  s.    #(#49#4a9+aS#49 9s   ")ru   get_feature_names_out)r  r  rr  s   `` rK   create_mock_transformerr    s    8D"D KrN   c                     [         R                  n [         R                  n[        5       n[	        S5      n[        X#SS9nUR                  (       a   e[        X#SS9nUR                  X5        [        / SQUR                  5       5        g )Nr  Fverbose_feature_names_outT)	pca__pca0	pca__pca1	pca__pca2	pca__pca3transf__transf0transf__transf1transf__transf2)
r  r  r  r   r  r)   r  r^   r>   r  )r\   r]   r   rr  unionfu_unions         rK   0test_make_union_passes_verbose_feature_names_outr    su     			AA
%C"8,DsEBE....#tDHLL	
 	&&(rN   c                  ^   [         R                  n [        SSS9n[        SU4/5      nUR	                  U 5      R                  U 5      nUR                  U 5      nUR                  U 5      n[        X45        [        X55        UR                  U5      nUR                  U5      n[        Xg5        g )Nr  r-  )r1  r0  r   )	r  r  r   r'   r^   rq   r:  r=   rz   )r\   r   r   X_transX_trans2X_trans3X_backX_back2s           rK   test_pipeline_transformr    s     			A
1
0C%'H ll1o''*G%%a(H  #Hg0g0''0F##G,Gf.rN   c                      [         R                  n [         R                  n[        5       n[	        SU4/5      nUR                  X5      nUR                  X5      R                  U 5      n[        XE5        g )Nrr  )	r  r  r  ru   r'   r:  r^   rq   r=   )r\   r]   r  r   r  r  s         rK   test_pipeline_fit_transformr    s`    		AAXF&&)*+H $$Q*Gzz!))!,Hg0rN   z
start, end))r   r   )r   r  )r   r  )r   r  Nr   )r   NrO   c                 4   [        S[        5       4S[        5       4S[        5       4/SSS9nX U n[        U[         5      (       d   eUR                  UR                  X :X  d   e[        UR                  R                  5       5      [        UR                  R                  5       5      X :X  d   eUR                  SS9nUR                  SS9nUS		 US		 XE:X  d   eS
n[        R                  " [        US9   X US2     S S S 5        g ! , (       d  f       g = f)Ntransf1transf2r   123T)memoryverboseFr   r	  z*Pipeline slicing only supports a step of 1r   ro  )r'   ru   r   r>  r	  listr   itemsrc   r   r   r   )startendr   
pipe_slicepipe_paramspipe_slice_paramsr   s          rK   test_pipeline_slicer    s    
VX	FH 5y{7KLD
 CJj(++++tzz%4444 	Z##))+,  &&()%4	5	5 //u/-K"--5-9G'"+++
6C	z	-3r\ 
.	-	-s   8D		
Dc                     [        5       n [        5       n[        SU 4SU4/5      nUS   U :X  d   eUS   U :X  d   eUS   U:X  d   eUS   U:X  d   e[        R                  " [
        5         US     S S S 5        [        R                  " [        5         US     S S S 5        g ! , (       d  f       N7= f! , (       d  f       g = f)Nr  r   r   ro  r  foobar)ru   r   r'   r   r   
IndexErrorKeyError)r  r   r   s      rK   test_pipeline_indexr    s    XF
+Ch'%67D7f>V###8s??;# 
z	"Q 
# 
x	 X 
!	 	 
#	" 
!	 s   ,B#B4#
B14
Cc                      [        5       n [        5       n[        SU 4/5      nUR                  S   U L d   eSU4/Ul        SUR                  ;  d   eUR                  S   UL d   eSU4/UR                  :X  d   eUR	                  SU 4/S9  SU 4/UR                  :X  d   eUR	                  US9  SU4/UR                  :X  d   eUR	                  S/S9  [
        R                  " S5      n[        R                  " [        US9   UR                  S//S/5        S S S 5        S	n[        R                  " [        US9   UR                  S//S/5        S S S 5        g ! , (       d  f       NH= f! , (       d  f       g = f)
Nrr  mock2r	  rr  )junkrV   zJLast step of Pipeline should implement fit or be the string 'passthrough'.r   r   z0This 'Pipeline' has no attribute 'fit_transform')ru   r'   r   r	  ri   r   r   r   r   r   r^   r=  r:  )r  r  r   r   s       rK   test_set_pipeline_stepsr    s   hGhG&'*+,H'7222 ()HN-----(G333g8>>111 012W(..000 W%W(..000 |n-
))TC 
y	,qcUQC  
- =C	~S	1uqc* 
2	1	 
-	, 
2	1s   E?E/
E,/
E=c                     [        5       n [        SS9n[        SU 4SU4/5      nSUR                  ;   d   eSUR                  ;  d   eUR                  R                  U L d   eUR                  R
                  UL d   e[        SU 4SU4/5      nUR                  R                  U Ld   eUR                  R
                  UL d   eg )Nr  r   rr  r   r  values)ru   r   r'   r   rr  r   r  )r  mult2r   s      rK   test_pipeline_named_stepsr  -  s    XFaLE&&)FE?;<H X)))))(.....$$...$$--- (F+fe_=>H&&f444$$---rN   r   c                 J   [         R                  " S//5      n[         R                  " S/5      n[        SS9n[        SS9n[        SS9n[        SU4SU 4SU4S	U4/5      nUR	                  X5        / S
QnUR
                   VV	s/ s H  u  pUPM	     n
nn	Xz:X  d   eg s  sn	nf )Nr   r  r   r     m2badm3m5)r  r  r  r  )r   r  r   r'   r^   r	  )r   r\   r]   r  mult3mult5r   expected_namesname_actual_namess              rK   %test_pipeline_correctly_adjusts_stepsr  >  s    
1#A
!AaLEaLEaLE
,tUmdE]KH LL.N(07WTDL7))) 8s   Bc                   ^^^ [         R                  " S//5      n[         R                  " S/5      n[        SS9m[        SS9m[        SS9mUUU4S jnU" 5       nSn[        U//UR	                  X5      5        [        U/UR                  U5      R                  U5      5        [        XR                  U//5      5        UR                  U S9  S	n[        U//UR	                  X5      5        [        U/UR                  U5      R                  U5      5        [        XR                  U//5      5        UR                  S
S9UR                  TU TS SSS SS.	:X  d   eUR                  U S9  Sn[        U//UR	                  X5      5        [        U/UR                  U5      R                  U5      5        [        XR                  U//5      5        / SQnU H  n[        XG5      " U5        M     UR                  TS9  S	n[        U//UR	                  X5      5        [        U/UR                  U5      R                  U5      5        [        XR                  U//5      5        U" 5       nUR                  U S9  Sn[        U//UR                  X5      R                  U5      5        [        U//UR	                  X5      5        [        XR                  U//5      5        SnSn	[        R                  " [        U	S9 n
[        US5        S S S 5        [!        W
R"                  R$                  [        5      (       d   eU['        U
R"                  R$                  5      ;   d   eS	n[)        ST4SU 4ST4/5      n[        U//UR	                  X5      5        [        U/UR                  U5      R                  U5      5        [        XR                  U//5      5        g ! , (       d  f       N= f)Nr   r  r   r  r  c                  ,   > [        ST 4ST4ST4/5      $ )Nr  r  last)r'   )r  r  r  s   rK   make0test_set_pipeline_step_passthrough.<locals>.makeX  s!    $uGHHrN      r  r  Tr   F)	r	  r  r  r  r  m2__mult
last__multtransform_inputr  r  )r   r   r   rq   r   )r     z''str' object has no attribute 'predict'z*This 'Pipeline' has no attribute 'predict'r   r   r  r  r  )r   r  r   r>   r:  r^   r   rz   ri   rc   r	  r`  rq   r   r   r=  r>  r?  r@  rA  r'   )r   r\   r]   r  r   expother_methodsri  rB  rC  rD  r  r  r  s              @@@rK   "test_set_pipeline_step_passthroughr  P  s   
1#A
!AaLEaLEaLEI vH
Cw 6 6q <=uhll1o55a89q44seW=>;'
Cw 6 6q <=uhll1o55a89q44seW=>D)
. 
 
 
 ;'
Cw 6 6q <=uhll1o55a89q44seW=>M  !!$   5!
Cw 6 6q <=uhll1o55a89q44seW=>vH[)
CwQ 2 < <Q ?@w 6 6q <=q44seW=>9I<I	~Y	79)$ 
8ioo//@@@@IOO556666 C${(;fe_MNHw 6 6q <=uhll1o55a89q44seW=> 
8	7s   O##
O1c                     [        [        S5      5      n U R                    U R                    U R                    [        [        5       5      n [        U S5      (       a   eU R                    U R                    [        S5      n U R                  S   S:X  d   e[        U S5      (       a   eU R                    U R                    [        [        5       [        5       5      n [        U S5      (       a   eU R                    [        U S5      (       a   e[        [        5       [        5       5      n [        U S5      (       a   eU R                    [        U S5      (       a   eg )Nr  r   r   r   r   rz   )	r(   r   r   rq   rz   ru   hasattrr	  rm   )r   s    rK   test_pipeline_ducktypingr    s&   T!W%HVX&Hx++++]+H>>! >>>>x++++VX{}5Hx++++x!45555[]FH5Hx++++x!455555rN   c                     [        5       n [        5       n[        X5      n[        U[        5      (       d   eUR                  S   S   S:X  d   eUR                  S   S   S:X  d   e[        X[        5       5      n[        U[        5      (       d   eUR                  S   S   S:X  d   eUR                  S   S   S:X  d   eUR                  S   S   S:X  d   eg )Nr   ztransf-1r   ztransf-2r  	fitparamt)ru   r(   r>  r'   r	  r   )t1t2r   s      rK   test_make_pipeliner    s    	B	B DdH%%%%::a=z)))::a=z)))-DdH%%%%::a=z)))::a=z)))::a={***rN   zpipeline, check_estimator_typec                 0    [        U 5      R                  S L $ rF   r1   estimator_typeests    rK   r  r    s    44<rN   c                 0    [        U 5      R                  S L $ rF   r  r  s    rK   r  r    s    8C=#?#?4#GrN   c                 8    [        U 5        U" U 5      (       d   eg)zCheck that the estimator type returned by the pipeline is correct.

Non-regression test as part of:
https://github.com/scikit-learn/scikit-learn/issues/30197
N)r   )r   check_estimator_types     rK   test_pipeline_estimator_typer    s    & 	N))))rN   c                  v    [        / S9n [        5       nUR                  5       nU R                  5       U:X  d   eg)zCheck that we propagate properly the tags in a Pipeline.

Non-regression test as part of:
https://github.com/scikit-learn/scikit-learn/issues/30197
r  N)r'   r   __sklearn_tags__)empty_pipelinebeexpected_tagss      rK   %test_sklearn_tags_with_empty_pipeliner     s:     B'N	B'')M**,===rN   c                     [         R                  n [         R                  n[        SSSS9n[	        SS9n[        SU4SU4/SS	0S
9nUR                  X5        UR                  U 5      n[        SU4SU4/SS	0S
9nUR                  X5      n[        S[        5       4SU4SU4/SS	0S
9nUR                  X5      n[        US S 2S S24   S	UR                  U 5      -  5        [        US S 2S4   UR                  X5      R                  5       5        [        US S 2S S24   S	UR                  U 5      -  5        [        US S 2S4   UR                  X5      R                  5       5        UR                  U R                  S   S4:X  d   eg )Nr  rG  r   r1  r0  rT  r   r  r   rn  r  r  rr  ro     )r  r  r  r   r   r&   r^   rq   r:  ru   r=   r>   ru  r9  )r\   r]   r   rn  rx  ry  X_fit_transformedX_fit_transformed_wo_methods           rK   test_feature_union_weightsr    s   		AA
1A
FC1F	
&)*
B FF1LLLOM	
&)*
B ((.	
&(	eS\Hf+=>#RL
B #%"2"21"8 mAssF3R#:K:KA:N5NO}QU+V-A-A!-G-M-M-OP/3B37c>O>OPQ>R9RS(B/1E1Ea1K1Q1Q1ST&,,Q???rN   c                     [         n [        S[        SS94S[        SS94/5      n[        S[        SS94S[        SS94/SS9n[        S[        SS94S[        SS94/SS9nUR                  U 5        UR	                  U 5      nUR
                  S   [        U 5      :X  d   eUR                  U 5        UR	                  U 5      nUR
                  UR
                  :X  d   e[        UR                  5       UR                  5       5        UR                  U 5      n[        UR                  5       UR                  5       5        UR	                  U 5      n[        UR                  5       UR                  5       5        g )	Nwordswordanalyzercharscharr  r  r   )
JUNK_FOOD_DOCSr&   r   r^   rq   r9  rI  r>   rv  r:  )r\   rx  fs_parallelfs_parallel2ry  X_transformed_parallelX_transformed_parallel2s          rK   test_feature_union_parallelr    s~    	A	ov67ov67	

B ov67ov67	
 K  ov67ov67	
 L FF1ILLOMq!SV+++OOA(2215"8">">>>>},,.0F0N0N0PQ +88;},,.0G0O0O0QR +44Q7},,.0G0O0O0QRrN   c                     [        SS9n [        SSS9n[        SU4SU 4/5      nUR                  [        5        UR	                  5       nU H  nSU;   a  M  S	U;   a  M   e   [        U5      S
:X  d   e[        S[        5       4/5      R                  S//5      n[        R                  " S5      n[        R                  " [        US9   UR	                  5         S S S 5        g ! , (       d  f       g = f)Nr	  r
  char_wb)r  r  )r  ngram_ranger  r  chars__words__#   tr1r   zDTransformer tr1 (type Transf) does not provide get_feature_names_outr   )r   r&   r^   r  r  rI  ru   r   r   r   r   r=  )	word_vect	char_vectftfeature_namesfeatr   s         rK    test_feature_union_feature_namesr   A  s    0IGI	+gy-AB	CBFF>,,.MD I$555 }###	vx()	*	.	.u	5B
))NC 
~S	1
  " 
2	1	1s   
C$$
C2c                  F   [         R                  n [         R                  n[        [	        SS9[        5       5      nUR                  X5        [        R                  " [        5         [        US5        S S S 5        [        [	        SS9[        SS95      n[        R                  " [        5         [        US5        S S S 5        UR                  X5        [        UR                  [        R                  " U5      5        g ! , (       d  f       N= f! , (       d  f       N[= f)Nr   r  classes_r   rT  )r  r  r  r(   r   r    r^   r   r   r=  r`  r!   r>   r"  r   rJ  )r\   r]   regr   s       rK   test_classes_propertyr%  T  s    		AA
a(*:*<
=CGGAM	~	&Z  
' a(*<!*L
MC	~	&Z  
'GGAMs||RYYq\2 
'	& 
'	&s   'D0D
D
D c                  b   [        S5      n [        S5      n[        S5      nS Ul        S U l        S Ul        [        SU 4SU4/5      n[        SS//UR	                  [
        R                  " S	//5      5      5        [        S
S/UR                  5       5        SU4/Ul        [        S//UR	                  [
        R                  " S	//5      5      5        [        S/UR                  5       5        UR                  SU4/S9  [        S//UR	                  [
        R                  " S	//5      5      5        [        S/UR                  5       5        UR                  US9  [        S//UR	                  [
        R                  " S	//5      5      5        [        S/UR                  5       5        g )Nr  r  r  c                     S/$ Nx3rV   r  s    rK   r  .test_set_feature_union_steps.<locals>.<lambda>i      $rN   c                     S/$ Nx2rV   r*  s    rK   r  r+  j  r,  rN   c                     S/$ )Nx5rV   r*  s    rK   r  r+  k  r,  rN   r  r  r   m2__x2m3__x3r  m5__x5rr  )rw  mock__x3r  mock__x5)	r   r  r&   r>   rq   r   r   rw  ri   )r  r  r  r  s       rK   test_set_feature_union_stepsr7  d  sl   GEGEGE"?E"?E"?E	e}tUm4	5BAxbjj1#.?!@A(+R-E-E-GH !%=/Bubll2::se+<=>z2#;#;#=> MMVUO#4M5ubll2::se+<=>
|R%=%=%?@ MMuMubll2::se+<=>
|R%=%=%?@rN   c                     [        S5      n [        S5      nS U l        S Ul        [        R                  " S//5      n[	        SU 4SU4/5      n[        SS//UR                  U5      R                  U5      5        [        SS//UR                  U5      5        [        SS	/UR                  5       5        UR                  S
S9  [        S//UR                  U5      R                  U5      5        [        S//UR                  U5      5        [        S	/UR                  5       5        UR                  S
S9  [        / /UR                  U5      R                  U5      5        [        / /UR                  U5      5        [        / UR                  5       5        UR                  US9  [        S//UR                  U5      R                  U5      5        [	        SSU4/5      n[        S//UR                  U5      R                  U5      5        [        S//UR                  U5      5        [        S	/UR                  5       5        g )Nr  r  c                     S/$ r.  rV   r*  s    rK   r  2test_set_feature_union_step_drop.<locals>.<lambda>  r,  rN   c                     S/$ r(  rV   r*  s    rK   r  r:    r,  rN   r   r  r  r2  r3  r   r  r  )r  r   )
r   r  r   r   r&   r>   r^   rq   r:  ri   )r  r  r\   r  s       rK    test_set_feature_union_step_dropr<    s   GEGE"?E"?E


QC5A	e}tUm4	5BAx!4!4Q!78Ax!1!1!!45(+R-E-E-GHMMVMubffQi11!45ub..q12z2#;#;#=>MMVMtRVVAY0034tR--a01r23356 MMUMubffQi11!45 
~e}5	6BubffQi11!45ub..q12z2#;#;#=>rN   c                  	   [        S5      n [        S5      nS U l        S Ul        [        R                  " S//5      n[	        SU 4SU4/5      n[        SS//UR                  U5      R                  U5      5        [        SS//UR                  U5      5        [        SS	/UR                  5       5        UR                  S
S9  [        SS//UR                  U5      R                  U5      5        [        SS//UR                  U5      5        [        SS	/UR                  S/5      5        UR                  S
S9  [        SS//UR                  U5      R                  U5      5        [        SS//UR                  U5      5        [        SS/UR                  S/5      5        UR                  US9  [        SS//UR                  U5      R                  U5      5        [        SS//UR                  U5      5        [        SS	/UR                  S/5      5        [	        SSU4/5      n[        SS//UR                  U5      R                  U5      5        [        SS//UR                  U5      5        [        SS	/UR                  S/5      5        [        R                  nUR                  S   n[        SSSS9n[	        SSU4/5      n[        X#R                  U5      R                  U5      SS2SU24   5        [        X#R                  U5      SS2SU24   5        [        / SQUR                  / SQ5      5        UR                  S
S9  UR                  U5      R                  U5      n[        U[        R                  " X"/5      5        UR                  U5      n[        U[        R                  " X"/5      5        [        / SQUR                  / SQ5      5        UR                  US9  [        X#R                  U5      R                  U5      SS2U* S24   5        [        X#R                  U5      SS2U* S24   5        [        / SQUR                  / SQ5      5        [	        SSU4/S
S0S9n[        US-  UR                  U5      R                  U5      SS2SU24   5        [        US-  UR                  U5      SS2SU24   5        [        / SQUR                  / SQ5      5        g)z@Check the behaviour of setting a transformer to `"passthrough"`.r  r  c                     S/$ r.  rV   r*  s    rK   r  4test_set_feature_union_passthrough.<locals>.<lambda>  r,  rN   c                     S/$ r(  rV   r*  s    rK   r  r?    r,  rN   r   r  r  r2  r3  r   r  
m2__myfeatmyfeatr  
m3__myfeat)r  r   rG  r   r  r   r   N)passthrough__f0passthrough__f1passthrough__f2passthrough__f3r  r  )f0f1f2f3)r   )rD  rE  rF  rG  pca__f0pca__f1pca__f2pca__f3)r   )passthrough__pca0passthrough__pca1rL  rM  rN  rO  r  )r   r  r   r   r&   r>   r^   rq   r:  ri   r  r  r9  r   hstack)r  r  r\   r  columnsr   X_fts          rK   "test_set_feature_union_passthroughrU    s{   GEGE #@E"?E


QC5A	e}tUm4	5BAx!4!4Q!78Ax!1!1!!45(+R-E-E-GHMM]M#Ax!4!4Q!78Ax!1!1!!45h/1I1I8*1UVMM]M#Ax!4!4Q!78Ax!1!1!!45	|$b&>&>z&J
 MMUMAx!4!4Q!78Ax!1!1!!45h/1I1I8*1UV 
,tUm<	=BAx!4!4Q!78Ax!1!1!!45h/1I1I8*1UV		AggajG
1A
FC	5s|D	EBq&&)--a0HWH=>q**1-a'k:;	
 	  !9:
 MMmM$66!9q!DtRYYv./ADtRYYv./		
 	  !9: MMcM"q&&)--a0WHI>?q**1-a'l;<	
 	  !9:
 
	'%6*A.
B q1ubffQi11!4Q[ABq1ub..q1!XgX+>?	
 	  !9:
rN   c                      [         R                  n [        SSSS9n[        SU4S/5      nUR	                  U 5        [        / SQUR                  5       5        g)	zDCheck feature_names_out for verbose_feature_names_out=True (default)r  rG  r   r  r   r   )r  r  passthrough__x0passthrough__x1passthrough__x2passthrough__x3Nr  r  r   r&   r^   r>   r  r\   r   r  s      rK   9test_feature_union_passthrough_get_feature_names_out_truer]    sS    		A
1A
FC	s|%CD	EBFF1I	
 	  "
rN   c                      [         R                  n [        SSSS9n[        SU4S/SS9nUR	                  U 5        [        / S	QUR                  5       5        g
)z;Check feature_names_out for verbose_feature_names_out=Falser  rG  r   r  r   r   Fr  )pca0pca1x0x1r/  r)  Nr[  r\  s      rK   :test_feature_union_passthrough_get_feature_names_out_falserc  )  s[    		A
1A
FC	
56RW
B FF1I	
 	  "
rN   c                  |   [         R                  " S5      n U R                  SS/SS//SS/S9n[        S S	 S
9n[	        S[        5       4SU4/SS9nUR                  U5        [        R                  " S5      n[         R                  " [        US9   UR                  5         SSS5        g! , (       d  f       g= f)zFCheck get_feature_names_out and non-verbose names and colliding names.pandasr   r  r  rH   rI   rS  c                     U S/   $ rf   rV   r\   s    rK   r  Stest_feature_union_passthrough_get_feature_names_out_false_errors.<locals>.<lambda>E  s
    !SE(rN   c                 0    [         R                  " S/5      $ rf   )r   r   )rJ   r  s     rK   r  ri  E  s    bjj#>OrN   )feature_names_outr  r  Fr  zvOutput feature names: ['a'] are not unique. Please set verbose_feature_names_out=True to add prefixes to feature namesr   N)r   importorskip	DataFramer*   r&   r+   r^   r   r   r   r   r  )pdr\   select_ar  r   s        rK   Atest_feature_union_passthrough_get_feature_names_out_false_errorsrp  ?  s    			X	&B
q!fq!f%Sz:A".OH 
 	!D(#34"'E 
IIaL
))	UC
 
z	-##% 
.	-	-s   B--
B;c                     [         R                  " S5      n U R                  [        [	        S5      5      /[	        S5       Vs/ s H  nSU 3PM
     snS9n[        SS/SS9nUR                  U5        [        R                  " S	5      n[         R                  " [        US
9   UR                  5         SSS5        gs  snf ! , (       d  f       g= f)zLCheck get_feature_names_out with non-verbose names and >= 5 colliding names.re  r  frf  )r  r   )r  r   Fr  zOutput feature names: ['f0', 'f1', 'f2', 'f3', 'f4', ...] are not unique. Please set verbose_feature_names_out=True to add prefixes to feature namesr   N)r   rl  rm  r  r  r&   r^   r   r   r   r   r  )rn  r  r\   r  r   s        rK   Ptest_feature_union_passthrough_get_feature_names_out_false_errors_overlap_over_5rs  V  s    			X	&B
d59o&%)0L)Q1QC)0LMA	 56"'E
 
IIaL
))	C 
z	-##% 
.	- 1M 
.	-s   B=
#C
Cc                   <    \ rS rSrSS jrS	S jrS	S jrS	S jrSrg)
DfOutTransformerim  c                     Xl         g rF   offset)rJ   rx  s     rK   rL   DfOutTransformer.__init__n  s    rN   Nc                     U $ rF   rV   r[   s      rK   r^   DfOutTransformer.fitq  r`   rN   c                     XR                   -
  $ rF   rw  r[   s      rK   rq   DfOutTransformer.transformt  s    ;;rN   c                     U $ rF   rV   )rJ   rq   s     rK   
set_outputDfOutTransformer.set_outputw  s	     rN   rw  )g      ?rF   )	rP   rQ   rR   rS   rL   r^   rq   r  rU   rV   rN   rK   ru  ru  m  s    rN   ru  df_lib_namere  polarsT1)r+   ru  r   )idsc                    [         R                  " U 5      nUR                  / SQ/ SQS.5      n[        SU4S[	        5       4/5      nUR                  U S9  UR                  U5      n[        UR                  5      / SQ:X  d   e[        UR                  5      SS/:X  d   eUR                  S	S
9  [         R                  " [        SS9   UR                  U5        SSS5        g! , (       d  f       g= f)a$  Check FeatureUnion behavior when transformers output duplicate column names.

Check that an error is raised when verbose_feature_names_out is False.
Check that no error is raised and columns are correctly prefixed when
verbose_feature_names_out is True.

Non-regression test for issue #32104
)r   r  r  rq  rG   r  r  rq   )t1__at1__bt2__at2__brH   rI   Fr  z%Output feature names:.*are not uniquer   N)r   rl  rm  r&   r+   r  r:  r  rS  ri   r   r   )r  r  df_libdfr  df_ts         rK   )test_feature_union_duplicate_column_namesr  }  s       -F			<@	AB	bzD.*:#;<	=BMMKM( BD!EEEE 

Sz)))MMEM2	z)Q	R
 
S	R	Rs   
C%%
C3c                     Sn SnSnS[        S5      4S[        S5      4/nS[        S5      4S[        S5      4/n[        S	4[        S
44 GH  u  pVS[        S5      4U[        S5      4/nX04XA4XrU-  44 GHk  u  p[        R                  " [
        U	S9   U" S0 Xh0D6R                  S//S/5        S S S 5        U" S0 US[        S5      4/0D6n
[        XU5        [        R                  " [
        U	S9   U
R                  S//S/5        S S S 5        [        R                  " [
        U	S9   U
R                  S//S/5        S S S 5        U" S0 US[        S5      4/0D6n
U
R                  " S0 Xh0D6  [        R                  " [
        U	S9   U
R                  S//S/5        S S S 5        [        R                  " [
        U	S9   U
R                  S//S/5        S S S 5        GMn     GM     g ! , (       d  f       GNA= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       GM  = f)Nz3Estimator names must not contain __: got \['a__q'\]z+Names provided are not unique: \['a', 'a'\]z=Estimator names conflict with constructor arguments: \['%s'\]a__qr  rI   r  rH   r	  rw  r   r   rV   )
r   r'   r&   r   r   r   r^   setattrr:  ri   )error_message_1error_message_2error_message_3
bad_steps1
bad_steps2r%  param
bad_steps3	bad_stepsmessager  s              rK   test_step_name_validationr    s   LODOVO47#c47^4JQ.3Q.1J '*\;M,NO
DGnud1g&67
))501#
I z9)u()--seaS9 : 2#tAw 012CC	*z9!s# : z9!!A3%!- : 2#tAw 012CNN0e/0z9!s# : z9!!A3%!- :93#
 P :9 :9 :9 :9 :9s<   G,5G>,HH H1,
G;>
H
H 
H.1
Ic                      [        S[        S[        5       4/5      4/5      n U R                  S[        5       S9  U R                  S[	        5       4/SS9  g )NrH   rI   gMbP?)a__b__alphaa__br  )a__stepsa__b__C)r'   r   ri   r   r!   )	estimators    rK   test_set_params_nested_pipeliner    sX    330@*A)B CDEFIU9C);)=#>"?KrN   c                  L   [         R                  n [         R                  n[        5       n [        R
                  " USS9n[        SS9n[        5       n[        S[        U5      4SU4/5      n[        SU4SU4/US9nUR                  X5        UR                  X5        UR                  S   R                  n[        UR                  U 5      UR                  U 5      5        [        UR                  U 5      UR                  U 5      5        [        UR!                  U 5      UR!                  U 5      5        [        UR#                  X5      UR#                  X5      5        [        UR                  S   R$                  UR                  S   R$                  5        ['        US5      (       a   eUR                  X5        [        UR                  U 5      UR                  U 5      5        [        UR                  U 5      UR                  U 5      5        [        UR!                  U 5      UR!                  U 5      5        [        UR#                  X5      UR#                  X5      5        [        UR                  S   R$                  UR                  S   R$                  5        XR                  S   R                  :X  d   e[        SS9n	[        5       n
[        S	U
4SU	4/US9nUR                  X5        [        UR                  U 5      UR                  U 5      5        [        UR                  U 5      UR                  U 5      5        [        UR!                  U 5      UR!                  U 5      5        [        UR#                  X5      UR#                  X5      5        [        UR                  S   R$                  UR                  S	   R$                  5        XR                  S	   R                  :X  d   e [(        R*                  " U5        g ! [(        R*                  " U5        f = f)
Nr  locationr  r   r#  r  logregr  r   transf_2)r  r  r  r   joblibMemoryr!   r   r'   r	   r^   r   r   r>   r   r   r   r   r   r  shutilrmtree)r\   r]   cachedirr  r   r  r   cached_pipetsclf_2r  cached_pipe_2s               rK   test_pipeline_memoryr    si   		AAyH8 "= a0(E&M2XsODE6 2XsODVT 	$$X.994<<?K,?,?,BC4--a0+2K2KA2NO411!4k6S6STU6VW4::a+[->->q-DEX&--{/F/Fx/P/W/W	
 68,,,, 	4<<?K,?,?,BC4--a0+2K2KA2NO411!4k6S6STU6VW4::a+[->->q-DEX&--{/F/Fx/P/W/W	
 ,,X6AAAAA #2= (#h%67
 	! 	4<<?M,A,A!,DE4--a0-2M2Ma2PQ""1%}'F'Fq'I	
 	4::a+]-@-@-FGX&--%%j188	
 ..z:EEEEEhhs   OP P#c                  >   [        5       n [        R                  " U SS9n[        [	        5       [        5       US9nUR                  UL d   e[        [	        5       [        5       5      nUR                  b   e[        U5      S:X  d   e[        R                  " U 5        g )Nr  r  r  r  )
r   r  r  r(   r   r,   r  rI  r  r  )r  r  r   s      rK   test_make_pipeline_memoryr    s{    yH]]Hb9F[]CE&AH??f$$$[]CE2H??"""x=A
MM(rN   c                   2    \ rS rSrSS jrSS jrSS jrSrg)FeatureNameSaveri  Nc                     [        XSS9  U $ )NT)reset)r@   r[   s      rK   r^   FeatureNameSaver.fit  s    TD1rN   c                     U$ rF   rV   r[   s      rK   rq   FeatureNameSaver.transform  rs   rN   c                     U$ rF   rV   )rJ   r  s     rK   r  &FeatureNameSaver.get_feature_names_out  s    rN   rV   rF   )rP   rQ   rR   rS   r^   rq   r  rU   rV   rN   rK   r  r    s    rN   r  c                     [        S[        5       4SS[        5       4/S9n [        5       nU R	                  UR
                  UR                  5        [        U SS R                  UR                  5      UR                  5        g)z5Check pipeline.get_feature_names_out with passthroughr  passr   r   r  Nro  )
r'   r  r!   r   r^   r  r  r>   r  r  )r   r  s     rK   test_features_names_passthroughr     su    &()#&()
D ;DHHTYY$Sb	''(:(:;T=O=OrN   c                  (   [        S[        5       4S[        5       4/S9n [         Vs/ s H  nSU;   PM
     nnU R	                  [        U5        [        U SS R                  5       / SQ5        [        U SS R                  S5      / SQ5        gs  snf )	z5Check pipeline.get_feature_names_out with vectorizersvectr   r  pizzaNro  )beerburgercoke	copyrightr  thenonsense_is_ignored)r'   r   r!   r  r^   r>   r  )r   r   r]   s      rK   #test_feature_names_count_vectorizerr  0  s    FO$56@R@T8UVWD-.~!A~A.HH^QSb	'')? Sb	''(=>? 	/s   Bc                     [        S[        5       4/S9n [        5       nU R                  UR                  UR
                  5        Sn[        R                  " [        US9   U R                  5         SSS5        g! , (       d  f       g= f)zVCheck that error is raised when a transformer does not define
`get_feature_names_out`.notransr  z&does not provide get_feature_names_outr   N)
r'   rX   r   r^   r  r  r   r   r=  r  )r   r  r   s      rK   8test_pipeline_feature_names_out_error_without_definitionr  ?  s`     Iwy123D;DHHTYY$
2C	~S	1""$ 
2	1	1s    A::
Bc                      [        [        5       5      n [        R                  " [        SS9   U R                  S/S//SS/SS/S9  S S S 5        g ! , (       d  f       g = f)Nz8Pipeline.fit does not accept the sample_weight parameterr   r   r   r  )r(   r!   r   r   r   r^   )r   s    rK   test_pipeline_param_errorr  K  sV    
*,
-C	T
 	!qc
QF1a&9
 
 
s   A
Ac              #      #    U  H^  u  u  pn[        X5      (       d  M  US :X  a8  [        US5      (       a'  [        UR                  S   S   [        5      (       a  MX  XU4v   M`     g7f)r:  r	  ro  r   N)r  r>  r	  r   ).0r  patternri  s       rK   	<genexpr>r  S  sj      <3#h sk n 	/!C!!syy}Q'3s S63#s   A(:A(A(r  r   zv\[Pipeline\].*\(step 1 of 2\) Processing transf.* total=.*\n\[Pipeline\].*\(step 2 of 2\) Processing clf.* total=.*\n$)noopNz\[Pipeline\].*\(step 1 of 3\) Processing transf.* total=.*\n\[Pipeline\].*\(step 2 of 3\) Processing noop.* total=.*\n\[Pipeline\].*\(step 3 of 3\) Processing clf.* total=.*\n$)r  r   )r   N)r  Nr   zw\[Pipeline\].*\(step 1 of 2\) Processing transf.* total=.*\n\[Pipeline\].*\(step 2 of 2\) Processing mult.* total=.*\n$)r  r   mult1r  z\[FeatureUnion\].*\(step 1 of 2\) Processing mult1.* total=.*\n\[FeatureUnion\].*\(step 2 of 2\) Processing mult2.* total=.*\n$)r  r   )r  r   z@\[FeatureUnion\].*\(step 1 of 1\) Processing mult2.* total=.*\n$)r^   r:  r   zest, pattern, methodc                 H   [        X5      n/ SQ/ SQ/nS/S//nU R                  SS9  U" XV5        UR                  5       R                  (       a   S5       eU R                  SS9  U" XV5        [        R
                  " X#R                  5       R                  5      (       d   eg )	Nr   r  r  )rq  r  r  r  r   F)r  zGot output for verbose=FalseT)r`  ri   
readouterroutr   r   )r  ri  r  capsysfuncr\   r]   s          rK   test_verboser    s    3D	IA
qc
ANN5N!J  "&&F(FF&NN4N J88G..0445555rN   c                     SS/SS/SS//n / SQn[        5       n[        5       n[        X#5      n[        US5      (       a   eUR	                  X5        UR
                  UR
                  s=:X  a  S:X  d   e   e[        5       n[        5       n[        X#5      nUR	                  X5        UR
                  UR
                  s=:X  a  S:X  d   e   e[        US5      (       a   eg 	Nr   r  r  rq  r  r  r   r   r  n_features_in_)r+   r   r(   r  r^   r  )r\   r]   ssgbdtr   s        rK   test_n_features_in_pipeliner    s     Q!Q!Q AA		B)+D"Dt-....HHQN""3"38q88888 
	B)+D"DFF1L""3"38q88888t-.....rN   c                  x   SS/SS/SS//n / SQn[        5       n[        U5      n[        US5      (       a   eUR                  X5        UR                  UR                  s=:X  a  S:X  d   e   e[        5       n[        U5      nUR                  X5        UR                  UR                  s=:X  a  S:X  d   e   eg r  )r+   r)   r  r^   r  )r\   r]   r  r  s       rK    test_n_features_in_feature_unionr    s     Q!Q!Q AA		B	BBr+,,,,FF1L 1 16Q66666 
	B	BBFF1L 1 16Q66666rN   c                      " S S[         [        5      n [        R                  [        R                  p![        SU " 5       4SU " 5       4/5      n[        R                  " [        5         UR                  X5        S S S 5        [        R                  " [        5         UR                  X5        S S S 5        UR                  XSS9  UR                  XSS9  g ! , (       d  f       Nc= f! , (       d  f       N@= f)Nc                   (    \ rS rSrSS jrSS jrSrg)7test_feature_union_fit_params.<locals>.DummyTransformeri  Nc                 "    USS0:w  a  [         eU $ )NrH   r   r   r   s       rK   r^   ;test_feature_union_fit_params.<locals>.DummyTransformer.fit  s    c1X%  KrN   c                     U$ rF   rV   r[   s      rK   rq   Atest_feature_union_fit_params.<locals>.DummyTransformer.transform      HrN   rV   rF   rP   rQ   rR   rS   r^   rq   rU   rV   rN   rK   DummyTransformerr    s    	
	rN   r  dummy0dummy1r   rg   )r   r   r  r  r  r&   r   r   r   r^   r:  r  r\   r]   r   s       rK   test_feature_union_fit_paramsr    s    +]  99dkkqx!1!34xAQAS6TUVA	z	"	a 
# 
z	"	 
# EE!!EOOAAO 
#	" 
#	"s   )CC)
C&)
C7c                  >    " S S[         5      n [        R                  [        R                  p![	        SU " 5       4SU " 5       4/5      n[
        R                  " [        5         UR                  XSS9  S S S 5        UR                  XSS9  g ! , (       d  f       N= f)Nc                       \ rS rSrSS jrSrg)Mtest_feature_union_fit_params_without_fit_transform.<locals>.DummyTransformeri  Nc                 "    USS0:w  a  [         eU $ )Nmetadatar   r  r   s       rK   r^   Qtest_feature_union_fit_params_without_fit_transform.<locals>.DummyTransformer.fit  s    j!_,  KrN   rV   rF   r   rV   rN   rK   r  r    s    	rN   r  nofittransform0nofittransform1r   )r  r   )	r-   r  r  r  r&   r   r   r   r:  r  s       rK   3test_feature_union_fit_params_without_fit_transformr    s    =  99dkkq 0 23 0 23	
	A 
z	"	q) 
# OOA1O% 
#	"s   $B
Bc                     [         R                  R                  5       [         R                  R                  5       p[        R
                  R                  SS/U R                  SS/S9R                  [        5      n[        R                  X'   [        [        5       [        5       5      nUR                  X5      R                  X5      S:  d   eg )Nr   r   r   g?)pg?)r  r  rt  r  r   randomchoicer9  astypeboolnanr(   r   r!   r^   r   )r\   r]   maskr   s       rK   %test_pipeline_missing_values_leniencyr    s     99>>T[[--/q99QFAGGSz:AA$GDffAG*<*>?D88A>%+++rN   c                      SS/SS/SS//n / SQnS[        5       4/nS	S0nS
n[        X#S9n[        R                  " [        US9   UR                  X5        S S S 5        g ! , (       d  f       g = f)Nr   r  r  rq  r  r  r  r  transformerzZAttempting to weight transformer "transformer", but it is not present in transformer_list.r  r   )ru   r&   r   r   r   r^   )r\   r]   rw  weightsexpected_msgr  s         rK   3test_feature_union_warns_unknown_transformer_weightr    sw     Q!Q!Q AA!68,-a G	5  )GE	z	6		! 
7	6	6s   A  
A.c                     [        U [        5       5      nUR                  5       R                  R                  (       a   eg rF   )r(   r,   r  
input_tagspairwise)r   r   s     rK   test_pipeline_get_tags_noner    s3     ce,D$$&11:::::rN   	Predictorc                 b   [         R                  R                  S5      nUR                  SS5      [         R                  " S/S-  S/S-  -   5      p2[        S[        5       4SU " 5       4/5      nUR                  X#5        UR                  U5      n[        U5      (       aA  [        US5        UR                  X#5      [        R                  " [        X55      5      :X  d   eg [        XSR!                  5       5        UR                  X#5      [        R                  " [#        X55      5      :X  d   eg )	Nr      r  r  r      r	  	predictor)r   r  RandomStaterandnr  r'   r:   r^   r   r
   r>   r   r   approxr"   r<   r   r#   )r  rngr\   r]   modely_preds         rK   1test_search_cv_using_minimal_compatible_estimatorr  $  s     ))


"C99RRXXqcAgb&89q
+-	.ik0JKE 
IIaO]]1FU61%{{1 FMM.2K$LLLL){{1 FMM(12E$FFFFrN   c                  8    " S S[         5      n [        SU " 5       4/5      n[        R                  " [        5         [        U5        S S S 5        UR                  [        R                  [        R                  5        [        U5        g ! , (       d  f       NH= f)Nc                       \ rS rSrS rSrg)0test_pipeline_check_if_fitted.<locals>.Estimatori:  c                     SU l         U $ r   r   r[   s      rK   r^   4test_pipeline_check_if_fitted.<locals>.Estimator.fit;      DLKrN   r!  Nr   rV   rN   rK   	Estimatorr  :  s    	rN   r$  r   )
r   r'   r   r   r   rA   r^   r  r  r  )r$  r   s     rK   test_pipeline_check_if_fittedr%  9  sd    M 
 %-./H	~	&! 
'LLDKK(H 
'	&s   B
Bc                     SS/SS/SS//n / SQn[        S[        5       4/5      n[        R                  " [        5         [        U5        S	S	S	5        UR                  X5        [        U5        [        S
/5      n[        U5        [        S[        5       4S
/5      n[        R                  " [        5         [        U5        S	S	S	5        UR                  X5        [        U5        g	! , (       d  f       N= f! , (       d  f       N<= f)z1Check __sklearn_is_fitted__ is defined correctly.r   r  r  rq  r  r  r  r   Nr  )r&   r:   r   r   r   rA   r^   )r\   r]   r  s      rK   "test_feature_union_check_if_fittedr'  F  s     Q!Q!Q AA5"4"6789E	~	& 
' 
IIaOE 123EE5"4"679PQRE	~	& 
' 
IIaOE 
'	& 
'	&s    C)8C:)
C7:
Dc                  >   [         R                  [         R                  p " S S[        5      n[	        U" 5       [        5       5      nUR                  X5        [         R                  nUR                  U5      n[        XT Vs/ s H  nSU 3PM
     sn5        gs  snf )zKCheck that pipeline passes names through.

Non-regression test for #21349.
c                   ,   ^  \ rS rSrSU 4S jjrSrU =r$ )Ytest_pipeline_get_feature_names_out_passes_names_through.<locals>.AddPrefixStandardScalarif  c                    > [         TU ]  US9n[        R                  " U Vs/ s H  nSU 3PM
     sn[        S9$ s  snf )Nr*  
my_prefix_)dtype)superr  r   r   object)rJ   r  r  r  	__class__s       rK   r  otest_pipeline_get_feature_names_out_passes_names_through.<locals>.AddPrefixStandardScalar.get_feature_names_outg  s?    G11PE::uEutD62uEVTTEs   <rV   rF   )rP   rQ   rR   rS   r  rU   __classcell__)r0  s   @rK   AddPrefixStandardScalarr*  f  s    	U 	UrN   r3  r,  N)	r  r  r  r+   r(   r^   r  r  r>   )r\   r]   r3  r   input_namesrk  r  s          rK   8test_pipeline_get_feature_names_out_passes_names_throughr5  _  s    
 99dkkqU. U
 02N4DEDHHQN$$K22;?(;*W;4Zv+>;*WX*Ws   B
c                     [         R                  " S5        [        SSS9u  p[        [	        5       [        5       5      nUR                  SS9  UR                  X5        USS R                  5       nUS   R                  n[        X45        g)z.Test pipeline's set_output with feature names.re  Tas_frame
return_X_yr  Nro  )r   rl  r   r(   r+   r!   r  r^   r  feature_names_in_r>   )r\   r]   r   r:  log_reg_feature_namess        rK   $test_pipeline_set_output_integrationr<  t  sx    
!dt4DA)+=+?@DOOhO'HHQNSb	779 H66(@rN   
df_libraryc                    [         R                  " U 5      n[        SSS9u  p#[        USS9u  pE[	        S[        5       4S[        5       4/5      nUR                  U S9  UR                  U5        UR                  U5      n[        XqR                  5      (       d   e[        UR                  UR                  5       5        U S:X  a!  [        UR                  UR                  5        g	g	)
z'Test feature union with set_output API.Tr7  r   r#  scalarr   r  re  N)r   rl  r   r$   r&   r+   r   r  r^   rq   r>  rm  r>   rS  r  index)r=  libr\   r  X_trainX_testr  r  s           rK   test_feature_union_set_outputrD    s     

j
)Cdt4DA&qq9OG8^%56GHE	z*	IIgoof%Gg}}----w(C(C(EFX7==&,,7 rN   c                      [        5       n [        5       n[        SU 4SU4SS/5      nUS   U L d   eUS   UL d   eUS   S:X  d   eUS   S:X  d   eg	)
z8Check FeatureUnion.__getitem__ returns expected results.r?  r   r  )drop_mer   r  r   rF  r   N)r+   r   r&   )r?  r   r  s      rK   test_feature_union_getitemrG    s    F
%CvCL#		
E ?f$$$<3=M)))v%%%rN   keyr  c                     [        S[        5       4S[        5       4/5      nSn[        R                  " [
        US9   X     SSS5        g! , (       d  f       g= f)z5Raise error when __getitem__ gets a non-string input.r?  r   zOnly string keys are supportedr   N)r&   r+   r   r   r   r  )rH  r  r   s      rK    test_feature_union_getitem_errorrJ    sE     8^%56GHE
*C	xs	+
 
,	+	+s   A
Ac                  `   [         R                  " S5        [        SSS9u  p[        5       nUR	                  U 5        [        SU4/5      n[        US5      (       d   e[        U R                  UR                  5        [        UR                  UR                  5        [        S/5      nUR	                  U 5        [        US5      (       d   e[        U R                  UR                  5        U R                  5       n[        S/5      nUR	                  U5        [        US5      (       a   eg)zlEnsure feature union has `.feature_names_in_` attribute if `X` has a
`columns` attribute.

Test for #24754.
re  Tr7  r   r:  r  N)r   rl  r   r+   r^   r&   r  r>   rS  r:  to_numpy)r\   r  rM  r  X_arrays        rK   $test_feature_union_feature_names_in_rN    s    !dt4DA F
JJqM7F+,-E5-....qyy%"9"9:v//1H1HI 123E	IIaL5-....qyy%"9"9: jjlG123E	IIgu122222rN   c                     [         R                  " S5      R                  SS5      n [        R                  " [
        SS9   [        S[        S 5      4S[        S	 5      4/5      R                  U 5        S
S
S
5        g
! , (       d  f       g
= f)z?Test that FeatureUnion raises error for 1D transformer outputs.r  r  r  z@Transformer 'b' returned an array or dataframe with 1 dimensionsr   rH   c                     U $ rF   rV   rh  s    rK   r  .test_feature_union_1d_output.<locals>.<lambda>  s    ArN   rI   c                     U S S 2S4   $ r  rV   rh  s    rK   r  rQ    s    AadGrN   N)	r   arangereshaper   r   r   r&   r*   r:  rh  s    rK   test_feature_union_1d_outputrU    sv    
		!Q"A	P
 	)+67)*;<=	

 -

 
 
s    5A>>
Bz(array_namespace, device_name, dtype_namec           	         [        XU5      u  p4[        R                  R                  S5      nSu  pgUR	                  Xg4S9R                  U5      nUR                  XS9n	Su  p[        S[        U
SS94S[        US	S94/5      nUR                  U5      n[        S
S9   UR                  U	5      n[        U[        SS9nUR                   HV  u  nnS HJ  n[        UU5      (       d  M  [        [        UU5      5      u  nnnUUL d   eU[        U	5      S   :X  a  MJ   e   MX     SSS5        [!        U5      n[#        UWUS9  UR$                  UX-   4:X  d   eg! , (       d  f       N;= f)zDTest that FeatureUnion with Array API-compatible transformers works.r   )r  r  )size)device)r  r   	nystroem1rm  	nystroem2r   T)array_api_dispatchcpu)xprX  )components_normalization_r  N)atol)r;   r   r  r  uniformr  r   r&   r   r:  r   r4   rw  r  r3   r`  r2   r<   r9  )array_namespacedevice_name
dtype_namer]  rX  rndrK  r  X_npX_xpn_components_1n_components_2r  X_np_transformedX_xp_transformedX_xp_transformed_npr  transattrtrans_xpr  trans_devicer`  s                          rK   'test_feature_union_array_api_compliancerq    s    &oJOJB
))


"C"I;;Y3;4;;JGD::d:*D%)"N(QOP(QOP	
E **40	4	0 ..t4%&62eL 11KD%95$''0Ht,1-Ha $r>)>'+CD+I!+LLLL : 2	 
1 *%D$&9E$$')    
1	0s   AE*0EE
E)c            	         [        S[        5       4S[        SSS94/5      n [        U 5      R                  SL d   e[        S[        5       4S[        SS	94/5      n [        U 5      R                  S
L d   e[        S[        5       4SS/5      n [        U 5      R                  SL d   e[        SS5      n [        U 5      R                  SL d   eg)zHCheck that FeatureUnion.array_api_support tag reflects its transformers.rM  nystroemr  r   rm  Tr   r  )r1  Fr  )droppedr   r   r   N)r&   r+   r   r1   array_api_supportr   r)   )r  s    rK   (test_feature_union_array_api_support_tagrv    s     ~'(qqAB	
E E?,,444 ~'(La01	
E E?,,555 ~'(#	
E E?,,444 v}-EE?,,444rN   T)enable_metadata_routingri  r^   r:  c                   ^ S mU4S jnS n[         R                  " SS/SS//5      n[         R                  " SS/5      n[         R                  " SS//5      n[         R                  " S	S
//5      n[         R                  " SS//5      nU" 5       u  ppnUR                  UUUUUS9  U" U	SS/XWS9  U" U
SS/5        U" USS/US-   US9  U" UU R                  S5      US-   US9  g)zLTest that with transform_input, data is correctly transformed for each step.c                 H    [        U S9R                  XS9R                  XS9$ )z$Get a transformer with requests set.registryr   r  )r.   set_fit_requestset_transform_request)r{  r   r  s      rK   get_transformer6test_transform_input_pipeline.<locals>.get_transformer:  s+     !(3_=_L"""R	
rN   c                     > [        5       [        5       [        5       [        5       4u  pp#[        T" U SSS9T" USSS9T" USSS9T" USSS9S/S9nX@XU4$ )zGet a pipeline and corresponding registries.

The pipeline has 4 steps, with different request values set to test different
cases. One is aliased.
Tr|  Fother_weightsr   r  )r/   r(   )
registry_1
registry_2
registry_3
registry_4r   r  s        rK   get_pipeline3test_transform_input_pipeline.<locals>.get_pipelineB  sw     KKKK	:
6

 JdTJJeeLJdTJJoPTU,-
 CCrN   c                 X    U (       d   eU  H  nU H  n[        U4UUS.UD6  M     M     g)zACheck that the right metadata was recorded for the given methods.)ri  parentN)r0   )r{  methodsr  r  ri  s        rK   check_metadata5test_transform_input_pipeline.<locals>.check_metadataW  s=    x!I!'!! 	 " "rN   r   r  r  rq  r   r  (   d      )r   r  r  r^   rq   r|  r  N)r   r  r^   split)ri  r  r  r\   r]   r   r  r  r   r  r  r  r  r  s                @rK   test_transform_input_pipeliner  5  s   

D*
 	1a&1a&!"A
!QAHHq!fX&MHHr2hZ(Mxx#s%H;G>8DjjHH		##   UK( :{34	#a'	 S#a'	rN   c            	          " S S[         [        5      n  " S S[        [        5      n[        R                  " SS//5      n[        R                  " SS/5      n[        R                  " SS//5      n[        R                  " SS/5      n[        SU " 5       4S	U" 5       R                  S
S
S94/S/S9nUR                  X#XES9  g)z;Test that the right transformed values are passed to `fit`.c                        \ rS rSrS rS rSrg)>test_transform_input_explicit_value_check.<locals>.Transformeri  c                     SU l         U $ r   r!  r[   s      rK   r^   Btest_transform_input_explicit_value_check.<locals>.Transformer.fit  r#  rN   c                     US-   $ r  rV   rp   s     rK   rq   Htest_transform_input_explicit_value_check.<locals>.Transformer.transform      q5LrN   r!  Nr  rV   rN   rK   Transformerr        		rN   r  c                       \ rS rSrSS jrSrg)<test_transform_input_explicit_value_check.<locals>.Estimatori  Nc                    [        U[        R                  " SS//5      5        [        U[        R                  " SS/5      5        [        U[        R                  " SS//5      5        [        U[        R                  " SS/5      5        U $ )Nr   r  r   r  )r>   r   r  rJ   r\   r]   X_valy_vals        rK   r^   @test_transform_input_explicit_value_check.<locals>.Estimator.fit  sg    q"((QF8"45q"((Aq6"23ubhhAx&89ubhh1v&67KrN   rV   rO   r   rV   rN   rK   r$  r    s    	rN   r$  r   r   r  r	  r  Tr  r  r  r  N)r   r   r   r   r  r'   r}  r^   )r  r$  r\   r]   r  r  r   s          rK   )test_transform_input_explicit_value_checkr    s    & O]  	1a&A
!QAHHq!fXEHHaVEKM*)+55D5MN	
 !	D 	HHQH,rN   c                     [         R                  " SS/SS//5      n [         R                  " SS/5      nSn[        R                  " [        US9   [        [        5       S/S	9R                  X5        S
S
S
5        g
! , (       d  f       g
= f)z<Make sure the right error is raised if slep6 is not enabled.r   r  r  rq  r   z;The `transform_input` parameter can only be set if metadatar   blahr  N)r   r  r   r   r   r(   r   r^   )r\   r]   r   s      rK   test_transform_input_no_slep6r    sg    
1a&1a&!"A
!QA
GC	z	-kmfX>BB1H 
.	-	-s   #A<<
B
c            	          " S S[         [        5      n  " S S[        [        5      n[        R                  " SS//5      n[        R                  " SS/5      n[        R                  " SS//5      n[        R                  " SS/5      n[        R                  " SS	//5      n[        R                  " SS/5      n[        S
U" 5       4SU " 5       R                  SSS94/S/S9nUR                  X#XF4XW4S9  g)zHTest that if metadata is a tuple of arrays, both arrays are transformed.c                       \ rS rSrSS jrSrg)-test_transform_tuple_input.<locals>.Estimatori  Nc                    [        U[        5      (       d   e[        U[        5      (       d   e[        US   [        R                  " SS//5      5        [        US   [        R                  " SS/5      5        [        US   [        R                  " SS//5      5        [        US   [        R                  " SS/5      5        SU l        U $ )Nr   r  r  r         T)r>  tupler>   r   r  r   r  s        rK   r^   1test_transform_tuple_input.<locals>.Estimator.fit  s    eU++++eU++++uQxAq6();<uQx1a&)9:uQxB8*)=>uQx1a&)9:DLKrN   r!  rO   r   rV   rN   rK   r$  r    s    		rN   r$  c                        \ rS rSrS rS rSrg)/test_transform_tuple_input.<locals>.Transformeri  c                     SU l         U $ r   r!  r[   s      rK   r^   3test_transform_tuple_input.<locals>.Transformer.fit  r#  rN   c                     US-   $ r  rV   rp   s     rK   rq   9test_transform_tuple_input.<locals>.Transformer.transform  r  rN   r!  Nr  rV   rN   rK   r  r    r  rN   r  r   r  r   r  r  r	  r  Tr  r  r  N)r   r   r   r   r  r'   r}  r^   )	r$  r  r\   r]   X_val0y_val0X_val1y_val1r   s	            rK   test_transform_tuple_inputr    s    
O] 
&  	1a&A
!QAXX1vhFXXq!fFXXBxj!FXXq!fFKM*)+55D5MN	
 !	D 	HHQ&)&1AHBrN   )r   r   r   r   r   r8  rq   rz   c                      " S S[         5      n[        SU" 5       4/5      n[        R                  " [        5         [        X 5      " S//5        S S S 5        g ! , (       d  f       g = f)Nc                   N    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rSrg):test_pipeline_warns_not_fitted.<locals>.StatelessEstimatori  zStateless estimator that doesn't check if it's fitted.

Stateless estimators that don't require fit, should properly set the
`requires_fit` flag and implement a `__sklearn_check_is_fitted__` returning
`True`.
c                     U $ rF   rV   r[   s      rK   r^   >test_pipeline_warns_not_fitted.<locals>.StatelessEstimator.fit  s    KrN   c                     U$ rF   rV   rp   s     rK   rq   Dtest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.transform  r  rN   c                 @    [         R                  " [        U5      5      $ rF   r   onesrI  rp   s     rK   r   Btest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.predict      773q6?"rN   c                 @    [         R                  " [        U5      5      $ rF   r  rp   s     rK   r   Htest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.predict_proba  r  rN   c                 @    [         R                  " [        U5      5      $ rF   r   zerosrI  rp   s     rK   r   Ltest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.predict_log_proba  s    88CF##rN   c                 @    [         R                  " [        U5      5      $ rF   r  rp   s     rK   r   Ltest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.decision_function 	  r  rN   c                     gr  rV   r[   s      rK   r   @test_pipeline_warns_not_fitted.<locals>.StatelessEstimator.score	  s    rN   c                 @    [         R                  " [        U5      5      $ rF   r  rp   s     rK   r8  Htest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.score_samples	  r  rN   c                     U$ rF   rV   rp   s     rK   rz   Ltest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.inverse_transform		  r  rN   rV   N)rP   rQ   rR   rS   rT   r^   rq   r   r   r   r   r   r8  rz   rU   rV   rN   rK   StatelessEstimatorr    s4    				#	#	$	#		#	rN   r  r  r   )r   r'   r   r   r   r`  )ri  r  r   s      rK   test_pipeline_warns_not_fittedr    sP    !] !F k#5#789:D	~	&se$ 
'	&	&s   A
A(c                   ~    \ rS rSrS rSS jrSS jrSS jrSS jrSS jr	SS	 jr
SS
 jrSS jrSS jrSS jrSrg)SimpleEstimatori	  c                     gr   rV   r   s    rK   r   %SimpleEstimator.__sklearn_is_fitted__	  r   rN   Nc                 .    Uc   U5       eUc   U5       eU $ rF   rV   rJ   r\   r]   r   props        rK   r^   SimpleEstimator.fit	  s)    (7-7(%%rN   c                      Uc   eUc   eUS-   $ r  rV   r  s        rK   r:  SimpleEstimator.fit_transform 	  #    (((1urN   c                 T    Uc   eUc   e[         R                  " [        U5      5      $ rF   r  r  s        rK   r   SimpleEstimator.fit_predict%	  ,    (((wws1vrN   c                 T    Uc   eUc   e[         R                  " [        U5      5      $ rF   r  rJ   r\   r   r  s       rK   r   SimpleEstimator.predict*	  r  rN   c                 T    Uc   eUc   e[         R                  " [        U5      5      $ rF   r  r  s       rK   r   SimpleEstimator.predict_proba/	  r  rN   c                 T    Uc   eUc   e[         R                  " [        U5      5      $ rF   r  r  s       rK   r   !SimpleEstimator.predict_log_proba4	  s-    (((xxArN   c                 T    Uc   eUc   e[         R                  " [        U5      5      $ rF   r  r  s       rK   r   !SimpleEstimator.decision_function9	  r  rN   c                     Uc   eUc   egr  rV   r  s        rK   r   SimpleEstimator.score>	  s    (((rN   c                      Uc   eUc   eUS-   $ r  rV   r  s       rK   rq   SimpleEstimator.transformC	  r  rN   c                      Uc   eUc   eUS-
  $ r  rV   r  s       rK   rz   !SimpleEstimator.inverse_transformH	  r  rN   rV   rO   )rP   rQ   rR   rS   r   r^   r:  r   r   r   r   r   r   rq   rz   rU   rV   rN   rK   r  r  	  s9    




 



rN   r  r  partial_fitc                    S n[         R                  " S//5      [         R                  " S/5      p2S/SSpen[        5       nU" XpSSS9nU" USSSS9n[        5       R	                  SSS9R                  SSS9R                  SSS9n[        S	U4S
U4/5      n	SU ;  a  U	R                  X#XES9n	 [        X5      " X#XEUS9  [        USSUUS9  [        USSUUS9  g! [         a    [        X5      " X$XVS9   N7f = f)z5Test that metadata is routed correctly for pipelines.c                 r    U[         ;   a
  [         U   nOU/nU H  n[        U SU S35      " S0 UD6  M     U $ )zSet requests for a given method.

If the given method is a composite method, set the same requests for
all the methods that compose it.
set__requestrV   )r6   r`  )r  ri  kwargr  s       rK   set_request7test_metadata_routing_for_pipeline.<locals>.set_requestT	  sH     &&'/GhGFC4xx01:E: 
rN   r   rH   rI   Tr   r  r^   r|  trsr  )r   r  r  )objri  r  r   r  rq   N)r   r  r  r.   r}  r~  set_inverse_transform_requestr'   r^   r`  r   r0   )
ri  r  r\   r]   r   r  r  r  r  r   s
             rK   "test_metadata_routing_for_pipeliner  O	  s6   
 88aSE?BHHaSMq%&CcM 
C
cD
AC
c54
@C	td	;		TD		A	&	&TD	&	I	  %S'9:;HF<<M<M
!8	
 # #  
!	

s   /C C87C8c                 B   S//S/p!S/SpC[        5       n[        SU4/5      nSU  3n[        R                  " [        [
        R                  " U5      S9    [        X`5      " XX4S9  SSS5        g! [         a    [        X`5      " XUS9   N%f = f! , (       d  f       g= f)zBTest that metadata is not routed for pipelines when not requested.r   rH   r  zn[sample_weight, prop] are passed but are not explicitly set as requested or not requested for SimpleEstimator.r   r  N)	r  r'   r   r   r   r   r   r`  r   )ri  r\   r]   r   r  r  r   error_messages           rK   (test_metadata_routing_error_for_pipeliner  	  s     C51#q#s4

C+s+,-H	117	:  
z=)A	B	QH%a-S 
C	B  	Q H%a4P	Q	 
C	Bs*   BA00B
BBB
B)r   rq   rz   c                     [        S[        5       4/5      n[        R                  " [        SS9   [        X5      " S//S/SS9  SSS5        g! , (       d  f       g= f)z}Test that the right error message is raised when metadata is passed while
not supported when `enable_metadata_routing=False`.r  z1is only supported if enable_metadata_routing=Truer   r   rH   r  N)r'   r  r   r   r   r`  )ri  r   s     rK   *test_routing_passed_metadata_not_supportedr  	  sT     k?#4567D	M
 	seA3SA
 
 
s   A
Ac                      [        S[        5       4S[        5       4/5      n U R                  S//S/5        U R	                  S//5        g)zFTest that pipeline works with estimators that have a `__len__` method.r  r  r   N)r'   r   r   r^   r   re  s    rK   %test_pipeline_with_estimator_with_lenr	  	  sN     
%'	(;8N8P*QRD 	HHqcUQCLL1#rN   	last_stepc                     [        S[        5       4SU 4/5      nUR                  S//S/5      R                  S/S/S//5      S/S/S//:X  d   eg)zyTest that the pipeline works when there is not last step.

It should just ignore and pass through the data on transform.
r  r  r   r  r  N)r'   r*   r^   rq   )r
  r   s     rK   test_pipeline_with_no_last_stepr  	  sc     e023k95MNOD88aSEA3))A3aS/:sQC!oMMMrN   c                     [         R                  " SS/SS/SS//5      n / SQn/ SQSp2[        S	[        5       4/5      nS
[        R                   S3n[
        R                  " [        [        R                  " U5      S9   UR                  XX#S9  SSS5        [        S	[        5       R                  SSS94/5      nS
[        R                   S3n[
        R                  " [        [        R                  " U5      S9   UR                  XX#S9R                  XUS9  SSS5        g! , (       d  f       N= f! , (       d  f       g= f)zCTest that the right error is raised when metadata is not requested.r   r   r  rq  r  r  r   r   r   rH   sub_transformerzb[sample_weight, metadata] are passed but are not explicitly set as requested or not requested for z.fitr   r|  NTz
.transform)r   r  r&   r.   rP   r   r   r   r   r   r^   r}  rq   )r\   r]   r   r  feature_unionr  s         rK   )test_feature_union_metadata_routing_errorr  	  sL    	1a&1a&1a&)*AA'8 !#46J6L"M!NOM	!!5!>!> ?t	E 
 
/ryy7O	P!mO 
Q ! "$&66"& 7 	
	M	  4 = =>j	J 
 
/ryy7O	P 	 	

)AX)
F 
Q	P) 
Q	P( 
Q	Ps    D&>D7&
D47
Ec                  P    [        S[        5       4/5      n U R                  5         g)z]Test that get_metadata_routing() works regardless of the Child's
consumption of any metadata.r  N)r&   r.   get_metadata_routing)r  s    rK   3test_feature_union_get_metadata_routing_without_fitr  	  s'     !#46J6L"M!NOM&&(rN   r	  c           	      J   [         R                  " SS/SS/SS//5      n/ SQn/ SQSpC[        S	U " [        5       S
9R	                  SSS9R                  SSS94SU " [        5       S
9R	                  SSS9R                  SSS94/5      nX4S.nUR                  " X40 UD6  UR                  " X40 UD6  UR                  " X40 UD6R                  " U40 UD6  UR                   H<  n U S   R                  n[        U5      (       d   eU H  n[        SUSSS.UD6  M     M>     g)z8Test that metadata is routed correctly for FeatureUnion.r   r   r  rq  r  r  r  rH   
sub_trans1rz  Tr|  
sub_trans2r^   )r   ri  r  NrV   )r   r  r&   r/   r}  r~  r^   r:  rq   rw  r{  rI  r0   )	r	  r\   r]   r   r  r  kwargsr{  	sub_transs	            rK   #test_feature_union_metadata_routingr   
  sN    	1a&1a&1a&)*AA'8  Y[1 tdC&&TD&I	 Y[1 tdC&&TD&I		
M"  -CFa%f%//a%f%//<V<$55q>**8}}}!I#  	 "	 6rN   c            	         [        SS9u  pSn[        5       n[        S[        5       4SS[	        US94/5      R                  U5      R                  X5        UR                  S5      S	:X  d   eUR                  S
5      S	:X  d   eUR                  S5      SS	U-   -   :X  d   eUR                  S5      SS	U-   -   :X  d   eg)zhCheck that callbacks are propagated correctly for a pipeline.

passthrough step is counted as one task.
Tr9  r  scr   r  max_itersetupr   teardownon_fit_task_beginon_fit_task_endN)r   r   r'   r+   r   set_callbacksr^   count_hooks)r\   r]   r  callbacks       rK   test_pipeline_with_callbacksr'  1
  s     %DAH.0H>#$*$h78	
 mHcc!i(A---
+q000  34	Q\8RRRR 12i1x<6PPPPrN   c                  d   [        SS9u  p[        5       n[        5       R                  U5      nSn[        5       n[	        US9R                  U5      n[        SU4SU4/5      R                  X5        UR                  S5      S:X  d   eUR                  S	5      S:X  d   eUR                  S
5      S:X  d   eUR                  S5      S:X  d   eUR                  S5      S:X  d   eUR                  S	5      S:X  d   eUR                  S
5      SU-   :X  d   eUR                  S5      SU-   :X  d   eg)z?Check that callbacks registered on steps are correctly invoked.Tr  r  r  r  r  r   r   r!  r"  r#  N)r   r   r+   r$  r   r'   r^   r%  )r\   r]   sc_callbackr  r  est_callbackr  s          rK   %test_pipeline_with_callbacks_on_stepsr+  K
  sA    %DA#%K			'	'	4BH$&L
H
-
;
;L
ICtRj5#,'(,,Q2""7+q000"":.!333""#671<<<""#45:::##G,111##J/1444##$78ALHHH##$56!h,FFFrN   c            
         [        SS9u  p[        5        nSn[        S[        5       4SS[	        US94/[
        R                  " US9S	9n[        5       nUR                  U5        UR                  X5        UR                  S
5      nUR                  S5      n[        UR                  S   S5      (       a   e[        5       nUR                  U5      R                  X5        UR                  S
5      US-
  :X  d   eUR                  S5      US-
  :X  d   e[        UR                  S   S5      (       a   e SSS5        g! , (       d  f       g= f)zGCheck that callbacks don't break the caching mechanism of the pipeline.Tr  r  r  r   r  r  )r  r  r"  r#  _skl_callbacksr   N)r   r   r'   r+   r   r  r  r   r$  r^   r%  r  r   )r\   r]   r  r  r   r&  n_task_begin
n_task_ends           rK   7test_pipeline_memory_callbacks_second_fit_same_pipeliner0  d
  sH    %DA		~'(.((;<
 ==(3
 348$++,?@))*;<
4++D13CDDDD 348$((.##$78L1<LLLL##$56*q.HHH4++D13CDDDDD1 
		s   D!E
E)r  )rT   	itertoolsr   r  r   tempfiler   r   r  numpyr   r   sklearnr   sklearn.baser   r   r   r	   r
   r   sklearn.callback.tests._utilsr   r   r   r   sklearn.clusterr   sklearn.datasetsr   sklearn.decompositionr   r   sklearn.dummyr   sklearn.ensembler   r   r   sklearn.exceptionsr   r   sklearn.feature_extraction.textr   sklearn.feature_selectionr   r   sklearn.imputer   sklearn.kernel_approximationr   sklearn.linear_modelr   r    r!   sklearn.metricsr"   r#   sklearn.model_selectionr$   sklearn.neighborsr%   sklearn.pipeliner&   r'   r(   r)   sklearn.preprocessingr*   r+   sklearn.svmr,   %sklearn.tests.metadata_routing_commonr-   r.   r/   r0   sklearn.utilsr1   sklearn.utils._array_apir2   r3   r4   r5    sklearn.utils._metadata_requestsr6   r7   sklearn.utils._testingr8   r9   r:   r;   r<   r=   r>   sklearn.utils.fixesr?   sklearn.utils.validationr@   rA   r  r  flags	writeabler  r  rC   rX   rm   ru   r}   r   r   r   r   r   markparametrizer  r  r  r  r  r  r!  r#  r+  r4  r;  rE  rQ  r]  ra  rf  rj  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  thread_unsafer  r   r%  r7  r<  rU  r]  rc  rp  rs  ru  r  r  r  r  r  r  r  r  r  r  productparameter_grid_test_verboser  r  r  r  r  r  r  r  r  r%  r'  r5  r<  rD  rG  slicerJ  rN  rU  rq  rv  r  r  r  r  r  r  sortedsetr  r  r  r	  r  r  r  r  r'  r+  r0  rV   rN   rK   <module>rY     sW
    	   0    "   # & 3 ( 
 H ; < ( 1 L L 4 4 0 N N E   #  H   / J
 {!		 #   M 	e 	"G 
[ f ] 2 .& = ,Qh !	E3<.	!5)	E3<1	2E:	1E3<@	A5I	(5#,7	8%@	G^,ucen=	>@PQ	s|e\^%<=	>F	su~|'<=	>O	'%)>?	@.Q	s|%CD	EuM
##	, >
636P 7"<<,7	I D11 .9, :,^
<'L:/&
1 V8$+B." }(=>* ?*" }(=>M? ?M?`68+ $	~');)=	>N	~')9);	<lK.*+<	
 
"GH**
>@F *S *SZ#&3 A: ?Fnb(,&.&.}   8(<=')=9=  
 >4#.LL< ~		} 	 	%:<"+"3"3 8VX.	0DEFN 8VX.	@TUVN !68,/	,N 8VX.>?N *VTV,<=>O 3fdf5EFGO w/'461BCDT /'461BDUVWSY0	
b 	0e3#< ~ /1LM6 N6/.7(.&0,$ }(=>; ?; '79J&KLG MG(
2Y*A  (';<8 =8"&$ E!QK 01 23@  .-/$	$N 5N -E?#;<J = .JZ -- .-BI -$C .$CV 	&%&%Z6m 6t 6#g,'=9Q*Q#RS-= . T=F 6#g,'=9Q*Q#RS-Q . TQ* E	B	B - . t]&;<-N . =N -%G .%GP -) .) -(*LM& .&Z Q Q2 G G0 E ErN   