
    {Kg                       d Z ddlZddlZddlZddlZddlZddlmZ ddlZddl	Z
ddlZddlmZmZmZmZ ddlmZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZmZ dd
lmZm Z  ddl!m"Z" ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z)m*Z*m+Z+ ddl,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z: ddl;m<Z< ddl=m>Z>m?Z?m@Z@mAZA ddlBmCZCmDZD ddlEmFZFmGZGmHZHmIZImJZJmKZK ddlLmMZM ddlNmOZO  e       ZPdZQ G d d      ZR G d deR      ZS G d d eS      ZT G d! d"eT      ZU G d# d$eU      ZV G d% d&e      ZW G d' d(e      ZX G d) d*eU      ZY G d+ d,e      ZZd- Z[d. Z\d/ Z]d0 Z^d1 Z_d2 Z`d3 Zad4 Zbd5 Zcd6 Zdd7 Zed8 Zfd9 Zgd: Zhej                  j                  d;g d<      d=        Zkej                  j                  d>eM      d?        Zld@ ZmdA ZndB ZodC ZpdD Zqej                  j                  dEg dF      dG        ZrdH ZsdI ZtdJ Zuej                  j                  dKddKg      dL        Zvej                  j                  dKddKg      dM        ZwdN ZxdO ZydP ZzdQ Z{dR Z|dS Z}dT Z~dU ZdV ZdW ZdX ZdY ZdZ Zd[ Zd\ Zd] Zd^ Z G d_ d`e      Zda Zdb Zdc Zdd Zde  ej                   e5df eU       fdg eX       fg      dhf e5df eU       fdidg eX       fg      djf e5df eU       fdkdg eX       fg      djf e5df eU       fdlg      dhf e5dmdn eW       fg      dof e5dpdn eW       fg      dof e4dq eW       fdr eW       fg      dsf e4dtdr eW       fdug      dvfgg dw      D        Zej                  j                  dxe      dy        Zdz Zd{ Zd| Zd} Zd~ Zd Zej                  j                  dKddKg      d        Zej                  j                  deGeFg      d        Zd Zd Zd Zd Zd Zd Zej                  j                  dd edd      g      d        Zd Zd Z G d de      Zej                  jI                  d      ej                  j                  d e eeD      ddhz
              d               Zej                  jI                  d      ej                  j                  d e eeD      ddhz
              d               Zej                  j                  dg d      d        Zej                  jI                  d      d        Zej                  jI                  d      ej                  j                  dddKg      d               Zej                  jI                  d      d        Zej                  jI                  d      d        Zej                  jI                  d      ej                  j                  de?e>g      d               Zy)z
Test the pipeline module.
    N)mkdtemp)BaseEstimatorTransformerMixincloneis_classifier)KMeans)	load_iris)PCATruncatedSVD)DummyRegressor)HistGradientBoostingClassifierRandomForestClassifierRandomTreesEmbedding)NotFittedErrorUnsetMetadataPassedError)CountVectorizer)SelectKBest	f_classif)SimpleImputer)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)COMPOSITE_METHODSMETHODS)MinimalClassifierMinimalRegressorMinimalTransformerassert_allcloseassert_array_almost_equalassert_array_equal)CSR_CONTAINERS)check_is_fitted)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                       e Zd ZdZddZy)NoFitz*Small class to test parameter dispatching.Nc                      || _         || _        y Nab)selfr7   r8   s      _/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/tests/test_pipeline.py__init__zNoFit.__init__F   s        NN)__name__
__module____qualname____doc__r;    r<   r:   r3   r3   C   s
    4r<   r3   c                        e Zd Zd ZddZd Zy)NoTransc                     | S r5   rB   r9   Xys      r:   fitzNoTrans.fitL       r<   c                 4    | j                   | j                  dS )Nr6   r6   )r9   deeps     r:   
get_paramszNoTrans.get_paramsO   s    VV$&&))r<   c                     |d   | _         | S Nr7   r7   )r9   paramss     r:   
set_paramszNoTrans.set_paramsR   s    r<   NF)r>   r?   r@   rI   rM   rR   rB   r<   r:   rD   rD   K   s    *r<   rD   c                       e Zd Zd Zy)NoInvTransfc                     |S r5   rB   r9   rG   s     r:   	transformzNoInvTransf.transformX       r<   N)r>   r?   r@   rX   rB   r<   r:   rU   rU   W   s    r<   rU   c                       e Zd Zd Zd Zy)Transfc                     |S r5   rB   rW   s     r:   rX   zTransf.transform]   rY   r<   c                     |S r5   rB   rW   s     r:   inverse_transformzTransf.inverse_transform`   rY   r<   N)r>   r?   r@   rX   r^   rB   r<   r:   r[   r[   \   s    r<   r[   c                       e Zd Zd Zy)TransfFitParamsc                     || _         | S r5   )
fit_paramsr9   rG   rH   rb   s       r:   rI   zTransfFitParams.fite   s    $r<   Nr>   r?   r@   rI   rB   r<   r:   r`   r`   d   s    r<   r`   c                   @    e Zd ZddZd Zd Zd Zd ZexZxZ	Z
d	dZy)
Multc                     || _         y r5   mult)r9   ri   s     r:   r;   zMult.__init__k   s	    	r<   c                     | S r5   rB   rF   s      r:   rI   zMult.fitn   rJ   r<   c                 F    t        j                  |      | j                  z  S r5   npasarrayri   rW   s     r:   rX   zMult.transformq       zz!}tyy((r<   c                 F    t        j                  |      | j                  z  S r5   rl   rW   s     r:   r^   zMult.inverse_transformt   ro   r<   c                 f    t        j                  |      | j                  z  j                  d      S )N   axis)rm   rn   ri   sumrW   s     r:   predictzMult.predictw   s'    

1		)..A.66r<   Nc                 ,    t        j                  |      S r5   rm   ru   rF   s      r:   scorez
Mult.score|   s    vvayr<   )rr   r5   )r>   r?   r@   r;   rI   rX   r^   rv   predict_probapredict_log_probadecision_functionry   rB   r<   r:   rf   rf   j   s4    ))7 =DCMC%(9r<   rf   c                   4    e Zd ZdZd ZddZd ZddZd	dZy)
	FitParamTzMock classifierc                     d| _         y )NF
successful)r9   s    r:   r;   zFitParamT.__init__   s	    r<   c                     || _         y r5   r   r9   rG   rH   should_succeeds       r:   rI   zFitParamT.fit   s	    (r<   c                     | j                   S r5   r   rW   s     r:   rv   zFitParamT.predict   s    r<   c                 L    | j                  |||       | j                  |      S )N)r   )rI   rv   r   s       r:   fit_predictzFitParamT.fit_predict   s"    An5||Ar<   Nc                 :    |||z  }t        j                  |      S r5   rx   )r9   rG   rH   sample_weights       r:   ry   zFitParamT.score   s     $M!Avvayr<   rS   r=   )	r>   r?   r@   rA   r;   rI   rv   r   ry   rB   r<   r:   r~   r~      s     )r<   r~   c                       e Zd ZdZd Zy)DummyTransfz(Transformer which store the column meansc                 p    t        j                  |d      | _        t        j                         | _        | S )Nr   rs   )rm   meanmeans_time
timestamp_rF   s      r:   rI   zDummyTransf.fit   s(    ggaa( ))+r<   N)r>   r?   r@   rA   rI   rB   r<   r:   r   r      s
    2r<   r   c                   .    e Zd ZdZd ZddZddZddZy)DummyEstimatorParamsz,Mock classifier that takes params on predictc                     | S r5   rB   rF   s      r:   rI   zDummyEstimatorParams.fit   rJ   r<   c                     || _         | S r5   got_attributer9   rG   r   s      r:   rv   zDummyEstimatorParams.predict       *r<   c                     || _         | S r5   r   r   s      r:   rz   z"DummyEstimatorParams.predict_proba   r   r<   c                     || _         | S r5   r   r   s      r:   r{   z&DummyEstimatorParams.predict_log_proba   r   r<   NrS   )r>   r?   r@   rA   rI   rv   rz   r{   rB   r<   r:   r   r      s    6r<   r   c                     t        dg      } t        j                  t              5  | j	                  dggdg       d d d        d}t        dt               fg      } t        j                  t        |      5  | j	                  dggdg       d d d        t               }t        d|fg      }|j                  d      t        dd d |d	|j                  d
      k(  sJ |j                  d       |j                  dk(  sJ |j                  J t        |       t               }t        t              }t        d|fd|fg      }|j                   d   |u sJ |j                   d   |u sJ d}t        dt               fd|fg      } t        j                  t        |      5  | j	                  dggdg       d d d        |j                  d       |j"                  dk(  sJ t        |       t%        j&                  d      }t        j                  t(        |      5  |j                  d       d d d        t+        |      }|j                   d   |j                   d   usJ |j                  d      }|j                  d      }|j                  d
      D ]  }|j-                  |        |j                  d
      D ]  }|j-                  |        |j-                  d       |j-                  d       |j-                  d       |j-                  d       ||k(  sJ y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)N)rr   rr   rr   zRLast step of Pipeline should implement fit or be the string 'passthrough'.*NoFit.*clfmatchsvcTrL   )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__CrB   )r   pytestraises	TypeErrorrI   r3   rD   rM   dictrR   r7   r8   reprr#   r   r   named_stepsCreescape
