o
    iRq                     @   s  d dl mZ d dlZd dl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mZmZmZmZmZmZmZ d dlmZmZ d d	lmZmZ d d
l m!Z!m"Z" G dd deZ#G dd deZ$ej%&dej%&dej%&dej%'deefej%'dddd Z(ej%'deefej%'dddddddg dg dfd dddddg d!g d"fdd#ddddg dg d$fd d#ddddg dg d$fgd%d& Z)ej%'deefej%'d'd(d)d*dd+d,gfd-d)d*dd-d.gfd(d/ddd+gfd0d)d*d*d1d2gfd0d3d*d*d1d2gfd0d2d*d*d1d2gfd0d4d*d*d5d4gfd0d6d*d*d7d8gfd0d9d*d*d:d9gfd0d,d*d*d+d,gfd0d-ddd+gfd0d+ddd+gfgd;d< Z*ej%'deefej%'d=g d>d?d@ Z+ej%'deefdAdB Z,ej%'dCg dDdEdF Z-ej%'dGdHdd*gid*fdHeddidIfgdJdK Z.ej%'deefej%'dLdMdNidOfdHd:dPdQfd)dRdSdTfdUdVdWdXfdYeddZid[fdYe id[fgd\d] Z/ej%'dLd0d0d^d_fgd`da Z0ej%'dbg dcddde Z1ej%'dfdgdhdi Z2ej%'djdd dkgfd*d dHdkgfdd g dlfdId g dlfdddmgfd*ddndmgfdIddndmgfdd*dogfdId*g dpfg	dqdr Z3ej%'deefdsdt Z4ej%'deefdudv Z5ej%'deefdwdx Z6ej%'dyeegdzd{ Z7ej%'dyeegd|d} Z8d~d Z9dS )    )ceilN)exponnormrandint)make_classification)DummyClassifier)enable_halving_search_cv)

GroupKFoldGroupShuffleSplitHalvingGridSearchCVHalvingRandomSearchCVKFoldLeaveOneGroupOutLeavePGroupsOutShuffleSplitStratifiedKFoldStratifiedShuffleSplit)_SubsampleMetaSplitter_top_k)check_cv_results_array_typescheck_cv_results_keys)SVC	LinearSVCc                       sf   e Zd ZU dZi ejdd eededd D Zee	d< 		d fd
d	Z
d fdd	Z  ZS )FastClassifierzDummy classifier that accepts parameters a, b, ... z.

    These parameter don't affect the predictions and are useful for fast
    grid searching.c                 C   s   i | ]}t |d qS )Zno_validation)chr).0key r   o/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/model_selection/tests/test_successive_halving.py
<dictcomp>*   s    zFastClassifier.<dictcomp>az   _parameter_constraints
stratifiedNc                    s   t  j|||d d S N)strategyrandom_stateconstant)super__init__)selfr&   r'   r(   kwargs	__class__r   r   r*   -   s   
zFastClassifier.__init__Fc                    s:   t  j|d}ttdtdd D ]}d|t|< q|S )N)deepr    r!   r"   Zwhatever)r)   
get_paramsrangeordr   )r+   r/   paramscharr-   r   r   r0   4   s   zFastClassifier.get_params)r$   NN)F)__name__
__module____qualname____doc__r   r#   r1   r2   dict__annotations__r*   r0   __classcell__r   r   r-   r   r   !   s   
 r   c                       sD   e Zd Z							d fdd	Z fdd	Z fd
dZ  ZS )SometimesFailClassifierr$   N
   Fr   c                    s.   || _ || _|| _|| _t j|||d d S r%   )fail_fitfail_predictn_estimatorsr    r)   r*   )r+   r&   r'   r(   r@   r>   r?   r    r-   r   r   r*   <   s   

