a
    h9                    @   s  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 ddlmZmZmZmZmZmZ ddlmZ ddlmZ 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l0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z; ddl<m=Z=m>Z> ddl?m@Z@ ddlAmBZBmCZCmDZDmEZE ddlFmGZG ddlHmIZImJZJ ddlKmLZLmMZMmNZNmOZOmPZPmQZQ ddlRmSZS ddlTmUZUmVZV e ZWdeWjXjY_ZdeWj[jY_ZdZ\G dd deZ]G d d! d!e]Z^G d"d# d#ee^Z_G d$d% d%e_Z`G d&d' d'e`ZaG d(d) d)eeZbG d*d+ d+eZcG d,d- d-e`ZdG d.d/ d/eZed0d1 Zfd2d3 Zgd4d5 Zhd6d7 Zid8d9 Zjd:d; Zkd<d= Zld>d? Zmd@dA ZndBdC ZodDdE ZpdFdG ZqdHdI ZrdJdK ZsejtudLg dMdNdO ZvejtudPeSdQdR ZwdSdT ZxdUdV ZydWdX ZzdYdZ Z{d[d\ Z|ejtud]g d^d_d` Z}dadb Z~dcdd Zdedf Zejtudgddggdhdi Zejtudgddggdjdk Zdldm Zdndo Zejtudpe:e> e/ efe:e> e. efe:e> dqdr fe9g dsdr fgdtdu Zdvdw Zdxdy Zdzd{ Zd|d} Zd~d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZG dd deZdd Zdd Zdd Zdd Zdd ee9de` fdec fgdfe9de` fddec fgdfe9de` fddec fgdfe9de` fdgdfe9ddeb fgdfe9ddeb fgdfe8deb fdeb fgdfe8ddeb fdgdfgg dD Zejtudedd Zdd Zdd Zdd Zdd Zdd Zdd ZejtudgddggddĄ ZejtudeMeLgddǄ ZddɄ Zdd˄ Zdd̈́ Zddτ Zddф Zddӄ ZejtuddeddՃgddׄ Zddل Zddۄ Zeddݍejtudddgdd Zeddݍdd Zdd Zeddݍdd Zejtudg ddd ZG dd deZejtudeeeJddh eddݍdd ZejtudeeeJddh eddݍdd Zejtudg ddd Zeddݍdd Zejtudddggeddݍdd Zeddݍdd Zeddݍdd Zeddݍejtud eCeBgdd ZdS (  z
Test the pipeline module.
    N)mkdtemp)config_context)BaseEstimatorClassifierMixinTransformerMixincloneis_classifieris_regressor)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)get_tags)COMPOSITE_METHODSMETHODS)MinimalClassifierMinimalRegressorMinimalTransformer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                   @   s   e Zd ZdZdddZdS )NoFitz*Small class to test parameter dispatching.Nc                 C   s   || _ || _d S Nab)selfr9   r:    r<   W/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/tests/test_pipeline.py__init__U   s    zNoFit.__init__)NN)__name__
__module____qualname____doc__r>   r<   r<   r<   r=   r6   R   s   r6   c                   @   s(   e Zd Zd	ddZd
ddZdd ZdS )NoTransNc                 C   s   | S r7   r<   r;   Xyr<   r<   r=   fit[   s    zNoTrans.fitFc                 C   s   | j | jdS )Nr8   r8   )r;   deepr<   r<   r=   
get_params^   s    zNoTrans.get_paramsc                 K   s   |d | _ | S Nr9   r9   )r;   paramsr<   r<   r=   
set_paramsa   s    
zNoTrans.set_params)N)F)r?   r@   rA   rG   rI   rM   r<   r<   r<   r=   rC   Z   s   

rC   c                   @   s   e Zd Zdd ZdS )NoInvTransfc                 C   s   |S r7   r<   r;   rE   r<   r<   r=   	transformg   s    zNoInvTransf.transformN)r?   r@   rA   rP   r<   r<   r<   r=   rN   f   s   rN   c                   @   s   e Zd Zdd Zdd ZdS )Transfc                 C   s   |S r7   r<   rO   r<   r<   r=   rP   l   s    zTransf.transformc                 C   s   |S r7   r<   rO   r<   r<   r=   inverse_transformo   s    zTransf.inverse_transformN)r?   r@   rA   rP   rR   r<   r<   r<   r=   rQ   k   s   rQ   c                   @   s   e Zd ZdddZdS )TransfFitParamsNc                 K   s
   || _ | S r7   )
fit_paramsr;   rE   rF   rT   r<   r<   r=   rG   t   s    zTransfFitParams.fit)Nr?   r@   rA   rG   r<   r<   r<   r=   rS   s   s   rS   c                   @   sV   e Zd ZdddZdd ZdddZd	d
 Zdd Zdd Ze Z	 Z