ValueErrorr   pop)	pipelinemsgr   pipefilter1pipe2rQ   params2xs	            r:    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W[ 
"	! 
-	,< 
-	, 
.	-s/   L%7L2#L?M%L/2L<?M	Mc                  *   t        j                  ddgg      } t        dt               fdt	               ff      }|j                  | d        |j                  |        |j                  d       |j                  | d        |j                  |        y )Nrr      transfr   rH   passthrough)r   )rm   arrayr   r[   r~   rI   ry   rR   rG   r   s     r:   test_pipeline_init_tupler     sw    
1a&Ah)E9;+?@ADHHQ$HJJqMOO=O)HHQ$HJJqMr<   c                  J   t         j                  } t         j                  }t               }t	        t
        d      }t        d|fd|fg      }|j                  | |       |j                  |        |j                  |        |j                  |        |j                  | |       y )Nr   kr   logistic)irisdatatargetr   r   r   r   rI   rv   rz   r{   ry   )rG   rH   r   r   r   s        r:   test_pipeline_methods_anovar     s    		AA

C)q)Ggw'*c):;<DHHQNLLOq1JJq!r<   c                     t        dt               fdt               fg      } | j                  d d d       | j	                  d       sJ | j
                  d   j                  J | j
                  d   j                  J t        j                  d      }t        j                  t        |      5  | j                  d d d       d d d        y # 1 sw Y   y xY w)Nr   r   T)rG   rH   clf__should_succeedz.fit() got an unexpected keyword argument 'bad'r   )clf__bad)r   r[   r~   rI   rv   r   r7   r8   r   r   r   r   r   )r   r   s     r:   test_pipeline_fit_paramsr   #  s    h)E9;+?@ADHHttH6<<H%''///H%''/// ))D
EC	y	,td+ 
-	,	,s   /CCc                     t        j                  ddgg      } t        dt               fdt	               fg      }|j                  | d        |j                  |       dk(  sJ |j                  | d       dk(  sJ |j                  | d d       dk(  sJ |j                  | t        j                  ddg            d	k(  sJ y )
Nrr   r   r   r   r      )rH   r   r      )rm   r   r   r[   r~   rI   ry   r   s     r:   %test_pipeline_sample_weight_supportedr   3  s    
1a&Ah)E9;+?@ADHHQ$H::a=A::a4: A%%%::a4t:4999::arxxA'7:8A===r<   c                     t        j                  ddgg      } t        dt               fdt	               fg      }|j                  | d        |j                  |       dk(  sJ |j                  | d       dk(  sJ t        j                  d      }t        j                  t        |	      5  |j                  | t        j                  ddg             d d d        y # 1 sw Y   y xY w)
Nrr   r   r   r   r   r   r   z:score() got an unexpected keyword argument 'sample_weight'r   )rm   r   r   r[   rf   rI   ry   r   r   r   r   r   )rG   r   r   s      r:   '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                     t        dt               fg      } t        j                  d      }t	        j
                  t        |      5  | j                  d       d d d        t	        j
                  t        |      5  | j                  d       d d d        t        j                  d      }t	        j
                  t        |      5  | j                  d       d d d        y # 1 sw Y   xY w# 1 sw Y   axY w# 1 sw Y   y xY w)	NclszInvalid parameter 'fake' for estimator Pipeline(steps=[('cls', LinearRegression())]). Valid parameters are: ['memory', 'steps', 'verbose'].r   nope)fake)fake__estimatorzInvalid parameter 'invalid_param' for estimator LinearRegression(). Valid parameters are: ['copy_X', 'fit_intercept', 'n_jobs', 'positive'].)cls__invalid_param)r   r   r   r   r   r   r   rR   )r   	error_msgs     r:   $test_pipeline_raise_set_params_errorr   K  s    e-/012D 			XI 
z	3V$ 
4
 
z	3/ 
4 			NI 
z	362 
4	3 
4	3
 
4	3 
4	3s$   C$=C0C<$C-0C9<Dc                  J   t         j                  } t         j                  }t        dd      }t	        ddd      }t        d|fd|fg      }|j                  | |       |j                  |        |j                  |        |j                  |        |j                  | |       y )	NTr   probabilityrandom_statefullmle
svd_solvern_componentswhitenpcar   )r   r   r   r#   r
   r   rI   rv   rz   r{   ry   )rG   rH   r   r   r   s        r:   test_pipeline_methods_pca_svmr   e  s    		AA
$Q
/C
eD
ACeS\E3<01DHHQNLLOq1JJq!r<   c                     t         j                  } t        ddd      }t        d      }t	        d|fd|fg      }|j                  |        |j                  |       j                  | j                  d   fk(  sJ |j                  |j                  |              t        |j                  |       |j                  |j                  |                    y )	Nr   r   Tr   )noveltyr   lofr   )r   r   r
   r   r   rI   score_samplesshapefit_transformr-   rX   )rG   r   r   r   s       r:   #test_pipeline_score_samples_pca_lofr   t  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Or<   c                     t        j                  dgdgg      } t        j                  ddg      }t        t                     }|j	                  | |       d}d}t        j                  t        |      5 }|j                  |        d d d        t        j                  j                  t              sJ |t        |j                  j                        v sJ y # 1 sw Y   SxY w)Nrr   r   z<'LogisticRegression' object has no attribute 'score_samples'z+'Pipeline' has no attribute 'score_samples'r   )rm   r   r   r   rI   r   r   AttributeErrorr   
isinstancevalue	__cause__str)rG   rH   r   	inner_msg	outer_msg	exec_infos         r:   4test_score_samples_on_pipeline_without_score_samplesr     s    
1#sA
!QA +-.DHHQNNI=I	~Y	791 
8 ioo//@@@IOO556666	 
8	7s   5CC"c                     t         j                  } t         j                  }| j                  d   }t	        t        j                  |            }t               }t        ddd      }t        ddd      }||fD ]  }t        d|fd	|fg      }|j                  | |       |j                  |       }	|	j                  |fk(  sJ |j                  |       }
|
j                  ||fk(  sJ |j                  |       }|j                  ||fk(  sJ |j                  |       }|j                  ||fk(  sJ |j!                  | |        y )
Nr   r   
randomizedT)r   r   r   ovr)r   r   decision_function_shape
preprocessr   )r   r   r   r   lenrm   uniquer"   r
   r#   r   rI   rv   rz   r{   r|   ry   )rG   rH   	n_samples	n_classesscalerr   r   preprocessingr   rv   proba	log_probar|   s                r:   'test_pipeline_methods_preprocessing_svmr    s3   		AA
IBIIaL!IF
1d
CC
$Q
NC #,6EFA ,,q/}},,,""1%{{y)4444**1-	9i"8888 2215 &&9i*@@@@

1a# 'r<   c                  8   t               } t        dd      }t               }t        dd      }| j                  t        j                        }|j                  |      }t        d|fd|fg      }|j                  t        j                        }t        ||       y )Nr   auto)r   n_initr  Kmeans)r"   r   r   r   r   r   r   r.   )r  kmscaler_for_pipelinekm_for_pipelinescaledseparate_predr   pipeline_preds           r:   test_fit_predict_on_pipeliner    s     F	Qv	.B )*!F;O !!$)),FNN6*M h 34x6QRSD$$TYY/Mm];r<   c                  d   t               } t        d      }t        d| fd|fg      }d}d}t        j                  t
        |      5 }t        |d       d d d        t        j                  j                  t
              sJ |t        |j                  j                        v sJ y # 1 sw Y   SxY w)	Nr   r   r  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   r   )r  r   r   r   r   r   s         r:   0test_fit_predict_on_pipeline_without_fit_predictr    s     F

 Ch'%67D;I=I	~Y	79m$ 
