U
    ½mœd]; ã                   @   sÎ  d 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ZddlZddlmZ ddlZddlZddlmZ ddlZddlmZmZmZmZmZmZmZmZ dd	lm Z 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+ ddl*m,Z, ddl*m-Z- ddl.m/Z/ ddl.m0Z0 ddl.m1Z1 ddl.m2Z2 ddl.m3Z3 ddl.m4Z4 ddl.m5Z5 ddl.m6Z6 ddl.m7Z7 ddl.m8Z8 ddl.m9Z9 ddl.m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@mAZA ddlBmCZC dd lBmDZD dd!lEmFZF dd"lGmHZH dd#lGmIZI dd$lGmJZJ dd%lKmLZL dd&lKmMZM dd'lKmNZN dd(lKmOZO dd)lKmPZP dd*lKmQZQ dd+lKmRZR dd,lSmTZT dd-lUmVZV dd.lWmXZX dd/lYmZZZm[Z[m\Z\ dd0l]m^Z^ dd1l_m`Z` G d2d3„ d3ƒZaG d4d5„ d5e@ƒZbe cd6d6gd7d6gd8d8gd9d8gg¡Zde cd8d8d9d9g¡Zed:d;„ Zfejg hd<e9e
e:d=d>�g¡ejg hd?deid@fdAdgidgeidBfdAdieidCfg¡dDdE„ ƒƒZjdFdG„ ZkdHdI„ ZldJdK„ Zmejg hdLe7e8g¡dMdN„ ƒZnedOdP„ ƒZodQdR„ ZpdSdT„ ZqdUdV„ ZrdWdX„ ZsdYdZ„ Ztd[d\„ Zud]d^„ Zvd_d`„ Zwdadb„ Zxdcdd„ Zydedf„ Zzdgdh„ Z{didj„ Z|G dkdl„ dle'ƒZ}edmdn„ ƒZ~dodp„ Zdqdr„ Z€ejg hdsd6d9g¡ejg hdte8e7g¡dudv„ ƒƒZ�dwdx„ Z‚dydz„ Zƒd{d|„ Z„d}d~„ Z…edd€„ ƒZ†d�d‚„ Z‡dƒd„„ Zˆd…d†„ Z‰d‡dˆ„ ZŠd‰dŠ„ Z‹d‹dŒ„ ZŒd�dŽ„ Z�ejg hd�e7d�d‘d8d=giife8d‘d8d=gid9d’œfg¡d“d”„ ƒZŽd•d–„ Z�d—d˜„ Z�d™dš„ Z‘d›dœ„ Z’ejg hdte8eDƒ d�džd=gidŸ�e7eDƒ d�džd=gid �g¡d¡d¢„ ƒZ“ejg hdte8eId£d¤�d¥džd=gid¦d§�e7eId£d¤�d¥džd=gid¦d¨�g¡d©dª„ ƒZ”d«d¬„ Z•d­d®„ Z–eƒ 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Æ„ Z¢dÇdÈ„ Z£dÉdÊ„ Z¤dËdÌ„ Z¥dÍdÎ„ Z¦dÏdÐ„ Z§dÑdÒ„ Z¨dÓdÔ„ Z©ejg hdÕdÖd£g¡ejg hd�e7d�d�d9d×dždØgiife8d�d9d×dždØgidÙd’œfg¡dÚdÛ„ ƒƒZªdÜdÝ„ Z«dÞdß„ Z¬dàdá„ Z­dâdã„ Z®dädå„ Z¯dædç„ Z°dèdé„ Z±ejg hdêd£dÖg¡dëdì„ ƒZ²dídî„ Z³dïdð„ Z´ejg hdñe7dòdódôgife8dòe%d8d×ƒifg¡dõdö„ ƒZµejg hdñe7d÷dódôgife8d÷e%dôdóƒifg¡dødù„ ƒZ¶ejg ·dú¡ejg hdLe7e8g¡ejg hdûeeg¡düdý„ ƒƒƒZ¸ejg hdÕd£dÖg¡dþdÿ„ ƒZ¹dS (   zTest the search moduleé    )ÚIterableÚSized)ÚStringIO)ÚchainÚproduct)ÚpartialN)ÚGeneratorType)Úassert_array_equalÚassert_array_almost_equalÚassert_allcloseÚassert_almost_equalÚignore_warningsÚMinimalClassifierÚMinimalRegressorÚMinimalTransformer)ÚCheckingClassifierÚMockDataFrame)Ú	bernoulliÚexponÚuniform)ÚBaseEstimatorÚClassifierMixin)Úis_classifier)Úmake_classification)Ú
make_blobs)Úmake_multilabel_classification)Útrain_test_split)ÚKFold)ÚStratifiedKFold)ÚStratifiedShuffleSplit)ÚLeaveOneGroupOut)ÚLeavePGroupsOut)Ú
GroupKFold)ÚGroupShuffleSplit)ÚGridSearchCV)ÚRandomizedSearchCV)ÚParameterGrid)ÚParameterSampler)ÚBaseSearchCV)ÚFitFailedWarning)Ú	LinearSVCÚSVC)ÚDecisionTreeRegressor)ÚDecisionTreeClassifier)ÚKMeans)ÚKernelDensity)ÚLocalOutlierFactor)ÚKNeighborsClassifier©Úf1_score)Úrecall_score)Úaccuracy_score)Úmake_scorer)Úroc_auc_score)Úconfusion_matrix)Úr2_score)Úeuclidean_distances)ÚSimpleImputer)ÚPipeline)ÚRidgeÚSGDClassifierÚLinearRegression)ÚHistGradientBoostingClassifier)ÚOneTimeSplitterc                   @   sb   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZeZ	eZ
eZddd„Zddd„Zdd„ ZdS )ÚMockClassifierz8Dummy classifier to test the parameter search algorithmsr   c                 C   s
   || _ d S ©N©Ú	foo_param)ÚselfrE   © rG   úb/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/sklearn/model_selection/tests/test_search.pyÚ__init__P   s    zMockClassifier.__init__c                 C   s$   t |ƒt |ƒkst‚t |¡| _| S rC   )ÚlenÚAssertionErrorÚnpÚuniqueÚclasses_©rF   ÚXÚYrG   rG   rH   ÚfitS   s    zMockClassifier.fitc                 C   s
   |j d S ©Nr   ©Úshape)rF   ÚTrG   rG   rH   ÚpredictX   s    zMockClassifier.predictc                 C   s
   || j  S rC   rD   ©rF   rP   rG   rG   rH   Ú	transform[   s    zMockClassifier.transformc                 C   s
   || j  S rC   rD   rX   rG   rG   rH   Úinverse_transform^   s    z MockClassifier.inverse_transformNc                 C   s   | j dkrd}nd}|S )Né   ç      ð?ç        rD   )rF   rP   rQ   ÚscorerG   rG   rH   r^   e   s    
zMockClassifier.scoreFc                 C   s
   d| j iS ©NrE   rD   )rF   ÚdeeprG   rG   rH   Ú
get_paramsl   s    zMockClassifier.get_paramsc                 K   s   |d | _ | S r_   rD   )rF   ÚparamsrG   rG   rH   Ú
set_paramso   s    
zMockClassifier.set_params)r   )NN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rI   rR   rW   rY   rZ   Úpredict_probaÚpredict_log_probaÚdecision_functionr^   ra   rc   rG   rG   rG   rH   rB   M   s   


rB   c                   @   s   e Zd ZdZedd„ ƒZdS )ÚLinearSVCNoScorez0A LinearSVC classifier that has no score method.c                 C   s   t ‚d S rC   )ÚAttributeError©rF   rG   rG   rH   r^   w   s    zLinearSVCNoScore.scoreN)rd   re   rf   rg   Úpropertyr^   rG   rG   rG   rH   rk   t   s   rk   éÿÿÿÿéþÿÿÿr[   é   c                    s*   t ˆ ƒ‡ fdd„ttˆ ƒƒD ƒks&t‚d S )Nc                    s   g | ]}ˆ | ‘qS rG   rG   ©Ú.0Úi©ÚgridrG   rH   Ú
<listcomp>�   s     z3assert_grid_iter_equals_getitem.<locals>.<listcomp>)ÚlistÚrangerJ   rK   ru   rG   ru   rH   Úassert_grid_iter_equals_getitem€   s    rz   Úklassé
   ©Ún_iterz input, error_type, error_messagez1Parameter .* a dict or a list, got: 0 of type intÚfooz Parameter .* is not a dict \(0\)z}Parameter (grid|distribution) for parameter 'foo' (is not|needs to be) (a list or a numpy array|iterable or a distribution).*c              	   C   s&   t j||d�� | |ƒ W 5 Q R X d S )N©Úmatch)ÚpytestÚraises)r{   ÚinputZ
error_typeÚerror_messagerG   rG   rH   Útest_validate_parameter_input„   s    r†   c               	   C   sv  ddddgi} t | ƒ}t|tƒs$t‚t|tƒs2t‚t|ƒdksBt‚t|ƒ ddgdddgd	œ}t |ƒ}t|ƒd
ksvt‚tdƒD ]>}tdd„ |D ƒƒ}|tdd„ t	|d |d ƒD ƒƒks~t‚q~t|ƒ t i ƒ}t|ƒdksÞt‚t
|ƒi gksðt‚t|ƒ t t¡� |d  W 5 Q R X t dddgii ddgigƒ}t|ƒdk�sDt‚t
|ƒddiddii ddigk�sjt‚t|ƒ d S )Nr   r[   rq   é   é   ZhamÚspamÚeggs)r   Úbaré   c                 s   s"   | ]}t tt| ¡ ƒŽ ƒV  qd S rC   )Útupler   ÚsortedÚitems©rs   ÚprG   rG   rH   Ú	<genexpr>¨   s     z&test_parameter_grid.<locals>.<genexpr>c                 s   s   | ]\}}d |d|fV  qdS )r‹   r   NrG   )rs   ÚxÚyrG   rG   rH   r’   ©   s    r‹   ÚCr|   ç      à?)r&   Ú
isinstancer   rK   r   rJ   rz   ry   Úsetr   rx   r‚   rƒ   Ú
IndexError)Zparams1Zgrid1Zparams2Zgrid2rt   ZpointsÚemptyZ	has_emptyrG   rG   rH   Útest_parameter_grid—   s2    
ÿ&r›   c               	   C   s¾   t ƒ } t| ddddgiddd�}tj}tƒ t_| tt¡ |t_|jj	dksPt
‚t|jd jdddgƒ | tt¡ | t¡ | t¡ | t¡ d|_t t¡� | tt¡ W 5 Q R X d S )NrE   r[   rq   r‡   ©ÚcvÚverboseZparam_foo_paramZsklearn)rB   r$   ÚsysÚstdoutr   rR   rP   r”   Úbest_estimator_rE   rK   r	   Úcv_results_Údatar^   rh   rj   rY   Úscoringr‚   rƒ   Ú
ValueError)ÚclfÚgrid_searchZ
old_stdoutrG   rG   rH   Útest_grid_search¼   s    


r¨   c                  C   sà   t dtƒ fgƒ} dtƒ tƒ gi}t| |dd�}| tt¡ |jd }t|d tƒsVt	‚t|d tƒsht	‚t
|d dƒrzt	‚t
|d dƒrŒt	‚|d |jk	sžt	‚|d |jk	s°t	‚t
|d d dƒrÆt	‚t
|d d dƒrÜt	‚d S )NZ	regressorrq   ©r�   Zparam_regressorr   r[   Zcoef_)r<   r?   r=   r$   rR   rP   r”   r¢   r—   rK   Úhasattrr¡   )ÚpipeÚ
param_gridr§   Zregressor_resultsrG   rG   rH   Útest_grid_search_pipeline_stepsÕ   s    
r­   ÚSearchCVc              	   C   sæ   t  d¡ dd¡}t  dgd dgd  ¡}tddgd�}| |d	dd
dgid
dd�}d}tjt|d�� |j||t  	d¡d� W 5 Q R X d}tjt|d��$ |j||t  	d¡t  
d¡d� W 5 Q R X |j||t  	d¡t  
d¡d� d S )Néd   r|   r   é   r[   r‰   rŠ   )Zexpected_fit_paramsrE   rq   r‡   Úraise©r�   Úerror_scorez0Expected fit parameter\(s\) \['eggs'\] not seen.r€   )r‰   z)Fit parameter spam has length 1; expected)r‰   rŠ   )rL   ÚarangeÚreshapeÚarrayr   r‚   rƒ   rK   rR   ÚonesÚzeros)r®   rP   r”   r¦   ZsearcherÚerr_msgrG   rG   rH   Útest_SearchCV_with_fit_paramsç   s     (rº   c               	   C   sÐ   t dd�} tddd�\}}dddg}tdd�}t| d|id	d
�}| ||¡ t|d|id	d
�}| ||¡ |j|jkszt‚| ||¡| ||¡ks–t‚t|d|iƒ}tj	t
dd�� | dgg¡ W 5 Q R X d S )Nr   ©Úrandom_staterq   ©r¼   Úcentersçš™™™™™¹?r[   r|   r•   Úaccuracy©r¤   z
no scoringr€   )r*   r   rk   r$   rR   Úbest_params_rK   r^   r‚   rƒ   Ú	TypeError)r¦   rP   r”   ÚCsZclf_no_scorer§   Zgrid_search_no_scorerG   rG   rH   Útest_grid_search_no_scoreú   s    


rÅ   c                  C   sî   t ddddd�\} }tdd�}ddgi}t||d d	� | |¡}t||d
d	� | |¡}ttƒ |dd	� | |¡}t||dd	� | |¡}| | |¡}| | |¡}	| | |¡}
| | |¡}|dk s¾t‚|	dk sÊt‚||	ksÖt‚t|	|ƒ t||
ƒ d S )Nr¯   rq   çš™™™™™É?r   ©Ú	n_samplesÚ	n_classesZflip_yr¼   r»   r•   r¿   rÁ   rÀ   Úroc_aucr\   )r   r*   r$   rR   rk   r^   rK   r   )rP   r”   r¦   rv   Zsearch_no_scoringZsearch_accuracyZsearch_no_score_method_aucZ
search_aucZscore_no_scoringZscore_accuracyZscore_no_score_aucZ	score_aucrG   rG   rH   Útest_grid_search_score_method  s.    

  ÿ þ
rË   c               
   C   sà   t j d¡} tdddd�\}}|  ddd¡}tdd�}ddgi}tƒ tdƒtdd	�t	ƒ g}d
}|D ]H}t
|||d�}	tjt|d�� |	 ||¡ W 5 Q R X |	j|||d� qbtƒ tƒ g}
|
D ]}t
|||d�}	|	 ||¡ q¼d S )Nr   é   rq   )rÈ   rÉ   r¼   r‡   r»   r•   r[   ©Ún_splitsz*The 'groups' parameter should not be None.r©   r€   )Úgroups)rL   ÚrandomÚRandomStater   Úrandintr*   r    r!   r"   r#   r$   r‚   rƒ   r¥   rR   r   r   )ÚrngrP   r”   rÏ   r¦   rv   Z	group_cvsÚ	error_msgr�   ÚgsZnon_group_cvsrG   rG   rH   Útest_grid_search_groups/  s(    

ürÖ   c                  C   sì   t  d¡ dd¡} t  dgd dgd  ¡}dddg}ttdd�d|iƒ}| | |¡ t|jj	|j	ƒ tt
ƒ d	d
dgiƒ}| | |¡ t|dƒr”t‚ttdd�d|iƒ}t|dƒr¶t‚ttdd�d|idd�}| | |¡ t|dƒrèt‚d S )Nr¯   r|   r   r°   r[   r¿   r»   r•   Úalphar\   g       @rN   F)Úrefit)rL   r´   rµ   r¶   r$   r*   rR   r	   r¡   rN   r=   rª   rK   )rP   r”   rÄ   r§   rG   rG   rH   Útest_classes__propertyN  s    
rÙ   c                  C   sh   t ƒ } t| ddgidd�}| tt¡ t|dƒs4t‚t| ddgiddd�}| tt¡ t|dƒsdt‚d S )NrE   r[   r‡   r©   r¢   r   )r~   r�   )rB   r$   rR   rP   r”   rª   rK   r%   )r¦   r§   Úrandom_searchrG   rG   rH   Útest_trivial_cv_results_attrg  s    rÛ   c                  C   sè   t ƒ } d ddgfD ]Š}t| ddddgiddd�}| tt¡ t|d	ƒsZt|d
ƒrZt|dƒs^t‚dD ]8}d|› d�}tjt	|d�� t
||ƒtƒ W 5 Q R X qbqd}dD ]<}tjt|d��$ t| i |dddœd� tt¡ W 5 Q R X q¦d S )NrÀ   Ú	precisionrE   r[   rq   r‡   F©rØ   r�   r¡   Úbest_index_rÂ   )rW   rh   ri   rY   rZ   z`refit=False`. z9 is available only after refitting on the best parametersr€   zIFor multi-metric scoring, the parameter refit must be set to a scorer key)Ú r°   TÚrecallrÀ   )ÚaccÚprec)rØ   r¤   )rB   r$   rR   rP   r”   rª   rK   r‚   rƒ   rl   Úgetattrr¥   )r¦   r¤   r§   Úfn_namerÔ   rØ   rG   rG   rH   Útest_no_refits  s8    ÿþý
ÿÿ   ÿ þrå   c               	   C   sX   t dddd�\} }tƒ }t|dddgiƒ}t t¡� | | d d… |¡ W 5 Q R X d S )	NéÈ   r¯   r   ©rÈ   Ú
n_featuresr¼   r•   r¿   r\   é´   )r   r*   r$   r‚   rƒ   r¥   rR   )ÚX_Úy_r¦   r�   rG   rG   rH   Útest_grid_search_errorš  s
    rì   c                  C   sr   t dddd�\} }dgdgdgdœ}td	d
�}t||ƒ}| | |¡ tdddd�}| | |¡ t|j|jjƒ d S )Nræ   r¯   r   rç   r\   Úrbfr¿   )r•   ÚkernelÚgammaÚauto©rï   )r   r+   r$   rR   r	   Z
dual_coef_r¡   )rê   rë   Ú
param_dictr¦   r�   rG   rG   rH   Útest_grid_search_one_grid_point¤  s    

ró   c                  C   sB   t ƒ } d }t| dtddƒidd�}| tt¡ |jjdks>t‚d S )NrE   r[   rˆ   r‡   r©   rq   )	rB   r$   ry   rR   rP   r”   r¡   rE   rK   )r¦   r§   rG   rG   rH   Ú/test_grid_search_when_param_grid_includes_range²  s
    rô   c               	   C   s6  t dddd�\} }ddi}tdd�}t d	¡}t||ƒ}tjt|d
�� | | |¡ W 5 Q R X dg i}tƒ }t d¡}t||ƒ}tjt	|d
�� | | |¡ W 5 Q R X ddi}tdd�}t d¡}t||ƒ}tjt|d
�� | | |¡ W 5 Q R X dt
 d¡i}tƒ }t||ƒ}t t	¡� | | |¡ W 5 Q R X d S )Nr|   r°   r   rç   r•   r[   rð   rñ   z£Parameter grid for parameter 'C' needs to be a list or a numpy array, but got 1 (of type int) instead. Single values need to be wrapped in a list with one element.r€   zIParameter grid for parameter 'C' need to be a non-empty sequence, got: []z1,2,3z©Parameter grid for parameter 'C' needs to be a list or a numpy array, but got '1,2,3' (of type str) instead. Single values need to be wrapped in a list with one element.)r‡   rq   )r   r+   ÚreÚescaper$   r‚   rƒ   rÃ   rR   r¥   rL   r·   )rP   r”   rò   r¦   rÔ   ÚsearchrG   rG   rH   Útest_grid_search_bad_param_grid»  s<    
ÿ
ÿ

ÿ

rø   c                  C   sâ   t dddd�\} }tƒ }t|dddgiƒ}| | d d… |d d… ¡ | | dd … ¡}|jj}t | ¡} tƒ }t|dddgiƒ}| | d d…  	¡ |d d… ¡ | | dd … ¡}|jj}t
 ||k¡d	ksÒt‚||ksÞt‚d S )
Nræ   r¯   r   rç   r•   r¿   r\   ré   gÍÌÌÌÌÌì?)r   r*   r$   rR   rW   r¡   r•   ÚspÚ
csr_matrixZtocoorL   ÚmeanrK   )rê   rë   r¦   r�   Úy_predr•   Úy_pred2ÚC2rG   rG   rH   Útest_grid_search_sparseã  s    
 rÿ   c                  C   sR  t dddd�\} }tƒ }t|dddgidd	�}| | d d
… |d d
… ¡ | | d
d … ¡}|jj}t | ¡} tƒ }t|dddgidd	�}| | d d
… |d d
… ¡ | | d
d … ¡}|jj}t	||ƒ ||ksÖt
‚dd„ }t|dd�}	t|dddgi|	d	�}| | d d
… |d d
… ¡ | | d
d … ¡}
|jj}||k�sDt
‚t	||
ƒ d S )Nræ   r¯   r   rç   r•   r¿   r\   Úf1rÁ   ré   c                 S   s   t | |ƒ S rC   r2   )Zy_true_Zy_pred_rG   rG   rH   Úf1_loss  s    z0test_grid_search_sparse_scoring.<locals>.f1_lossF)Zgreater_is_better)r   r*   r$   rR   rW   r¡   r•   rù   rú   r	   rK   r6   )rê   rë   r¦   r�   rü   r•   rý   rþ   r  ZF1LossZy_pred3ZC3rG   rG   rH   Útest_grid_search_sparse_scoringø  s,    

r  c            	   	   C   sæ   t dddd�\} }t | d d… | d d… j¡}|d d… }tdd�}t|dd	d
giƒ}| ||¡ |jdksrt‚t | dd … | d d… j¡}|dd … }| 	|¡}t 
||k¡dks¼t‚t t¡� | | ¡ |¡ W 5 Q R X d S )Nræ   r¯   r   rç   ré   Úprecomputed©rî   r•   r¿   r\   )r   rL   ÚdotrV   r+   r$   rR   Úbest_score_rK   rW   rû   r‚   rƒ   r¥   Útolist)	rê   rë   ÚK_trainÚy_trainr¦   r�   ZK_testZy_testrü   rG   rG   rH   Ú#test_grid_search_precomputed_kernel  s    

r
  c               	   C   sV   t  d¡} t  d¡}tdd�}t|dddgiƒ}t t¡� | | |¡ W 5 Q R X d S )N)r|   é   )r|   r  r  r•   r¿   r\   )	rL   r¸   r·   r+   r$   r‚   rƒ   r¥   rR   )r  r	  r¦   r�   rG   rG   rH   Ú3test_grid_search_precomputed_kernel_error_nonsquare9  s    


r  c                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
ÚBrokenClassifierz*Broken classifier that cannot be fit twiceNc                 C   s
   || _ d S rC   ©Ú	parameter©rF   r  rG   rG   rH   rI   G  s    zBrokenClassifier.__init__c                 C   s   t | dƒrt‚d| _d S )NÚhas_been_fit_T)rª   rK   r  ©rF   rP   r”   rG   rG   rH   rR   J  s    zBrokenClassifier.fitc                 C   s   t  |jd ¡S rS   ©rL   r¸   rU   rX   rG   rG   rH   rW   N  s    zBrokenClassifier.predict)N)rd   re   rf   rg   rI   rR   rW   rG   rG   rG   rH   r  D  s   
r  c                  C   sX   t  d¡ dd¡} t  dgd dgd  ¡}ttƒ dddgigddd	�}| | |¡ d S )
Nr¯   r|   r   r°   r[   r  rÜ   T©r¤   rØ   )rL   r´   rµ   r¶   r$   r  rR   )rP   r”   r¦   rG   rG   rH   Ú
test_refitR  s       ÿr  c                  C   sf   dd„ } t dddd�\}}ttdd�dd	d
dgid| d�}| ||¡ |jdksTt‚t|dƒrbt‚dS )z^
    Test refit=callable, which adds flexibility in identifying the
    "best" estimator.
    c                 S   st   t dddd�\}}ttdd�dddd	gid
dd�}| ||¡ |jdksLt‚|j ¡ D ]}|| ksVt‚qV| d  ¡ S )z–
        A dummy function tests `refit=callable` interface.
        Return the index of a model that has the least
        `mean_test_score`.
        r¯   rˆ   é*   rç   r»   r•   ç{®Gáz„?r¿   r[   rÜ   Tr  r   Úmean_test_score)	r   r$   r*   rR   rÞ   rK   r¢   ÚkeysÚargmin)Ú
cv_resultsrP   r”   r¦   ÚkeyrG   rG   rH   Úrefit_callablef  s    üz+test_refit_callable.<locals>.refit_callabler¯   rˆ   r  rç   r»   r•   r  r¿   r[   rÜ   r  r   r  N)r   r$   r*   rR   rÞ   rK   rª   )r  rP   r”   r¦   rG   rG   rH   Útest_refit_callable`  s    ür  c               	   C   sb   dd„ } t dddd�\}}ttdd�dd	d
gid| d�}tjtdd�� | ||¡ W 5 Q R X dS )zb
    Test implementation catches the errors when 'best_index_' returns an
    invalid result.
    c                 S   s   dS )zT
        A dummy function tests when returned 'best_index_' is not integer.
        NrG   ©r  rG   rG   rH   Úrefit_callable_invalid_type“  s    zEtest_refit_callable_invalid_type.<locals>.refit_callable_invalid_typer¯   rˆ   r  rç   r»   r•   r¿   r[   rÜ   r  z&best_index_ returned is not an integerr€   N)r   r$   r*   r‚   rƒ   rÃ   rR   )r   rP   r”   r¦   rG   rG   rH   Ú test_refit_callable_invalid_type�  s    