z SometimesFailClassifier.__init__c                    s   | j rtdt ||S )Nzfitting failed)r>   	Exceptionr)   fitr+   Xyr-   r   r   rB   O   s   zSometimesFailClassifier.fitc                    s   | j rtdt |S )Nzpredict failed)r?   rA   r)   predictr+   rD   r-   r   r   rF   T   s   zSometimesFailClassifier.predict)r$   NNr=   FFr   )r5   r6   r7   r*   rB   rF   r;   r   r   r-   r   r<   ;   s    r<   z+ignore::sklearn.exceptions.FitFailedWarningz!ignore:Scoring failed:UserWarningz%ignore:One or more of the:UserWarningHalvingSearchfail_at)rB   rF   c           	      C   s   d}t |dd\}}| t d| ddgdtdid	d
ddd}||| |jd|  r0J |jd }|jd }t| sCJ t	|t| }|j
d dksVJ |d |k s`J dS )z\Check the selection of the best scores in presence of failure represented by
    NaN values.  r   	n_samplesr'   Zfail_FTr       r@      r"      )resourcemax_resourcesmin_resourcesfactormean_test_scorerank_test_scoreN)r   r<   r1   rB   best_params_cv_results_npisnananyuniqueshapeall)	rH   rI   rL   rD   rE   searchZscoresZranksZunique_nan_ranksr   r   r   test_nan_handlingZ   s$   	

r_   Estzaggressive_elimination,max_resources,expected_n_iterations,expected_n_required_iterations,expected_n_possible_iterations,expected_n_remaining_candidates,expected_n_candidates,expected_n_resources,Tlimited   rM   r"   )<         rM   )rd   rd   rc      F)rc   rd   re   )rd   rc   rf   Z	unlimited)%   o   M    c	                 C   s   d}	t |	dd\}
}dttdd}t }|dkrd}n|	}| ||||d	d
}|jdd | tu r9|jddd ||
| |j|ksFJ |j|ksMJ |j	|ksTJ |j
|ks[J |j|ksbJ |j|ksiJ t|jd |j |jksxJ d S )NrJ   r   rK   l1l2   r    bra   rf   rM   )aggressive_eliminationrQ   rS   T)verboserc   exhaustn_candidatesrR   )r   listr1   r   
set_paramsr   rB   n_iterations_n_required_iterations_n_possible_iterations_n_resources_n_candidates_Zn_remaining_candidates_r   rS   )r`   rq   rQ   expected_n_iterationsexpected_n_required_iterationsexpected_n_possible_iterationsZexpected_n_remaining_candidatesexpected_n_candidatesexpected_n_resourcesrL   rD   rE   
param_gridbase_estimatorshr   r   r   test_aggressive_elimination   s2   )"r   zfmin_resources,max_resources,expected_n_iterations,expected_n_possible_iterations,expected_n_resources,smallestautorO   rd   rc   2      rn   rs   ri   rj   rJ   iX     iW     iU  i,  d   c                 C   s   d}t |dd\}}ddgg dd}	t }
| |
|	d||d	}| tu r)|jd
d ||| d}|j|ks8J |j|ks?J |j|ksFJ |j|ksMJ |dkrd|j|j  krat	|jksfJ  J d S d S )NrJ   r   rK   r"   rO   )r"   rO   rM   ro   rM   )rS   rR   rQ   rN   ru   rs   )
r   r   r   rx   rB   ry   rz   r{   r|   len)r`   rR   rQ   r~   r   r   rL   rD   rE   r   r   r   r   r   r   r   test_min_max_resources   s.   &&r   z2max_resources, n_iterations, n_possible_iterations)	)r      	   )   r   r   )i  r      )   r   r   )i  r   re   )    rb   rb   )   rM   rM   )   rM   rM   )rb   r"   r"   c                 C   s   d}t |dd\}}ddgttdd}t }d}	| ||d|	|dd}
| tu r.|
jd	d
 |
|| |
jdks;J |
j|ksBJ |
j	|ksIJ d S )Nr   r"   rK   rO   r=   ro   rb   )cvrS   rQ   rR   rd   r   r   )
r   rw   r1   r   r   rx   rB   rz   ry   r{   )r`   rQ   Zn_iterationsZn_possible_iterationsrL   rD   rE   r   r   rS   r   r   r   r   test_n_iterations  s&   r   c           
      C   sj  d}t |dd\}}ddgttdd}t }| ||dddd	d
}||| t|jtg dks5J t|jd |jd |jd D ]\}}}	||d   krV|	ksYJ  J qDt	j
tdd t||dddd}||| W d    n1 s{w   Y  t	j
tdd$ ddgddgdd	gd}t||dddd}||| W d    d S 1 sw   Y  d S )NrJ   r   rK   r"   rO   r=   ro   crM   )r   rP   rQ   rS   )r"   rM   r   n_resourcesr3   param_cz0Cannot use resource=1234 which is not supported match1234)r   rP   rQ   zSCannot use parameter c as the resource since it is part of the searched parameters.)r    rp   r   )r   rw   r1   r   rB   setr|   ziprW   pytestraises
ValueErrorr   )
r`   rL   rD   rE   r   r   r   Zr_ir3   r   r   r   r   test_resource_parameter5  s>   "

"r   z2max_resources, n_candidates, expected_n_candidates))r   rs      )r   rs   r   )r   r   r   )r   re   re   )r   r   r   c           	   	   C   sz   d}t |dd\}}ttd}t }t|||d| ddd}||| |jd |ks,J |dkr9|jd	 | ks;J d S d S )
Nr   r   rK   ro   rO   rb   )ru   r   rQ   rS   rR   rs   rv   )r   r   r   r   rB   r}   r|   )	rQ   ru   r   rL   rD   rE   r   r   r   r   r   r   test_random_search]  s&   
	r   z*param_distributions, expected_n_candidatesr    r=   c                 C   sJ   d}t |dd\}}t }t|| dd}||| |jd |ks#J d S )Nr   r   rK   r=   r   )r   r   r   rB   r}   )param_distributionsr   rL   rD   rE   r   r   r   r   r   )test_random_search_discrete_distributions  s   r   zparams, expected_error_messagerP   Znot_a_parameterz:Cannot use resource=not_a_parameter which is not supported)rP   rQ   z:Cannot use parameter a as the resource since it is part ofrp   )rQ   rP   z:resource can only be 'n_samples' when max_resources='auto'      )rR   rQ   z3min_resources_=15 is greater than max_resources_=14r   )shufflezmust yield consistent foldsc                 C   sn   t  }ddgi}td\}}| ||fi |}tjt|d ||| W d    d S 1 s0w   Y  d S Nr    r"   r   r   )r   r   r   r   r   rB   )r`   r3   expected_error_messager   r   rD   rE   r   r   r   r   test_input_errors  s   