8ioo//@@@IOO556666 
8	7s   B&&B/c                     t        dt               fdt               fg      } | j                  d d dd       | j                  d   j
                  d   sJ | j                  d   j                  sJ d| j                  d   j
                  vsJ y )Nr   r   T)rG   rH   transf__should_get_thisr   should_get_thisr   )r   r`   r~   r   r   rb   r   r   s    r:   -test_fit_predict_with_intermediate_fit_paramsr    s     h 12UIK4HIJD
$$   H%001BCCCE"----4#3#3H#=#H#HHHHr<   method_name)rv   rz   r{   c                     t        dt               fdt               fg      }|j                  d d        t	        ||       } |d d       |j
                  d   j                  sJ y )Nr   r   T)rG   r   )r   r[   r   rI   r  r   r   )r  r   methods      r:   (test_predict_methods_with_predict_paramsr     sa     h)E3G3I+JKLDHHT4T;'F
T&E"0000r<   csr_containerc                    t         j                  }||j                  d      z  }t         j                  }t	        dd      }t        d      }t        d|fd|fg      }|j                  ||       |j                  |      }|j                  |j                  d   d	fk(  sJ t        |d d d d
f   |j                  |             t        |d d d
f   |j                  ||      j                                t        d|fd|fg      } | |      }|j                  ||      }t        ||j                                t        |      }	|j                   d   d   |	j                   d   d   usJ |j#                  d       |j                  ||      j                  |j                  d   dfk(  sJ t        dt%               fd|fd|fg      }|j                  ||      }|j                  |j                  d   dfk(  sJ d}
t        dt%               fdt'               fg      }t)        j*                  t,        |
      5  |j                  |       d d d        t        d|fd|ff      }|j                  ||       y # 1 sw Y   -xY w)Nr   rs   r   )r   r   rr   r   svdselectr   )	select__k   mockr   z>All estimators should implement fit and transform.*\bNoTrans\brX   no_transformr   )r   r   r   r   r   r   r   rI   rX   r   r.   r   r/   raveltoarrayr   transformer_listrR   r[   rD   r   r   r   )r!  rG   rH   r#  r$  fsX_transformedX_spX_sp_transformedfs2r   s              r:   test_feature_unionr2    sh    			AQAA
AA
6C1F	s|h%78	9BFF1aLLLOM1771:q/111 mAssF3S5F5Fq5IJ}QU+V-A-A!Q-G-M-M-OP 
s|h%78	9BD''a0m-=-E-E-GH )Cq!!$C,@,@,CA,FFFF MMAMAq!''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FF1aL 
-	,s   <I::Jc                  
   t               } t               }t        d| fd|fg      }|j                  d   | k(  sJ |j                  d   |k(  sJ |j                  j                  | k(  sJ |j                  j
                  |k(  sJ y)z6Check the behaviour of `named_transformers` attribute.r   noinvtransfN)r[   rU   r   named_transformersr   r4  )r   r4  r-  s      r:   %test_feature_union_named_transformersr6  "  s    XF-K	&)M;+GH	IB  *f444  /;>>>   ''6111  ,,;;;r<   c                      t        d      } t               }t        | |      }t        |j                   \  }}|dk(  sJ || |fk(  sJ y )Nr   r  )r   r   )r
   r[   r    zipr,  )r   r(  funamestransformerss        r:   test_make_unionr<  /  sU    

 C8D	C	Br223E<%%%%C;&&&r<   c                  d   t        d      } t               }t        | |d      }|j                  t        | |      j                  k(  sJ d|j                  k(  sJ t        j                  d      }t        j                  t        |      5  t        | |ddd	
       d d d        y # 1 sw Y   y xY w)Nr   r  r   n_jobszEmake_union() got an unexpected keyword argument 'transformer_weights'r   
   rr   )r   r[   transformer_weights)
r
   r[   r    r,  r?  r   r   r   r   r   )r   r(  r9  r   s       r:   test_make_union_kwargsrC  8  s    

 C8D	Ca	(B*S$"7"H"HHHH		>> ))OC 
y	,3"2JK 
-	,	,s   B&&B/c                  j   t         j                  } t        dd      }t        d|fg      }|j	                  |       j                  |       }|j                  |       }|j                  |       }t        ||       t        ||       |j                  |      }|j                  |      }t        ||       y )Nr   r   )r   r   r   )	r   r   r
   r   rI   rX   r   r.   r^   )rG   r   r   X_transX_trans2X_trans3X_backX_back2s           r:   test_pipeline_transformrJ  G  s     			A
1
0C%'H ll1o''*G%%a(H  #Hgx0gx0''0F##G,Gfg.r<   c                      t         j                  } t         j                  }t               }t	        d|fg      }|j                  | |      }|j                  | |      j                  |       }t        ||       y )Nr(  )	r   r   r   r[   r   r   rI   rX   r.   )rG   rH   r   r   rE  rF  s         r:   test_pipeline_fit_transformrL  Z  sf    		AAXF&&)*+H $$Q*Gzz!Q))!,Hgx0r<   z
start, end))r   rr   )r   r   )rr   r   )rr   r   )Nrr   )rr   Nr=   c                 :   t        dt               fdt               fdt               fgdd      }|| | }t        |t               sJ |j                  |j                  | | k(  sJ t        |j                  j                               t        |j                  j                               | | k(  sJ |j                  d      }|j                  d      }|d	= |d	= ||k(  sJ d
}t        j                  t        |      5  || |d    d d d        y # 1 sw Y   y xY w)Ntransf1transf2r   123T)memoryverboseFr   stepsz*Pipeline slicing only supports a step of 1r   r%  )r   r[   r~   r   rS  listr   itemsrM   r   r   r   )startendr   
pipe_slicepipe_paramspipe_slice_paramsr   s          r:   test_pipeline_slicer[  g  s'    
VX	FH 5y{7KLD
 eCJj(+++tzz%4444 	Z##))+,  &&()%4	5	5 //u/-K"--5-9G'"++++
6C	z	-U3r\ 
.	-	-s   ?	DDc                  j   t               } t               }t        d| fd|fg      }|d   | k(  sJ |d   | k(  sJ |d   |k(  sJ |d   |k(  sJ t        j                  t
              5  |d    d d d        t        j                  t              5  |d    d d d        y # 1 sw Y   1xY w# 1 sw Y   y xY w)Nr   r   r   r%  r   foobar)r[   r~   r   r   r   
IndexErrorKeyError)r   r   r   s      r:   test_pipeline_indexr`    s    XF
+Ch'%67D7f>V###8s??;# 
z	"Q 
# 
x	 X 
!	 	 
#	" 
!	 s   'BB)B&)B2c                     t               } t               }t        d| fg      }|j                  d   | u sJ d|fg|_        d|j                  vsJ |j                  d   |u sJ d|fg|j                  k(  sJ |j	                  d| fg       d| fg|j                  k(  sJ |j	                  |       d|fg|j                  k(  sJ |j	                  dg       t        j                  d      }t        j                  t        |      5  |j                  dggdg       d d d        d	}t        j                  t        |      5  |j                  dggdg       d d d        y # 1 sw Y   ExY w# 1 sw Y   y xY w)
Nr(  mock2rS  r(  )junkrB   zJLast step of Pipeline should implement fit or be the string 'passthrough'.r   rr   z0This 'Pipeline' has no attribute 'fit_transform')r[   r   r   rS  rR   r   r   r   r   r   rI   r   r   )rN  rO  r   r   s       r:   test_set_pipeline_stepsrf    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,/E8c                     t               } t        d      }t        d| fd|fg      }d|j                  v sJ d|j                  vsJ |j                  j                  | u sJ |j                  j
                  |u sJ t        d| fd|fg      }|j                  j                  | usJ |j                  j
                  |u sJ y )Nr   rh   r(  ri   rb  values)r[   rf   r   r   r(  ri   rh  )r   mult2r   s      r:   test_pipeline_named_stepsrj    s    XFaLE&&)FE?;<H X)))))(.....$$...$$--- (F+fe_=>H&&f444$$---r<   r   c                 V   t        j                  dgg      }t        j                  dg      }t        d      }t        d      }t        d      }t        d|fd| fd|fd	|fg      }|j	                  ||       g d
}|j
                  D 	cg c]  \  }}	|	 }
}}	||
k(  sJ y c c}	}w )Nrr   r   rh   r      m2badm3m5)rm  rn  ro  rp  )rm   r   rf   r   rI   rS  )r   rG   rH   ri  mult3mult5r   expected_namesname_actual_namess              r:   %test_pipeline_correctly_adjusts_stepsrw    s    
1#A
!AaLEaLEaLE
,tUmdE]KH LLA.N(07WT1DL7\))) 8s   B%c           
         t        j                  dgg      }t        j                  dg      }t        d      t        d      t        d      fd} |       }d}t        |gg|j	                  ||             t        |g|j                  |      j                  |             t        ||j                  |gg             |j                  |        d	}t        |gg|j	                  ||             t        |g|j                  |      j                  |             t        ||j                  |gg             |j                  d
      |j                  | d ddddk(  sJ |j                  |        d}t        |gg|j	                  ||             t        |g|j                  |      j                  |             t        ||j                  |gg             g d}|D ]  } t        ||      |        |j                         d	}t        |gg|j	                  ||             t        |g|j                  |      j                  |             t        ||j                  |gg              |       }|j                  |        d}t        |gg|j                  ||      j                  |             t        |gg|j	                  ||             t        ||j                  |gg             d}d}	t        j                  t        |	      5 }