ür!  Úout_bound_valueÚ	search_cvc              	      sf   ‡ fdd„}t dddd�\}}|tdd�dd	d
gid|d�}tjtdd�� | ||¡ W 5 Q R X dS )zg
    Test implementation catches the errors when 'best_index_' returns an
    out of bound result.
    c                    s   ˆ S )zV
        A dummy function tests when returned 'best_index_' is out of bounds.
        rG   r  ©r"  rG   rH   Úrefit_callable_out_bound­  s    z?test_refit_callable_out_bound.<locals>.refit_callable_out_boundr¯   rˆ   r  rç   r»   r•   r¿   r[   rÜ   r  zbest_index_ index out of ranger€   N)r   r*   r‚   rƒ   r™   rR   )r"  r#  r%  rP   r”   r¦   rG   r$  rH   Útest_refit_callable_out_bound¥  s    
ür&  c                  C   st   dd„ } t dddd�\}}ttƒddœ}ttdd	�d
dddgi|| d�}| ||¡ |jdksbt‚t|dƒrpt‚dS )zC
    Test refit=callable in multiple metric evaluation setting
    c                 S   s   d| kst ‚| d  ¡ S )z•
        A dummy function tests `refit=callable` interface.
        Return the index of a model that has the least
        `mean_test_prec`.
        Zmean_test_prec)rK   r  r  rG   rG   rH   r  Ä  s    z8test_refit_callable_multi_metric.<locals>.refit_callabler¯   rˆ   r  rç   rÜ   )ZAccuracyrâ   r»   r•   r  r¿   r[   r  r   r  N)	r   r6   r5   r$   r*   rR   rÞ   rK   rª   )r  rP   r”   r¤   r¦   rG   rG   rH   Ú test_refit_callable_multi_metric¿  s    	ür'  c                  C   s„   t  d¡ dddd¡} t  d¡ ddd¡}d	d