ZdddZdS )Mult   c                 C   s
   || _ d S r7   mult)r;   rZ   r<   r<   r=   r>   z   s    zMult.__init__c                 C   s   dS NTr<   r;   r<   r<   r=   __sklearn_is_fitted__}   s    zMult.__sklearn_is_fitted__Nc                 C   s   | S r7   r<   rD   r<   r<   r=   rG      s    zMult.fitc                 C   s   t || j S r7   npasarrayrZ   rO   r<   r<   r=   rP      s    zMult.transformc                 C   s   t || j S r7   r^   rO   r<   r<   r=   rR      s    zMult.inverse_transformc                 C   s   t || j jddS )NrX   Zaxis)r_   r`   rZ   sumrO   r<   r<   r=   predict   s    zMult.predictc                 C   s
   t |S r7   r_   rb   rD   r<   r<   r=   score   s    z
Mult.score)rX   )N)N)r?   r@   rA   r>   r]   rG   rP   rR   rc   predict_probapredict_log_probadecision_functionre   r<   r<   r<   r=   rW   y   s   

rW   c                   @   s>   e Zd ZdZdd ZdddZdd Zdd	d
ZdddZdS )	FitParamTzMock classifierc                 C   s
   d| _ d S )NF
successfulr\   r<   r<   r=   r>      s    zFitParamT.__init__Fc                 C   s   || _ d| _d S r[   )rk   fitted_r;   rE   rF   should_succeedr<   r<   r=   rG      s    zFitParamT.fitc                 C   s   | j S r7   rj   rO   r<   r<   r=   rc      s    zFitParamT.predictc                 C   s   | j |||d | |S )N)rn   )rG   rc   rm   r<   r<   r=   fit_predict   s    zFitParamT.fit_predictNc                 C   s   |d ur|| }t |S r7   rd   )r;   rE   rF   sample_weightr<   r<   r=   re      s    zFitParamT.score)F)F)NN)	r?   r@   rA   rB   r>   rG   rc   ro   re   r<   r<   r<   r=   ri      s   

ri   c                   @   s   e Zd ZdZdd ZdS )DummyTransfz(Transformer which store the column meansc                 C   s   t j|dd| _t | _| S )Nr   ra   )r_   meanmeans_time
timestamp_rD   r<   r<   r=   rG      s    
zDummyTransf.fitN)r?   r@   rA   rB   rG   r<   r<   r<   r=   rq      s   rq   c                   @   s>   e Zd ZdZdd Zdd ZdddZdd	d
ZdddZdS )DummyEstimatorParamsz,Mock classifier that takes params on predictc                 C   s   dS r[   r<   r\   r<   r<   r=   r]      s    z*DummyEstimatorParams.__sklearn_is_fitted__c                 C   s   | S r7   r<   rD   r<   r<   r=   rG      s    zDummyEstimatorParams.fitFc                 C   s
   || _ | S r7   got_attributer;   rE   rx   r<   r<   r=   rc      s    zDummyEstimatorParams.predictc                 C   s
   || _ | S r7   rw   ry   r<   r<   r=   rf      s    z"DummyEstimatorParams.predict_probac                 C   s
   || _ | S r7   rw   ry   r<   r<   r=   rg      s    z&DummyEstimatorParams.predict_log_probaN)F)F)F)	r?   r@   rA   rB   r]   rG   rc   rf   rg   r<   r<   r<   r=   rv      s   

rv   c            	      C   s  t dg} tt" | dggdg W d    n1 s<0    Y  d}t dt fg} tjt|d" | dggdg W d    n1 s0    Y  t }t d|fg}|jddtf d d |d	|jd
dksJ |j	dd |j
dksJ |jd u sJ t| t }tt}t d|fd|fg}|jd |u sDJ |jd |u sXJ d}t dt fd|fg} tjt|d" | dggdg W d    n1 s0    Y  |j	dd |jdksJ t| td}tjt|d |j	dd W d    n1 s0    Y  t|}|jd |jd us@J |jdd}|jdd}|jd
dD ]}|| qd|jd
dD ]}|| q|d |d |d |d ||ksJ d S )N)rX   rX   rX   zRLast step of Pipeline should implement fit or be the string 'passthrough'.*NoFit.*clfmatchsvcTrH   )svc__aZsvc__br}   F皙?)r   anovaz<All intermediate steps should be transformers.*\bNoTrans\b.*t)Zsvc__Cz]Invalid parameter 'C' for estimator SelectKBest(). Valid parameters are: ['k', 'score_func'].)Zanova__C)r    pytestraises	TypeErrorrG   r6   rC   rI   dictrM   r9   r:   reprr%   r   r   named_stepsCreescape
ValueErrorr   pop)	pipelinemsgrz   pipefilter1pipe2rL   Zparams2xr<   r<   r=    test_pipeline_invalid_parameters   sb    
00
2,



r   c                  C   sh   t ddgg} tdt fdt ff}|j| d d ||  |jdd |j| d d ||  d S )NrX      transfrz   rF   passthrough)r   )r_   arrayr    rQ   ri   rG   re   rM   rE   r   r<   r<   r=   test_pipeline_init_tuple  s    
r   c                  C   sl   t j} t j}t }ttdd}td|fd|fg}|| | ||  |	|  |
|  || | d S )Nr   kr   Zlogistic)irisdatatargetr   r   r   r    rG   rc   rf   rg   re   )rE   rF   rz   r   r   r<   r<   r=   test_pipeline_methods_anova*  s    


r   c                  C   s   t dt fdt fg} | jd d dd | d s6J | jd jd u sJJ | jd jd u s^J t	d}t
jt|d  | jd d dd W d    n1 s0    Y  d S )Nr   rz   T)rE   rF   clf__should_succeedz.fit() got an unexpected keyword argument 'bad'r{   )Zclf__bad)r    rQ   ri   rG   rc   r   r9   r:   r   r   r   r   r   )r   r   r<   r<   r=   test_pipeline_fit_params9  s    
r   c                  C   s   t ddgg} tdt fdt fg}|j| d d || dksHJ |j| d ddks^J |j| d d ddksvJ |j| t ddgdd	ksJ d S )
NrX   r   r   rz   r      )rF   rp   rp      )r_   r   r    rQ   ri   rG   re   r   r<   r<   r=   %test_pipeline_sample_weight_supportedI  s    r   c                  C   s   t ddgg} tdt fdt fg}|j| d d || dksHJ |j| d ddks^J td}t	j
t|d	( |j| t ddgd W d    n1 s0    Y  d S )
NrX   r   r   rz   r   r   r   z:score() got an unexpected keyword argument 'sample_weight'r{   )r_   r   r    rQ   rW   rG   re   r   r   r   r   r   )rE   r   r   r<   r<   r=   'test_pipeline_sample_weight_unsupportedT  s    
r   c                  C   s   t dt fg} td}tjt|d | jdd W d    n1 sJ0    Y  tjt|d | jdd W d    n1 s0    Y  td}tjt|d | jdd W d    n1 s0    Y  d S )	NclszInvalid parameter 'fake' for estimator Pipeline(steps=[('cls', LinearRegression())]). Valid parameters are: ['memory', 'steps', 'transform_input', 'verbose'].r{   Znope)Zfake)Zfake__estimatorzInvalid parameter 'invalid_param' for estimator LinearRegression(). Valid parameters are: ['copy_X', 'fit_intercept', 'n_jobs', 'positive'].)Zcls__invalid_param)r    r   r   r   r   r   r   rM   )r   	error_msgr<   r<   r=   $test_pipeline_raise_set_params_errora  s    **r   c                  C   st   t j} t j}tddd}tdddd}td|fd|fg}|| | ||  ||  |	|  |
| | d S )	NTr   probabilityrandom_statefullmle
svd_solvern_componentswhitenpcar}   )r   r   r   r%   r   r    rG   rc   rf   rg   re   )rE   rF   rz   r   r   r<   r<   r=   test_pipeline_methods_pca_svm|  s    


r   c                  C   s   t j} tdddd}tdd}td|fd|fg}||  || j| jd fksXJ |||  t	|| ||
|  d S )	Nr   r   Tr   )Znoveltyr   lofr   )r   r   r   r   r    rG   score_samplesshapefit_transformr0   rP   )rE   r   r   r   r<   r<   r=   #test_pipeline_score_samples_pca_lof  s    

r   c                  C   s   t dgdgg} t ddg}tt }|| | d}d}tjt|d}||  W d    n1 sl0    Y  t	|j
jtsJ |t|j
jv sJ d S )NrX   r   z<'LogisticRegression' object has no attribute 'score_samples'z+'Pipeline' has no attribute 'score_samples'r{   )r_   r   r!   r   rG   r   r   AttributeErrorr   
isinstancevalue	__cause__str)rE   rF   r   	inner_msg	outer_msg	exec_infor<   r<   r=   4test_score_samples_on_pipeline_without_score_samples  s    
(r   c                  C   s   t j} t j}| jd }tt|}t }tdddd}t	dddd}||fD ]}t
d|fd	|fg}|| | || }	|	j|fksJ || }
|
j||fksJ || }|j||fksJ || }|j||fksJ || | qNd S )
Nr   r   
randomizedT)r   r   r   Zovr)r   r   Zdecision_function_shape
preprocessr}   )r   r   r   r   lenr_   uniquer$   r   r%   r    rG   rc   rf   rg   rh   re   )rE   rF   Z	n_samplesZ	n_classesscalerr   rz   Zpreprocessingr   rc   ZprobaZ	log_probarh   r<   r<   r=   'test_pipeline_methods_preprocessing_svm  s&    




r   c                  C   sh   t  } tddd}t  }tddd}| tj}||}td|fd|fg}|tj}t|| d S )Nr   auto)r   Zn_initr   ZKmeans)r$   r
   r   r   r   ro   r    r1   )r   kmZscaler_for_pipelineZkm_for_pipelineZscaledZseparate_predr   Zpipeline_predr<   r<   r=   test_fit_predict_on_pipeline  s    
r   c                  C   s   t  } tdd}td| fd|fg}d}d}tjt|d}t|d W d    n1 sZ0    Y  t|jj	tsvJ |t
|jj	v sJ d S )	Nr   r   r   r   z)'Pipeline' has no attribute 'fit_predict'z+'PCA' object has no attribute 'fit_predict'r{   ro   )r$   r   r    r   r   r   getattrr   r   r   r   )r   r   r   r   r   r   r<   r<   r=   0test_fit_predict_on_pipeline_without_fit_predict  s    
(r   c                  C   sf   t dt fdt fg} | jd d ddd | jd jd s>J | jd jsNJ d| jd jvsbJ d S )Nr   rz   T)rE   rF   Ztransf__should_get_thisr   Zshould_get_thisrn   )r    rS   ri   ro   r   rT   rk   r   r<   r<   r=   -test_fit_predict_with_intermediate_fit_params  s    r   method_name)rc   rf   rg   c                 C   sN   t dt fdt fg}|d d  t|| }|d dd |jd jsJJ d S )Nr   rz   T)rE   rx   )r    rQ   rv   rG   r   r   rx   )r   r   methodr<   r<   r=   (test_predict_methods_with_predict_params  s
    
r   csr_containerc                 C   s  t j }||jdd8 }t j}tddd}tdd}td|fd|fg}||| |	|}|j
|j
d d	fksxJ t|d d d d
f || t|d d d
f |||  td|fd|fg}| |}|||}t||  t|}	|jd d |	jd d usJ |jdd |||j
|j
d dfksHJ tdt fd|fd|fg}|||}|j
|j
d dfksJ d}
tdt fdt fg}tjt|
d || W d    n1 s0    Y  td|fd|ff}||| d S )Nr   ra   r   )r   r   rX   r   svdselectr   )Z	select__k   mockr   z>All estimators should implement fit and transform.*\bNoTrans\brP   Zno_transformr{   )r   r   copyrr   r   r   r   r   rG   rP   r   r1   r   r2   raveltoarrayr   transformer_listrM   rQ   rC   r   r   r   )r   rE   rF   r   r   fsX_transformedZX_spZX_sp_transformedZfs2r   r<   r<   r=   test_feature_union	  s8    


 """*r   c                  C   sh   t  } t }td| fd|fg}|jd | ks2J |jd |ksDJ |jj| ksTJ |jj|ksdJ dS )z6Check the behaviour of `named_transformers` attribute.r   noinvtransfN)rQ   rN   r   Znamed_transformersr   r   )r   r   r   r<   r<   r=   %test_feature_union_named_transformers9  s    r   c                  C   sH   t dd} t }t| |}t|j \}}|dks4J || |fksDJ d S )Nr   r   )r   r   )r   rQ   r"   zipr   )r   r   funamesZtransformersr<   r<   r=   test_make_unionF  s    

r   c                  C   s   t dd} t }t| |dd}|jt| |jks4J d|jksBJ td}tjt	|d$ t| |ddd	d
 W d    n1 s0    Y  d S )Nr   r   r   n_jobszEmake_union() got an unexpected keyword argument 'transformer_weights'r{   
   rX   )r   rQ   Ztransformer_weights)
r   rQ   r"   r   r   r   r   r   r   r   )r   r   r   r   r<   r<   r=   test_make_union_kwargsO  s    
r   c                  C   sz   t j} tddd}td|fg}|| | }|| }|| }t|| t|| ||}||}t|| d S )Nr   r   )r   r   r   )	r   r   r   r    rG   rP   r   r1   rR   )rE   r   r   X_transX_trans2ZX_trans3ZX_backZX_back2r<   r<   r=   test_pipeline_transform^  s    





r   c                  C   sL   t j} t j}t }td|fg}|| |}|| || }t|| d S )Nr   )	r   r   r   rQ   r    r   rG   rP   r1   )rE   rF   r   r   r   r   r<   r<   r=   test_pipeline_fit_transformq  s    r   z
start, end))r   rX   )r   r   )rX   r   )rX   r   NrX   )rX   N)NNc                 C   s   t dt fdt fdt fgddd}|| | }t|t s@J |j|j| | ksXJ t|j t|j | | ksJ |jdd}|jdd}|d	= |d	= ||ksJ d
}t	j
t|d || |d  W d    n1 s0    Y  d S )Ntransf1transf2rz   Z123T)memoryverboseFr~   stepsz*Pipeline slicing only supports a step of 1r{   r   )r    rQ   ri   r   r   listr   itemsrI   r   r   r   )startendr   Z
pipe_sliceZpipe_paramsZpipe_slice_paramsr   r<   r<   r=   test_pipeline_slice~  s(    r   c                  C   s   t  } t }td| fd|fg}|d | ks0J |d | ks@J |d |ksPJ |d |ks`J tt |d  W d    n1 s0    Y  tt |d  W d    n1 s0    Y  d S )Nr   rz   r   r   r   Zfoobar)rQ   ri   r    r   r   
IndexErrorKeyError)r   rz   r   r<   r<   r=   test_pipeline_index  s    &r   c                  C   sV  t  } t  }td| fg}|jd | u s,J d|fg|_d|jvsFJ |jd |u sXJ d|fg|jkslJ |jd| fgd d| fg|jksJ |j|d d|fg|jksJ |jdgd td}tjt	|d" |
dggdg W d    n1 s0    Y  d	}tjt|d" |dggdg W d    n1 sH0    Y  d S )
Nr   mock2r   r   )Zjunkr<   zJLast step of Pipeline should implement fit or be the string 'passthrough'.r{   rX   z0This 'Pipeline' has no attribute 'fit_transform')rQ   r    r   r   rM   r   r   r   r   r   rG   r   r   )r   r   r   r   r<   r<   r=   test_set_pipeline_steps  s*    2r  c                  C   s   t  } tdd}td| fd|fg}d|jv s2J d|jvs@J |jj| u sPJ |jj|u s`J td| fd|fg}|jj| usJ |jj|u sJ d S )Nr   rY   r   rZ   r   values)rQ   rW   r    r   r   rZ   r  )r   mult2r   r<   r<   r=   test_pipeline_named_steps  s    
r  r   c           	      C   s   t dgg}t dg}tdd}tdd}tdd}td|fd| fd|fd	|fg}||| g d
}dd |jD }||ksJ d S )NrX   r   rY   r      m2badm3m5)r  r	  r
  r  c                 S   s   g | ]\}}|qS r<   r<   ).0name_r<   r<   r=   
<listcomp>      z9test_pipeline_correctly_adjusts_steps.<locals>.<listcomp>)r_   r   rW   r    rG   r   )	r   rE   rF   r  mult3mult5r   Zexpected_namesZactual_namesr<   r<   r=   %test_pipeline_correctly_adjusts_steps  s    


r  c                    s  t dgg}t dg}tdd tddtdd fdd}| }d}t|gg||| t|g||| t|||gg |j| d	 d
}t|gg||| t|g||| t|||gg |j	dd|j
 | d ddd dd	ksJ |j| d d}t|gg||| t|g||| t|||gg g d}|D ]}t||| qp|j d d
}t|gg||| t|g||| t|||gg | }|j| d d}t|gg|||| t|gg||| t|||gg d}d}	tjt|	d}
t|d W d    n1 sl0    Y  t|
jjtsJ |t|
jjv sJ d
}td fd| fdfg}t|gg||| t|g||| t|||gg d S )NrX   r   rY   r   r  c                      s   t d fdfdfgS )Nr  r
  last)r    r<   r  r  r  r<   r=   make  s    z0test_set_pipeline_step_passthrough.<locals>.make   r
  r   Tr~   F)	r   r  r
  r  r   Zm2__multZ
last__multtransform_inputr   r  )rf   rg   rh   rP   re   )r     z''str' object has no attribute 'predict'z*This 'Pipeline' has no attribute 'predict'r{   rc   r  r
  r  )r_   r   rW   r2   r   rG   rc   rR   rM   rI   r   r   rP   r   r   r   r   r   r   r   r    )r   rE   rF   r  r   expZother_methodsr   r   r   r   r<   r  r=   "test_set_pipeline_step_passthrough  sr    



*r  c                  C   s   t td} | j | j | j t t } t| dr6J | j | j t d} | jd dks\J t| drjJ | j | j t t t } t| drJ | j t| drJ t t t } t| drJ | j t| drJ d S )Nr  rc   r   r   r   r   rR   )	r!   rW   rc   rP   rR   rQ   hasattrr   rN   )r   r<   r<   r=   test_pipeline_ducktypingD  s*    
r   c                  C   s   t  } t  }t| |}t|ts$J |jd d dks:J |jd d dksPJ t| |t }t|tslJ |jd d dksJ |jd d dksJ |jd d dksJ d S )Nr   ztransf-1rX   ztransf-2r   Z	fitparamt)rQ   r!   r   r    r   ri   )t1t2r   r<   r<   r=   test_make_pipeline`  s    
r#  zpipeline, check_estimator_typec                 C   s   t | jd u S r7   )r*   Zestimator_typeestr<   r<   r=   <lambda>v  r  r&  c                 C   s
   | j d u S r7   )Z_estimator_typer$  r<   r<   r=   r&  x  r  c                 C   s   t |  || sJ dS )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   Zcheck_estimator_typer<   r<   r=   test_pipeline_estimator_typeo  s    r'  c                  C   s,   t g d} t }| }|  |ks(J dS )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__)Zempty_pipelinebeZexpected_tagsr<   r<   r=   %test_sklearn_tags_with_empty_pipeline  s    