t        |d       d d d        t!        
j"                  j$                  t              sJ |t'        |
j"                  j$                        v sJ d	}t)        dfd| fdfg      }t        |gg|j	                  ||             t        |g|j                  |      j                  |             t        ||j                  |gg             y # 1 sw Y   xY w)Nrr   r   rh   r   rl  c                  ,    t        d fdfdfg      S )Nrm  ro  last)r   )ri  rq  rr  s   r:   makez0test_set_pipeline_step_passthrough.<locals>.make  s!    $uGHHr<      ro  r@  Tr   F)rS  rm  ro  rz  rQ  m2__mult
last__multrR  rm  )rz   r{   r|   rX   ry   )rz     z''str' object has no attribute 'predict'z*This 'Pipeline' has no attribute 'predict'r   rv   rm  ro  rz  )rm   r   rf   r/   r   rI   rv   r^   rR   rM   rS  r  rX   r   r   r   r   r   r   r   r   )r   rG   rH   r{  r   expother_methodsr  r   r   r   ri  rq  rr  s              @@@r:   "test_set_pipeline_step_passthroughr    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==Pc                     t        t        d            } | j                   | j                   | j                   t        t                     } t        | d      rJ | j                   | j                   t        d      } | j                  d   dk(  sJ t        | d      rJ | j                   | j                   t        t               t                     } t        | d      rJ | j                   t        | d      rJ t        t               t                     } t        | d      rJ | j                   t        | d      rJ y )Nrl  rv   r   r   r   r   r^   )	r   rf   rv   rX   r^   r[   hasattrrS  rU   )r   s    r:   test_pipeline_ducktypingr  ,  s   T!W%HVX&Hx+++]+H>>! >>>>x+++VX{}5Hx+++x!4555[]FH5Hx+++x!45555r<   c                     t               } t               }t        | |      }t        |t              sJ |j                  d   d   dk(  sJ |j                  d   d   dk(  sJ t        | |t                     }t        |t              sJ |j                  d   d   dk(  sJ |j                  d   d   dk(  sJ |j                  d   d   dk(  sJ y )Nr   ztransf-1rr   ztransf-2r   	fitparamt)r[   r   r   r   rS  r~   )t1t2r   s      r:   test_make_pipeliner  H  s    	B	BR DdH%%%::a=z)))::a=z)))R-DdH%%%::a=z)))::a=z)))::a={***r<   c                  :   t         j                  } t         j                  }t        ddd      }t	        d      }t        d|fd|fgdd	i
      }|j                  | |       |j                  |       }t        d|fd|fgdd	i
      }|j                  | |      }t        dt               fd|fd|fgdd	i
      }|j                  | |      }t        |d d d df   d	|j                  |       z         t        |d d df   |j                  | |      j                                t        |d d d df   d	|j                  |       z         t        |d d df   |j                  | |      j                                |j                  | j                  d   dfk(  sJ y )Nr   r   r   r   r   r   rr   r   r   r$  r@  rA  r(  r%     )r   r   r   r
   r   r   rI   rX   r   r[   r.   r/   r*  r   )rG   rH   r   r$  r-  r.  X_fit_transformedX_fit_transformed_wo_methods           r:   test_feature_union_weightsr  W  s   		AA
1A
FC1F	
&)*
B FF1aLLLOM	
&)*
B ((A.	
&(	eS\Hf+=>#RL
B #%"2"21a"8 mAssF3R#:K:KA:N5NO}QU+V-A-A!Q-G-M-M-OP/3B37c>O>OPQ>R9RS(B/1E1Ea1K1Q1Q1ST&,,Q???r<   c                  "   t         } t        dt        d      fdt        d      fg      }t        dt        d      fdt        d      fgd      }t        dt        d      fdt        d      fgd      }|j                  |        |j	                  |       }|j
                  d   t        |       k(  sJ |j                  |        |j	                  |       }|j
                  |j
                  k(  sJ t        |j                         |j                                |j                  |       }t        |j                         |j                                |j	                  |       }t        |j                         |j                                y )	Nwordswordanalyzercharscharr   r>  r   )
JUNK_FOOD_DOCSr   r   rI   rX   r   r   r/   r+  r   )rG   r-  fs_parallelfs_parallel2r.  X_transformed_parallelX_transformed_parallel2s          r:   test_feature_union_parallelr  x  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Rr<   c                     t        d      } t        dd      }t        d|fd| fg      }|j                  t               |j	                         }|D ]  }d|v rd	|v rJ  t        |      d
k(  sJ t        dt               fg      j                  dgg      }t        j                  d      }t        j                  t        |      5  |j	                          d d d        y # 1 sw Y   y xY w)Nr  r  char_wb)r   r   )r  ngram_ranger  r  chars__words__#   tr1rr   zDTransformer tr1 (type Transf) does not provide get_feature_names_outr   )r   r   rI   r  get_feature_names_outr   r[   r   r   r   r   r   )	word_vect	char_vectftfeature_namesfeatr   s         r:    test_feature_union_feature_namesr    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##C,c                  B   t         j                  } t         j                  }t        t	        d      t                     }|j                  | |       t        j                  t              5  t        |d       d d d        t        t	        d      t        d            }t        j                  t              5  t        |d       d d d        |j                  | |       t        |j                  t        j                  |             y # 1 sw Y   xY w# 1 sw Y   QxY w)Nrr   r   classes_r   r   )r   r   r   r   r   r   rI   r   r   r   r  r   r/   r  rm   r  )rG   rH   regr   s       r:   test_classes_propertyr    s    		AA
a(*:*<
=CGGAqM	~	&Z  
' a(*<!*L
MC	~	&Z  
'GGAqMs||RYYq\2 
'	& 
'	&s   *D	8D	DDc                  f   t        d      } t        d      }t        d      }d |_        d | _        d |_        t        d| fd|fg      }t        ddgg|j	                  t        j                  d	gg                   t        d
dg|j                                d|fg|_        t        dgg|j	                  t        j                  d	gg                   t        dg|j                                |j                  d|fg       t        dgg|j	                  t        j                  d	gg                   t        dg|j                                |j                  |       t        dgg|j	                  t        j                  d	gg                   t        dg|j                                y )Nr   r   rl  c                     dgS Nx3rB   input_featuress    r:   <lambda>z.test_set_feature_union_steps.<locals>.<lambda>      $r<   c                     dgS Nx2rB   r  s    r:   r  z.test_set_feature_union_steps.<locals>.<lambda>  r  r<   c                     dgS )Nx5rB   r  s    r:   r  z.test_set_feature_union_steps.<locals>.<lambda>  r  r<   rm  ro  rr   m2__x2m3__x3rp  m5__x5r(  )r,  mock__x3rd  mock__x5)	rf   r  r   r/   rX   rm   rn   r,  rR   )ri  rq  rr  r  s       r:   test_set_feature_union_stepsr    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%=%=%?@r<   c                     t        d      } t        d      }d | _        d |_        t        j                  dgg      }t	        d| fd|fg      }t        ddgg|j                  |      j                  |             t        ddgg|j                  |             t        dd	g|j                                |j                  d
       t        dgg|j                  |      j                  |             t        dgg|j                  |             t        d	g|j                                |j                  d
       t        g g|j                  |      j                  |             t        g g|j                  |             t        g |j                                |j                  |       t        dgg|j                  |      j                  |             t	        dd|fg      }t        dgg|j                  |      j                  |             t        dgg|j                  |             t        d	g|j                                y )Nr   r   c                     dgS r  rB   r  s    r:   r  z2test_set_feature_union_step_drop.<locals>.<lambda>  r  r<   c                     dgS r  rB   r  s    r:   r  z2test_set_feature_union_step_drop.<locals>.<lambda>  r  r<   rr   rm  ro  r  r  dropr  r}  )rm  r  )
