a
    �ù»j
C ã                   @   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jt udLg dM¢¡dNdO„ ƒZvejt udPeS¡dQdR„ ƒZwdSdT„ ZxdUdV„ ZydWdX„ ZzdYdZ„ Z{d[d\„ Z|ejt ud]g d^¢¡d_d`„ ƒZ}dadb„ Z~dcdd„ Zdedf„ Z€ejt udgddgg¡dhdi„ ƒZ�ejt udgddgg¡djdk„ ƒZ‚dldm„ Zƒdndo„ Z„ejt udpe:e>ƒ e/ƒ ƒefe:e>ƒ e.ƒ ƒefe:e>ƒ ƒdqdr„ fe9g ƒdsdr„ fg¡dtdu„ ƒZ…dvdw„ Z†dxdy„ Z‡dzd{„ 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’d�d‘„ Z“d’d“„ Z”d”d•„ Z•G d–d—„ d—eƒZ–d˜d™„ Z—dšd›„ Z˜dœd�„ Z™dždŸ„ Zšd d¡„ e ›e9d¢e`ƒ fd£ecƒ fgƒd¤fe9d¢e`ƒ fd¥d£ecƒ fgƒd¦fe9d¢e`ƒ fd§d£ecƒ fgƒd¦fe9d¢e`ƒ fd¨gƒd¤fe9d©dªebƒ fgƒd«fe9d¬dªebƒ fgƒd«fe8d­ebƒ fd®ebƒ fgƒd¯fe8d°d®ebƒ fd±gƒd²fgg d³¢¡D ƒZœejt ud´eœ¡dµd¶„ ƒZ�d·d¸„ Zžd¹dº„ ZŸd»d¼„ Z d½d¾„ Z¡d¿dÀ„ Z¢dÁdÂ„ Z£ejt udgddgg¡dÃdÄ„ ƒZ¤ejt udÅeMeLg¡dÆdÇ„ ƒZ¥dÈdÉ„ Z¦dÊdË„ Z§dÌdÍ„ Z¨dÎdÏ„ Z©dÐdÑ„ ZªdÒdÓ„ Z«ejt udÔde¬ddÕƒg¡dÖd×„ ƒZ­dØdÙ„ Z®dÚdÛ„ Z¯edÜdÝ�ejt udÞdßdàg¡dádâ„ ƒƒZ°edÜdÝ�dãdä„ ƒZ±dådæ„ Z²edÜdÝ�dçdè„ ƒZ³ejt udÞg dé¢¡dêdë„ ƒZ´G dìdí„ díeƒZµejt udÞe¶e·eJƒdîdïh ƒ¡edÜdÝ�dðdñ„ ƒƒZ¸ejt udÞe¶e·eJƒdîdïh ƒ¡edÜdÝ�dòdó„ ƒƒZ¹ejt udÞg dô¢¡dõdö„ ƒZºedÜdÝ�d÷dø„ ƒZ»ejt udùddgg¡edÜdÝ�dúdû„ ƒƒZ¼edÜdÝ�düdý„ ƒZ½edÜdÝ�dþdÿ„ ƒZ¾edÜdÝ�ejt u�d eCeBg¡�d�d„ ƒƒZ¿d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<   úAE:\soccer\ml_env\Lib\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 s�0    Y  tƒ }t d|fgƒ}|jdd�tf d d |d	œ|jd
d�¤ŽksÜJ ‚|j	dd� |j
dksöJ ‚|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 �sª0    Y  |j	dd� |jdk�sÐJ ‚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�sÊJ ‚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Úfilter1Z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 sœ0    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s–J ‚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 s¤0    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 s„0    Y  t d¡}tjt|d�� | jdd� W d   ƒ n1 sÈ0    Y  d S )	NÚclszžInvalid parameter 'fake' for estimator Pipeline(steps=[('cls', LinearRegression())]). Valid parameters are: ['memory', 'steps', 'transform_input', 'verbose'].r{   Znope)Zfake)Zfake__estimatorzŒInvalid 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ƒsˆJ ‚|t|j
jƒv sœJ ‚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sŒJ ‚| | ¡}
|
j||fks¨J ‚| | ¡}|j||fksÄJ ‚| | ¡}|j||fksàJ ‚| | |¡ 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 sŠJ ‚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�sŠJ ‚d}
tdtƒ fdtƒ fgƒ}tjt|
d�� | |¡ W d   ƒ n1 �sÖ0    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 s„0    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s€J ‚|jdd�}|jdd�}|d	= |d	= ||ks°J ‚d
}t	j
t|d�� || |d…  W d   ƒ n1 sæ0    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 sˆ0    Y  t t¡� |d  W d   ƒ n1 sº0    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s’J ‚|j|d� d|fg|jks²J ‚|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s„J ‚|jj|u s”J ‚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sˆJ ‚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ƒ�sŠJ ‚|t|
jjƒv �s J ‚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ƒr’J ‚| j t| dƒr¦J ‚t tƒ tƒ ƒ} t| dƒrÂJ ‚| j t| dƒrÖJ ‚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s‚J ‚|jd d dks˜J ‚|jd d dks®J ‚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 )zªCheck 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 )z Check 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s–J ‚| | ¡ | | ¡}|j|jksºJ ‚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:    þÿþûþû





r4  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 sº0    Y  d S )Nr.  r/  Zchar_wb)r£   r£   )r0  Zngram_ranger1  r-  Zchars__Zwords__é#   Ztr1rX   zDTransformer tr1 (type Transf) does not provide get_feature_names_outr{   )r   r   rG   r3  Ú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    

ÿr9  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 sž0    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<   r@  r<   r<   r=   r%  
  r  c                 S   s   dgS )NZx5r<   r@  r<   r<   r=   r%    r  r  r	  rX   Úm2__x2Úm3__x3r
  Zm5__x5rÚ   )rÞ   Zmock__x3r  Zmock__x5)	rW   r6  r   r2   rP   r_   r`   rÞ   rM   )r  r  r  r7  r<   r<   r=   Útest_set_feature_union_steps  s$    


 rF  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 rB  r<   r@  r<   r<   r=   r%  %  r  z2test_set_feature_union_step_drop.<locals>.<lambda>c                 S   s   dgS r>  r<   r@  r<   r<   r=   r%  &  r  rX   r  r	  rD  rE  Údropr  r  )r  rG  )