r*  c                  C   sX  t j} t j}tdddd}tdd}td|fd|fgdd	id
}|| | || }td|fd|fgdd	id
}|| |}tdt	 fd|fd|fgdd	id
}|| |}t
|d d d df d	||   t|d d df || |  t
|d d d df d	||   t|d d df || |  |j| jd dfksTJ d S )Nr   r   r   r   r   r   rX   r   r   r   r   r   r   r      )r   r   r   r   r   r   rG   rP   r   rQ   r1   r2   r   r   )rE   rF   r   r   r   r   ZX_fit_transformedZX_fit_transformed_wo_methodr<   r<   r=   test_feature_union_weights  s.    

$"$"r-  c                  C   s  t } tdtddfdtddfg}tdtddfdtddfgdd}tdtddfdtddfgdd}||  || }|jd t| ksJ ||  || }|j|jksJ t| |  |	| }t| |  || }t| |  d S )	Nwordswordanalyzercharscharr   r   r   )
JUNK_FOOD_DOCSr   r   rG   rP   r   r   r2   r   r   )rE   r   Zfs_parallelZfs_parallel2r   ZX_transformed_parallelZX_transformed_parallel2r<   r<   r=   test_feature_union_parallel  s:    





r5  c                  C   s   t dd} t ddd}td|fd| fg}|t | }|D ]}d|v s@d	|v s@J q@t|d
ksjJ tdt fgdgg}td}t	j
t|d |  W d    n1 s0    Y  d S )Nr/  r0  Zchar_wb)r   r   )r1  Zngram_ranger2  r.  Zchars__Zwords__#   Ztr1rX   zDTransformer tr1 (type Transf) does not provide get_feature_names_outr{   )r   r   rG   r4  get_feature_names_outr   rQ   r   r   r   r   r   )Z	word_vectZ	char_vectftfeature_namesZfeatr   r<   r<   r=    test_feature_union_feature_names  s    