rf   r  rm   rn   r   r/   rI   rX   r   rR   )ri  rq  rG   r  s       r:    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#;#;#=>r<   c                  
   t        d      } t        d      }d | _        d |_        t        j                  dgg      }t	        d| fd|fg      }t        ddgg|j                  |      j                  |             t        ddgg|j                  |             t        dd	g|j                                |j                  d
       t        ddgg|j                  |      j                  |             t        ddgg|j                  |             t        dd	g|j                  dg             |j                  d
       t        ddgg|j                  |      j                  |             t        ddgg|j                  |             t        ddg|j                  dg             |j                  |       t        ddgg|j                  |      j                  |             t        ddgg|j                  |             t        dd	g|j                  dg             t	        dd|fg      }t        ddgg|j                  |      j                  |             t        ddgg|j                  |             t        dd	g|j                  dg             t        j                  }|j                  d   }t        ddd      }t	        dd|fg      }t        ||j                  |      j                  |      ddd|f          t        ||j                  |      ddd|f          t        g d|j                  g d             |j                  d
       |j                  |      j                  |      }t        |t        j                  ||g             |j                  |      }t        |t        j                  ||g             t        g d|j                  g d             |j                  |       t        ||j                  |      j                  |      dd| df          t        ||j                  |      dd| df          t        g d|j                  g d             t	        dd|fgd
di      }t        |dz  |j                  |      j                  |      ddd|f          t        |dz  |j                  |      ddd|f          t        g d|j                  g d             y)z@Check the behaviour of setting a transformer to `"passthrough"`.r   r   c                     dgS r  rB   r  s    r:   r  z4test_set_feature_union_passthrough.<locals>.<lambda>  r  r<   c                     dgS r  rB   r  s    r:   r  z4test_set_feature_union_passthrough.<locals>.<lambda>  r  r<   rr   rm  ro  r  r  r   r  
m2__myfeatmyfeatr}  
m3__myfeat)rm  r   r   r   r  r  r   N)passthrough__f0passthrough__f1passthrough__f2passthrough__f3	pca__pca0	pca__pca1)f0f1f2f3)r   )r  r  r  r  pca__f0pca__f1pca__f2pca__f3)r   )passthrough__pca0passthrough__pca1r  r  r  r  rA  )rf   r  rm   rn   r   r/   rI   rX   r   rR   r   r   r   r
   hstack)ri  rq  rG   r  columnsr   X_fts          r:   "test_set_feature_union_passthroughr    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1v./ADtRYY1v./		
 	  !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:
r<   c                      t         j                  } t        ddd      }t        d|fdg      }|j	                  |        t        g d|j                                y)	zDCheck feature_names_out for verbose_feature_names_out=True (default)r   r   r   r  r   r  )r  r  passthrough__x0passthrough__x1passthrough__x2passthrough__x3Nr   r   r
   r   rI   r/   r  rG   r   r  s      r:   9test_feature_union_passthrough_get_feature_names_out_truer  y  sS    		A
1A
FC	s|%CD	EBFF1I	
 	  "
r<   c                      t         j                  } t        ddd      }t        d|fdgd      }|j	                  |        t        g d	|j                                y
)z;Check feature_names_out for verbose_feature_names_out=Falser   r   r   r  r   r  Fverbose_feature_names_out)pca0pca1x0x1r  r  Nr  r  s      r:   :test_feature_union_passthrough_get_feature_names_out_falser    s[    		A
1A
FC	
56RW
B FF1I	
 	  "
r<   c                     t        j                  d      } | j                  ddgddggddg      }t        d d	 
      }t	        dt               fd|fgd      }|j                  |       t        j                  d      }t        j                  t        |      5  |j                          ddd       y# 1 sw Y   yxY w)zFCheck get_feature_names_out and non-verbose names and colliding names.pandasrr   r   r   r7   r8   r  c                     | dg   S rO   rB   )rG   s    r:   r  zStest_feature_union_passthrough_get_feature_names_out_false_errors.<locals>.<lambda>  s
    !SE(r<   c                 .    t        j                  dg      S rO   )rm   rn   )r9   ru  s     r:   r  zStest_feature_union_passthrough_get_feature_names_out_false_errors.<locals>.<lambda>  s    bjj#>Or<   )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"   rI   r   r   r   r   r  )pdrG   select_aunionr   s        r:   Atest_feature_union_passthrough_get_feature_names_out_false_errorsr    s    			X	&B
q!fq!f%Sz:A".OH 
 	!D(#34"'E 
IIaL
))	UC
 
z	-##% 
.	-	-s   B66B?c                     t        j                  d      } | j                  t        t	        d            gt	        d      D cg c]  }d| 	 c}      }t        ddgd      }|j                  |       t        j                  d	      }t        j                  t        |
      5  |j                          ddd       yc c}w # 1 sw Y   yxY w)zLCheck get_feature_names_out with non-verbose names and >= 5 colliding names.r  r@  fr  )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   r  r  rT  ranger   rI   r   r   r   r   r  )r  irG   r   r   s        r:   Ptest_feature_union_passthrough_get_feature_names_out_false_errors_overlap_over_5r    s    			X	&B
d59o&%)0L)Q1QC)0LMA	 56"'E
 
IIaL
))	C 
z	-##% 
.	- 1M 
.	-s   C 
&CCc                  p   d} d}d}dt        d      fdt        d      fg}dt        d      fdt        d      fg}t        d	ft        d
ffD ]  \  }}dt        d      f|t        d      fg}|| f||f|||z  ffD ]x  \  }}	t        j                  t
        |	      5   |di ||ij                  dggdg       d d d         |di |dt        d      fgi}
t        |
||       t        j                  t
        |	      5  |
j                  dggdg       d d d        t        j                  t
        |	      5  |
j                  dggdg       d d d         |di |dt        d      fgi}
 |
j                  di ||i t        j                  t
        |	      5  |
j                  dggdg       d d d        t        j                  t
        |	      5  |
j                  dggdg       d d d        {  y # 1 sw Y   BxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   nxY w# 1 sw Y   xY w)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   r8   r   r7   rS  r,  r   rr   rB   )
rf   r   r   r   r   r   rI   setattrr   rR   )error_message_1error_message_2error_message_3
bad_steps1
bad_steps2r   param
bad_steps3	bad_stepsmessageests              r:   test_step_name_validationr    s   LODOVO47#c47^4JQ.3Q.1J '*\;M,NO
UDGnud1g&67
))501#
Iw z9)ui()--seaS9 : 2#tAw 012CC	*z9!s# : z9!!A3%!- : 2#tAw 012CCNN0eY/0z9!s# : z9!!A3%!- :93#
 P :9 :9 :9 :9 :9s<   G: H9HHH+:HHHH(+H5c                      t        dt        dt               fg      fg      } | j                  dt                      | j                  dt	               fgd       y )Nr7   r8   gMbP?)a__b__alphaa__brl  )a__stepsa__b__C)r   r   rR   r   r   )	estimators    r:   test_set_params_nested_pipeliner    sX    330@*A)B CDEFIU9C);)=#>"?Kr<   c                  r   t         j                  } t         j                  }t               }	 t	        j
                  |d      }t        dd      }t               }t        dt        |      fd|fg      }t        d|fd|fg|      }|j                  | |       |j                  | |       |j                  d   j                  }t        |j                  |       |j                  |              t        |j                  |       |j                  |              t        |j!                  |       |j!                  |              t        |j#                  | |      |j#                  | |             t        |j                  d   j$                  |j                  d   j$                         t'        |d	      rJ |j                  | |       t        |j                  |       |j                  |              t        |j                  |       |j                  |              t        |j!                  |       |j!                  |              t        |j#                  | |      |j#                  | |             t        |j                  d   j$                  |j                  d   j$                         ||j                  d   j                  k(  sJ t        dd      }	t               }