"r   rt   zcannot be both set to 'exhaust'c                 C   sn   t  }ddgi}td\}}t||fi | }tjt|d ||| W d    d S 1 s0w   Y  d S r   )r   r   r   r   r   r   rB   )r3   r   r   r   rD   rE   r   r   r   r   test_input_errors_randomized  s   
"r   zAfraction, subsample_test, expected_train_size, expected_test_size))      ?T(   r=   )r   Fr   rd   )皙?Tr   rb   )r   Fr   rd   c           
      C   s   d}t |\}}ttd| |d d}|||D ]9\}}	|jd |ks%J |	jd |ks.J |rC|jd |	jd  t||  ksBJ q|	jd ||j  ksQJ qd S )Nr   r   base_cvfractionsubsample_testr'   r   )r   r   r   splitr\   intr   Zget_n_splits)
r   r   Zexpected_train_sizeZexpected_test_sizerL   rD   rE   r   traintestr   r   r   test_subsample_splitter_shapes  s   &r   r   )TFc                 C   s   d}t |\}}ttdd| d d}t|j||d d}t|j||d d}t||D ]3\\}}\}	}
t||	kr<J | rHt||
krGJ q+t||
ksQJ t|| ||
 ks^J q+d S )Nr   r   r   r   groups)r   r   r   rw   r   r   rX   r]   )r   rL   rD   rE   r   Zfolds_aZfolds_bZtrain_aZtest_aZtrain_bZtest_br   r   r   #test_subsample_splitter_determinism  s   r   zk, itr, expectedr   )drp   r    r   efi)ghr   c                 C   s<   g dg dg dd}t || |d}t||ksJ d S )N	r   r   r   r   r"   r"   rO   rO   rO   	rb   rM   r   r"      r=   r   rN   r   	r    rp   r   r   r   r   r   r   r   iterrT   r3   )kitr)r   rX   r]   )r   r   expectedresultsgotr   r   r   