„ }dd„ }t||dgd�}t|ddddgiƒ}| | |¡ tt¡ t	|dƒs€t
‚d S )Né,  r|   r°   r‡   rq   i  é   é   c                 S   s   | j dd … dkS )Nr[   )r°   r‡   rq   rT   ©r“   rG   rG   rH   Úcheck_Xá  s    z#test_gridsearch_nd.<locals>.check_Xc                 S   s   | j dd … dkS )Nr[   )r)  r*  rT   r+  rG   rG   rH   Úcheck_yä  s    z#test_gridsearch_nd.<locals>.check_yrR   )r,  r-  Úmethods_to_checkrE   r[   r¢   )rL   r´   rµ   r   r$   rR   r^   rP   r”   rª   rK   )ZX_4dZy_3dr,  r-  r¦   r§   rG   rG   rH   Útest_gridsearch_ndÜ  s    ýr/  c                  C   sŠ   t  d¡ dd¡} t  dgd dgd  ¡}tdd„ dgd	�}td
d�}t|dddd
gi|d�}| |  ¡ |¡ 	| |¡ t
|dƒs†t‚d S )Nr¯   r|   r   r°   r[   c                 S   s
   t | tƒS rC   ©r—   rx   r+  rG   rG   rH   Ú<lambda>÷  ó    z test_X_as_list.<locals>.<lambda>rR   )r,  r.  r‡   rÍ   rE   rq   r©   r¢   ©rL   r´   rµ   r¶   r   r   r$   rR   r  r^   rª   rK   ©rP   r”   r¦   r�   r§   rG   rG   rH   Útest_X_as_listñ  s    þ
r5  c                  C   sŠ   t  d¡ dd¡} t  dgd dgd  ¡}tdd„ dgd	�}td
d�}t|dddd
gi|d�}| | | ¡ ¡ 	| |¡ t
|dƒs†t‚d S )Nr¯   r|   r   r°   r[   c                 S   s
   t | tƒS rC   r0  r+  rG   rG   rH   r1    r2  z test_y_as_list.<locals>.<lambda>rR   )r-  r.  r‡   rÍ   rE   rq   r©   r¢   r3  r4  rG   rG   rH   Útest_y_as_list   s    þ
r6  c                     sö   t t fg} z"ddlm}m} |  ||f¡ W n tk
r@   Y nX t d¡ dd¡}t 	dgd dgd  ¡}| D ]~\‰ ‰ˆ |ƒˆ|ƒ }}‡ fdd„}‡fd	d
„}t
||d�}	t|	ddddgiƒ}
|
 ||¡ ||¡ |
 |¡ t|
dƒsrt‚qrd S )Nr   )ÚSeriesÚ	DataFramer¯   r|   r°   r[   c                    s
   t | ˆ ƒS rC   ©r—   r+  )ÚInputFeatureTyperG   rH   Úcheck_df!  s    z#test_pandas_input.<locals>.check_dfc                    s
   t | ˆ ƒS rC   r9  r+  )Ú
TargetTyperG   rH   Úcheck_series$  s    z'test_pandas_input.<locals>.check_series)r,  r-  rE   rq   r‡   r¢   )r   Zpandasr7  r8  ÚappendÚImportErrorrL   r´   rµ   r¶   r   r$   rR   r^   rW   rª   rK   )Útypesr7  r8  rP   r”   ZX_dfZy_serr;  r=  r¦   r§   rG   )r:  r<  rH   Útest_pandas_input  s"    

rA  c                  C   sÚ   t ddd�\} }tdddd�}ddg}d	D ]>}t|td
ddgd�||d�}| | |¡ |jd dks*t‚q*t|td
ddgd�dd�}| | |¡ |jd dks¢t‚t|td
ddgd�d�}| | ¡ |jd dksÖt‚d S )Né2   r   ©rÈ   r¼   rÐ   r[   )r¼   ÚinitZn_initÚadjusted_rand_scoreÚfowlkes_mallows_score)rE  rF  rq   r‡   rˆ   )Ú
n_clusters)r¬   r¤   rØ   rG  ©r¬   r¤   ©r¬   )r   r.   r$   ÚdictrR   rÂ   rK   )rP   r”   Úkmr¤   rØ   r§   rG   rG   rH   Útest_unsupervised_grid_search/  s,       ÿ  ÿ
rL  c                  C   sv   dd„ } t ddddgddgddggd�\}}ttƒ tdddgd�| d	�}| |¡ |jd
 dksdt‚|jdksrt‚d S )Nc                 S   s   | j dkrdS dS )Nr¿   r  r   ©Ú	bandwidth)Ú	estimatorrP   rG   rG   rH   Úcustom_scoringN  s    z2test_gridsearch_no_predict.<locals>.custom_scoringr¿   r[   r   )Úcluster_stdr¼   r¾   r  rM  rH  rN  r  )r   r$   r/   rJ  rR   rÂ   rK   r  )rP  rP   Ú_r÷   rG   rG   rH   Útest_gridsearch_no_predictK  s    $ý