r:  c                  C   s   t j} t j}ttddt }|| | tt	 t
|d W d    n1 sT0    Y  ttddtdd}tt	 t
|d W d    n1 s0    Y  || | t|jt| d S )NrX   r   classes_r   r   )r   r   r   r!   r   r   rG   r   r   r   r   r   r2   r;  r_   r   )rE   rF   regrz   r<   r<   r=   test_classes_property  s    ((r>  c                  C   s4  t d} t d}t d}dd |_dd | _dd |_td| fd	|fg}tddgg|td
gg tddg|  d|fg|_tdgg|td
gg tdg|  |jd|fgd tdgg|td
gg tdg|  |j|d tdgg|td
gg tdg|  d S )Nr   r   r  c                 S   s   dgS Nx3r<   input_featuresr<   r<   r=   r&  	  r  z.test_set_feature_union_steps.<locals>.<lambda>c                 S   s   dgS Nx2r<   rA  r<   r<   r=   r&  
  r  c                 S   s   dgS )NZx5r<   rA  r<   r<   r=   r&    r  r  r
  rX   m2__x2m3__x3r  Zm5__x5r   )r   Zmock__x3r  Zmock__x5)	rW   r7  r   r2   rP   r_   r`   r   rM   )r  r  r  r8  r<   r<   r=   test_set_feature_union_steps  s$    


 rG  c                  C   s  t d} t d}dd | _dd |_tdgg}td| fd|fg}tddgg||| tddgg|| td	d
g|  |j	dd tdgg||| tdgg|| td
g|  |j	dd tg g||| tg g|| tg |  |j	|d tdgg||| tdd|fg}tdgg||| tdgg|| td
g|  d S )Nr   r   c                 S   s   dgS rC  r<   rA  r<   r<   r=   r&  %  r  z2test_set_feature_union_step_drop.<locals>.<lambda>c                 S   s   dgS r?  r<   rA  r<   r<   r=   r&  &  r  rX   r  r
  rE  rF  dropr  r  )r  rH  )
rW   r7  r_   r`   r   r2   rG   rP   r   rM   )r  r  rE   r8  r<   r<   r=    test_set_feature_union_step_drop!  s.    

rI  c                  C   s  t d} t d}dd | _dd |_tdgg}td| fd|fg}tddgg||| tddgg|| td	d
g|  |j	dd tddgg||| tddgg|| tdd
g|dg |j	dd tddgg||| tddgg|| tddg|dg |j	|d tddgg||| tddgg|| tdd
g|dg tdd|fg}tddgg||| tddgg|| tdd
g|dg t
j}|jd }tdddd}tdd|fg}t||||ddd|f  t|||ddd|f  tg d|g d |j	dd |||}t|t||g ||}t|t||g tg d|g d |j	|d t||||dd| df  t|||dd| df  tg d|g d tdd|fgddid}t|d |||ddd|f  t|d ||ddd|f  tg d|g d dS )z@Check the behaviour of setting a transformer to `"passthrough"`.r   r   c                 S   s   dgS rC  r<   rA  r<   r<   r=   r&  K  r  z4test_set_feature_union_passthrough.<locals>.<lambda>c                 S   s   dgS r?  r<   rA  r<   r<   r=   r&  L  r  rX   r  r
  rE  rF  r   r  Z
m2__myfeatZmyfeatr  Z
m3__myfeat)r  r   r   r   r+  r  r   N)passthrough__f0passthrough__f1passthrough__f2passthrough__f3	pca__pca0	pca__pca1)Zf0f1f2Zf3)r   )rJ  rK  rL  rM  pca__f0pca__f1pca__f2pca__f3)r   )Zpassthrough__pca0Zpassthrough__pca1rR  rS  rT  rU  r   )rW   r7  r_   r`   r   r2   rG   rP   r   rM   r   r   r   r   Zhstack)r  r  rE   r8  columnsr   ZX_ftr<   r<   r=   "test_set_feature_union_passthroughD  s~    


& 

("
*$rW  c                  C   sD   t j} tdddd}td|fdg}||  tg d|  dS )	zDCheck feature_names_out for verbose_feature_names_out=True (default)r   r   r   r+  r   r  )rN  rO  Zpassthrough__x0Zpassthrough__x1Zpassthrough__x2Zpassthrough__x3Nr   r   r   r   rG   r2   r7  rE   r   r8  r<   r<   r=   9test_feature_union_passthrough_get_feature_names_out_true  s    
rZ  c                  C   sH   t j} tdddd}td|fdgdd}||  tg d	|  d
S )z;Check feature_names_out for verbose_feature_names_out=Falser   r   r   r+  r   r  FZverbose_feature_names_out)Zpca0Zpca1Zx0x1rD  r@  NrX  rY  r<   r<   r=   :test_feature_union_passthrough_get_feature_names_out_false  s    
r]  c                  C   s   t d} | jddgddggddgd}tdd	 d
d	 d}tdt fd|fgdd}|| td}t j	t
|d |  W d   n1 s0    Y  dS )zFCheck get_feature_names_out and non-verbose names and colliding names.pandasrX   r   r   r9   r:   rV  c                 S   s
   | dg S rJ   r<   )rE   r<   r<   r=   r&    r  zStest_feature_union_passthrough_get_feature_names_out_false_errors.<locals>.<lambda>c                 S   s   t dgS rJ   )r_   r`   )r;   r  r<   r<   r=   r&    r  )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$   rG   r   r   r   r   r7  )pdrE   Zselect_aunionr   r<   r<   r=   Atest_feature_union_passthrough_get_feature_names_out_false_errors  s    