test_top_k  s   r   c                    s4  t d}tjd d}t|dd\}}dttdd}t } fdd	}| ||d
|d}| t	u r:|j
ddd ||| t|jd tjsKJ t|jd tjsVJ ||j}	t|	d  t|	ksjJ |	d t|	d< |	jdddd}
||
}|j}t|d D ]H}|| }|||d  @ |k sJ | ||d  @ }| | @ }| |j|d  ksJ |
| | }|
| | }||k sJ q|	d  }|	|	d |k d  }|	d  }|j|	j| d ksJ |	j| d |	j| d k sJ |	j| d |	j| d ksJ d S )Npandasr   rJ   rK   rk   rn   ro   c                    s      S )N)Zrand)ZestrD   rE   rngr   r   scorer:  s   ztest_cv_results.<locals>.scorerrO   )rS   Zscoringrc   rs   rt   r   r   rT   r3   
params_str)indexcolumnsvaluesr"   ) r   importorskiprX   randomRandomStater   rw   r1   r   r   rx   rB   
isinstancerW   Zndarray	DataFramer   r[   applystrZpivotZisnary   r]   sumr}   wheremaxminZidxmaxrV   Ziloc)r`   pdrL   rD   rE   r   r   r   r   cv_results_dftableZnan_maskZn_iteritZalready_discarded_maskZdiscarded_now_maskZ	kept_maskZdiscarded_max_scoreZkept_min_scoreZ	last_iterZidx_best_last_iterZidx_best_all_itersr   r   r   test_cv_results*  s\   


r   c                    sn  t d}g  g g G  fdddt}d}d}t|dd\}}dttd	d
}| }| ||d|ddd}	| tu rD|	jddd |	|| t	 t	ksTJ dd t
 D }
|
d d | }
d d | ||	j}t	t	|
  krt	|ksJ  J tj|
dd\}}|	j|k sJ |	j|k sJ |d k sJ |d |
k sJ d S )Nr   c                       s:   e Zd Z fddZ fddZ fddZ  ZS )z=test_base_estimator_inputs.<locals>.FastClassifierBookKeepingc                    s    |jd  t ||S Nr   )appendr\   r)   rB   rC   )r.   passed_n_samples_fitr   r   rB     s   zAtest_base_estimator_inputs.<locals>.FastClassifierBookKeeping.fitc                    s    |jd  t |S r   )r   r\   r)   rF   rG   )r.   passed_n_samples_predictr   r   rF     s   zEtest_base_estimator_inputs.<locals>.FastClassifierBookKeeping.predictc                    s    | t jdi |S )Nr   )r   r)   rx   )r+   r3   )r.   passed_paramsr   r   rx     s   
zHtest_base_estimator_inputs.<locals>.FastClassifierBookKeeping.set_params)r5   r6   r7   rB   rF   rx   r;   r   r   r   r   r-   r   FastClassifierBookKeeping  s    r   r   rO   r   rK   rk   rn   ro   F)rS   r   return_train_scoreZrefitrc   rs   rt   c                 S   s   g | ]\}}|| qS r   r   )r   xrE   r   r   r   
<listcomp>  s    z.test_base_estimator_inputs.<locals>.<listcomp>T)Zreturn_countsr3   r   )r   r   r   r   rw   r1   r   rx   rB   r   r   r   rW   rX   r[   r|   r]   r}   )r`   r   r   rL   n_splitsrD   rE   r   r   r   Zpassed_n_samplesr   Zuniquescountsr   r   r   test_base_estimator_inputs  sD   
(r   c              	   C   s   t jd}tdddd\}}|ddd}tdd}ddgi}t tdtdd	t	ddg}d
}|D ]/}	| |||	dd}
t
jt|d |
|| W d    n1 sUw   Y  |
j|||d q3t tddg}|D ]}	| |||	d}
|
|| qmd S )Nr   r   rO   )rL   Z	n_classesr'   rM   )r'   Cr"   )r   z*The 'groups' parameter should not be None.)r   r'   r   r   )r   )rX   r   r   r   r   r   r   r   r	   r
   r   r   r   rB   r   r   )r`   r   rD   rE   r   ZclfgridZ	group_cvs	error_msgr   gsZnon_group_cvsr   r   r   test_groups_support  s,   

r   SearchCVc                 C   st   t  }ddgi}tddd}| ||dd}d}tjt|d ||g  W d	   d	S 1 s3w   Y  d	S )
zBCheck that we raise an error if the minimum resources is set to 0.r    r"   r   rM   r   )rR   z;min_resources_=0: you might have passed an empty dataset X.r   N)r   rX   emptyZreshaper   r   r   rB   )r   r   r   rD   r^   err_msgr   r   r   test_min_resources_null  s   
"r   c                 C   sH   t g dt g dt g dd}| dd|}|dks"J dS )z3Check the selection strategy of the halving search.r   r   r   r   Nr   )rX   arrayZ_select_best_index)r   r   Z
best_indexr   r   r   test_select_best_index  s   r  c            	         s   t dddd\} }dgtddtddd	d
gddgdg}d}d}d}tt d|ddd}|| | t|j}|j t |||| ddddd}t	|||| t
 fddt|D saJ t
 fddt|D spJ dS )zqCheck the behaviour of the `HalvingRandomSearchCV` with `param_distribution`
    being a list of dictionary.
    r   rb   *   )rL   Z
n_featuresr'   rbfr=   )scaleg?)kernelr   gammapolyrO   rM   )r  Zdegree)param_Cparam_degreeparam_gammaparam_kernel)rT   Zmean_train_scorerU   Zsplit0_test_scoreZsplit1_test_scoreZsplit2_test_scoreZsplit0_train_scoreZsplit1_train_scoreZsplit2_train_scoreZstd_test_scoreZstd_train_scoreZmean_fit_timeZstd_fit_timeZmean_score_timeZstd_score_time)r   r   Tr   )r   r   r   r'   r   r   Oc                 3   sL    | ]!} d  | dkr d j | o! d j | o! d j |  V  qdS )r  r  r	  r  r
  Nmaskr   r   Z
cv_resultsr   r   	<genexpr>D  s    z;test_halving_random_search_list_of_dicts.<locals>.<genexpr>c                 3   sN    | ]"} d  | dkr d j |  o" d j |  o" d j | V  qdS )r  r  r	  r  r
  Nr  r  r  r   r   r  M  s    N)r   r   r   r   rB   r   r}   rW   r   r   r]   r1   )	rD   rE   r3   Z
param_keysZ
score_keysZ
extra_keysr^   ru   Zexpected_cv_results_kindsr   r  r   (test_halving_random_search_list_of_dicts  s8   
	r  ):mathr   numpyrX   r   Zscipy.statsr   r   r   Zsklearn.datasetsr   Zsklearn.dummyr   Zsklearn.experimentalr   Zsklearn.model_selectionr	   r
   r   r   r   r   r   r   r   r   Z2sklearn.model_selection._search_successive_halvingr   r   Z)sklearn.model_selection.tests.test_searchr   r   Zsklearn.svmr   r   r   r<   markfilterwarningsZparametrizer_   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   <module>   s    0


!/$
'



	
	






d
B
 