t        d
|
fd|	fg|      }|j                  | |       t        |j                  |       |j                  |              t        |j                  |       |j                  |              t        |j!                  |       |j!                  |              t        |j#                  | |      |j#                  | |             t        |j                  d   j$                  |j                  d
   j$                         ||j                  d
   j                  k(  sJ 	 t)        j*                  |       y # t)        j*                  |       w xY w)Nr@  locationrR  Tr   r   r   r   rQ  r   transf_2)r   r   r   r   joblibMemoryr#   r   r   r   rI   r   r   r/   rv   rz   r{   ry   r   r  shutilrmtree)rG   rH   cachedirrQ  r   r   r   cached_pipetsclf_2r   cached_pipe_2s               r:   test_pipeline_memoryr*    s   		AAyH8 "=d3(E&M2UCLAB6 2UCLA&Q 	1A$$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,,, 	1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 15= (#eU^4V
 	!Q 	4<<?M,A,A!,DE4--a0-2M2Ma2PQ""1%}'F'Fq'I	
 	4::a+]-@-@A-FGX&--%%j188	
 ]..z:EEEEEhhs   OP P6c                  @   t               } t        j                  | d      }t        t	               t               |      }|j                  |u sJ t        t	               t                     }|j                  J t        |      dk(  sJ t        j                  |        y )Nr@  r  r  r   )
r   r!  r"  r   r   r#   rQ  r   r#  r$  )r%  rQ  r   s      r:   test_make_pipeline_memoryr,  ;  s{    yH]]Hb9F[]CE&AH??f$$$[]CE2H??"""x=A
MM(r<   c                   $    e Zd ZddZddZddZy)FeatureNameSaverNc                 ,    | j                  |d       | S )NT)reset)_check_feature_namesrF   s      r:   rI   zFeatureNameSaver.fitH  s    !!!4!0r<   c                     |S r5   rB   rF   s      r:   rX   zFeatureNameSaver.transformL  rY   r<   c                     |S r5   rB   )r9   r  s     r:   r  z&FeatureNameSaver.get_feature_names_outO  s    r<   r5   )r>   r?   r@   rI   rX   r  rB   r<   r:   r.  r.  G  s    r<   r.  c                     t        dt               fddt               fg      } t               }| j	                  |j
                  |j                         t        | dd j                  |j                        |j                         y)z5Check pipeline.get_feature_names_out with passthroughr:  passr   r   rc  Nr%  )
r   r.  r   r	   rI   r   r   r/   r  r  )r   r   s     r:   test_features_names_passthroughr7  S  su    &()#&()
D ;DHHTYY$Sb	''(:(:;T=O=Or<   c                  &   t        dt               fdt               fg      } t        D cg c]  }d|v  }}| j	                  t        |       t        | dd j                         g d       t        | dd j                  d      g d       yc c}w )	z5Check pipeline.get_feature_names_out with vectorizersvectr   rc  pizzaNr%  )beerburgercoke	copyrightr:  thenonsense_is_ignored)r   r   r   r  rI   r/   r  )r   r   rH   s      r:   #test_feature_names_count_vectorizerrA  c  s    FO$56@R@T8UVWD-.~!A~A.HH^QSb	'')? Sb	''(=>? 	/s   Bc                     t        dt               fg      } t               }| j                  |j                  |j
                         d}t        j                  t        |      5  | j                          ddd       y# 1 sw Y   yxY w)zZCheck that error is raised when a transformer does not define
    `get_feature_names_out`.notransrc  z&does not provide get_feature_names_outr   N)