rS  c                  C   s  ddgt ddƒdœ} t| ddd�}dd	„ |D ƒ}t|ƒdks@t‚|D ]2}|d
 dksXt‚d|d   krpdksDn t‚qDddddddddddddgi} t| ddd�}dd	„ |D ƒdd	„ |D ƒksÄt‚dt ddƒi} t| ddd�}dd	„ |D ƒdd	„ |D ƒk�st‚d S )Nrí   Úlinearr   r[   )rî   r•   r|   )Úparam_distributionsr~   r¼   c                 S   s   g | ]}|‘qS rG   rG   ©rs   r“   rG   rG   rH   rw   b  s     z&test_param_sampler.<locals>.<listcomp>rî   )rí   rT  r•   rq   r‡   rˆ   r°   rŒ   r)  é   é	   c                 S   s   g | ]}|‘qS rG   rG   rV  rG   rG   rH   rw   m  s     c                 S   s   g | ]}|‘qS rG   rG   rV  rG   rG   rH   rw   s  s     )r   r'   rJ   rK   )rU  ÚsamplerÚsamplesÚsamplerG   rG   rH   Útest_param_sampler\  s2      ÿ   ÿ   ÿr\  c                    sª   | j ‰ t‡ fdd„|D ƒƒs t‚t‡ fdd„|D ƒƒs:t‚t‡ fdd„|D ƒƒrTt‚t‡ fdd„|D ƒƒsnt‚| jr~| j ¡ ndg}|D ]}ˆ d|  jtj	ksˆt‚qˆd S )Nc                 3   s    | ]}t ˆ | tjjƒV  qd S rC   ©r—   rL   ÚmaZMaskedArray)rs   Úparamr  rG   rH   r’   y  s     z/check_cv_results_array_types.<locals>.<genexpr>c                 3   s   | ]}ˆ | j tkV  qd S rC   )ÚdtypeÚobject©rs   r  r  rG   rH   r’   z  s     c                 3   s    | ]}t ˆ | tjjƒV  qd S rC   r]  rb  r  rG   rH   r’   {  s     c                 3   s(   | ] }|  d ¡sˆ | jtjkV  qdS )ZrankN)Ú
startswithr`  rL   Úfloat64rb  r  rG   rH   r’   |  s   
þr^   zrank_test_%s)
r¢   ÚallrK   ÚanyÚmultimetric_Úscorer_r  r`  rL   Zint32)r÷   Ú
param_keysÚ
score_keysZscorer_keysr  rG   r  rH   Úcheck_cv_results_array_typesv  s    þrk  c                    sB   t tˆ  ¡ ƒt|| d ƒƒ t‡ ‡fdd„|| D ƒƒs>t‚d S )N)rb   c                 3   s   | ]}ˆ | j ˆfkV  qd S rC   rT   rb  ©r  Ún_candrG   rH   r’   �  s     z(check_cv_results_keys.<locals>.<genexpr>)r	   rŽ   r  re  rK   )r  ri  rj  rm  rG   rl  rH   Úcheck_cv_results_keysˆ  s
    
 ÿrn  c            	         s&  t dddd�\} }d}d}tdgdd	gd
dgd�tdgddgd�g}d}d}|}ttƒ ||dd�}| | |¡ |j‰ tˆ d dkƒsˆt‚‡ fdd„|D ƒsžt‚‡ fdd„|D ƒs´t‚t|||ƒ t	ˆ |||ƒ |j‰ t
|jd ƒ}t‡ fdd„t|ƒD ƒƒ�st‚t‡ fdd„t|ƒD ƒƒ�s"t‚d S )NrB  rˆ   r  rç   r‡   rŒ   rí   r[   r|   r¿   ©rî   r•   rï   Úpolyrq   ©rî   Zdegree©Úparam_CÚparam_degreeÚparam_gammaÚparam_kernel©r  Úmean_train_scoreÚrank_test_scoreZsplit0_test_scoreZsplit1_test_scoreZsplit2_test_scoreZsplit0_train_scoreZsplit1_train_scoreZsplit2_train_scoreÚstd_test_scoreÚstd_train_scoreÚmean_fit_timeÚstd_fit_timeÚmean_score_timeÚstd_score_timeT)r�   r¬   Úreturn_train_scorery  c                 3   s&   | ]}|d krt ˆ | dkƒV  qdS )ry  r   N©re  ©rs   Úkr  rG   rH   r’   À  s      z.test_grid_search_cv_results.<locals>.<genexpr>c                 3   s.   | ]&}d |kr|dkrt ˆ | dkƒV  qdS )Útimery  r[   Nr�  r‚  r  rG   rH   r’   Á  s    þrb   c                 3   sJ   | ]B}ˆ d  | dkrˆ d j | o@ˆ d j | o@ˆ d j |  V  qdS ©rv  rT  rs  ru  rt  N©Úmaskrr   r  rG   rH   r’   Ì  s   ûÿc                 3   sL   | ]D}ˆ d  | dkrˆ d j |  oBˆ d j |  oBˆ d j | V  qdS ©rv  rí   rs  ru  rt  Nr†  rr   r  rG   rH   r’   Õ  s   ûÿ)r   rJ  r$   r+   rR   r¢   re  rK   rk  rn  rJ   ry   )	rP   r”   rÎ   Zn_grid_pointsrb   ri  rj  Ún_candidatesr÷   rG   r  rH   Útest_grid_search_cv_results�  sR    ÿûÿüø   ÿ
þ
ú	úrŠ  c            
         sÞ   t dddd�\} }d}d}dgtdd	�td