rW   r6  r_   r`   r   r2   rG   rP   r¹   rM   )r  r  rE   r7  r<   r<   r=   Ú test_set_feature_union_step_drop!  s.    

rH  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 rB  r<   r@  r<   r<   r=   r%  K  r  z4test_set_feature_union_passthrough.<locals>.<lambda>c                 S   s   dgS r>  r<   r@  r<   r<   r=   r%  L  r  rX   r  r	  rD  rE  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´   )rI  rJ  rK  rL  Úpca__f0Úpca__f1Úpca__f2Úpca__f3)r—   )Zpassthrough__pca0Zpassthrough__pca1rQ  rR  rS  rT  rë   )rW   r6  r_   r`   r   r2   rG   rP   r¹   rM   r�   rž   r¸   r   Zhstack)r  r  rE   r7  Úcolumnsr´   ZX_ftr<   r<   r=   Ú"test_set_feature_union_passthroughD  s~    

ÿ
& ÷

õ("÷
þ*$÷rV  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  )rM  rN  Zpassthrough__x0Zpassthrough__x1Zpassthrough__x2Zpassthrough__x3N©r�   rž   r   r   rG   r2   r6  ©rE   r´   r7  r<   r<   r=   Ú9test_feature_union_passthrough_get_feature_names_out_trueµ  s    
÷rY  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Úx1rC  r?  NrW  rX  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 s–0    Y  dS )zFCheck get_feature_names_out and non-verbose names and colliding names.ÚpandasrX   r”   r£   r9   r:   ©rU  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!  FrZ  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Œ   r6  )ÚpdrE   Zselect_aÚunionr�   r<   r<   r=   ÚAtest_feature_union_passthrough_get_feature_names_out_false_errorsß  s    
ÿþ
ÿrd  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 s€0    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—   FrZ  z”Output 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`  ra  r÷   Úranger   rG   rŠ   r‹   r„   rŒ   r6  )rb  rE   rc  r�   r<   r<   r=   ÚPtest_feature_union_passthrough_get_feature_names_out_false_errors_overlap_over_5ö  s    
&þ
ÿrh  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 sÖ0    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 �s‚0    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 �sô0    Y  tjt|	d��" |
 dggdg¡ W d   ƒ qˆ1 �s60    Y  qˆqLd 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rl  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:   gü©ñÒMbP?)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    rn  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�s¨J ‚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_2rr  Zcached_pipe_2r<   r<   r=   Útest_pipeline_memory8  s^    ÿÿÿÿ

þry  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ê   ro  rq  r”   )
r   rs  rt  r!   rq   r%   rô   rÆ   ru  rv  )rw  rô   rŽ   r<   r<   r=   Útest_make_pipeline_memoryw  s    rz  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;   rA  r<   r<   r=   r6  ‹  s    z&FeatureNameSaver.get_feature_names_out)N)N)N)r?   r@   rA   rG   rP   r6  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   r6  r8  )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   r3  rG   r2   r6  )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»   r6  )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‰  rG  )r  rG  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r¦dks¬n J ‚t|dƒrºJ ‚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r–dksœn 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 sš0    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_msgrc  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	|ƒr–t
|dƒ | ||¡t t||ƒ¡ksÄJ ‚n.t|| ¡ ƒ | ||¡t t||ƒ¡ksÄJ ‚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 sÀ0    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   rc  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 )Nr@  c                 S   s   g | ]}d |› �‘qS ©Z
my_prefix_r<   ©r  r  r<   r<   r=   r  Ø  r  zƒtest_pipeline_get_feature_names_out_passes_names_through.<locals>.AddPrefixStandardScalar.get_feature_names_out.<locals>.<listcomp>)Zdtype)Úsuperr6  r_   r`   Úobject)r;   rA  ræ   ©Ú	__class__r<   r=   r6  Ö  s    zotest_pipeline_get_feature_names_out_passes_names_through.<locals>.AddPrefixStandardScalar.get_feature_names_out)N)r?   r@   rA   r6  Ú__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   r8  r6  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ƒ   r`  r   r!   r$   r   Ú
set_outputrG   r6  Ú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ƒ   r`  r   r   r   r$   r   r½  rG   rP   r¼   ra  r2   rU  r6  Úindex)rb  rE   r  ZX_trainZX_testrc  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_merG  r~  r—   rÃ  rG  N)r$   r   r   )rÀ  r´   rc  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Å  rc  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ƒs„J ‚t| j|j	ƒ |  
¡ }tdgƒ}| |¡ t|dƒr¼J ‚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ƒ   r`  r   r$   rG   r   r  r2   rU  r¾  Zto_numpy)rE   r  rÈ   rc  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 sš0    Y  tjdd��$ t d¡ | 
| ¡ W d   ƒ n1 sÚ0    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 )z«Get 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™  rm  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¢  rm  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¢  rm  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>.StatelessEstimatorzñStateless 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÷  rm  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 )z Set 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Ö  Útrsrm  )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 s¦0    Y  dS )zBTest that metadata is not routed for pipelines when not requested.rX   r9   rm  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 )z�Test that the right error message is raised when metadata is passed while
    not supported when `enable_metadata_routing=False`.rm  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  rm  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 )z�Test that the pipeline works when there is not last step.

    It should just ignore and pass through the data on transform.
    r  rm  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 sŒ0    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|ƒsòJ ‚|D ]}tf |dddœ|¤Ž qöqØd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Š   ru  rt   rÎ  Útempfiler   rs  Ú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Ÿ   r3  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,  r4  r9  r=  rF  rH  rV  rY  r\  rd  rh  rl  rn  ry  rz  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ÿ

		
(

ÿ