U
    ^»{jE? ã                   @   sP  d Z ddlZddlZddlZddl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ZddlZddlmZ ddlmZmZmZ dd	lmZmZmZ dd
lmZ ddl m!Z!m"Z"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z- ddl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE ddlFmGZG ddlHmIZI ddlJmKZK ddlLmMZMmNZNmOZO ddlPmQZQ ddlRmSZSmTZT ddlUmVZVmWZW ddlXmYZYmZZZ ddl[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZc G dd„ dƒZdG dd„ deTƒZee fd d gd!d gd"d"gd#d"gg¡Zge fd"d"d#d#g¡Zhd$d%„ Ziejj kd&e@eeAd'd(�g¡ejj kd)deld*fd+dgidgeld,fd+dield-fg¡d.d/„ ƒƒZmd0d1„ Znd2d3„ Zod4d5„ Zpejj kd6e9eBg¡d7d8„ ƒZqecd9d:„ ƒZrd;d<„ Zsd=d>„ Ztd?d@„ ZudAdB„ ZvdCdD„ ZwdEdF„ ZxdGdH„ ZydIdJ„ ZzdKdL„ Z{dMdN„ Z|dOdP„ Z}dQdR„ Z~dSdT„ ZG dUdV„ dVeƒZ€ecdWdX„ ƒZ�dYdZ„ Z‚d[d\„ Zƒejj kd]d d#g¡ejj kd^eBe9g¡d_d`„ ƒƒZ„dadb„ Z…dcdd„ Z†dedf„ Z‡dgdh„ Zˆecdidj„ ƒZ‰dkdl„ ZŠdmdn„ Z‹dodp„ ZŒdqdr„ Z�dîdtdu„ZŽdvdw„ Z�dxdy„ Z�ejj kdze9d{d|d"d'giifeBd|d"d'gid#d}œfg¡d~d„ ƒZ‘d€d�„ Z’d‚dƒ„ Z“d„d…„ Z”d†d‡„ Z•ejj kd^eBeVƒ dˆd‰d'gidŠ�e9eVƒ dˆd‰d'gid‹�g¡dŒd�„ ƒZ–ejj kd^eBeOdŽd��d�d‰d'gid‘d’�e9eOdŽd��d�d‰d'gid‘d“�g¡d”d•„ ƒZ—d–d—„ Z˜d˜d™„ Z™ecƒ 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jj kdÀdÁdŽg¡ejj kdze9d{dˆd#dÂd‰dÃgiifeBdˆd#dÂ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jj kdÕdŽdÁg¡dÖd×„ ƒZµdØdÙ„ Z¶dÚdÛ„ Z·ejj kdÜe9dÝdÞdßgifeBdÝed"dÂƒifg¡dàdá„ ƒZ¸ejj kdÜe9dâdÞdßgifeBdâedßdÞƒifg¡dãdä„ ƒZ¹ejj ºdå¡ejj kd6e9eBg¡ejj kdæe]e\g¡dçdè„ ƒƒƒZ»ejj kdÀdŽdÁg¡dédê„ ƒZ¼ejj kdÜe9d{feBdëfe<d{fg¡dìdí„ ƒZ½dS )ïzTest the search moduleé    N)ÚIterableÚSized)Úpartial)ÚStringIO)ÚchainÚproduct)ÚGeneratorType)Ú	bernoulliÚexponÚuniform)ÚBaseEstimatorÚClassifierMixinÚis_classifier)ÚKMeans)Ú
make_blobsÚmake_classificationÚmake_multilabel_classification)ÚHistGradientBoostingClassifier)Úenable_halving_search_cv)ÚSimpleImputer)ÚLinearRegressionÚRidgeÚSGDClassifier)Úaccuracy_scoreÚconfusion_matrixÚf1_scoreÚmake_scorerÚr2_scoreÚrecall_scoreÚroc_auc_score)Úeuclidean_distances)ÚGridSearchCVÚ
GroupKFoldÚGroupShuffleSplitÚHalvingGridSearchCVÚKFoldÚLeaveOneGroupOutÚLeavePGroupsOutÚParameterGridÚParameterSamplerÚRandomizedSearchCVÚStratifiedKFoldÚStratifiedShuffleSplitÚtrain_test_split)ÚBaseSearchCV)ÚFitFailedWarning)ÚOneTimeSplitter)ÚKernelDensityÚKNeighborsClassifierÚLocalOutlierFactor)ÚPipeline)ÚSVCÚ	LinearSVC)ÚDecisionTreeClassifierÚDecisionTreeRegressor)ÚCheckingClassifierÚMockDataFrame)ÚMinimalClassifierÚMinimalRegressorÚMinimalTransformerÚassert_allcloseÚassert_almost_equalÚassert_array_almost_equalÚassert_array_equalÚignore_warningsc                   @   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)ÚselfrF   © rH   úh/var/www/html/bwave/python/venv/lib/python3.8/site-packages/sklearn/model_selection/tests/test_search.pyÚ__init__N   s    zMockClassifier.__init__c                 C   s$   t |ƒt |ƒkst‚t |¡| _| S rD   )ÚlenÚAssertionErrorÚnpÚuniqueÚclasses_©rG   ÚXÚYrH   rH   rI   ÚfitQ   s    zMockClassifier.fitc                 C   s
   |j d S ©Nr   ©Úshape)rG   ÚTrH   rH   rI   ÚpredictV   s    zMockClassifier.predictc                 C   s
   || j  S rD   rE   ©rG   rQ   rH   rH   rI   Ú	transformY   s    zMockClassifier.transformc                 C   s
   || j  S rD   rE   rY   rH   rH   rI   Úinverse_transform\   s    z MockClassifier.inverse_transformNc                 C   s   | j dkrd}nd}|S )Né   ç      ð?ç        rE   )rG   rQ   rR   ÚscorerH   rH   rI   r_   c   s    
zMockClassifier.scoreFc                 C   s
   d| j iS ©NrF   rE   )rG   ÚdeeprH   rH   rI   Ú