d	�dœdgddgdœg}d}d}|}ttƒ |||dd�}| | |¡ |j‰ t|||ƒ tˆ |||ƒ t|jd ƒ}	t	‡ fdd„t
|	ƒD ƒƒs¼t‚t	‡ fdd„t
|	ƒD ƒƒsÚt‚d S )NrB  rˆ   r  rç   r‡   é   rí   r|   )Úscaler¿   ro  rp  rq   rq  rr  rw  T)r~   r�   rU  r€  rb   c                 3   sJ   | ]B}ˆ d  | dkrˆ d j | o@ˆ d j | o@ˆ d j |  V  qdS r…  r†  rr   r  rG   rH   r’     s   ûÿz0test_random_search_cv_results.<locals>.<genexpr>c                 3   sL   | ]D}ˆ d  | dkrˆ d j |  oBˆ d j |  oBˆ d j | V  qdS rˆ  r†  rr   r  rG   rH   r’     s   ûÿ)r   r   r%   r+   rR   r¢   rk  rn  rJ   re  ry   rK   )
rP   r”   rÎ   Ún_search_iterrb   ri  rj  rm  r÷   r‰  rG   r  rH   Útest_random_search_cv_resultsà  s6    þûú	úrŽ  zSearchCV, specialized_paramsr¬   r•   )rU  r~   c                    sÆ  t ddgddgddgddggddddd�\}}tj|jd td�}d|t |dk¡d d d d… < d|t |dk¡d d d d… < || g| |gg}tƒ |d	d
œ}| f ||—Ž‰ ˆ  ||¡ t ‡ fdd„t	ˆ j
ƒD ƒ¡}ˆ jd d }ˆ jd d }	t ‡ fdd„t	ˆ j
ƒD ƒ¡}
ˆ jd d }ˆ jd d }ˆ jd d dk�sJt‚t|ddgƒ t|
ddgƒ |t t |¡¡k�s€t‚|	t t |¡¡k�sšt‚|t d¡k�s®t‚|t d¡k�sÂt‚d S )Nr   r[   r¿   FéP   )r¾   r¼   rQ  ÚshufflerÈ   ©r`  rq   T)rO  r�   r€  c                    s   g | ]}ˆ j d |  d ‘qS )úsplit%d_test_scorer   ©r¢   ©rs   Ús©r÷   rG   rH   rw   ?  s   ÿz+test_search_default_iid.<locals>.<listcomp>r  rz  c                    s   g | ]}ˆ j d |  d ‘qS )zsplit%d_train_scorer   r“  r”  r–  rG   rH   rw   H  s   ÿrx  r{  rs  gUUUUUUÕ?)r   rL   r·   rU   ÚboolÚwherer+   rR   r¶   ry   Ú	n_splits_r¢   rK   r   r‚   Úapproxrû   Zstd)r®   Úspecialized_paramsrP   r”   r‡  r�   Zcommon_paramsZtest_cv_scoresZ	test_meanZtest_stdZtrain_cv_scoresZ
train_meanZ	train_stdrG   r–  rH   Útest_search_default_iid  sF    
û
	  
þÿ
þÿrœ  c                  C   s˜   t dddd�\} }d}tdgddgd	dgd
�tdgddgd�g}g }ttƒttƒdœddfD ].}ttƒ |||dd�}| | |¡ | |¡ q\t	|Ž  d S )NrB  rˆ   r  rç   r‡   rí   r[   r|   r¿   ro  rp  rq   rq  ©rÀ   rà   rÀ   rà   F)r�   r¬   r¤   rØ   )
r   rJ  r6   r5   r4   r$   r+   rR   r>  Ú*compare_cv_results_multimetric_with_single)rP   r”   rÎ   rb   Zgrid_searchesr¤   r§   rG   rG   rH   Ú'test_grid_search_cv_results_multimetric^  s:    ÿûÿüøý    ÿrŸ  c                  C   sÎ   t dddd�\} }d}d}tt ddd¡tjd	d
ddd�d�}dD ]†}g }dD ]\}|rnd}t|tƒrhdn|}nd}t|dd�}	t|	|||||d
d�}
|
 | |¡ | 	|
¡ qNt
|Ž  t|d
 |d |ƒ qBd S )NrB  rˆ   r  rç   r‡   r‹  éüÿÿÿr[   éûÿÿÿr   r¿   )Úbase)r•   rï   ©TF)r�  rÀ   rà   TrÀ   F)Úprobabilityr¼   )r~   r�   rU  r¤   rØ   r¼   )r   rJ  rL   Zlogspacer—   r�   r+   r%   rR   r>  rž  Ú)compare_refit_methods_when_refit_with_acc)rP   r”   rÎ   r�  rb   rØ   Zrandom_searchesr¤   r¤  r¦   rÚ   rG   rG   rH   Ú)test_random_search_cv_results_multimetric�  s:    $ù	  ÿr¦  c                    s–   | j s
t‚tt| jƒdƒ | j‰ dd„ |j ¡ D ƒ}| dd„ |j ¡ D ƒ¡ t‡ fdd„dD ƒƒsht‚t	j
 dd„ ˆ  ¡ D ƒd	d„ | ¡ D ƒ¡ d
S )z€Compare multi-metric cv_results with the ensemble of multiple
    single metric cv_results from single metric grid/random searchr�  c                 S   s    i | ]\}}t  d d|¡|“qS )ú_score$Z	_accuracy©rõ   Úsub©rs   rƒ  ÚvrG   rG   rH   Ú
<dictcomp>­  s     z>compare_cv_results_multimetric_with_single.<locals>.<dictcomp>c                 S   s    i | ]\}}t  d d|¡|“qS )r§  Z_recallr¨  rª  rG   rG   rH   r¬  ±  s      c                 3   s    | ]}t  ˆ | d k¡V  qdS )r[   N)rL   re  r‚  ©Zcv_results_multirG   rH   r’   ·  s   ÿz=compare_cv_results_multimetric_with_single.<locals>.<genexpr>)r~  r  r|  r}  c                 S   s    i | ]\}}|  d ¡s||“qS ©Ú_time©Úendswithrª  rG   rG   rH   r¬  Æ  s     
  c                 S   s    i | ]\}}|  d ¡s||“qS r®  r°  rª  rG   rG   rH   r¬  Ç  s     
  N)rg  rK   r	   rŽ   rh  r¢   r�   Úupdatere  rL   ÚtestingÚassert_equal)Úsearch_multiÚ
search_accZ
search_recZcv_results_acc_recrG   r­  rH   rž  ¥  s$    
ÿÿ
þÿþrž  c                 C   sª   |j |kst‚|r"| j dks0t‚n| j r,t‚dS tdddd�\}}dD ]"}tt| |ƒ|ƒt||ƒ|ƒƒ qFt|  ||¡| ||¡ƒ dD ]}t| |ƒt||ƒksˆt‚qˆdS )	zDCompare refit multi-metric search methods with single metric methodsrÀ   Nr¯   rˆ   r  rç   )rW   rh   ri   )rÞ   r  rÂ   )rØ   rK   r   r   rã   r^   )rµ  r¶  rØ   rP   r”   Úmethodr  rG   rG   rH   r¥  Ë  s    
 ÿr¥  Ú	max_depthr°   )rO  rU  )rO  r¬   c              	   C   sJ   t dddd�\}}|  ||¡ d}tjt|d�� |  |¡ W 5 Q R X d S )Nr¯   rˆ   r  rç   z@'DecisionTreeClassifier' object has no attribute 'score_samples'r€   )r   rR   r‚   rƒ   rl   Úscore_samples)r#  rP   r”   r¹   rG   rG   rH   Ú"test_search_cv_score_samples_errorÞ  s
    rº  T)ZnoveltyÚn_neighborsrÜ   )rO  rU  r¤   )rO  r¬   r¤   c                 C   s²   t j d¡}d}d}t|| ƒ}|| }t|dddgddggddd�d }t j||jdd	|dfd
�gdd�}t  dg| ¡}d|| d …< |  ||¡ t	|  
|¡| j 
|¡ƒ d S )Nr  r(  g333333Ã?rq   r   r–   )rÈ   rè   r¾   rQ  r¼   iúÿÿÿrŒ   )ÚlowÚhighÚsize)Zaxisr[   ro   )rL   rÐ   rÑ   Úintr   Zconcatenater   r¶   rR   r   r¹  r¡   )r#  rÓ   rÈ   Zoutliers_fractionZ
n_outliersZ	n_inliersrP   Zy_truerG   rG   rH   Ú#test_search_cv_score_samples_methodö  s,    ûú" 
ÿrÀ  c                  C   sî   t ddd�\} }ddddgi}ttƒ |dd	�}ttƒ d
|dd�}||fD ] }| | |¡ |j}t|d d |d d ƒ t|d d |d d ƒ t |d d |d d ¡r²t	‚t |d d |d d ¡rÒt	‚t|jd ddd
gƒ qHd S )NrB  r  rC  r•   r[   gj¼t“ð?çü©ñÒMbP?T)r¬   r€  r‡   )r~   rU  r€  r  r   rx  rq   ry  )
r   r$   r+   r%   rR   r¢   r   rL   ZallcloserK   )rP   r”   r¬   r§   rÚ   r÷   r  rG   rG   rH   Ú(test_search_cv_results_rank_tie_breaking&  s:       ÿ
 
ÿ
 
ÿ
 
ÿ
 
ÿrÂ  c                  C   s~   dgdgdgdgdggdddddg } }t ƒ tƒ f}ddd gi}tƒ }|D ].}t|||d� | |¡}t|jd	 dd gƒ qJd S )
Nr[   rq   r‡   rˆ   r°   r   r¼   r©   Zparam_random_state)r,   r-   r   r$   rR   r	   r¢   )rP   r”   Ú
estimatorsÚest_parametersr�   Úestr§   rG   rG   rH   Ú!test_search_cv_results_none_paramH  s    (ý ürÆ  c                  C   s2  t dd�} dgdgdgdgg}ddddg}t| dddgiddd�}t| dddgidddd	�}||fD ]È}| ||¡ d
D ]4}t |j| dk¡s”t‚t |j| dk ¡sxt‚qxdD ]H}|j| d dksÌt‚|j| d dksât‚t |j| dk ¡s²t‚q²t|dƒ�st‚t	|j
tƒ�st‚|j
dksdt‚qdd S )Nr   r»   r[   rq   r‡   rˆ   r•   r²   )r�   r³   r~   )r|  r}  )r~  r  r]   Úrefit_time_)r*   r$   r%   rR   rL   re  r¢   rK   rª   r—   rÇ  Úfloat)ZsvcrP   r”   rÕ   Úrsr÷   r  rG   rG   rH   Útest_search_cv_timingW  s2    
ÿÿÿÿörÊ  c               	      sj  d} t dd�}tddd�\}}dddg}d	D �]6}t|d
|i|| d�‰ˆ ||¡j}t| ¡ ƒ}dtdd„ t| ƒD ƒƒ }t	t
 ||¡ƒsŽt‚t| d�}	ˆj} t|ƒD ]¼\‰ }
|j|
d� t
 ‡ ‡fdd„t| ƒD ƒ¡}t|	 ||¡ƒD ]x\}\}}| || || ¡ |dk�r,t|| | || ¡ƒ}n&|dk�rR| || ¡}t|| |ƒ}t||| ƒ qèq¦q,d S )Nr‡   r   r»   rq   r½   r¿   r[   r|   )r   rÊ   r•   )r¤   r�   )r  ry  c                 s   s   | ]}d | V  qdS )r’  NrG   )rs   Zcv_irG   rG   rH   r’   Œ  s    z9test_grid_search_correct_score_results.<locals>.<genexpr>rÍ   )r•   c                    s   g | ]}ˆj d |  ˆ  ‘qS ©r’  r“  r”  ©Zcandidate_ir§   rG   rH   rw   –  s   ÿz:test_grid_search_correct_score_results.<locals>.<listcomp>r   rÊ   )r*   r   r$   rR   r¢   rx   r  r�   ry   re  rL   Zin1drK   r   r™  Ú	enumeraterc   r¶   Úsplitr3   rW   rj   r7   r   )rÎ   r¦   rP   r”   rÄ   r^   r  Zresult_keysZexpected_keysr�   r•   Z	cv_scoresrt   ÚtrainÚtestÚcorrect_scoreÚdecrG   rÌ  rH   Ú&test_grid_search_correct_score_results€  s:    



ÿ

þÿ

rÓ  c                  C   s¤   t ƒ } t| ddddgiddd�}| tt¡ t t |¡¡}t| 	t¡| 	t¡ƒ t
| ddddgidddd�}| tt¡ t t |¡¡}t| 	t¡| 	t¡ƒ d S )NrE   r[   rq   r‡   TrÝ   )rØ   r~   r�   )rB   r$   rR   rP   r”   ÚpickleÚloadsÚdumpsr
   rW   r%   )r¦   r§   Zgrid_search_pickledrÚ   Zrandom_search_pickledrG   rG   rH   Útest_pickle¥  s$        ÿ ÿr×  c                  C   s   t ddd�\} }dddddgi}tƒ }tdd	�tdd	�g}|D ]¨}t|||d
�}| | |¡ |jd }tt|ƒƒD ]r}|j	f || Ž t
| | |¡ƒD ]L\}	\}
}| | |
 ||
 ¡ | | | || ¡}t||jd|	  | ƒ q–qrq>|D ]®}t|||dd�}| | |¡ |jd }tt|ƒƒD ]v}|j	f || Ž t
| | |¡ƒD ]N\}	\}
}| | |
 ||
 ¡ | | | || ¡}t||jd|	  | ƒ �qF�q"qìd S )NTr   )Zreturn_indicatorr¼   r¸  r[   rq   r‡   rˆ   r»   r©   rb   r’  )r�   r~   )r   r   r,   r-   r$   rR   r¢   ry   rJ   rc   rÍ  rÎ  r^   r   r%   )rP   r”   rÄ  r�   rÃ  rÅ  r§   Z
res_paramsÚcand_irt   rÏ  rÐ  rÑ  rÚ   rG   rG   rH   Ú&test_grid_search_with_multioutput_data·  s@    þ
þ

þrÙ  c                  C   sR   t  d¡ dd¡} dddddg}tdd�}t|i dd	� | |¡}t|d
ƒrNt‚d S )Nr  r°   ro   r   r[   F)r¤  rq   r©   rh   )rL   r´   rµ   r+   r$   rR   rª   rK   ©rP   r”   r¦   rÕ   rG   rG   rH   Útest_predict_proba_disabledå  s
    
rÛ  c                  C   s|   t jdt jd� dd¡} t j| dd d …f< dddddg}tdtd	t jd
�fdtƒ fgƒ}t|ddddgidd� 	| |¡ d S )Nr  r‘  r°   ro   rq   r   r[   Zimputerrû   )ZstrategyZmissing_valuesÚ
classifierZclassifier__foo_paramr‡   r©   )
rL   r´   rd  rµ   Únanr<   r;   rB   r$   rR   )rP   r”   r‘   rG   rG   rH   Útest_grid_search_allows_nansî  s    þÿrÞ  c                   @   s:   e Zd ZdZdZddd„Zddd„Zdd	„ Zdd
d„ZdS )ÚFailingClassifierz,Classifier that raises a ValueError on fit()rq   Nc                 C   s
   || _ d S rC   r  r  rG   rG   rH   rI     s    zFailingClassifier.__init__c                 C   s   | j tjkrtdƒ‚d S )Nz%Failing classifier failed as required)r  rß  ÚFAILING_PARAMETERr¥   r  rG   rG   rH   rR     s    zFailingClassifier.fitc                 C   s   t  |jd ¡S rS   r  rX   rG   rG   rH   rW     s    zFailingClassifier.predictc                 C   s   dS )Nr]   rG   rO   rG   rG   rH   r^     s    zFailingClassifier.score)N)N)NN)	rd   re   rf   rg   rà  rI   rR   rW   r^   rG   rG   rG   rH   rß  ü  s   

rß  c               	      s‚  t dddd�\} }tƒ }t|ddddgigdd	d
d�‰tjdtjd�}tjt|d�� ˆ 	| |¡ W 5 Q R X t
ˆjd ƒ}‡fdd„‰ t‡ ‡fdd„t|ƒD ƒƒs¦t‚t|ddddgigdd	tdƒd�‰tjdtjd�}tjt|d�� ˆ 	| |¡ W 5 Q R X t
ˆjd ƒ}t‡ ‡fdd„t|ƒD ƒƒ�s.t‚ˆjd }|d dk�rT|d dk�sXt‚||j dk�slt‚ˆj|jk�s~t‚d S )Nr  r|   r   rç   r  r[   rq   rÀ   Fr]   ©r¤   rØ   r³   zÈ5 fits failed.+total of 15.+The score on these train-test partitions for these parameters will be set to 0\.0.+5 fits failed with the following error.+ValueError.+Failing classifier failed as required©Úflagsr€   rb   c                    s    t  ‡‡ fdd„tˆjƒD ƒ¡S )Nc                    s   g | ]}ˆ j d |  ˆ ‘qS rË  r“  r”  )rÕ   rt   rG   rH   rw   3  s     zPtest_grid_search_failing_classifier.<locals>.get_cand_scores.<locals>.<listcomp>)rL   r¶   ry   r™  ©rt   )rÕ   rä  rH   Úget_cand_scores1  s    ÿz<test_grid_search_failing_classifier.<locals>.get_cand_scoresc                 3   s4   | ],}ˆj d  | tjkrt ˆ |ƒdk¡V  qdS )Úparam_parameterr]   N)r¢   rß  rà  rL   re  ©rs   rØ  ©rå  rÕ   rG   rH   r’   7  s
   ÿþz6test_grid_search_failing_classifier.<locals>.<genexpr>rÝ  zÇ5 fits failed.+total of 15.+The score on these train-test partitions for these parameters will be set to nan.+5 fits failed with the following error.+ValueError.+Failing classifier failed as requiredc                 3   s6   | ].}ˆj d  | tjkrt t ˆ |ƒ¡¡V  qdS )ræ  N)r¢   rß  rà  rL   re  Úisnanrç  rè  rG   rH   r’   P  s
   ÿþry  r‡   )r   rß  r$   rõ   ÚcompileÚDOTALLr‚   Úwarnsr)   rR   rJ   r¢   re  ry   rK   rÈ  rà  rÞ   )rP   r”   r¦   Úwarning_messager‰  ZranksrG   rè  rH   Ú#test_grid_search_failing_classifier  sV    ûûþÿ	ûûþ
 rî  c               	   C   sn   t dddd�\} }tƒ }t|dtjgd igdd�}tjd	tjd
�}tjt	|d�� | 
| |¡ W 5 Q R X d S )Nr  r|   r   rç   r  r‡   r]   ©r³   zrAll the 15 fits failed.+15 fits failed with the following error.+ValueError.+Failing classifier failed as requiredrâ  r€   ©r   rß  r$   rà  rõ   rê  rë  r‚   rƒ   r¥   rR   )rP   r”   r¦   rÕ   rí  rG   rG   rH   Ú)test_grid_search_classifier_all_fits_fail`  s    ýürñ  c               	   C   s\   t dddd�\} }tƒ }t|ddddgigdd	d
d�}t t¡� | | |¡ W 5 Q R X d S )Nr  r|   r   rç   r  r[   rq   rÀ   Fr±   rá  )r   rß  r$   r‚   rƒ   r¥   rR   rÚ  rG   rG   rH   Ú)test_grid_search_failing_classifier_raiseu  s    û	rò  c            	   	   C   sZ  ddgdddgdœddd	gig} t | d
d�}d
}d}d|||f }tjt|d�� t|ƒ W 5 Q R X t | dd�}t|ƒ}t|ƒdksˆt‚t| ƒD ]}||ks�t‚q�tt | dd�ƒdksºt‚tdƒtdƒtdƒdœ} t | ddd�}t|ƒ}t|ƒdksøt‚dd„ |D ƒ}tt	|ƒƒdk�st‚t
dƒdddgdœ}t |dd�}t|ƒ}t|ƒdk�sVt‚d S )Nr   r[   ÚaÚbÚc)ÚfirstÚsecondÚthirdÚtwoÚvaluesrX  r}   rW  z}The total space of parameters %d is smaller than n_iter=%d. Running %d iterations. For exhaustive searches, use GridSearchCV.r€   iè  r|   )ró  rô  rõ  éc   r  )r~   r¼   c                 S   s&   g | ]}d |d |d |d f ‘qS )z	a%db%dc%dró  rô  rõ  rG   r�   rG   rG   rH   rw   ¨  s     z7test_parameters_sampler_replacement.<locals>.<listcomp>r–   r)  )r'   r‚   rì  ÚUserWarningrx   rJ   rK   r&   ry   r˜   r   )	rb   rY  r~   Z	grid_sizeZexpected_warningrZ  rú  Zhashable_samplesZparams_distributionrG   rG   rH   Ú#test_parameters_sampler_replacementŠ  s8    
þþÿrý  c                  C   s¸   ddgi} t  d¡ dd¡}ddddddg}ttdd	�| d
d�}t|dƒrNt‚| ||¡ | |¡ | 	|¡ ddgi} ttdd	�| d
d�}t|dƒršt‚| ||¡ t|dƒr´t‚d S )NÚlossZlog_lossé   rŒ   ro   r   r[   Zhinge)rþ  r‡   )rO  r¬   r�   rh   )
rL   r´   rµ   r$   r>   rª   rK   rR   rh   ri   )r¬   rP   r”   r¦   rG   rG   rH   Ú#test_stochastic_gradient_loss_param²  s2     ÿ  ÿ

 ÿ  ÿr   c                  C   sR   t  d¡ dd¡} ddddddg}tdd�}t|dddgid	d