r   rD   r	   rI   r   r   r   r   r   r  )r   r   r   s      r:   8test_pipeline_feature_names_out_error_without_definitionrD  r  s`     Iwy123D;DHHTYY$
2C	~S	1""$ 
2	1	1s   %A??Bc                      t        t                     } t        j                  t        d      5  | j                  dgdggddgddg       d d d        y # 1 sw Y   y xY w)Nz8Pipeline.fit does not accept the sample_weight parameterr   r   rr   r   )r   r   r   r   r   rI   )r   s    r:   test_pipeline_param_errorrF  ~  sV    
*,
-C	T
 	!qc
QF1a&9
 
 
s   AAc              #      K   | ]L  \  \  }}}t        ||      r8|d k(  r,t        |d      r t        |j                  d   d   t              s|||f N yw)r   rS  r%  rr   N)r  r   rS  r~   ).0r  patternr  s       r:   	<genexpr>rJ    sc      <3#gh sF/!C!syy}Q'3s 	'63#s   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$)rK  r   )r   N)r   Nri   zw\[Pipeline\].*\(step 1 of 2\) Processing transf.* total=.*\n\[Pipeline\].*\(step 2 of 2\) Processing mult.* total=.*\n$)r   r   mult1ri  z\[FeatureUnion\].*\(step 1 of 2\) Processing mult1.* total=.*\n\[FeatureUnion\].*\(step 2 of 2\) Processing mult2.* total=.*\n$)rL  r  )rq  r  z@\[FeatureUnion\].*\(step 1 of 1\) Processing mult2.* total=.*\n$)rI   r   r   zest, pattern, methodc                 F   t        | |      }g dg dg}dgdgg}| j                  d        |||       |j                         j                  rJ d       | j                  d        |||       t	        j
                  ||j                         j                        sJ y )	Nrr   r   r   )r'  rl  r  r  r   F)rR  zGot output for verbose=FalseT)r  rR   
readouterroutr   r   )r  r  rI  capsysfuncrG   rH   s          r:   test_verboserS    s    3D	IA
qc
ANN5N!AJ  "&&F(FF&NN4N AJ88GV..044555r<   c                     ddgddgddgg} g d}t               }t               }t        ||      }t        |d      rJ |j	                  | |       |j
                  |j
                  cxk(  rdk(  sJ  J t               }t               }t        ||      }|j	                  | |       |j
                  |j
                  cxk(  rdk(  sJ  J t        |d      rJ y 	Nrr   r   r   r'  rl  r  r   rr   r   n_features_in_)r"   r   r   r  rI   rW  )rG   rH   ssgbdtr   s        r:   test_n_features_in_pipelinerZ    s     Q!Q!Q AA		B)+DT"Dt-...HHQN""3"38q88888 
	B)+DT"DFF1aL""3"38q88888t-....r<   c                  j   ddgddgddgg} g d}t               }t        |      }t        |d      rJ |j                  | |       |j                  |j                  cxk(  rdk(  sJ  J t               }t        |      }|j                  | |       |j                  |j                  cxk(  rdk(  sJ  J y rU  )r"   r    r  rI   rW  )rG   rH   rX  r9  s       r:    test_n_features_in_feature_unionr\    s     Q!Q!Q AA		B	BBr+,,,FF1aL 1 16Q66666 
	B	BBFF1aL 1 16Q66666r<   c                      G d dt         t              } t        j                  t        j                  }}t        d |        fd |        fg      }t        j                  t              5  |j                  ||       d d d        t        j                  t              5  |j                  ||       d d d        |j                  ||d       |j                  ||d       y # 1 sw Y   fxY w# 1 sw Y   >xY w)Nc                       e Zd ZddZddZy)7test_feature_union_fit_params.<locals>.DummyTransformerNc                      |ddik7  rt         | S )Nr7   r   r   rc   s       r:   rI   z;test_feature_union_fit_params.<locals>.DummyTransformer.fit  s    c1X%  Kr<   c                     |S r5   rB   rF   s      r:   rX   zAtest_feature_union_fit_params.<locals>.DummyTransformer.transform  s    Hr<   r5   )r>   r?   r@   rI   rX   rB   r<   r:   DummyTransformerr_    s    	
	r<   rc  dummy0dummy1r   rP   )r   r   r   r   r   r   r   r   r   rI   r   rc  rG   rH   r   s       r:   test_feature_union_fit_paramsrg     s    +]  99dkkqAx!1!34xAQAS6TUVA	z	"	a 
# 
z	"	1 
# EE!Q!EOOAqAO 
#	" 
#	"s   )C!C-!C*-C6c                  D    G d dt               } t        j                  t        j                  }}t	        d |        fd |        fg      }t        j                  t              5  |j                  ||d       d d d        |j                  ||d       y # 1 sw Y   xY w)Nc                       e Zd ZddZy)Mtest_feature_union_fit_params_without_fit_transform.<locals>.DummyTransformerNc                      |ddik7  rt         | S )Nmetadatarr   ra  rc   s       r:   rI   zQtest_feature_union_fit_params_without_fit_transform.<locals>.DummyTransformer.fit  s    j!_,  Kr<   r5   rd   rB   r<   r:   rc  rj    s    	r<   rc  nofittransform0nofittransform1r   )rl  rr   )	r$   r   r   r   r   r   r   r   r   rf  s       r:   3test_feature_union_fit_params_without_fit_transformro    s    =  99dkkqA 0 23 0 23	
	A 
z	"	1q) 
# OOAq1O% 
#	"s   $BBc                  v   t         j                  t         j                  }} t        j                  j                  ddg| j                  ddg      j                  t              }t        j                  | |<   t        t               t                     }|j                  | |      j                  | |      dkD  sJ y )Nrr   r   r   g?)pg?)r   r   r   rm   randomchoicer   astypeboolnanr   r   r   rI   ry   )rG   rH   maskr   s       r:   %test_pipeline_missing_values_leniencyrx  /  s     99dkkqA99QFAGGSz:AA$GDffAdG*<*>?D88Aq>1%+++r<   c                      ddgddgddgg} g d}dt               fg}d	di}d
}t        ||      }t        j                  t        |      5  |j                  | |       d d d        y # 1 sw Y   y xY w)Nrr   r   r   r'  rl  r  rV  r   transformerzZAttempting to weight transformer "transformer", but it is not present in transformer_list.rA  r   )r[   r   r   r   r   rI   )rG   rH   r,  weightsexpected_msgr   s         r:   3test_feature_union_warns_unknown_transformer_weightr}  9  s{     Q!Q!Q AA!68,-a G	5  )wGE	z	6		!Q 
7	6	6s   A''A0c                 V    t        | t                     }|j                         d   rJ y )Npairwise)r   r#   	_get_tags)r   r   s     r:   test_pipeline_get_tags_noner  K  s*     ce,D~~
++++r<   	Predictorc                 \   t         j                  j                  d      }|j                  dd      t        j                  dgdz  dgdz  z         }}t        dt               fd |        fg      }|j                  ||       |j                  |      }t        |      rAt        |d       |j                  ||      t        j                  t        ||            k(  sJ y t        ||j!                                |j                  ||      t        j                  t#        ||            k(  sJ y )	Nr      r   rl  rr      rz  	predictor)rm   rr  RandomStaterandnr   r   r,   rI   rv   r   r/   ry   r   approxr   r-   r   r   )r  rngrG   rH   modely_preds         r:   1test_search_cv_using_minimal_compatible_estimatorr  W  s     ))


"C99RRXXqcAgb&89qA
+-	.ik0JKE 
IIaO]]1FU61%{{1a FMM.F2K$LLLL){{1a FMM(1f2E$FFFFr<   c                  ,    G d dt               } t        d |        fg      }t        j                  t              5  t        |       d d d        |j                  t        j                  t        j                         t        |       y # 1 sw Y   CxY w)Nc                       e Zd Zd Zy)0test_pipeline_check_if_fitted.<locals>.Estimatorc                     d| _         | S )NT)fitted_rF   s      r:   rI   z4test_pipeline_check_if_fitted.<locals>.Estimator.fitn  s    DLKr<   Nrd   rB   r<   r:   	Estimatorr  m  s    	r<   r  r   )
r   r   r   r   r   r1   rI   r   r   r   )r  r   s     r:   test_pipeline_check_if_fittedr  l  sd    M 
 %-./H	~	&! 
'LLDKK(H 
'	&s   B

Bc                     ddgddgddgg} g d}t        dt               fg      }t        j                  t              5  t        |       d	d	d	       |j                  | |       t        |       t        d
g      }t        |       t        dt               fd
g      }t        j                  t              5  t        |       d	d	d	       |j                  | |       t        |       y	# 1 sw Y   xY w# 1 sw Y   3xY w)z1Check __sklearn_is_fitted__ is defined correctly.rr   r   r   r'  rl  r  rV  r   Nr5  )r   r,   r   r   r   r1   rI   )rG   rH   r   s      r:   "test_feature_union_check_if_fittedr  y  s     Q!Q!Q AA5"4"6789E	~	& 
' 
IIaOE 123EE5"4"679PQRE	~	& 
' 
IIaOE 
'	& 
'	&s   C)7C5)C25C>c                  >   t         j                  t         j                  }}  G d dt              }t	         |       t                     }|j                  | |       t         j                  }|j                  |      }t        ||D cg c]  }d| 	 c}       yc c}w )zRCheck that pipeline passes names through.

    Non-regresion test for #21349.
    c                         e Zd Zd fd	Z xZS )Ytest_pipeline_get_feature_names_out_passes_names_through.<locals>.AddPrefixStandardScalarc                     t         |   |      }t        j                  |D cg c]  }d| 	 c}t              S c c}w )Nr  
my_prefix_)dtype)superr  rm   rn   object)r9   r  r:  rt  	__class__s       r:   r  zotest_pipeline_get_feature_names_out_passes_names_through.<locals>.AddPrefixStandardScalar.get_feature_names_out  s?    G11PE::uEutD62uEVTTEs   >r5   )r>   r?   r@   r  __classcell__)r  s   @r:   AddPrefixStandardScalarr    s    	U 	Ur<   r  r  N)	r   r   r   r"   r   rI   r  r  r/   )rG   rH   r  r   input_namesr  rt  s          r:   8test_pipeline_get_feature_names_out_passes_names_throughr    s    
 99dkkqAU. U
 02N4DEDHHQN$$K22;?(;*W;4Zv+>;*WX*Ws   B
c                  *   t        j                  d       t        dd      \  } }t        t	               t                     }|j                  d       |j                  | |       |dd j                         }|d   j                  }t        ||       y)z.Test pipeline's set_output with feature names.r  Tas_frame
return_X_yrX   Nr%  )r   r  r	   r   r"   r   
set_outputrI   r  feature_names_in_r/   )rG   rH   r   r  log_reg_feature_namess        r:   $test_pipeline_set_output_integrationr    s    
!dt4DAq)+=+?@DOOhO'HHQNSb	779 H66(*?@r<   c                     t        j                  d      } t        dd      \  }}t        |d      \  }}t	        dt               fdt               fg      }|j                  d       |j                  |       |j                  |      }t        || j                        sJ t        |j                  |j                                t        |j                  |j                         y	)
z'Test feature union with set_output API.r  Tr  r   r  scalarr   r  N)r   r  r	   r   r   r"   r
   r  rI   rX   r   r  r/   r  r  index)r  rG   ru  X_trainX_testr   rE  s          r:   test_feature_union_set_outputr    s    			X	&Bdt4DAq&qq9OGV8^%56GHE	x(	IIgoof%Ggr||,,,w(C(C(EFw}}fll3r<   c                      t               } t               }t        d| fd|fddg      }|d   | u sJ |d   |u sJ |d   dk(  sJ |d   dk(  sJ y	)
z8Check FeatureUnion.__getitem__ returns expected results.r  r   r5  )drop_mer  r6  r   r  r  N)r"   r
   r   )r  r   r   s      r:   test_feature_union_getitemr    s    F
%CvCL#		
E ?f$$$<3=M)))v%%%r<   keyr   c                     t        dt               fdt               fg      }d}t        j                  t
        |      5  ||     ddd       y# 1 sw Y   yxY w)z5Raise error when __getitem__ gets a non-string input.r  r   zOnly string keys are supportedr   N)r   r"   r
   r   r   r_  )r  r   r   s      r:    test_feature_union_getitem_errorr    sG     8^%56GHE
*C	xs	+c
 
,	+	+s   AAc                  H   t        j                  d       t        dd      \  } }t               }|j	                  |        t        d|fg      }t        |d      sJ t        | j                  |j                         t        |j                  |j                         t        dg      }|j	                  |        t        |d      sJ t        | j                  |j                         | j                         }t        dg      }|j	                  |       t        |d      rJ y)zxEnsure feature union has `.feature_names_in_` attribute if `X` has a
    `columns` attribute.

    Test for #24754.
    r  Tr  scaler  r5  N)r   r  r	   r"   rI   r   r  r/   r  r  to_numpy)rG   ru  r  r   X_arrays        r:   $test_feature_union_feature_names_in_r    s     !dt4DAq 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2r<   c                     t         j                  j                  d      j                  d      } t	        dt        d      fg      }|j                  |       } t        j                  t        d      5  |j                          d d d        t        j                  t        d	      5  |j                  | | 
       d d d        t        j                  d      5  t        j                  d       |j                  |        d d d        t        j                  t        d      5  |j                  |        d d d        y # 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   XxY w# 1 sw Y   y xY w)Nr   )r@  rl  )sizer   r   )r   z$Missing required positional argumentr   z$Cannot use both X and Xt. Use X only)rG   XtT)recorderrorzXt was renamed X in version 1.5)r  )rm   rr  r  normalr   r
   r   r   r   r   r^   warningscatch_warningssimplefilterwarnsFutureWarningr   s     r:   .test_pipeline_inverse_transform_Xt_deprecationr    s   
		a ''W'5AeSa0123D1A	y(N	O  
P 
y(N	Oq) 
P 
	 	 	-g&q! 
. 
m+L	M!$ 
N	M 
P	O 
P	O 
.	- 
N	Ms0   4E (E'E$E$ E	EE!$E-c                   \    e Zd ZddZddZddZddZddZddZddZ	dd	Z
dd
ZddZy)SimpleEstimatorNc                     |J |J | S r5   rB   r9   rG   rH   r   props        r:   rI   zSimpleEstimator.fit  s    (((r<   c                     |J |J y r5   rB   r  s        r:   r   zSimpleEstimator.fit_transform$      (((r<   c                     |J |J y r5   rB   r  s        r:   r   zSimpleEstimator.fit_predict(  r  r<   c                     |J |J y r5   rB   r9   rG   r   r  s       r:   rv   zSimpleEstimator.predict,  r  r<   c                     |J |J y r5   rB   r  s       r:   rz   zSimpleEstimator.predict_proba0  r  r<   c                     |J |J y r5   rB   r  s       r:   r{   z!SimpleEstimator.predict_log_proba4  r  r<   c                     |J |J y r5   rB   r  s       r:   r|   z!SimpleEstimator.decision_function8  r  r<   c                     |J |J y r5   rB   r  s        r:   ry   zSimpleEstimator.score<  r  r<   c                     |J |J y r5   rB   r  s       r:   rX   zSimpleEstimator.transform@  r  r<   c                     |J |J y r5   rB   r  s       r:   r^   z!SimpleEstimator.inverse_transformD  r  r<   r=   )r>   r?   r@   rI   r   r   rv   rz   r{   r|   ry   rX   r^   rB   r<   r:   r  r    s4    
         r<   r  enable_slep006r  splitpartial_fitc                    d }dggdg}}dgdd}}}t               } ||| dd      } ||ddd      }t               j                  dd      j                  dd      j	                  dd      }t        d	|fd
|fg      }	d| vr|	j                  dggdg|||      }		  t        |	|       |||||       t        |d||       t        |d||       y# t        $ r  t        |	|       ||||       Y @w xY w)z5Test that metadata is routed correctly for pipelines.c                 j    |t         v r
t         |   }n|g}|D ]  } t        | d| d      di |  | S )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__requestrB   )r(   r  )r  r  kwargmethodss       r:   set_requestz7test_metadata_routing_for_pipeline.<locals>.set_requestO  sJ     &&'/GhGF1GC4xx01:E: 
r<   rr   r7   r8   Tr   r  rI   r   rl  trsr  )r   r  rl  )objr  r   rl  rX   N)
r  r%   set_fit_requestset_transform_requestset_inverse_transform_requestr   rI   r  r   r'   )
r  r  rG   rH   r   r  rl  r  r  r   s
             r:   "test_metadata_routing_for_pipeliner  I  sB    C51#qA%&Cc4M 
C
c6D
AC
c54
@C	td	;		TD		A	&	&TD	&	I	  %S'9:;HF<<SEA3m$   

!&!qD8	
 ]X =8  
!&!]	

s    C C87C8c                 R   dggdg}}dgd}}t               }t        d|fg      }d|  }t        j                  t        t        j                  |            5  	  t        ||       ||||       ddd       y# t        $ r  t        ||       |||       Y )w xY w# 1 sw Y   yxY w)zBTest that metadata is not routed for pipelines when not requested.rr   r7   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   )r  rG   rH   r   r  r  r   error_messages           r:   (test_metadata_routing_error_for_pipeliner    s     C51#qA#s4M

C+s+,-H	117	:  
z=)A	B	Q%GHf%a-dS 
C	B  	Q &GHf%a}4P	Q	 
C	Bs*   BA99BBBBB&)r|   rX   r^   c                     t        dt               fg      }t        j                  t        d      5   t        ||       dggdgd       ddd       y# 1 sw Y   yxY w)zTest 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   rr   r7   r  N)r   r  r   r   r   r  )r  r   s     r:   *test_routing_passed_metadata_not_supportedr    sX     k?#4567D	M
 	fseA3SA
 
 
s   AAc                      t        dt               fdt               fg      } | j                  dggdg       | j	                  dgg       y)zFTest that pipeline works with estimators that have a `__len__` method.r  r  rr   N)r   r   r   rI   rv   r  s    r:   %test_pipeline_with_estimator_with_lenr    sN     
%'	(;8N8P*QRD 	HHqcUQCLL1#r<   	last_stepc                     t        dt               fd| fg      }|j                  dggdg      j                  dgdgdgg      dgdgdggk(  sJ y)zTest that the pipeline works when there is not last step.

    It should just ignore and pass through the data on transform.
    r  r  rr   r   r   N)r   r!   rI   rX   )r  r   s     r:   test_pipeline_with_no_last_stepr    sc     e023k95MNOD88aSEA3))A3aS/:sQC!oMMMr<   c                     t        j                  ddgddgddgg      } g d}g dd}}t        d	t               fg      }d
t        j                   d}t        j                  t        t        j                  |            5  |j                  | |||       ddd       t        d	t               j                  dd      fg      }d
t        j                   d}t        j                  t        t        j                  |            5  |j                  | |||      j                  | ||       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zCTest that the right error is raised when metadata is not requested.r   rr   r   r'  r  rN  rr   rr   rr   r7   sub_transformerzb[sample_weight, metadata] are passed but are not explicitly set as requested or not requested for z.fitr   r  NTz
.transform)rm   r   r   r%   r>   r   r   r   r   r   rI   r  rX   )rG   rH   r   rl  feature_unionr  s         r:   )test_feature_union_metadata_routing_errorr    sX    	1a&1a&1a&)*AA'8M !#46J6L"M!NOM	!!5!>!> ?t	E 
 
/ryy7O	P!QmhO 
Q ! "$&66"& 7 	
	M	  4 = =>j	J 
 
/ryy7O	Pq 	 	

)A]X)
F 
Q	P) 
Q	P( 
Q	Ps   D9(E9EEc                  P    t        dt               fg      } | j                          y)zaTest that get_metadata_routing() works regardless of the Child's
    consumption of any metadata.r  N)r   r%   get_metadata_routing)r  s    r:   3test_feature_union_get_metadata_routing_without_fitr    s'     !#46J6L"M!NOM&&(r<   rz  c                 b   t        j                  ddgddgddgg      }g d}g dd}}t        d	 | t               
      j	                  dd      j                  dd      fd | t               
      j	                  dd      j                  dd      fg      }||d} |j                  ||fi |  |j                  ||fi |   |j                  ||fi |j                  |fi | |j                  D ]3  } | d   j                  }t        |      sJ |D ]  }t        d|dd|  5 y)z8Test that metadata is routed correctly for FeatureUnion.r   rr   r   r'  r  rN  r  r7   
sub_trans1)registryTr  
sub_trans2rI   )r  r  NrB   )rm   r   r   r&   r  r  rI   r   rX   r,  r   r   r'   )	rz  rG   rH   r   rl  r  kwargsr   	sub_transs	            r:   #test_feature_union_metadata_routingr    s\    	1a&1a&1a&)*AA'8M  Y[1 tdC&&TD&I	 Y[1 tdC&&TD&I		
M"  -(CFMa%f%M1///Ma%f%//<V<$55q>**8}}!I#   "	 6r<   )rA   	itertoolsr   r#  r   r  tempfiler   r!  numpyrm   r   sklearn.baser   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.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&   r'    sklearn.utils._metadata_requestsr(   r)   sklearn.utils._testingr*   r+   r,   r-   r.   r/   sklearn.utils.fixesr0   sklearn.utils.validationr1   r   r  r3   rD   rU   r[   r`   rf   r~   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  markparametrizer   r2  r6  r<  rC  rJ  rL  r[  r`  rf  rj  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r*  r,  r.  r7  rA  rD  rF  productparameter_grid_test_verboserS  rZ  r\  rg  ro  rx  r}  r  r  r  r  r  r  r  r  slicer  r  r  r  usefixturessortedsetr  r  r  r  r  r  r  r  rB   r<   r:   <module>r&     s    	        N N " & 3 ( 
 H ; < ( L L 4 4 0 N N E   H  / 4{ 	e 	' 
[ f = , ,& = &Qh	, >
634P 7"<<,7	I D11 .9, :,^
<'L/&
1 V8$+B." }(=>* ?*" }(=>L? ?L?^68+@B*SZ#&3 A: ?Fnb(,&.&,#.LL< ~		} 	 	%:<"3)"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 4 &$ E!QK 01 23B%.* m * Z )*6#g,'=9Q*Q#RS7 T +7t )* 6#g,'=9Q*Q#RSQ T	 +
Q* E	B	B )* + )*t]&;<N = +N )*%G +%GP )*) +) )*(*LM% +%r<   