re  c                  C   s   t d} | jttdgdd tdD d}tddgdd	}|| td
}t j	t
|d |  W d   n1 s0    Y  dS )zLCheck get_feature_names_out with non-verbose names and >= 5 colliding names.r^  r   c                 S   s   g | ]}d | qS )fr<   )r  ir<   r<   r=   r    r  zdtest_feature_union_passthrough_get_feature_names_out_false_errors_overlap_over_5.<locals>.<listcomp>r_  )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   ra  rb  r   ranger   rG   r   r   r   r   r7  )rc  rE   rd  r   r<   r<   r=   Ptest_feature_union_passthrough_get_feature_names_out_false_errors_overlap_over_5  s    
&
ri  c               
   C   sH  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||| ffD ]\}}	tjt|	d0 |f i ||idggdg W d    n1 s0    Y  |f i |dt dfgi}
t|
|| tjt|	d" |
dggdg W d    n1 s@0    Y  tjt|	d" |
dggdg W d    n1 s0    Y  |f i |dt dfgi}
|
j	f i ||i tjt|	d" |
dggdg W d    n1 s0    Y  tjt|	d" |
dggdg W d    q1 s60    Y  qqLd S )Nz3Estimator names must not contain __: got \['a__q'\]z+Names provided are not unique: \['a', 'a'\]z=Estimator names conflict with constructor arguments: \['%s'\]Za__qr   r:   r   r9   r   r   r{   rX   )
rW   r    r   r   r   r   rG   setattrr   rM   )Zerror_message_1Zerror_message_2Zerror_message_3Z
bad_steps1Z
bad_steps2r   paramZ
bad_steps3Z	bad_stepsmessager%  r<   r<   r=   test_step_name_validation  s2    
>222rm  c                  C   sD   t dt dt fgfg} | jdt d | jdt fgdd d S )Nr9   r:   gMbP?)Za__b__alphaZa__br  )Za__stepsZa__b__C)r    r   rM   r   r   )	estimatorr<   r<   r=   test_set_params_nested_pipeline2  s    ro  c               	   C   s  t j} t j}t }zbtj|dd}tddd}t }tdt	|fd|fg}td|fd|fg|d}|
| | |
| | |jd j}t|| ||  t|| ||  t|| ||  t|| ||| | t|jd j|jd j t|d	rJ |
| | t|| ||  t|| ||  t|| ||  t|| ||| | t|jd j|jd j ||jd jksJ tddd}	t }
td
|
fd|	fg|d}|
| | t|| ||  t|| ||  t|| ||  t|| ||| | t|jd j|jd
 j ||jd
 jksjJ W t| nt| 0 d S )Nr   locationr   Tr   r   r   r}   r   rs   transf_2)r   r   r   r   joblibMemoryr%   rq   r    r   rG   r   ru   r2   rc   rf   rg   re   rs   r  shutilrmtree)rE   rF   cachedirr   rz   r   r   Zcached_pipetsZclf_2rs  Zcached_pipe_2r<   r<   r=   test_pipeline_memory8  s^    