�}| | |¡ d S )NrŒ   ro   r   r[   r»   r•   r¿   rÆ   r‡   )r¬   r�   )rL   r´   rµ   r*   r$   rR   rÚ  rG   rG   rH   Ú%test_search_train_scores_set_to_falseÒ  s
    
r  c            	         sþ  d} d}t | dd�\}}ttdd�dddd	git|| d
�dd�‰ ˆ  ||¡ ttdd�dddd	git|d�dd�}| ||¡ tt|ddd� ||¡tƒsžt	‚ttdd�dddd	git|ddd� ||¡dd�}| ||¡ ttdd�dddd	git|ddd�dd�}| ||¡ dd„ }t
j ||jƒ||jƒ¡ t
j dd„ ˆ j ¡ D ƒdd„ |j ¡ D ƒ¡ ttdd�dddddgit|dd�dd�‰ ˆ  ||¡ dD ]\‰i }tdƒD ]$‰‡ ‡‡fdd„tdƒD ƒ|ˆ< �q¬t|d |d ƒ t|d |d ƒ �qœd S )Nr¯   r°   r   rC  r»   r•   r¿   rÆ   g333333Ó?)rÎ   rÈ   T)r¬   r�   r€  rÍ   )rÎ   r�  r¼   c                 S   s   dD ]}|   |¡ q| S )N)r|  r}  r~  r  )Úpop)r  r  rG   rG   rH   Ú_pop_time_keys  s    z>test_grid_search_cv_splits_consistency.<locals>._pop_time_keysc                 S   s    i | ]\}}|  d ¡s||“qS r®  r°  rª  rG   rG   rH   r¬    s     
  z:test_grid_search_cv_splits_consistency.<locals>.<dictcomp>c                 S   s    i | ]\}}|  d ¡s||“qS r®  r°  rª  rG   rG   rH   r¬    s     
  )rÎ   r�  )rÏ  rÐ  rˆ   c                    s"   g | ]}ˆ j d |ˆf  ˆ ‘qS )zsplit%d_%s_scorer“  r”  ©rÕ   Zparam_iZ
score_typerG   rH   rw   1  s   ÿz:test_grid_search_cv_splits_consistency.<locals>.<listcomp>r[   rq   r‡   )r   r$   r*   rA   rR   r   r—   rÎ  r   rK   rL   r³  r´  r¢   r�   ry   r
   )	rÈ   rÎ   rP   r”   Zgs2Zgs3Zgs4r  Zper_param_scoresrG   r  rH   Ú&test_grid_search_cv_splits_consistencyÛ  sv    
üüþüü ÿ
þ
üþr  c                  C   sJ   t ƒ } t| ddddgiddd�}| tt¡ | | t¡¡}tt|ƒ d S )NrE   r[   rq   r‡   rœ   )rB   r$   rR   rP   r”   rZ   rY   r	   )r¦   r§   ZX_round_triprG   rG   rH   Ú+test_transform_inverse_transform_round_trip:  s
    r  c                     sà   dd„ ‰‡ ‡‡fdd„‰G ‡‡fdd„dt ƒ} tdd�‰td	d