get_paramsj   s    zMockClassifier.get_paramsc                 K   s   |d | _ | S r`   rE   )rG   ÚparamsrH   rH   rI   Ú
set_paramsm   s    
zMockClassifier.set_params)r   )NN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rJ   rS   rX   rZ   r[   Úpredict_probaÚpredict_log_probaÚdecision_functionr_   rb   rd   rH   rH   rH   rI   rC   K   s   


rC   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 rD   )ÚAttributeError©rG   rH   rH   rI   r_   u   s    zLinearSVCNoScore.scoreN)re   rf   rg   rh   Úpropertyr_   rH   rH   rH   rI   rl   r   s   rl   éÿÿÿÿéþÿÿÿr\   é   c                    s*   t ˆ ƒ‡ fdd„ttˆ ƒƒD ƒks&t‚d S )Nc                    s   g | ]}ˆ | ‘qS rH   rH   ©Ú.0Úi©ÚgridrH   rI   Ú
<listcomp>   s     z3assert_grid_iter_equals_getitem.<locals>.<listcomp>)ÚlistÚrangerK   rL   rv   rH   rv   rI   Úassert_grid_iter_equals_getitem~   s    r{   Ú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_messagerH   rH   rI   Ú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\   rr   é   é   ZhamÚspamÚeggs)r€   Úbaré   c                 s   s"   | ]}t tt| ¡ ƒŽ ƒV  qd S rD   )Útupler   ÚsortedÚitems©rt   ÚprH   rH   rI   Ú	<genexpr>¥   s     z&test_parameter_grid.<locals>.<genexpr>c                 s   s   | ]\}}d |d|fV  qdS )rŒ   r€   NrH   )rt   ÚxÚyrH   rH   rI   r“   ¦   s    rŒ   ÚCr}   ç      à?)r(   Ú
isinstancer   rL   r   rK   r{   rz   Úsetr   ry   rƒ   r„   Ú
IndexError)Zparams1Zgrid1Zparams2Zgrid2ru   ZpointsÚemptyZ	has_emptyrH   rH   rI   Ú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 )NrF   r\   rr   rˆ   ©ÚcvÚverboseZparam_foo_paramZsklearn)rC   r!   ÚsysÚstdoutr   rS   rQ   r•   Úbest_estimator_rF   rL   rA   Úcv_results_Údatar_   ri   rk   rZ   Úscoringrƒ   r„   Ú
ValueError)ÚclfÚgrid_searchZ
old_stdoutrH   rH   rI   Ú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	regressorrr   ©rž   Zparam_regressorr   r\   Zcoef_)r4   r   r   r!   rS   rQ   r•   r£   r˜   rL   Úhasattrr¢   )ÚpipeÚ
param_gridr¨   Zregressor_resultsrH   rH   rI   Ú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_paramsrF   rr   rˆ   Úraise©rž   Úerror_scorez0Expected fit parameter\(s\) \['eggs'\] not seen.r�   )rŠ   z)Fit parameter spam has length 1; expected)rŠ   r‹   )rM   ÚarangeÚreshapeÚarrayr9   rƒ   r„   rL   rS   ÚonesÚzeros)r¯   rQ   r•   r§   ZsearcherÚerr_msgrH   rH   rI   Útest_SearchCV_with_fit_paramsä   s     (r»   c               	   C   sÔ   t ddd�} tddd�\}}dddg}tddd�}t| d	|id
d�}| ||¡ t|d	|id
d�}| ||¡ |j|jks~t‚| ||¡| ||¡ksšt‚t|d	|iƒ}tj	t
dd�� | dgg¡ W 5 Q R X d S )NÚautor   ©ÚdualÚrandom_staterr   ©r¿   Úcentersçš™™™™™¹?r\   r}   r–   Úaccuracy©r¥   z
no scoringr�   )r6   r   rl   r!   rS   Úbest_params_rL   r_   rƒ   r„   Ú	TypeError)r§   rQ   r•   ÚCsZclf_no_scorer¨   Zgrid_search_no_scorerH   rH   rI   Útest_grid_search_no_score÷   s    
rÈ   c                  C   sô   t ddddd�\} }tddd�}dd	gi}t||d d
� | |¡}t||dd
� | |¡}ttdd�|dd
� | |¡}t||dd
� | |¡}| | |¡}| | |¡}	| | |¡}
| | |¡}|dk sÄt‚|	dk sÐt‚||	ksÜt‚t|	|ƒ t||
ƒ d S )Nr°   rr   çš™™™™™É?r   ©Ú	n_samplesÚ	n_classesZflip_yr¿   r¼   r½   r–   rÂ   rÄ   rÃ   ©r¾   Úroc_aucr]   )r   r6   r!   rS   rl   r_   rL   r?   )rQ   r•   r§   rw   Zsearch_no_scoringZsearch_accuracyZsearch_no_score_method_aucZ
search_aucZscore_no_scoringZscore_accuracyZscore_no_score_aucZ	score_aucrH   rH   rI   Ú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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� qdtƒ tƒ g}
|
D ]}t
|||d�}	|	 ||¡ q¾d S )Nr   é   rr   )rË   rÌ   r¿   rˆ   r¼   r½   r–   r\   ©Ún_splitsz*The 'groups' parameter should not be None.rª   r�   )Úgroups)rM   ÚrandomÚRandomStater   Úrandintr6   r&   r'   r"   r#   r!   rƒ   r„   r¦   rS   r+   r,   )ÚrngrQ   r•   rÓ   r§   rw   Z	group_cvsÚ	error_msgrž   ÚgsZnon_group_cvsrH   rH   rI   Ú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�d	|iƒ}| | |¡ t|jj	|j	ƒ tt
ƒ d
ddgiƒ}| | |¡ t|dƒr–t‚ttddd�d	|iƒ}t|dƒrºt‚ttddd�d	|idd�}| | |¡ t|dƒrît‚d S )Nr°   r}   r   r±   r\   rÂ   r¼   r½   r–   Úalphar]   g       @rO   F)Úrefit)rM   rµ   r¶   r·   r!   r6   rS   rA   r¢   rO   r   r«   rL   )rQ   r•   rÇ   r¨   rH   rH   rI   Útest_classes__propertyK  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 )NrF   r\   rˆ   rª   r£   r   )r   rž   )rC   r!   rS   rQ   r•   r«   rL   r*   )r§   r¨   Úrandom_searchrH   rH   rI   Útest_trivial_cv_results_attrf  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Ã   Ú	precisionrF   r\   rr   rˆ   F©rÜ   rž   r¢   Úbest_index_rÅ   )rX   ri   rj   rZ   r[   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)TÚrecallrÃ   )ÚaccÚprec)rÜ   r¥   )rC   r!   rS   rQ   r•   r«   rL   rƒ   r„   rm   Úgetattrr¦   )r§   r¥   r¨   Úfn_namerØ   rÜ   rH   rH   rI   Útest_no_refitr  s8    ÿþý
ÿÿ   ÿ þrè   c               	   C   s\   t dddd�\} }tdd�}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   r6   r!   rƒ   r„   r¦   rS   )ÚX_Úy_r§   rž   rH   rH   rI   Ú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Úgammar¼   ©rò   )r   r5   r!   rS   rA   Z
dual_coef_r¢   )rí   rî   Ú
param_dictr§   rž   rH   rH   rI   Ú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 )NrF   r\   r‰   rˆ   rª   rr   )	rC   r!   rz   rS   rQ   r•   r¢   rF   rL   )r§   r¨   rH   rH   rI   Ú/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ˆ   rr   )r   r5   ÚreÚescaper!   rƒ   r„   rÆ   rS   r¦   rM   r¸   )rQ   r•   rô   r§   rØ   ÚsearchrH   rH   rI   Útest_grid_search_bad_param_gridº  s<    
ÿ
ÿ

ÿ

rú   c                  C   sê   t dddd�\} }tdd�}t|ddd	giƒ}| | d d
… |d d
… ¡ | | d
d … ¡}|jj}t | ¡} tdd�}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Â   r]   rì   gÍÌÌÌÌÌì?)r   r6   r!   rS   rX   r¢   r–   ÚspÚ
csr_matrixZtocoorM   ÚmeanrL   )rí   rî   r§   rž   Úy_predr–   Úy_pred2ÚC2rH   rH   rI   Útest_grid_search_sparseâ  s    


 r  c                  C   sZ  t dddd�\} }tdd�}t|ddd	gid
d�}| | d d… |d d… ¡ | | dd … ¡}|jj}t | ¡} tdd�}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�sLt
‚t	||
ƒ d S )Nré   r°   r   rê   r¼   rÍ   r–   rÂ   r]   Úf1rÄ   rì   c                 S   s   t | |ƒ S rD   )r   )Zy_true_Zy_pred_rH   rH   rI   Úf1_loss  s    z0test_grid_search_sparse_scoring.<locals>.f1_lossF)Zgreater_is_better)r   r6   r!   rS   rX   r¢   r–   rû   rü   rA   rL   r   )rí   rî   r§   rž   rþ   r–   rÿ   r   r  ZF1LossZy_pred3ZC3rH   rH   rI   Ú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   rM   ÚdotrW   r5   r!   rS   Úbest_score_rL   rX   rý   rƒ   r„   r¦   Útolist)	rí   rî   ÚK_trainÚy_trainr§   rž   ZK_testZy_testrþ   rH   rH   rI   Ú#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]   )	rM   r¹   r¸   r5   r!   rƒ   r„   r¦   rS   )r
  r  r§   rž   rH   rH   rI   Ú3test_grid_search_precomputed_kernel_error_nonsquare8  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 rD   ©Ú	parameter©rG   r  rH   rH   rI   rJ   F  s    zBrokenClassifier.__init__c                 C   s   t | dƒrt‚d| _d S )NÚhas_been_fit_T)r«   rL   r  ©rG   rQ   r•   rH   rH   rI   rS   I  s    zBrokenClassifier.fitc                 C   s   t  |jd ¡S rT   ©rM   r¹   rV   rY   rH   rH   rI   rX   M  s    zBrokenClassifier.predict)N)re   rf   rg   rh   rJ   rS   rX   rH   rH   rH   rI   r  C  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Ü   )rM   rµ   r¶   r·   r!   r  rS   )rQ   r•   r§   rH   rH   rI   Ú
test_refitQ  s       ÿr  c                  C   sh   dd„ } t dddd�\}}ttddd�d	d
ddgid| d�}| ||¡ |jdksVt‚t|dƒrdt‚dS )z^
    Test refit=callable, which adds flexibility in identifying the
    "best" estimator.
    c                 S   sv   t dddd�\}}ttddd�ddd	d
giddd�}| ||¡ |jdksNt‚|j ¡ D ]}|| ksXt‚qX| 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½   r–   ç{®Gáz„?rÂ   r\   rà   Tr  r   Úmean_test_score)	r   r!   r6   rS   râ   rL   r£   ÚkeysÚargmin)Ú
cv_resultsrQ   r•   r§   ÚkeyrH   rH   rI   Úrefit_callablee  s    
üz+test_refit_callable.<locals>.refit_callabler°   r‰   r  rê   r¼   r½   r–   r  rÂ   r\   rà   r  r   r  N)r   r!   r6   rS   râ   rL   r«   )r  rQ   r•   r§   rH   rH   rI   Útest_refit_callable_  s    
ür   c               	   C   sd   dd„ } t dddd�\}}ttd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.
        NrH   ©r  rH   rH   rI   Úrefit_callable_invalid_type’  s    zEtest_refit_callable_invalid_type.<locals>.refit_callable_invalid_typer°   r‰   r  rê   r¼   r½   r–   rÂ   r\   rà   r  z&best_index_ returned is not an integerr�   N)r   r!   r6   rƒ   r„   rÆ   rS   )r"  rQ   r•   r§   rH   rH   rI   Ú test_refit_callable_invalid_typeŒ  s    

ür#  Úout_bound_valueÚ	search_cvc              	      sh   ‡ fdd„}t dddd�\}}|td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.
        rH   r!  ©r$  rH   rI   Ú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à   r  zbest_index_ index out of ranger�   N)r   r6   rƒ   r„   rš   rS   )r$  r%  r'  rQ   r•   r§   rH   r&  rI   Útest_refit_callable_out_bound¤  s    

ür(  c                  C   sv   dd„ } t dddd�\}}ttƒddœ}ttd	dd
�ddddgi|| d�}| ||¡ |jdksdt‚t|dƒrrt‚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)rL   r  r!  rH   rH   rI   r  Ã  s    z8test_refit_callable_multi_metric.<locals>.refit_callabler°   r‰   r  rê   rà   )ZAccuracyrå   r¼   r½   r–   r  rÂ   r\   r  r   r  N)	r   r   r   r!   r6   rS   râ   rL   r«   )r  rQ   r•   r¥   r§   rH   rH   rI   Ú 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ˆ   rr   i  é   é   c                 S   s   | j dd … dkS )Nr\   )r±   rˆ   rr   rU   ©r”   rH   rH   rI   Úcheck_Xà  s    z#test_gridsearch_nd.<locals>.check_Xc                 S   s   | j dd … dkS )Nr\   )r+  r,  rU   r-  rH   rH   rI   Úcheck_yã  s    z#test_gridsearch_nd.<locals>.check_yrS   )r.  r/  Úmethods_to_checkrF   r\   r£   )rM   rµ   r¶   r9   r!   rS   r_   rQ   r•   r«   rL   )ZX_4dZy_3dr.  r/  r§   r¨   rH   rH   rI   Útest_gridsearch_ndÛ  s    ýr1  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 rD   ©r˜   ry   r-  rH   rH   rI   Ú<lambda>ö  ó    z test_X_as_list.<locals>.<lambda>rS   )r.  r0  rˆ   rÑ   rF   rr   rª   r£   ©rM   rµ   r¶   r·   r9   r%   r!   rS   r	  r_   r«   rL   ©rQ   r•   r§   rž   r¨   rH   rH   rI   Útest_X_as_listð  s    þ
r7  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 rD   r2  r-  rH   rH   rI   r3    r4  z test_y_as_list.<locals>.<lambda>rS   )r/  r0  rˆ   rÑ   rF   rr   rª   r£   r5  r6  rH   rH   rI   Útest_y_as_listÿ  s    þ
r8  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   )Ú	DataFrameÚSeriesr°   r}   r±   r\   c                    s
   t | ˆ ƒS rD   ©r˜   r-  )ÚInputFeatureTyperH   rI   Úcheck_df   s    z#test_pandas_input.<locals>.check_dfc                    s
   t | ˆ ƒS rD   r;  r-  )Ú
TargetTyperH   rI   Úcheck_series#  s    z'test_pandas_input.<locals>.check_series)r.  r/  rF   rr   rˆ   r£   )r:   Zpandasr9  r:  ÚappendÚImportErrorrM   rµ   r¶   r·   r9   r!   rS   r_   rX   r«   rL   )Útypesr9  r:  rQ   r•   ZX_dfZy_serr=  r?  r§   r¨   rH   )r<  r>  rI   Útest_pandas_input  s"    

rC  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)rG  rH  rr   rˆ   r‰   )Ú
n_clusters)r­   r¥   rÜ   rI  ©r­   r¥   ©r­   )r   r   r!   ÚdictrS   rÅ   rL   )rQ   r•   Úkmr¥   rÜ   r¨   rH   rH   rI   Útest_unsupervised_grid_search.  s,       ÿ  ÿ
rN  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)Ú	estimatorrQ   rH   rH   rI   Úcustom_scoringM  s    z2test_gridsearch_no_predict.<locals>.custom_scoringrÂ   r\   r   )Úcluster_stdr¿   rÁ   r  rO  rJ  rP  r  )r   r!   r1   rL  rS   rÅ   rL   r  )rR  rQ   Ú_rù   rH   rH   rI   Útest_gridsearch_no_predictJ  s    $ý
rU  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 rH   rH   ©rt   r”   rH   rH   rI   rx   a  s     z&test_param_sampler.<locals>.<listcomp>rñ   )rð   rV  r–   rr   rˆ   r‰   r±   r�   r+  é   é	   c                 S   s   g | ]}|‘qS rH   rH   rX  rH   rH   rI   rx   l  s     c                 S   s   g | ]}|‘qS rH   rH   rX  rH   rH   rI   rx   r  s     )r   r)   rK   rL   )rW  ÚsamplerÚsamplesÚsamplerH   rH   rI   Ú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 rD   ©r˜   rM   ÚmaZMaskedArray)rt   Úparamr!  rH   rI   r“   x  s     z/check_cv_results_array_types.<locals>.<genexpr>c                 3   s   | ]}ˆ | j tkV  qd S rD   )ÚdtypeÚobject©rt   r  r!  rH   rI   r“   y  s     c                 3   s    | ]}t ˆ | tjjƒV  qd S rD   r_  rd  r!  rH   rI   r“   z  s     c                 3   s(   | ] }|  d ¡sˆ | jtjkV  qdS )ZrankN)Ú
startswithrb  rM   Úfloat64rd  r!  rH   rI   r“   {  s   
þr_   zrank_test_%s)
r£   ÚallrL   ÚanyÚmultimetric_Úscorer_r  rb  rM   Zint32)rù   Ú
param_keysÚ
score_keysZscorer_keysr  rH   r!  rI   Úcheck_cv_results_array_typesu  s    þrm  rH   c                    sJ   || | }t tˆ  ¡ ƒt|d ƒƒ t‡ ‡fdd„|| D ƒƒsFt‚d S )N)rc   c                 3   s   | ]}ˆ | j ˆfkV  qd S rD   rU   rd  ©r  Ún_candrH   rI   r“   ‹  s     z(check_cv_results_keys.<locals>.<genexpr>)rA   r�   r  rg  rL   )r  rk  rl  ro  Z
extra_keysÚall_keysrH   rn  rI   Úcheck_cv_results_keys‡  s    rq  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}d}d}|}ttƒ d|dd�}| | |¡ |j‰ tˆ d dkƒs„t‚‡ fdd„|D ƒsšt‚‡ fdd„|D ƒs°t‚t|||ƒ t	ˆ |||ƒ |j‰ ‡ fdd„t
|ƒD ƒ}t|ƒsòt‚t|ƒdk�st‚‡ fdd„t
|ƒD ƒ}	t|	ƒ�s(t‚t|	ƒdk�s:t‚d S )NrD  r‰   r  rê   r�   rð   r\   r}   rÂ   ©rñ   r–   rò   Úpolyrr   ©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_timerˆ   T)rž   r­   Úreturn_train_scorer|  c                 3   s&   | ]}|d krt ˆ | dkƒV  qdS )r|  r   N©rg  ©rt   Úkr!  rH   rI   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 )Útimer|  r\   Nr„  r…  r!  rH   rI   r“   ¼  s    þc                    sH   g | ]@}ˆ d  | dkrˆ d j | oBˆ d j | oBˆ d j |  ‘qS )ry  rs  rv  rx  rw  ©Úmaskrs   r!  rH   rI   rx   Ç  s   ûÿz/test_grid_search_cv_results.<locals>.<listcomp>c                    sJ   g | ]B}ˆ d  | dkrˆ d j |  oDˆ d j |  oDˆ d j | ‘qS )ry  rð   rv  rx  rw  rˆ  rs   r!  rH   rI   rx   Ó  s   ûÿ)r   rL  r!   r5   rS   r£   rg  rL   rm  rq  rz   rK   )
rQ   r•   Zn_grid_pointsrc   rk  rl  Ún_candidatesrù   Zpoly_resultsZrbf_resultsrH   r!  rI   Útest_grid_search_cv_resultsŽ  sL    ÿûÿüø
þ

ú	
ú	r‹  c                     sÌ   t 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d�}| | |¡ |j‰ t|||ƒ tˆ |||ƒ t‡ fdd„t	|ƒD ƒƒsªt
‚t‡ fdd„t	|ƒD ƒƒsÈt
‚d S )NrD  r‰   r  rê   é   rð   r}   )ÚscalerÂ   rr  rs  rr   rˆ   rt  ru  rz  T)r   rž   rW  rƒ  c                 3   sJ   | ]B}ˆ d  | dkrˆ d j | o@ˆ d j | o@ˆ d j |  V  qdS )ry  rs  rv  rx  rw  Nrˆ  rs   r!  rH   rI   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 )ry  rð   rv  rx  rw  Nrˆ  rs   r!  rH   rI   r“     s   ûÿ)r   r
   r*   r5   rS   r£   rm  rq  rg  rz   rL   )rQ   r•   Ún_search_iterrc   rk  rl  rŠ  rù   rH   r!  rI   Útest_random_search_cv_resultsà  s2    þûú	úr�  zSearchCV, specialized_paramsr­   r–   )rW  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¿   rS  ÚshufflerË   ©rb  rr   T)rQ  rž   rƒ  c                    s   g | ]}ˆ j d |  d ‘qS )úsplit%d_test_scorer   ©r£   ©rt   Ús©rù   rH   rI   rx   =  s   ÿz+test_search_default_iid.<locals>.<listcomp>r  r}  c                    s   g | ]}ˆ j d |  d ‘qS )zsplit%d_train_scorer   r”  r•  r—  rH   rI   rx   F  s   ÿr{  r~  rv  gUUUUUUÕ?)r   rM   r¸   rV   ÚboolÚwherer5   rS   r·   rz   Ú	n_splits_r£   rL   r>   rƒ   Úapproxrý   Zstd)r¯   Úspecialized_paramsrQ   r•   r‰  rž   Zcommon_paramsZtest_cv_scoresZ	test_meanZtest_stdZtrain_cv_scoresZ
train_meanZ	train_stdrH   r—  rI   Ú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 )NrD  r‰   r  rê   rˆ   rð   r\   r}   rÂ   rr  rs  rr   rt  ©rÃ   rã   rÃ   rã   F)rž   r­   r¥   rÜ   )
r   rL  r   r   r   r!   r5   rS   r@  Ú*compare_cv_results_multimetric_with_single)rQ   r•   rÒ   rc   Zgrid_searchesr¥   r¨   rH   rH   rI   Ú'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 )NrD  r‰   r  rê   rˆ   rŒ  éüÿÿÿr\   éûÿÿÿr   rÂ   )Úbase)r–   rò   ©TF)rž  rÃ   rã   TrÃ   F)Úprobabilityr¿   )r   rž   rW  r¥   rÜ   r¿   )r   rL  rM   Zlogspacer˜   rŽ   r5   r*   rS   r@  rŸ  Ú)compare_refit_methods_when_refit_with_acc)rQ   r•   rÒ   rŽ  rc   rÜ   Zrandom_searchesr¥   r¥  r§   rÞ   rH   rH   rI   Ú)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©rt   r†  ÚvrH   rH   rI   Ú
<dictcomp>«  s     z>compare_cv_results_multimetric_with_single.<locals>.<dictcomp>c                 S   s    i | ]\}}t  d d|¡|“qS )r¨  Z_recallr©  r«  rH   rH   rI   r­  ¯  s      c                 3   s    | ]}t  ˆ | d k¡V  qdS )r\   N)rM   rg  r…  ©Zcv_results_multirH   rI   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«  rH   rH   rI   r­  Ä  s     
  c                 S   s    i | ]\}}|  d ¡s||“qS r¯  r±  r«  rH   rH   rI   r­  Å  s     
  N)ri  rL   rA   r�   rj  r£   r�   Úupdaterg  rM   ÚtestingÚassert_equal)Úsearch_multiÚ
search_accZ
search_recZcv_results_acc_recrH   r®  rI   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ê   )rX   ri   rj   )râ   r  rÅ   )rÜ   rL   r   r?   ræ   r_   )r¶  r·  rÜ   rQ   r•   Úmethodr  rH   rH   rI   r¦  É  s    
 ÿr¦  Ú	max_depthr±   )rQ  rW  )rQ  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   rS   rƒ   r„   rm   Úscore_samples)r%  rQ   r•   rº   rH   rH   rI   Ú"test_search_cv_score_samples_errorÜ  s
    r»  T)ZnoveltyÚn_neighborsrà   )rQ  rW  r¥   )rQ  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Ã?rr   r   r—   )rË   rë   rÁ   rS  r¿   iúÿÿÿr�   )ÚlowÚhighÚsize)Zaxisr\   rp   )rM   rÔ   rÕ   Úintr   Zconcatenater   r·   rS   r>   rº  r¢   )r%  r×   rË   Zoutliers_fractionZ
n_outliersZ	n_inliersrQ   Zy_truerH   rH   rI   Ú#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 )NrD  r  rE  r–   r\   gj¼t“ð?çü©ñÒMbP?T)r­   rƒ  rˆ   )r   rW  rƒ  r  r   r{  rr   r|  )
r   r!   r5   r*   rS   r£   r?   rM   ZallcloserL   )rQ   r•   r­   r¨   rÞ   rù   r  rH   rH   rI   Ú(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\   rr   rˆ   r‰   r±   r   r¿   rª   Zparam_random_state)r8   r7   r%   r!   rS   rA   r£   )rQ   r•   Ú
estimatorsÚest_parametersrž   Úestr¨   rH   rH   rI   Ú!test_search_cv_results_none_paramF  s    (ý ürÇ  c                  C   s4  t d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 ¡szt‚qzd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sft‚qfd S )Nr¼   r   r½   r\   rr   rˆ   r‰   r–   r³   )rž   r´   r   )r  r€  )r�  r‚  r^   Úrefit_time_)r6   r!   r*   rS   rM   rg  r£   rL   r«   r˜   rÈ  Úfloat)ZsvcrQ   r•   rÙ   Úrsrù   r  rH   rH   rI   Útest_search_cv_timingU  s2    ÿÿÿÿörË  c               	      sl  d} t d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�rT| || ¡}t|| |ƒ}t||| ƒ qêq¨q.d S )Nrˆ   r¼   r   r½   rr   rÀ   rÂ   r\   r}   )r  rÎ   r–   )r¥   rž   )r  r|  c                 s   s   | ]}d | V  qdS )r“  NrH   )rt   Zcv_irH   rH   rI   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¨   rH   rI   rx   ”  s   ÿz:test_grid_search_correct_score_results.<locals>.<listcomp>r  rÎ   )r6   r   r!   rS   r£   ry   r  rŽ   rz   rg  rM   ÚisinrL   r+   rš  Ú	enumeraterd   r·   Úsplitr   rX   rk   r   r?   )rÒ   r§   rQ   r•   rÇ   r_   r  Zresult_keysZexpected_keysrž   r–   Z	cv_scoresru   ÚtrainÚtestÚcorrect_scoreÚdecrH   rÍ  rI   Ú&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 )NrF   r\   rr   rˆ   Trá   )rÜ   r   rž   )rC   r!   rS   rQ   r•   ÚpickleÚloadsÚdumpsr@   rX   r*   )r§   r¨   Zgrid_search_pickledrÞ   Zrandom_search_pickledrH   rH   rI   Ú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\   rr   rˆ   r‰   ©r¿   rª   rc   r“  )rž   r   )r   r%   r8   r7   r!   rS   r£   rz   rK   rd   rÏ  rÐ  r_   r?   r*   )rQ   r•   rÅ  rž   rÄ  rÆ  r¨   Z
res_paramsÚcand_iru   rÑ  rÒ  rÓ  rÞ   rH   rH   rI   Ú&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±   rp   r   r\   F)r¥  rr   rª   ri   )rM   rµ   r¶   r5   r!   rS   r«   rL   ©rQ   r•   r§   rÙ   rH   rH   rI   Ú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±   rp   rr   r   r\   Zimputerrý   )ZstrategyZmissing_valuesÚ
classifierZclassifier__foo_paramrˆ   rª   )
rM   rµ   rf  r¶   Únanr4   r   rC   r!   rS   )rQ   r•   r’   rH   rH   rI   Ú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()rr   Nc                 C   s
   || _ d S rD   r  r  rH   rH   rI   rJ   ÿ  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  rH   rH   rI   rS     s    zFailingClassifier.fitc                 C   s   t  |jd ¡S rT   r  rY   rH   rH   rI   rX     s    zFailingClassifier.predictc                 C   s   dS )Nr^   rH   rP   rH   rH   rI   r_   	  s    zFailingClassifier.score)N)N)NN)	re   rf   rg   rh   rã  rJ   rS   rX   r_   rH   rH   rH   rI   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\   rr   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�   rc   c                    s    t  ‡‡ fdd„tˆjƒD ƒ¡S )Nc                    s   g | ]}ˆ j d |  ˆ ‘qS rÌ  r”  r•  )rÙ   ru   rH   rI   rx   1  s     zPtest_grid_search_failing_classifier.<locals>.get_cand_scores.<locals>.<listcomp>)rM   r·   rz   rš  ©ru   )rÙ   rç  rI   Úget_cand_scores/  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ã  rM   rg  ©rt   rÛ  ©rè  rÙ   rH   rI   r“   5  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ã  rM   rg  Úisnanrê  rë  rH   rI   r“   N  s
   ÿþr|  rˆ   )r   râ  r!   r÷   ÚcompileÚDOTALLrƒ   Úwarnsr/   rS   rK   r£   rg  rz   rL   rÉ  rã  râ   )rQ   r•   r§   Úwarning_messagerŠ  ZranksrH   rë  rI   Ú#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¦   rS   )rQ   r•   r§   rÙ   rð  rH   rH   rI   Ú)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\   rr   rÃ   Fr²   rä  )r   râ  r!   rƒ   r„   r¦   rS   rÝ  rH   rH   rI   Ú)test_grid_search_failing_classifier_raiset  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ÚvaluesrZ  r~   rY  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ø  rH   r‘   rH   rH   rI   rx   §  s     z7test_parameters_sampler_replacement.<locals>.<listcomp>r—   r+  )r)   rƒ   rï  ÚUserWarningry   rK   rL   r(   rz   r™   r	   )	rc   r[  r   Z	grid_sizeZexpected_warningr\  rý  Zhashable_samplesZparams_distributionrH   rH   rI   Ú#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�   rp   r   r\   Zhinge)r  rˆ   )rQ  r­   rž   ri   )
rM   rµ   r¶   r!   r   r«   rL   rS   ri   rj   )r­   rQ   r•   r§   rH   rH   rI   Ú#test_stochastic_gradient_loss_param±  s2     ÿ  ÿ

 ÿ  ÿr  c                  C   sT   t  d¡ dd¡} ddddddg}tddd�}t|ddd	gid
d�}| | |¡ d S )Nr�   rp   r   r\   r¼   r½   r–   rÂ   rÉ   rˆ   )r­   rž   )rM   rµ   r¶   r6   r!   rS   rÝ  rH   rH   rI   Ú%test_search_train_scores_set_to_falseÑ  s
    r  c            	         s  d} d}t | dd�\}}ttddd�ddd	d
git|| d�dd�‰ ˆ  ||¡ ttd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	d
git|ddd� ||¡dd�}| ||¡ ttd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	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   rE  r¼   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  rH   rH   rI   Ú_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«  rH   rH   rI   r­    s     
  z:test_grid_search_cv_splits_consistency.<locals>.<dictcomp>c                 S   s    i | ]\}}|  d ¡s||“qS r¯  r±  r«  rH   rH   rI   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_typerH   rI   rx   0  s   ÿz:test_grid_search_cv_splits_consistency.<locals>.<listcomp>r\   rr   rˆ   )r   r!   r6   r0   rS   r%   r˜   rÐ  r   rL   rM   r´  rµ  r£   r�   rz   r@   )	rË   rÒ   rQ   r•   Zgs2Zgs3Zgs4r  Zper_param_scoresrH   r  rI   Ú&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 )NrF   r\   rr   rˆ   r�   )rC   r!   rS   rQ   r•   r[   rZ   rA   )r§   r¨   ZX_round_triprH   rH   rI   Ú+test_transform_inverse_transform_round_trip9  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  rL   r²  rM   Z
asanyarrayrb  ÚkindrA   r>   )ÚresultsÚgscvZexp_resultsr†  rH   rH   rI   Úcheck_resultsC  s    
  ÿz-test_custom_run_search.<locals>.check_resultsc                    s   t ˆ| dd� ˆ ˆ¡S )NT©rƒ  )r!   rS   rK  )rQ   r§   r•   rH   rI   Úfit_gridQ  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 rD   ©ÚsuperrJ   ©rG   rQ  Úkwargs©Ú	__class__rH   rI   rJ   U  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\   rr   Úmin_samples_splitr±   r}   rH   )rG   Úevaluater  ©r  r  rH   rI   Ú_run_searchX  s    þz:test_custom_run_search.<locals>.CustomSearchCV._run_search)re   rf   rg   rJ   r  Ú__classcell__rH   r  r  rI   ÚCustomSearchCVT  s   r  r   rÚ  r°   r‰   )rË   Zn_informativer¿   Tr  r¹  r\   rr   r  r±   r}   rp   rT  >   rÈ  r£   rO   rj  r¢   zAttribute %s not equal)	r.   r8   r   rS   r£   ÚdirÚislowerræ   rL   )r  Zmycvr  r  ÚattrrH   )rQ   r  r§   r  r•   rI   Útest_custom_run_searchB  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 rD   r  r  r  rH   rI   rJ   }  s    zDtest__custom_fit_no_run_search.<locals>.NoRunSearchSearchCV.__init__Nc                 [   s   | S rD   rH   )rG   rQ   r•   rÓ   Ú
fit_paramsrH   rH   rI   rS   €  s    z?test__custom_fit_no_run_search.<locals>.NoRunSearchSearchCV.fit)NN)re   rf   rg   rJ   rS   r  rH   rH   r  rI   ÚNoRunSearchSearchCV|  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 rD   r  r  r  rH   rI   rJ   ‡  s    z<test__custom_fit_no_run_search.<locals>.BadSearchCV.__init__)re   rf   rg   rJ   r  rH   rH   r  rI   ÚBadSearchCV†  s   r#  z_run_search not implemented.r�   )r.   r5   rS   rQ   r•   rƒ   r„   ÚNotImplementedError)r"  r#  rH   rH   rI   Útest__custom_fit_no_run_search{  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 rH   rH   )rt   ÚurH   rH   rI   rx   –  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Ð  rQ   r*   r   rƒ   r„   r¦   rS   r•   )rž   Ú
train_sizeÚridgerH   rH   rI   Ú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\   rH   )rG   ÚargsÚkwrH   rH   rI   Úget_n_splits¬  s    z;test_random_search_bad_cv.<locals>.BrokenKFold.get_n_splitsN)re   rf   rg   r-  rH   rH   rH   rI   Ú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¦   rS   rQ   r•   )r.  rž   r(  r)  rH   rH   rI   Útest_random_search_bad_cv¨  s    
ýr/  rƒ  Frˆ   rY  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 )Nrr   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 rT   )Ún_countsrn   rH   rH   rI   rJ   Ø  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   )r0  rM   rà  )rG   rQ  rQ   r•   rH   rH   rI   Ú__call__Û  s    zQtest_searchcv_raise_warning_with_non_finite_score.<locals>.FailingScorer.__call__N)re   rf   rg   rh   rJ   r1  rH   rH   rH   rI   ÚFailingScorerÕ  s   r2  rˆ   )r¥   rž   rƒ  rÒ  rÑ  zOne or more of the z scores are non-finiter|  r  )r   r7   rƒ   rï  rÿ  rS   rK   rL   ÚzipÚstrÚmessager£   ÚmaxrM   rì  rA   rg  )r¯   rœ  rƒ  rQ   r•   r2  rw   Zwarn_msgZset_with_warningÚmsgZdatasetZ	last_rankZnon_finite_maskrH   rH   rI   Ú1test_searchcv_raise_warning_with_non_finite_scoreÁ  s*    ÿüûr8  c            	      C   sª   dd„ } t dddd�\}}tddd�}t|d	d
dgi| dd�}| ||¡ ddddg}|D ]}d |¡|jksZt‚qZ| |¡}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)rX   r   )r§   rQ   r•   rþ   ÚcmrH   rH   rI   Úcustom_scorerü  s    

zAtest_callable_multimetric_confusion_matrix.<locals>.custom_scoreré(   r‰   r  rê   r¼   r½   r–   rÂ   r\   r;  r  r:  r<  r=  zmean_test_{}r9  )r   r6   r!   rS   Úformatr£   rL   rX   r   r_   rƒ   r›  )	r?  rQ   r•   rÆ  rù   Zscore_namesÚnamerþ   r>  rH   rH   rI   Ú*test_callable_multimetric_confusion_matrixù  s    

rC  c                  C   s¾   dd„ } t dddd�\}}td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Ã   )rX   r   r   ©rÆ  rQ   r•   rþ   rH   rH   rI   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   r6   r!   rS   r  rƒ   r›  rL   râ   r_   )r?  rQ   r•   rÆ  Úsearch_callableÚ
search_strrH   rH   rI   Ú1test_callable_multimetric_same_as_list_of_strings  s(     
  ÿ 
  ÿrH  c                  C   s,  dd„ } t dddd�\}}td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 rD   )rX   r   rD  rH   rH   rI   r?  ,  s    
zHtest_callable_single_metric_same_as_single_string.<locals>.custom_scorerr@  r‰   r  rê   r¼   r½   r–   rÂ   r\   Tr  rã   rE  )r?  rQ   r•   rÆ  rF  rG  Zsearch_list_strrH   rH   rI   Ú1test_callable_single_metric_same_as_single_string*  s2     
  ÿ 
  ÿ"rI  c               	   C   sh   dd„ } t dddd�\}}ttd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\   rH   ©rÆ  rQ   r•   rH   rH   rI   Ú
bad_scorerH  s    zBtest_callable_multimetric_error_on_invalid_key.<locals>.bad_scorerr@  r‰   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!   r6   rƒ   r„   r¦   rS   )rK  rQ   r•   r§   r7  rH   rH   rI   Ú.test_callable_multimetric_error_on_invalid_keyF  s    

üÿrL  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\   rH   rJ  rH   rH   rI   r?  ^  s    zBtest_callable_multimetric_error_failing_clf.<locals>.custom_scorerr  r}   r   rê   r  r\   rr   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/   rS   r>   r£   )r?  rQ   r•   r§   rÙ   rð  rH   rH   rI   Ú+test_callable_multimetric_error_failing_clf[  s"    ûýrN  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 rM  rH   rJ  rH   rH   rI   r?  y  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?  rQ   r•   r§   rÙ   Zindividual_fit_error_messager†   rH   rH   rI   Ú+test_callable_multimetric_clf_all_fits_failw  s"    ûûrO  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«   rL   rS   rP  )rë   rQ   r•   Zgbdtr­   rÙ   rÊ  rH   rH   rI   Útest_n_features_in•  s    
rQ  Ú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 ©NrR  rH   rn   ©rR  rH   rI   Ú
_more_tags±  s    z^test_search_cv_pairwise_property_delegated_to_base_estimator.<locals>.TestEstimator._more_tagsN)re   rf   rg   rU  rH   rT  rH   rI   ÚTestEstimator°  s   rV  z.BaseSearchCV pairwise tag must match estimatorr¼  r}   rR  N)r   r!   Ú	_get_tagsrL   )rR  rV  rÆ  Úattr_messagerž   rH   rT  rI   Ú<test_search_cv_pairwise_property_delegated_to_base_estimator¦  s
    
rY  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 rD   rT  )rG   rR  rH   rH   rI   rJ   Ä  s    zatest_search_cv__pairwise_property_delegated_to_base_estimator.<locals>.EstimatorPairwise.__init__c                 S   s
   d| j iS rS  rT  rn   rH   rH   rI   rU  Ç  s    zctest_search_cv__pairwise_property_delegated_to_base_estimator.<locals>.EstimatorPairwise._more_tagsN)T)re   rf   rg   rJ   rU  rH   rH   rH   rI   ÚEstimatorPairwiseÃ  s   
rZ  z4BaseSearchCV _pairwise property must match estimatorr¤  rT  r¼  r}   rR  N)r   rd   r!   rW  rL   )rZ  rÆ  rX  Z_pairwise_settingrž   rH   rH   rI   Ú=test_search_cv__pairwise_property_delegated_to_base_estimatorº  s    	r[  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.
    rD  rr   r   rE  r¼  r}   rª   r  )Zmetricz2GridSearchCV not identical with precomputed metricN)r   r2   r!   rS   rX   r    rg  rL   )rË   rÒ   rQ   r•   Zgrid_paramsr§   rž   Zpreds_originalZX_precomputedZpreds_precomputedrX  rH   rH   rI   Ú;test_search_cv_pairwise_property_equivalence_of_precomputedÓ  s    



r\  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 rD   )rö  )rG   rö  rH   rH   rI   rJ   ú  s    z5test_scalar_fit_param.<locals>.TestEstimator.__init__c                 S   s
   || _ d S rD   )Úr_)rG   rQ   r•   ÚrrH   rH   rI   rS   ý  s    z0test_scalar_fit_param.<locals>.TestEstimator.fitc                 S   s   t jt|ƒd�S )NrU   )rM   r¹   rK   rY   rH   rH   rI   rX    	  s    z4test_scalar_fit_param.<locals>.TestEstimator.predict)N)N)re   rf   rg   rJ   rS   rX   rH   rH   rH   rI   rV  ù  s   

rV  r  rÚ  )r^  )r   r   r   rS   r¢   r]  rL   )r¯   Úparam_searchrV  ÚmodelrQ   r•   rH   rH   rI   Útest_scalar_fit_paramñ  s
    
ra  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   rr   r\   )r  rS   rL   Úcallabler˜   rŽ   Úndim)rG   rQ   r•   rb  Útuple_of_arraysÚscalar_paramÚcallable_paramr  rH   rI   rS   	  s    	z=test_scalar_fit_param_compat.<locals>._FitParamClassifier.fit)NNNN)re   rf   rg   rS   r  rH   rH   r  rI   Ú_FitParamClassifier	  s
       ùrh  c                   S   s   d S rD   rH   rH   rH   rH   rI   Ú_fit_param_callable/	  s    z9test_scalar_fit_param_compat.<locals>._fit_param_callable)re  rg  rf  )r-   r   r   rS   )
r¯   r_  ZX_trainZX_validr  Zy_validrh  ri  r`  r!  rH   rH   rI   Útest_scalar_fit_param_compat		  s    ÿÿýrj  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   é   rr   r±   r\   r  ZtransformerZ	predictorr}   )Ztransformer__paramZpredictor__paramar²   rò  )rM   rÔ   rÕ   Zrandnr·   r4   r=   rS   rÅ   r  rL   rX   r   rA   r_   rƒ   r›  r   r>   rý   r   )	r¯   rk  r×   rQ   r•   r`  rc   rù   rþ   rH   rH   rI   Ú1test_search_cv_using_minimal_compatible_estimatorC	  s"    (ÿþ

"rm  c                 C   s‚   t ddddd�\}}tddd�}dd	gi}t||d
dd|d� ||¡ |  ¡ j}|rbt 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°   rr   rÉ   r   rÊ   r¼   r½   r–   rÂ   rÃ   rˆ   )r¥   rŸ   rž   rƒ  z$score=\(train=[\d\.]+, test=[\d.]+\)zscore=[\d\.]+N)
r   r6   r!   rS   Z
readouterrÚoutr÷   ÚfindallrK   rL   )Zcapsysrƒ  rQ   r•   r§   rw   Zcapturedr‚   rH   rH   rI   Útest_search_cv_verbose_3b	  s&    
ú ù
rp  rW  c           	      C   sš   t dd�\}}tdd�gdgdœ}|d d j}td	tƒ fd
gƒ}||i}| |fddddœ|—Ž ||¡}|d d j|ks€t‚|jjd jdks–t‚d S )Nr  rÚ  r¼   rÍ   r  )r§   Zclf__Cr§   r   Ztrs)r§   NTrr   rÃ   )rÜ   rž   r¥   )	r   r6   r–   r4   r=   rS   rL   r¢   Znamed_steps)	r¯   r_  rQ   r•   rc   Zorig_Cr¬   Zparam_grid_searchrÙ   rH   rH   rI   Útest_search_estimator_paramz	  s    
 ÿrq  )rH   )¾rh   rÖ  r÷   r    Úcollections.abcr   r   Ú	functoolsr   Úior   Ú	itertoolsr   r   rB  r   ÚnumpyrM   rƒ   Zscipy.sparseÚsparserû   Zscipy.statsr	   r
   r   Zsklearn.baser   r   r   Zsklearn.clusterr   Zsklearn.datasetsr   r   r   Zsklearn.ensembler   Zsklearn.experimentalr   Zsklearn.imputer   Zsklearn.linear_modelr   r   r   Zsklearn.metricsr   r   r   r   r   r   r   Zsklearn.metrics.pairwiser    Zsklearn.model_selectionr!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   Zsklearn.model_selection._searchr.   Z#sklearn.model_selection._validationr/   Z$sklearn.model_selection.tests.commonr0   Zsklearn.neighborsr1   r2   r3   Zsklearn.pipeliner4   Zsklearn.svmr5   r6   Zsklearn.treer7   r8   Zsklearn.utils._mockingr9   r:   Zsklearn.utils._testingr;   r<   r=   r>   r?   r@   rA   rB   rC   rl   r·   rQ   r•   r{   Ú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)  r1  r7  r8  rC  rN  rU  r^  rm  rq  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/  r8  rC  rH  rI  rL  rN  rO  rQ  rY  r[  r\  ra  rj  Úfilterwarningsrm  rp  rq  rH   rH   rH   rI   Ú<module>   sŠ  $	<('"ýýþ$

'
	($
-

R=þþ
8#$&
þ 
ÿûþ

ý
ýúþ
!"
(%.	Q( 	_	9þþþ
-
 þ
þþ
3

ýþ