rz  c                  C   sn   t  } tj| dd}tt t |d}|j|u s4J tt t }|jd u sPJ t|dks`J t	|  d S )Nr   rp  rr  r   )
r   rt  ru  r!   rq   r%   r   r   rv  rw  )rx  r   r   r<   r<   r=   test_make_pipeline_memoryw  s    r{  c                   @   s*   e Zd ZdddZd	ddZd
ddZdS )FeatureNameSaverNc                 C   s   t | |dd | S )NT)reset)r4   rD   r<   r<   r=   rG     s    zFeatureNameSaver.fitc                 C   s   |S r7   r<   rD   r<   r<   r=   rP     s    zFeatureNameSaver.transformc                 C   s   |S r7   r<   )r;   rB  r<   r<   r=   r7    s    z&FeatureNameSaver.get_feature_names_out)N)N)N)r?   r@   rA   rG   rP   r7  r<   r<   r<   r=   r|    s   

r|  c                  C   sR   t dt fddt fgd} t }| |j|j t| dd |j	|j	 dS )z5Check pipeline.get_feature_names_out with passthroughr   passr   rz   r  Nr   )
r    r|  r   r   rG   r   r   r2   r7  r9  )r   r   r<   r<   r=   test_features_names_passthrough  s    r  c                  C   sn   t dt fdt fgd} dd tD }| t| t| dd  g d t| dd d	g d dS )
z5Check pipeline.get_feature_names_out with vectorizersZvectrz   r  c                 S   s   g | ]}d |v qS )pizzar<   )r  r   r<   r<   r=   r    r  z7test_feature_names_count_vectorizer.<locals>.<listcomp>Nr   )beerZburgerZcoke	copyrightr  ZtheZnonsense_is_ignored)r    r   r   r4  rG   r2   r7  )r   rF   r<   r<   r=   #test_feature_names_count_vectorizer  s    r  c                  C   sf   t dt fgd} t }| |j|j d}tjt|d | 	  W d   n1 sX0    Y  dS )zZCheck that error is raised when a transformer does not define
    `get_feature_names_out`.Znotransr  z&does not provide get_feature_names_outr{   N)
r    rC   r   rG   r   r   r   r   r   r7  )r   r   r   r<   r<   r=   8test_pipeline_feature_names_out_error_without_definition  s    r  c                  C   s\   t t } tjtdd0 | jdgdggddgddgd W d    n1 sN0    Y  d S )Nz8Pipeline.fit does not accept the sample_weight parameterr{   r   rX   r   )r!   r   r   r   r   rG   )rz   r<   r<   r=   test_pipeline_param_error  s
    
r  c                 c   sP   | ]H\\}}}t ||r|d kr>t |dr>t|jd d ts|||fV  qdS )r   r   r   rX   N)r  r   r   ri   )r  r%  patternr   r<   r<   r=   	<genexpr>  s   
4

r  r   rz   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   )rz   N)r   NrZ   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  rH  )r  rH  z@\[FeatureUnion\].*\(step 1 of 1\) Processing mult2.* total=.*\n$)rG   r   ro   zest, pattern, methodc                 C   s~   t | |}g dg dg}dgdgg}| jdd ||| | jrNJ d| jdd ||| t|| jszJ d S )	NrX   r   r   )r   r  r  r,  r   F)r   zGot output for verbose=FalseT)r   rM   Z
readouterroutr   r|   )r%  r   r  ZcapsysfuncrE   rF   r<   r<   r=   test_verbose  s    


r  c                  C   s   ddgddgddgg} g d}t  }t }t||}t|drBJ || | |j|j  krfdksln J t  }t }t||}|| | |j|j  krdksn J t|drJ d S 	NrX   r   r   r   r  r  r   rX   r   n_features_in_)r$   r   r!   r  rG   r  )rE   rF   ssZgbdtr   r<   r<   r=   test_n_features_in_pipeline  s    

r  c                  C   s   ddgddgddgg} g d}t  }t|}t|dr:J || | |j|j  kr^dksdn J t  }t|}|| | |j|j  krdksn J d S r  )r$   r"   r  rG   r  )rE   rF   r  r   r<   r<   r=    test_n_features_in_feature_union(  s    r  c                  C   s   G dd dt t} tjtj }}td|  fd|  fg}tt |	|| W d    n1 sd0    Y  tt |
|| W d    n1 s0    Y  |j	||dd |j
||dd d S )Nc                   @   s    e Zd ZdddZdddZdS )z7test_feature_union_fit_params.<locals>.DummyTransformerNc                 [   s   |ddikrt | S )Nr9   r   r   rU   r<   r<   r=   rG   ?  s    z;test_feature_union_fit_params.<locals>.DummyTransformer.fitc                 S   s   |S r7   r<   rD   r<   r<   r=   rP   D  s    zAtest_feature_union_fit_params.<locals>.DummyTransformer.transform)N)Nr?   r@   rA   rG   rP   r<   r<   r<   r=   DummyTransformer>  s   
r  Zdummy0Zdummy1r   rK   )r   r   r   r   r   r   r   r   r   rG   r   r  rE   rF   r   r<   r<   r=   test_feature_union_fit_params<  s    	**r  c                  C   s   G dd dt } tjtj }}td|  fd|  fg}tt  |j||dd W d    n1 sf0    Y  |j||dd d S )Nc                   @   s   e Zd ZdddZdS )zMtest_feature_union_fit_params_without_fit_transform.<locals>.DummyTransformerNc                 [   s   |ddikrt | S )NmetadatarX   r  rU   r<   r<   r=   rG   X  s    zQtest_feature_union_fit_params_without_fit_transform.<locals>.DummyTransformer.fit)NrV   r<   r<   r<   r=   r  W  s   r  Znofittransform0Znofittransform1r   )r  rX   )	r&   r   r   r   r   r   r   r   r   r  r<   r<   r=   3test_feature_union_fit_params_without_fit_transformS  s    .r  c                  C   sp   t j t j  } }tjjddg| jddgdt	}tj
| |< tt t }|| || |dkslJ d S )NrX   r   r   g?)pg?)r   r   r   r   r_   randomchoicer   Zastypeboolnanr!   r   r   rG   re   )rE   rF   maskr   r<   r<   r=   %test_pipeline_missing_values_leniencyk  s
    "
r  c                  C   s   ddgddgddgg} g d}dt  fg}d	di}d
}t||d}tjt|d || | W d    n1 sr0    Y  d S )NrX   r   r   r   r  r  r  r   transformerzZAttempting to weight transformer "transformer", but it is not present in transformer_list.r   r{   )rQ   r   r   r   r   rG   )rE   rF   r   weightsZexpected_msgrd  r<   r<   r=   3test_feature_union_warns_unknown_transformer_weightu  s    r  c                 C   s    t | t }| jjrJ d S r7   )r!   r%   r(  Z
input_tagspairwise)r   r   r<   r<   r=   test_pipeline_get_tags_none  s    r  	Predictorc                 C   s   t jd}|ddt dgd dgd   }}tdt fd|  fg}||| ||}t	|rt
|d |||tt||ksJ n.t||  |||tt||ksJ d S )	Nr      r   r  rX      r  Z	predictor)r_   r  RandomStateZrandnr   r    r/   rG   rc   r   r2   re   r   Zapproxr   r0   rr   r   )r  rngrE   rF   modelZy_predr<   r<   r=   1test_search_cv_using_minimal_compatible_estimator  s    (

"r  c                  C   sn   G dd dt } td|  fg}tt t| W d    n1 sH0    Y  |tjtj	 t| d S )Nc                   @   s   e Zd Zdd ZdS )z0test_pipeline_check_if_fitted.<locals>.Estimatorc                 S   s
   d| _ | S r[   rl   rD   r<   r<   r=   rG     s    z4test_pipeline_check_if_fitted.<locals>.Estimator.fitNrV   r<   r<   r<   r=   	Estimator  s   r  rz   )
r   r    r   r   r   r5   rG   r   r   r   )r  r   r<   r<   r=   test_pipeline_check_if_fitted  s    &r  c                  C   s   ddgddgddgg} g d}t dt fg}tt t| W d	   n1 sV0    Y  || | t| t d
g}t| t dt fd
g}tt t| W d	   n1 s0    Y  || | t| d	S )z1Check __sklearn_is_fitted__ is defined correctly.rX   r   r   r   r  r  r  rz   Nr~  )r   r/   r   r   r   r5   rG   )rE   rF   rd  r<   r<   r=   "test_feature_union_check_if_fitted  s    &
&r  c                  C   s`   t jt j } }G dd dt}t| t }|| | t j}||}t|dd |D  dS )zRCheck that pipeline passes names through.

    Non-regresion test for #21349.
    c                       s   e Zd Zd fdd	Z  ZS )zYtest_pipeline_get_feature_names_out_passes_names_through.<locals>.AddPrefixStandardScalarNc                    s&   t  j|d}tjdd |D tdS )NrA  c                 S   s   g | ]}d | qS Z
my_prefix_r<   r  r  r<   r<   r=   r    r  ztest_pipeline_get_feature_names_out_passes_names_through.<locals>.AddPrefixStandardScalar.get_feature_names_out.<locals>.<listcomp>)Zdtype)superr7  r_   r`   object)r;   rB  r   	__class__r<   r=   r7    s    zotest_pipeline_get_feature_names_out_passes_names_through.<locals>.AddPrefixStandardScalar.get_feature_names_out)N)r?   r@   rA   r7  __classcell__r<   r<   r  r=   AddPrefixStandardScalar  s   r  c                 S   s   g | ]}d | qS r  r<   r  r<   r<   r=   r    r  zLtest_pipeline_get_feature_names_out_passes_names_through.<locals>.<listcomp>N)	r   r   r   r$   r!   rG   r9  r7  r2   )rE   rF   r  r   Zinput_namesr`  r<   r<   r=   8test_pipeline_get_feature_names_out_passes_names_through  s    
r  c                  C   sh   t d tddd\} }tt t }|jdd || | |dd  }|d j	}t
|| dS )z.Test pipeline's set_output with feature names.r^  TZas_frameZ
return_X_yrP   Nr   )r   ra  r   r!   r$   r   
set_outputrG   r7  feature_names_in_r2   )rE   rF   r   r  Zlog_reg_feature_namesr<   r<   r=   $test_pipeline_set_output_integration  s    

r  c                  C   s   t d} tddd\}}t|dd\}}tdt fdt fg}|jdd || |	|}t
|| jsrJ t|j|  t|j|j d	S )
z'Test feature union with set_output API.r^  Tr  r   r<  scalarr   r  N)r   ra  r   r   r   r$   r   r  rG   rP   r   rb  r2   rV  r7  index)rc  rE   r  ZX_trainZX_testrd  r   r<   r<   r=   test_feature_union_set_output  s    


r  c                  C   sh   t  } t }td| fd|fddg}|d | u s4J |d |u sDJ |d dksTJ |d dksdJ d	S )
z8Check FeatureUnion.__getitem__ returns expected results.r  r   r~  )drop_merH  r  r   r  rH  N)r$   r   r   )r  r   rd  r<   r<   r=   test_feature_union_getitem  s    r  keyr   c                 C   sV   t dt fdt fg}d}tjt|d ||   W d   n1 sH0    Y  dS )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  rd  r   r<   r<   r=    test_feature_union_getitem_error  s    r  c                  C   s   t d tddd\} }t }||  td|fg}t|dsFJ t| j|j	 t|j	|j	 tdg}||  t|dsJ t| j|j	 | 
 }tdg}|| t|drJ dS )zxEnsure feature union has `.feature_names_in_` attribute if `X` has a
    `columns` attribute.

    Test for #24754.
    r^  Tr  scaler  r~  N)r   ra  r   r$   rG   r   r  r2   rV  r  Zto_numpy)rE   r  r   rd  ZX_arrayr<   r<   r=   $test_feature_union_feature_names_in_   s     