dd�\‰ ‰| ˆdd� ˆ ˆ¡}ˆdddgidddgigƒ}|j}ˆ||ƒ t|ƒD ]H}|d  ¡ r’|dd … dkr’|dkr’t||ƒt||ƒks’td| ƒ‚q’d S )Nc                 S   sŽ   |j }t|  ¡ ƒt|ƒkst‚| D ]f}| d¡s"t | | ¡| |< | | jjdkrnt	|| | | d| d� q"t
|| | | d| d� q"d S )Nr¯  ÚOz	Checking )r¹   )r¢   rŽ   r  rK   r±  rL   Z
asanyarrayr`  Úkindr	   r   )ÚresultsÚgscvZexp_resultsrƒ  rG   rG   rH   Úcheck_resultsD  s    
  ÿz-test_custom_run_search.<locals>.check_resultsc                    s   t ˆ| dd� ˆ ˆ¡S )NT©r€  )r$   rR   rI  )rP   r¦   r”   rG   rH   Úfit_gridR  s    z(test_custom_run_search.<locals>.fit_gridc                       s*   e Zd Z‡ fdd„Z‡‡fdd„Z‡  ZS )z.test_custom_run_search.<locals>.CustomSearchCVc                    s   t ƒ j|f|Ž d S rC   ©ÚsuperrI   ©rF   rO  Úkwargs©Ú	__class__rG   rH   rI   V  s    z7test_custom_run_search.<locals>.CustomSearchCV.__init__c                    sd   |ddiddigƒ}ˆ |ˆdddgiƒƒ |ddiddigƒ}ˆ |ˆdddgidddgigƒƒ d S )Nr¸  r[   rq   Úmin_samples_splitr°   r|   rG   )rF   Úevaluater	  ©r  r  rG   rH   Ú_run_searchY  s    þz:test_custom_run_search.<locals>.CustomSearchCV._run_search)rd   re   rf   rI   r  Ú__classcell__rG   r  r  rH   ÚCustomSearchCVU  s   r  r   r»   r¯   rˆ   )rÈ   Zn_informativer¼   Tr  r¸  r[   rq   r  r°   r|   ro   rR  >   rÇ  rN   r¡   r¢   zAttribute %s not equal)	r(   r,   r   rR   r¢   ÚdirÚislowerrã   rK   )r  Zmycvr
  r	  ÚattrrG   )rP   r  r¦   r  r”   rH   Útest_custom_run_searchC  s*    


ÿþÿýÿr  c               	   C   sb   G dd„ dt ƒ} | tƒ ƒ tt¡ G dd„ dt ƒ}tjtdd�� |tƒ ƒ tt¡ W 5 Q R X d S )Nc                       s&   e Zd Z‡ fdd„Zddd„Z‡  ZS )z;test__custom_fit_no_run_search.<locals>.NoRunSearchSearchCVc                    s   t ƒ j|f|Ž d S rC   r  r  r  rG   rH   rI   x  s    zDtest__custom_fit_no_run_search.<locals>.NoRunSearchSearchCV.__init__Nc                 [   s   | S rC   rG   )rF   rP   r”   rÏ   Ú
fit_paramsrG   rG   rH   rR   {  s    z?test__custom_fit_no_run_search.<locals>.NoRunSearchSearchCV.fit)NN)rd   re   rf   rI   rR   r  rG   rG   r  rH   ÚNoRunSearchSearchCVw  s   r  c                       s   e Zd Z‡ fdd„Z‡  ZS )z3test__custom_fit_no_run_search.<locals>.BadSearchCVc                    s   t ƒ j|f|Ž d S rC   r  r  r  rG   rH   rI   ‚  s    z<test__custom_fit_no_run_search.<locals>.BadSearchCV.__init__)rd   re   rf   rI   r  rG   rG   r  rH   ÚBadSearchCV�  s   r   z_run_search not implemented.r€   )r(   r+   rR   rP   r”   r‚   rƒ   ÚNotImplementedError)r  r   rG   rG   rH   Útest__custom_fit_no_run_searchv  s
    r"  c               	   C   sx   t dd� t¡} dd„ | D ƒ d}ttƒ dddd	gi| d
d�}tjtdd��" | td |… t	d |… ¡ W 5 Q R X d S )Nr‡   rÍ   c                 S   s   g | ]}|‘qS rG   rG   )rs   ÚurG   rG   rH   rw   ‘  s     z0test_empty_cv_iterator_error.<locals>.<listcomp>r¯   r×   rÁ  r  r¿   rˆ   ©r�   Zn_jobszNNo fits were performed. Was the CV iterator empty\? Were there no candidates\?r€   )
r   rÎ  rP   r%   r=   r‚   rƒ   r¥   rR   r”   )r�   Ú
train_sizeÚridgerG   rG   rH   Útest_empty_cv_iterator_errorŠ  s    ýr'  c               	   C   st   G dd„ dt ƒ} | dd�}d}ttƒ dddd	gi|d
d�}tjtdd��" | td |… td |… ¡ W 5 Q R X d S )Nc                   @   s   e Zd Zdd„ ZdS )z.test_random_search_bad_cv.<locals>.BrokenKFoldc                 _   s   dS )Nr[   rG   )rF   ÚargsÚkwrG   rG   rH   Úget_n_splits§  s    z;test_random_search_bad_cv.<locals>.BrokenKFold.get_n_splitsN)rd   re   rf   r*  rG   rG   rG   rH   ÚBrokenKFold¦  s   r+  r‡   rÍ   r¯   r×   rÁ  r  r¿   rˆ   r$  zXcv.split and cv.get_n_splits returned inconsistent results. Expected \d+ splits, got \d+r€   )	r   r%   r=   r‚   rƒ   r¥   rR   rP   r”   )r+  r�   r%  r&  rG   rG   rH   Útest_random_search_bad_cv£  s    
ýr,  r€  Fr‡   rW  rˆ   c              	   C   s  t ddd�\}}G dd„ dƒ}| tƒ f|ƒ d|dœ|—Ž}t t¡�}| ||¡ W 5 Q R X |rhdd	gndg}t|ƒt|ƒks‚t‚t||ƒD ]"\}	}
d
|
› d�t	|	j
ƒksŒt‚qŒ|jd  ¡ }t |jd ¡}t|jd | |ƒ t |jd |  |k ¡�st‚d S )Nrq   r   )rÉ   r¼   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )zHtest_searchcv_raise_warning_with_non_finite_score.<locals>.FailingScorerz1Scorer that will fail for some split but not all.c                 S   s
   d| _ d S rS   )Ún_countsrm   rG   rG   rH   rI   Ó  s    zQtest_searchcv_raise_warning_with_non_finite_score.<locals>.FailingScorer.__init__c                 S   s&   |  j d7  _ | j d dkr"tjS dS )Nr[   r°   r   )r-  rL   rÝ  )rF   rO  rP   r”   rG   rG   rH   Ú__call__Ö  s    zQtest_searchcv_raise_warning_with_non_finite_score.<locals>.FailingScorer.__call__N)rd   re   rf   rg   rI   r.  rG   rG   rG   rH   ÚFailingScorerÐ  s   r/  r‡   )r¤   r�   r€  rÐ  rÏ  zOne or more of the z scores are non-finitery  r  )r   r-   r‚   rì  rü  rR   rJ   rK   ÚzipÚstrÚmessager¢   ÚmaxrL   ré  r	   re  )r®   r›  r€  rP   r”   r/  rv   Zwarn_msgZset_with_warningÚmsgZdatasetZ	last_rankZnon_finite_maskrG   rG   rH   Ú1test_searchcv_raise_warning_with_non_finite_score¼  s*    ÿüûr5  c            	      C   s¨   dd„ } t dddd�\}}tdd�}t|dd	d
gi| dd�}| ||¡ ddddg}|D ]}d |¡|jksXt‚qX| |¡}t||ƒ}| 	||¡t
 |d ¡ks¤t‚d S )Nc                 S   s2   |   |¡}t||ƒ}|d |d |d |d dœS )N)r   r   ©r   r[   )r[   r   )r[   r[   )ÚtnÚfpÚfnÚtp)rW   r8   )r¦   rP   r”   rü   ÚcmrG   rG   rH   Úcustom_scorer÷  s    

zAtest_callable_multimetric_confusion_matrix.<locals>.custom_scoreré(   rˆ   r  rç   r»   r•   r¿   r[   r8  r  r7  r9  r:  zmean_test_{}r6  )r   r*   r$   rR   Úformatr¢   rK   rW   r8   r^   r‚   rš  )	r<  rP   r”   rÅ  r÷   Zscore_namesÚnamerü   r;  rG   rG   rH   Ú*test_callable_multimetric_confusion_matrixô  s    


r@  c                  C   s¼   dd„ } t dddd�\}}tdd�}t|dd	d
gi| dd�}t|dd	d
giddgdd�}| ||¡ | ||¡ |jt |j¡ks†t‚|j|jks–t‚| 	||¡t | 	||¡¡ks¸t‚d S )Nc                 S   s    |   |¡}t||ƒt||ƒdœS )N)rà   rÀ   )rW   r4   r5   ©rÅ  rP   r”   rü   rG   rG   rH   r<    s    
þzHtest_callable_multimetric_same_as_list_of_strings.<locals>.custom_scorerr=  rˆ   r  rç   r»   r•   r¿   r[   rà   r  rÀ   ©
r   r*   r$   rR   r  r‚   rš  rK   rÞ   r^   )r<  rP   r”   rÅ  Úsearch_callableÚ
search_strrG   rG   rH   Ú1test_callable_multimetric_same_as_list_of_strings  s(    
 
  ÿ 
  ÿrE  c                  C   s*  dd„ } t dddd�\}}tdd�}t|dd	d
gi| dd�}t|dd	d
giddd�}t|dd	d
gidgdd�}| ||¡ | ||¡ | ||¡ |jt |j¡ks¨t‚|j|jks¸t‚| 	||¡t | 	||¡¡ksÚt‚|jt |j¡ksðt‚|j|jk�st‚| 	||¡t | 	||¡¡k�s&t‚d S )Nc                 S   s   |   |¡}t||ƒS rC   )rW   r4   rA  rG   rG   rH   r<  '  s    
zHtest_callable_single_metric_same_as_single_string.<locals>.custom_scorerr=  rˆ   r  rç   r»   r•   r¿   r[   Tr  rà   rB  )r<  rP   r”   rÅ  rC  rD  Zsearch_list_strrG   rG   rH   Ú1test_callable_single_metric_same_as_single_string%  s2    
 
  ÿ 
  ÿ"rF  c               	   C   sf   dd„ } t dddd�\}}ttdd�dd	d
gi| dd�}d}tjt|d�� | ||¡ W 5 Q R X d S )Nc                 S   s   ddiS )NZbad_namer[   rG   ©rÅ  rP   r”   rG   rG   rH   Ú
bad_scorerC  s    zBtest_callable_multimetric_error_on_invalid_key.<locals>.bad_scorerr=  rˆ   r  rç   r»   r•   r¿   r[   Z	good_namer  z`For multi-metric scoring, the parameter refit must be set to a scorer key or a callable to refitr€   )r   r$   r*   r‚   rƒ   r¥   rR   )rH  rP   r”   r¦   r4  rG   rG   rH   Ú.test_callable_multimetric_error_on_invalid_keyA  s    
üÿrI  c               	   C   sŽ   dd„ } t dddd�\}}tƒ }t|dddd	gig| d
dd�}tjdtjd�}tjt|d�� | 	||¡ W 5 Q R X t
|jd dddgƒ d S )Nc                 S   s   ddiS ©Nrá   r[   rG   rG  rG   rG   rH   r<  Y  s    zBtest_callable_multimetric_error_failing_clf.<locals>.custom_scorerr  r|   r   rç   r  r[   rq   Fr¿   rá  zm5 fits failed.+total of 15.+The score on these train-test partitions for these parameters will be set to 0\.1râ  r€   Zmean_test_acc)r   rß  r$   rõ   rê  rë  r‚   rì  r)   rR   r   r¢   )r<  rP   r”   r¦   rÕ   rí  rG   rG   rH   Ú+test_callable_multimetric_error_failing_clfV  s"    ûýrK  c               	   C   s„   dd„ } t dddd�\}}tƒ }t|dtjgd ig| d	d
d�}d}tjd|› �tjd�}tjt	|d�� | 
||¡ W 5 Q R X d S )Nc                 S   s   ddiS rJ  rG   rG  rG   rG   rH   r<  t  s    zBtest_callable_multimetric_clf_all_fits_fail.<locals>.custom_scorerr  r|   r   rç   r  r‡   Fr¿   rá  z1ValueError: Failing classifier failed as requiredz5All the 15 fits failed.+your model is misconfigured.+râ  r€   rð  )r<  rP   r”   r¦   rÕ   Zindividual_fit_error_messager…   rG   rG   rH   Ú+test_callable_multimetric_clf_all_fits_failr  s"    ûýrL  c                  C   s�   d} t | d�\}}tƒ }dddgi}t||ƒ}t||dd�}t|dƒrJt‚t|dƒrXt‚| ||¡ | ||¡ |j| ks~t‚|j| ksŒt‚d S )Nrˆ   )rè   Zmax_iterr‡   r[   r}   Ún_features_in_)r   r@   r$   r%   rª   rK   rR   rM  )rè   rP   r”   Zgbdtr¬   rÕ   rÉ  rG   rG   rH   Útest_n_features_inŽ  s    
rN  Úpairwisec                    sJ   G ‡ fdd„dt ƒ}|ƒ }d}t|ddgiƒ}ˆ | ¡ d ksFt|ƒ‚dS )zë
    Test implementation of BaseSearchCV has the pairwise tag
    which matches the pairwise tag of its estimator.
    This test make sure pairwise tag is delegated to the base estimator.

    Non-regression test for issue #13920.
    c                       s   e Zd Z‡ fdd„ZdS )zStest_search_cv_pairwise_property_delegated_to_base_estimator.<locals>.TestEstimatorc                    s   dˆ iS ©NrO  rG   rm   ©rO  rG   rH   Ú
