U
    -eE?                    @   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jjkd&e@eeAd'd(gejjkd)deld*fd+dgidgeld,fd+dield-fgd.d/ Zmd0d1 Znd2d3 Zod4d5 Zpejjkd6e9eBg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ZecdWdX ZdYdZ Zd[d\ Zejjkd]d d#gejjkd^eBe9gd_d` Zdadb Zdcdd Zdedf Zdgdh Zecdidj Zdkdl Zdmdn Zdodp Zdqdr ZddtduZdvdw Zdxdy Zejjkdze9d{d|d"d'giifeBd|d"d'gid#d}fgd~d Zdd Zdd Zdd Zdd Zejjkd^eBeV ddd'gide9eV ddd'gidgdd Zejjkd^eBeOddddd'gidde9eOddddd'giddgdd Zdd Zdd Zec dd Zdd Zdd Zdd Zdd Zdd ZG dd deZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zejjkdddgejjkdze9d{dd#dddgiifeBdd#dddgidd}fgddƄ ZddȄ Zddʄ Zdd̄ Zdd΄ ZddЄ Zdd҄ ZddԄ Zejjkdddgddׄ Zddل Zddۄ Zejjkde9dddgifeBded"difgdd Zejjkde9dddgifeBdeddރifgdd Zejjdejjkd6e9eBgejjkde]e\gdd Zejjkdddgdd Zejjkde9d{feBdfe<d{fgdd Zd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   j/var/www/html/Darija-Ai-Train/env/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stt
|i gkst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rt	|d |jk	st	|d |jk	st	t
|d d drt	t
|d d drt	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 )Nd   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st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 st|	dk st||	kst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}	|	|| qd 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rtttdddd	|i}t|drtttdddd	|idd}|| | t|drt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 qd 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   zParameter 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,3zParameter 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st||kst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st
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st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   {Gz?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st
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st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st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stt|td
ddgdd}||  |jd dkstd S )N2   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st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stqd 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st fdd|D st fdd|D stt||| t	 ||| |j  fddt
|D }t|st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 st
t fddt	|D st
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st|	tt|kst|tdkst|tdkstd S )Nr   r\   r   FP   )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 )zCompare 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stqd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   ir   )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 rt	t|d d |d d rt	t|jd ddd
g qHd S )NrD  r  rE  r   r\   gjt?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stt|j| dk sztqzdD ]H}|j| d dkst|j| d dkstt|j| dk stqt|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
||st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|||  qqq.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|	  |  qqrq>|D ]}t|||dd}|| | |jd }tt|D ]v}|j	f ||  t
|| |D ]N\}	\}
}|| |
 ||
  || | || }t||jd|	  |  qFq"qd 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 st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   z5 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  z5 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stt| D ]}||kstqtt | dddksttdtdtdd} t | ddd}t|}t|dkst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rt||| t|drt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st	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 |< qt|d |d  t|d |d  qd 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rt||t||kstd| qd 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  >   rO   rj  r   r  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stt||D ]"\}	}
d
|
 dt	|	j
kst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st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st|j|jkst|	||t|	||kst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st|j|jkst|	||t|	||kst|jt|jkst|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st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 st|
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st
||}t|rt|d |||tt||kst
n.t||  |||tt||kst
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st|jjd jdkst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