r  c                  C   s$  t jdjdd} tdtddfg}|| } tjt	dd |
  W d    n1 s^0    Y  tjt	d	d |j
| | d
 W d    n1 s0    Y  tjdd$ td |
|  W d    n1 s0    Y  tjtdd |j
| d W d    n1 s0    Y  d S )Nr   )r   r  )sizer   r   )r   z$Missing required positional argumentr{   z$Cannot use both X and Xt. Use X only)rE   XtT)recorderrorzXt was renamed X in version 1.5)r  )r_   r  r  normalr    r   r   r   r   r   rR   warningscatch_warningssimplefilterwarnsFutureWarningr   r<   r<   r=   .test_pipeline_inverse_transform_Xt_deprecationA  s    
&,
(r  T)Zenable_metadata_routingr   rG   r   c                    s   dd   fdd}dd }t ddgd	d
gg}t ddg}t ddgg}t ddgg}t ddgg}| \}}	}
}}|j|||||d ||	ddg||d ||
ddg ||ddg|d |d ||| d|d	 |d dS )zLTest that with transform_input, data is correctly transformed for each step.c                 S   s   t | dj||dj||dS )z$Get a transformer with requests set.registryrp   r  )r'   set_fit_requestset_transform_request)r  rp   r  r<   r<   r=   get_transformer]  s    
z6test_transform_input_pipeline.<locals>.get_transformerc               	      sf   t  t  t  t  f\} }}}t | ddd |ddd |ddd |ddddgd}|| |||fS )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_weightsrp   r  )r(   r!   )
registry_1
registry_2
registry_3
registry_4r   r  r<   r=   get_pipelinee  s    z3test_transform_input_pipeline.<locals>.get_pipelinec                 [   s6   | sJ | D ]$}|D ]}t |f||d| qqdS )zACheck that the right metadata was recorded for the given methods.)r   parentN)r)   )r  methodsr  rn  r   r<   r<   r=   check_metadataz  s    z5test_transform_input_pipeline.<locals>.check_metadatarX   r   r   r   r   r  (   d      )rp   r  r  rG   rP   r  r  N)r_   r   rG   split)r   r  r  rE   rF   rp   r  r  r   r  r  r  r  r<   r  r=   test_transform_input_pipelineX  s@    r  c                  C   s   G dd dt t} G dd dtt}tddgg}tddg}tddgg}tddg}td|  fd	| jd
d
dfgdgd}|j||||d dS )z;Test that the right transformed values are passed to `fit`.c                   @   s   e Zd Zdd Zdd ZdS )z>test_transform_input_explicit_value_check.<locals>.Transformerc                 S   s
   d| _ | S r[   r  rD   r<   r<   r=   rG     s    zBtest_transform_input_explicit_value_check.<locals>.Transformer.fitc                 S   s   |d S r   r<   rO   r<   r<   r=   rP     s    zHtest_transform_input_explicit_value_check.<locals>.Transformer.transformNr  r<   r<   r<   r=   Transformer  s   r  c                   @   s   e Zd ZdddZdS )z<test_transform_input_explicit_value_check.<locals>.EstimatorNc                 S   sX   t |tddgg t |tddg t |tddgg t |tddg | S )NrX   r   r   r   )r2   r_   r   r;   rE   rF   X_valy_valr<   r<   r=   rG     s
    z@test_transform_input_explicit_value_check.<locals>.Estimator.fit)NNrV   r<   r<   r<   r=   r    s   r  r   rX   r   r  rn  Tr  r  r  r  N)r   r   r   r_   r   r    r  rG   )r  r  rE   rF   r  r  r   r<   r<   r=   )test_transform_input_explicit_value_check  s    r  c                  C   sr   t ddgddgg} t ddg}d}tjt|d( tt dgd	| | W d
   n1 sd0    Y  d
S )z<Make sure the right error is raised if slep6 is not enabled.rX   r   r   r   r   z;The `transform_input` parameter can only be set if metadatar{   Zblahr  N)r_   r   r   r   r   r!   rq   rG   )rE   rF   r   r<   r<   r=   test_transform_input_no_slep6  s
    r  c            	      C   s   G dd dt t} G dd dtt}tddgg}tddg}tddgg}tddg}tdd	gg}tddg}td
| fd|  jdddfgdgd}|j||||f||fd dS )zHTest that if metadata is a tuple of arrays, both arrays are transformed.c                   @   s   e Zd ZdddZdS )z-test_transform_tuple_input.<locals>.EstimatorNc                 S   s   t |tsJ t |tsJ t|d tddgg t|d tddg t|d tddgg t|d tddg d| _| S )Nr   r   r   rX         T)r   tupler2   r_   r   rl   r  r<   r<   r=   rG     s    z1test_transform_tuple_input.<locals>.Estimator.fit)NNrV   r<   r<   r<   r=   r    s   r  c                   @   s   e Zd Zdd Zdd ZdS )z/test_transform_tuple_input.<locals>.Transformerc                 S   s
   d| _ | S r[   r  rD   r<   r<   r=   rG     s    z3test_transform_tuple_input.<locals>.Transformer.fitc                 S   s   |d S r   r<   rO   r<   r<   r=   rP     s    z9test_transform_tuple_input.<locals>.Transformer.transformNr  r<   r<   r<   r=   r    s   r  rX   r   r   r   r  r  rn  Tr  r  r  N)r   r   r   r_   r   r    r  rG   )	r  r  rE   rF   ZX_val0Zy_val0ZX_val1Zy_val1r   r<   r<   r=   test_transform_tuple_input  s    r  )rc   rf   rg   rh   re   r   rP   rR   c                 C   sd   G dd dt }td| fg}tjtdd" t|| dgg W d    n1 sV0    Y  d S )Nc                   @   sX   e Zd 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S )z:test_pipeline_warns_not_fitted.<locals>.StatelessEstimatorzStateless 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                 S   s   | S r7   r<   rD   r<   r<   r=   rG     s    z>test_pipeline_warns_not_fitted.<locals>.StatelessEstimator.fitc                 S   s   |S r7   r<   rO   r<   r<   r=   rP     s    zDtest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.transformc                 S   s   t t|S r7   r_   Zonesr   rO   r<   r<   r=   rc     s    zBtest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.predictc                 S   s   t t|S r7   r  rO   r<   r<   r=   rf     s    zHtest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.predict_probac                 S   s   t t|S r7   r_   Zzerosr   rO   r<   r<   r=   rg   !  s    zLtest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.predict_log_probac                 S   s   t t|S r7   r  rO   r<   r<   r=   rh   $  s    zLtest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.decision_functionc                 S   s   dS r   r<   rD   r<   r<   r=   re   '  s    z@test_pipeline_warns_not_fitted.<locals>.StatelessEstimator.scorec                 S   s   t t|S r7   r  rO   r<   r<   r=   r   *  s    zHtest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.score_samplesc                 S   s   |S r7   r<   rO   r<   r<   r=   rR   -  s    zLtest_pipeline_warns_not_fitted.<locals>.StatelessEstimator.inverse_transformN)r?   r@   rA   rB   rG   rP   rc   rf   rg   rh   re   r   rR   r<   r<   r<   r=   StatelessEstimator  s   r  rn  z)This Pipeline instance is not fitted yet.r{   rX   )r   r    r   r  r  r   )r   r  r   r<   r<   r=   test_pipeline_warns_not_fitted  s    #r  c                   @   sx   e Zd Zdd ZdddZdddZddd	Zdd