_more_tagsª  s    z^test_search_cv_pairwise_property_delegated_to_base_estimator.<locals>.TestEstimator._more_tagsN)rd   re   rf   rR  rG   rQ  rG   rH   ÚTestEstimator©  s   rS  z.BaseSearchCV pairwise tag must match estimatorr»  r|   rO  N)r   r$   Ú	_get_tagsrK   )rO  rS  rÅ  Úattr_messager�   rG   rQ  rH   Ú<test_search_cv_pairwise_property_delegated_to_base_estimatorŸ  s
    
rV  c                  C   s\   G dd„ dt ƒ} | ƒ }d}dD ]8}|j|d� t|ddgiƒ}|| ¡ d kst|ƒ‚qd	S )
zð
    Test implementation of BaseSearchCV has the pairwise property
    which matches the pairwise tag of its estimator.
    This test make sure pairwise tag is delegated to the base estimator.

    Non-regression test for issue #13920.
    c                   @   s   e Zd Zddd„Zdd„ ZdS )zXtest_search_cv__pairwise_property_delegated_to_base_estimator.<locals>.EstimatorPairwiseTc                 S   s
   || _ d S rC   rQ  )rF   rO  rG   rG   rH   rI   ½  s    zatest_search_cv__pairwise_property_delegated_to_base_estimator.<locals>.EstimatorPairwise.__init__c                 S   s
   d| j iS rP  rQ  rm   rG   rG   rH   rR  À  s    zctest_search_cv__pairwise_property_delegated_to_base_estimator.<locals>.EstimatorPairwise._more_tagsN)T)rd   re   rf   rI   rR  rG   rG   rG   rH   ÚEstimatorPairwise¼  s   
rW  z4BaseSearchCV _pairwise property must match estimatorr£  rQ  r»  r|   rO  N)r   rc   r$   rT  rK   )rW  rÅ  rU  Z_pairwise_settingr�   rG   rG   rH   Ú=test_search_cv__pairwise_property_delegated_to_base_estimator³  s    	rX  c                  C   sž   d} d}t | dd�\}}ddgi}tƒ }t|||d�}| ||¡ | |¡}t|ƒ}tdd	�}t|||d�}| ||¡ | |¡}	d
}
||	k ¡ sšt|
ƒ‚dS )zÚ
    Test implementation of BaseSearchCV has the pairwise tag
    which matches the pairwise tag of its estimator.
    This test ensures the equivalence of 'precomputed'.

    Non-regression test for issue #13920.
    rB  rq   r   rC  r»  r|   r©   r  )Zmetricz2GridSearchCV not identical with precomputed metricN)r   r1   r$   rR   rW   r:   re  rK   )rÈ   rÎ   rP   r”   Zgrid_paramsr¦   r�   Zpreds_originalZX_precomputedZpreds_precomputedrU  rG   rG   rH   Ú;test_search_cv_pairwise_property_equivalence_of_precomputedÌ  s    



rY  zSearchCV, param_searchró  r¿   r  c                 C   sP   G dd„ dt tƒ}| |ƒ |ƒ}tdd�\}}|j||dd� |jjdksLt‚d S )Nc                   @   s(   e Zd Zddd„Zd	dd„Zdd„ ZdS )
z,test_scalar_fit_param.<locals>.TestEstimatorNc                 S   s
   || _ d S rC   )ró  )rF   ró  rG   rG   rH   rI   ó  s    z5test_scalar_fit_param.<locals>.TestEstimator.__init__c                 S   s
   || _ d S rC   )Úr_)rF   rP   r”   ÚrrG   rG   rH   rR   ö  s    z0test_scalar_fit_param.<locals>.TestEstimator.fitc                 S   s   t jt|ƒd�S )NrT   )rL   r¸   rJ   rX   rG   rG   rH   rW   ù  s    z4test_scalar_fit_param.<locals>.TestEstimator.predict)N)N)rd   re   rf   rI   rR   rW   rG   rG   rG   rH   rS  ò  s   

rS  r  r»   )r[  )r   r   r   rR   r¡   rZ  rK   )r®   Úparam_searchrS  ÚmodelrP   r”   rG   rG   rH   Útest_scalar_fit_paramê  s
    
r^  r×   c           
      C   sd   t tdd�ddiŽ\}}}}G dd„ dtƒ}dd„ }| |ƒ |ƒ}||f|ddœ}	|j||f|	Ž d S )	Nr  r»   r¼   c                       s   e Zd Zd‡ fdd„	Z‡  ZS )z9test_scalar_fit_param_compat.<locals>._FitParamClassifierNc                    s`   t ƒ j|||d� |dkst‚t|ƒs*t‚t|tƒs8t‚|d jdksJt‚|d jdks\t‚| S )N)Úsample_weightr   rq   r[   )r  rR   rK   Úcallabler—   r�   Úndim)rF   rP   r”   r_  Útuple_of_arraysÚscalar_paramÚcallable_paramr  rG   rH   rR   	  s    	z=test_scalar_fit_param_compat.<locals>._FitParamClassifier.fit)NNNN)rd   re   rf   rR   r  rG   rG   r  rH   Ú_FitParamClassifier	  s
       ùre  c                   S   s   d S rC   rG   rG   rG   rG   rH   Ú_fit_param_callable(	  s    z9test_scalar_fit_param_compat.<locals>._fit_param_callable)rb  rd  rc  )r   r   r>   rR   )
r®   r\  ZX_trainZX_validr	  Zy_validre  rf  r]  r  rG   rG   rH   Útest_scalar_fit_param_compat	  s    ÿÿýrg  z)ignore:The total space of parameters 4 isÚ	Predictorc           	      C   sþ   t j d¡}| dd¡t  dgd dgd  ¡ }}tdtƒ fd|ƒ fgƒ}dd	gdd	gd
œ}| ||dd�}| ||¡ |j 	¡ | 	¡ ksŽt
‚| |¡}t|ƒrÌt|dƒ | ||¡t t||ƒ¡ksút
‚n.t|| ¡ ƒ | ||¡t t||ƒ¡ksút
‚d S )Nr   é   rq   r°   r[   r  ZtransformerZ	predictorr|   )Ztransformer__paramZpredictor__paramar±   rï  )rL   rÐ   rÑ   Zrandnr¶   r<   r   rR   rÂ   r  rK   rW   r   r	   r^   r‚   rš  r5   r   rû   r9   )	r®   rh  rÓ   rP   r”   r]  rb   r÷   rü   rG   rG   rH   Ú1test_search_cv_using_minimal_compatible_estimator<	  s"    (ÿþ

"rj  c                 C   s€   t ddddd�\}}tdd�}ddgi}t||d	d
d
|d� ||¡ |  ¡ j}|r`t d|¡}nt d|¡}t|ƒd
ks|t	‚dS )zkCheck that search cv with verbose>2 shows the score for single
    metrics. non-regression test for #19658.r¯   rq   rÆ   r   rÇ   r»   r•   r¿   rÀ   r‡   )r¤   rž   r�   r€  z$score=\(train=[\d\.]+, test=[\d.]+\)zscore=[\d\.]+N)
r   r*   r$   rR   Z
readouterrÚoutrõ   ÚfindallrJ   rK   )Zcapsysr€  rP   r”   r¦   rv   Zcapturedr�   rG   rG   rH   Útest_search_cv_verbose_3[	  s&    

ú ù
rm  )ºrg   Úcollections.abcr   r   Úior   Ú	itertoolsr   r   Ú	functoolsr   rÔ  rŸ   r@  r   rõ   ÚnumpyrL   Zscipy.sparseÚsparserù   r‚   Zsklearn.utils._testingr	   r
   r   r   r   r   r   r   Zsklearn.utils._mockingr   r   Zscipy.statsr   r   r   Zsklearn.baser   r   r   Zsklearn.datasetsr   r   r   Zsklearn.model_selectionr   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   Zsklearn.model_selection._searchr(   Z#sklearn.model_selection._validationr)   Zsklearn.svmr*   r+   Zsklearn.treer,   r-   Zsklearn.clusterr.   Zsklearn.neighborsr/   r0   r1   Zsklearn.metricsr3   r4   r5   r6   r7   r8   r9   Zsklearn.metrics.pairwiser:   Zsklearn.imputer;   Zsklearn.pipeliner<   Zsklearn.linear_modelr=   r>   r?   Zsklearn.ensembler@   Z$sklearn.model_selection.tests.commonrA   rB   rk   r¶   rP   r”   rz   ÚmarkZparametrizerÃ   r†   r›   r¨   r­   rº   rÅ   rË   rÖ   rÙ   rÛ   rå   rì   ró   rô   rø   rÿ   r  r
  r  r  r  r  r!  r&  r'  r/  r5  r6  rA  rL  rS  r\  rk  rn  rŠ  rŽ  rœ  rŸ  r¦  rž  r¥  rº  rÀ  rÂ  rÆ  rÊ  rÓ  r×  rÙ  rÛ  rÞ  rß  rî  rñ  rò  rý  r   r  r  r  r  r"  r'  r,  r5  r@  rE  rF  rI  rK  rL  rN  rV  rX  rY  r^  rg  Úfilterwarningsrj  rm  rG   rG   rG   rH   Ú<module>   s¦  (
'"ýýþ%

'
	($
-
P?þþ
8#$&
þ 
ÿûþ

ý
ýúþ
!"
(%.	Q( 	_	3þþþ
-
 þ
þþ
3