dZdddZdddZ	dddZ
dddZd ddZd!ddZdS )"SimpleEstimatorc                 C   s   dS r[   r<   r\   r<   r<   r=   r]   <  s    z%SimpleEstimator.__sklearn_is_fitted__Nc                 C   s$   |d usJ ||d us J || S r7   r<   r;   rE   rF   rp   propr<   r<   r=   rG   ?  s    zSimpleEstimator.fitc                 C   s    |d usJ |d usJ |d S r   r<   r  r<   r<   r=   r   D  s    zSimpleEstimator.fit_transformc                 C   s&   |d usJ |d usJ t t|S r7   r  r  r<   r<   r=   ro   I  s    zSimpleEstimator.fit_predictc                 C   s&   |d usJ |d usJ t t|S r7   r  r;   rE   rp   r  r<   r<   r=   rc   N  s    zSimpleEstimator.predictc                 C   s&   |d usJ |d usJ t t|S r7   r  r  r<   r<   r=   rf   S  s    zSimpleEstimator.predict_probac                 C   s&   |d usJ |d usJ t t|S r7   r  r  r<   r<   r=   rg   X  s    z!SimpleEstimator.predict_log_probac                 C   s&   |d usJ |d usJ t t|S r7   r  r  r<   r<   r=   rh   ]  s    z!SimpleEstimator.decision_functionc                 C   s   |d usJ |d usJ dS r   r<   r  r<   r<   r=   re   b  s    zSimpleEstimator.scorec                 C   s    |d usJ |d usJ |d S r   r<   r  r<   r<   r=   rP   g  s    zSimpleEstimator.transformc                 C   s    |d usJ |d usJ |d S r   r<   r  r<   r<   r=   rR   l  s    z!SimpleEstimator.inverse_transform)NN)NN)NN)NN)NN)NN)NN)NN)NN)NN)r?   r@   rA   r]   rG   r   ro   rc   rf   rg   rh   re   rP   rR   r<   r<   r<   r=   r  9  s   








r  r  Zpartial_fitc           
   	   C   s  dd }t dggt dg }}dgdd  }}}t }||| ddd}||dddd}t jddd	jddd	jddd	}td
|fd|fg}	d| vr|	j||||d}	zt	|	| |||||d W n( t
y   t	|	| ||||d Y n0 t|dd||d t|dd||d dS )z5Test that metadata is routed correctly for pipelines.c                 [   sB   |t v rt | }n|g}|D ] }t| d| df i | q| 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__request)r+   r   )r%  r   kwargr  r<   r<   r=   set_requestx  s    
z7test_metadata_routing_for_pipeline.<locals>.set_requestrX   r9   r:   Trp   r  rG   r  trsrn  )rp   r  r  )objr   r  rp   r  rP   N)r_   r   r  r'   r  r  Zset_inverse_transform_requestr    rG   r   r   r)   )
r   r  rE   rF   rp   r  r  r%  r  r   r<   r<   r=   "test_metadata_routing_for_pipelines  sN    

r  c              	   C   s   dggdg }}dgd }}t  }td|fg}d|  }tjtt|dR zt|| ||||d W n& ty   t|| |||d Y n0 W d   n1 s0    Y  dS )zBTest that metadata is not routed for pipelines when not requested.rX   r9   rn  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   rE   rF   rp   r  r%  r   error_messager<   r<   r=   (test_metadata_routing_error_for_pipeline  s    r  )rh   rP   rR   c                 C   s\   t dt fg}tjtdd* t|| dggdgdd W d   n1 sN0    Y  dS )zTest that the right error message is raised when metadata is passed while
    not supported when `enable_metadata_routing=False`.rn  z1is only supported if enable_metadata_routing=Truer{   rX   r9   r  N)r    r  r   r   r   r   )r   r   r<   r<   r=   *test_routing_passed_metadata_not_supported  s
    r  c                  C   s<   t dt fdt fg} | dggdg | dgg dS )zFTest that pipeline works with estimators that have a `__len__` method.r  rn  rX   N)r    r   r   rG   rc   r   r<   r<   r=   %test_pipeline_with_estimator_with_len  s
    r	  	last_stepc                 C   sR   t dt fd| fg}|dggdgdgdgdggdgdgdggksNJ dS )zTest that the pipeline works when there is not last step.

    It should just ignore and pass through the data on transform.
    r  rn  rX   r   r   N)r    r#   rG   rP   )r
  r   r<   r<   r=   test_pipeline_with_no_last_step  s    r  c                  C   s  t 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	|d" |j
| |||d W d   n1 s0    Y  td	t jdddfg}d
tj d}tjtt	|d. |j
| |||dj| ||d W d   n1 s0    Y  dS )zCTest that the right error is raised when metadata is not requested.r   rX   r   r   r  r  rX   rX   rX   r9   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'   r?   r   r   r   r   r   rG   r  rP   )rE   rF   rp   r  feature_unionr  r<   r<   r=   )test_feature_union_metadata_routing_error  s8    0r  c                  C   s   t dt fg} |   dS )zaTest that get_metadata_routing() works regardless of the Child's
    consumption of any metadata.r  N)r   r'   Zget_metadata_routing)r  r<   r<   r=   3test_feature_union_get_metadata_routing_without_fit	  s    r  r  c           	      C   s  t ddgddgddgg}g d}g dd }}td	| t d
jdddjdddfd| t d
jdddjdddfg}||d}|j||fi | |j||fi | |j||fi |j|fi | |j	D ]:} | d j
}t|sJ |D ]}tf |ddd| qqdS )z8Test that metadata is routed correctly for FeatureUnion.r   rX   r   r   r  r  r  r9   Z
sub_trans1r  Tr  Z
sub_trans2rG   )r  r   r  N)r_   r   r   r(   r  r  rG   r   rP   r   r  r   r)   )	r  rE   rF   rp   r  r  kwargsr  Z	sub_transr<   r<   r=   #test_feature_union_metadata_routing$	  sF    
"

r  )rB   	itertoolsr   rv  rt   r  tempfiler   rt  numpyr_   r   Zsklearnr   Zsklearn.baser   r   r   r   r   r	   Zsklearn.clusterr
   Zsklearn.datasetsr   Zsklearn.decompositionr   r   Zsklearn.dummyr   Zsklearn.ensembler   r   r   Zsklearn.exceptionsr   r   Zsklearn.feature_extraction.textr   Zsklearn.feature_selectionr   r   Zsklearn.imputer   Zsklearn.linear_modelr   r   r   Zsklearn.metricsr   r   Zsklearn.model_selectionr   Zsklearn.neighborsr   Zsklearn.pipeliner   r    r!   r"   Zsklearn.preprocessingr#   r$   Zsklearn.svmr%   Z%sklearn.tests.metadata_routing_commonr&   r'   r(   r)   Zsklearn.utilsr*   Z sklearn.utils._metadata_requestsr+   r,   Zsklearn.utils._testingr-   r.   r/   r0   r1   r2   Zsklearn.utils.fixesr3   Zsklearn.utils.validationr4   r5   r   r   flagsZ	writeabler   r4  r6   rC   rN   rQ   rS   rW   ri   rq   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r   markZparametrizer   r   r   r   r   r   r   r   r   r  r  r  r  r   r#  r'  r*  r-  r5  r:  r>  rG  rI  rW  rZ  r]  re  ri  rm  ro  rz  r{  r|  r  r  r  r  productZparameter_grid_test_verboser  r  r  r  r  r  r  r  r  r  r  r  r  r  r  slicer  r  r  r  r  r  r  r  r  sortedsetr  r  r  r	  r  r  r  r  r<   r<   r<   r=   <module>   s    


T

/	
!

P
!-#q&?1?





!M
!	
,
-:C

		
(

