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 )no_validation)chr).0key r   /var/www/www-root/data/www/176.119.141.140/sports-predictor/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#   whatever)r*   
get_paramsrangeordr   )r,   r0   paramscharr.   r   r   r2   4   s   zFastClassifier.get_params)r%   NN)F)__name__
__module____qualname____doc__r   r$   r3   r4   dict__annotations__r+   r2   __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)   rB   r@   rA   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   rD   O   s   zSometimesFailClassifier.fitc                    s   | j rtdt |S )Nzpredict failed)rA   rC   r*   predictr,   rF   r.   r   r   rH   T   s   zSometimesFailClassifier.predict)r%   NNr?   FFr   )r7   r8   r9   r+   rD   rH   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)rD   rH   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(   fail_FTr!      rB      r#      )resourcemax_resourcesmin_resourcesfactormean_test_scorerank_test_scoreN)r   r>   r3   rD   best_params_cv_results_npisnananyuniqueshapeall)	rJ   rK   rN   rF   rG   searchscoresranksunique_nan_ranksr   r   r   test_nan_handlingZ   s$   	

re   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   rP   r#   )<         rP   )rj   rj   ri      F)ri   rj   rk   )rj   ri   rl   	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 )NrL   r   rM   l1l2   r!   brg   rl   rP   )aggressive_eliminationrT   rV   T)verboseri   exhaustn_candidatesrU   )r   listr3   r   
set_paramsr   rD   n_iterations_n_required_iterations_n_possible_iterations_n_resources_n_candidates_n_remaining_candidates_r   rV   )rf   rx   rT   expected_n_iterationsexpected_n_required_iterationsexpected_n_possible_iterationsexpected_n_remaining_candidatesexpected_n_candidatesexpected_n_resourcesrN   rF   rG   
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autorR   rj   ri   2      ru   rz   rp   rq   rL   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 )NrL   r   rM   r#   rR   )r#   rR   rP   rv   rP   )rV   rU   rT   rQ   r|   rz   )
r   r   r   r   rD   r   r   r   r   len)rf   rU   rT   r   r   r   rN   rF   rG   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   rk   )    rh   rh   )   rP   rP   )   rP   rP   )rh   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#   rM   rR   r?   rv   rh   )cvrV   rT   rU   rj   r   r   )
r   r~   r3   r   r   r   rD   r   r   r   )rf   rT   n_iterationsn_possible_iterationsrN   rF   rG   r   r   rV   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 )NrL   r   rM   r#   rR   r?   rv   crP   )r   rS   rT   rV   )r#   rP   r   n_resourcesr5   param_cz0Cannot use resource=1234 which is not supported match1234)r   rS   rT   zSCannot use parameter c as the resource since it is part of the searched parameters.)r!   rw   r   )r   r~   r3   r   rD   setr   ziprZ   pytestraises
ValueErrorr   )
rf   rN   rF   rG   r   r   r   r_ir5   r   r   r   r   test_resource_parameter5  s>   "

"r   z2max_resources, n_candidates, expected_n_candidates))r   rz      )r   rz   r   )r   r   r   )r   rk   rk   )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   rM   rv   rR   rh   )r|   r   rT   rV   rU   rz   r}   )r   r   r   r   rD   r   r   )	rT   r|   r   rN   rF   rG   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   rM   r?   r   )r   r   r   rD   r   )param_distributionsr   rN   rF   rG   r   r   r   r   r   )test_random_search_discrete_distributions  s   r   zparams, expected_error_messagerS   not_a_parameterz:Cannot use resource=not_a_parameter which is not supported)rS   rT   z:Cannot use parameter a as the resource since it is part ofrw   )rT   rS   z:resource can only be 'n_samples' when max_resources='auto'      )rU   rT   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   rD   )rf   r5   expected_error_messager   r   rF   rG   r   r   r   r   test_input_errors  s   
"r   r{   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   rD   )r5   r   r   r   rF   rG   r   r   r   r   test_input_errors_randomized  s   
"r   zAfraction, subsample_test, expected_train_size, expected_test_size))      ?T(   r?   )r   Fr   rj   )皙?Tr   rh   )r   Fr   rj   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   get_n_splits)
r   r   expected_train_sizeexpected_test_sizerN   rF   rG   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   r~   r   r   r[   r`   )r   rN   rF   rG   r   folds_afolds_btrain_atest_atrain_btest_br   r   r   #test_subsample_splitter_determinism  s   r   zk, itr, expectedr   )drw   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#   rR   rR   rR   	rh   rP   r   r#      r?   r   rQ   r   	r!   rw   r   r   r   r   r   r   r   iterrW   r5   )kitr)r   r[   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   rL   rM   rr   ru   rv   c                    s      S )N)rand)estrF   rG   rngr   r   scorer:  s   ztest_cv_results.<locals>.scorerrR   )rV   scoringri   rz   r{   r   r   rW   r5   
params_str)indexcolumnsvaluesr#   ) r   importorskipr[   randomRandomStater   r~   r3   r   r   r   rD   
isinstancerZ   ndarray	DataFramer   r^   applystrpivotisnar   r`   sumr   wheremaxminidxmaxrY   iloc)rf   pdrN   rF   rG   r   r   r   r   cv_results_dftablenan_maskn_iteritalready_discarded_maskdiscarded_now_mask	kept_maskdiscarded_max_scorekept_min_score	last_iteridx_best_last_iter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*   rD   rE   )r/   passed_n_samples_fitr   r   rD     s   zAtest_base_estimator_inputs.<locals>.FastClassifierBookKeeping.fitc                    s    |jd  t |S r  )r  r_   r*   rH   rI   )r/   passed_n_samples_predictr   r   rH     s   zEtest_base_estimator_inputs.<locals>.FastClassifierBookKeeping.predictc                    s    | t jdi |S )Nr   )r  r*   r   )r,   r5   )r/   passed_paramsr   r   r     s   
zHtest_base_estimator_inputs.<locals>.FastClassifierBookKeeping.set_params)r7   r8   r9   rD   rH   r   r=   r   r  r  r  r.   r   FastClassifierBookKeeping  s    r  r   rR   r   rM   rr   ru   rv   F)rV   r   return_train_scorerefitri   rz   r{   c                 S   s   g | ]\}}|| qS r   r   )r   xrG   r   r   r   
<listcomp>  s    z.test_base_estimator_inputs.<locals>.<listcomp>T)return_countsr5   r   )r   r   r   r   r~   r3   r   r   rD   r   r   r   rZ   r[   r^   r   r`   r   )rf   r  r  rN   n_splitsrF   rG   r   r   r   passed_n_samplesr  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   rR   )rN   	n_classesr(   rP   )r(   Cr#   )r  z*The 'groups' parameter should not be None.)r   r(   r   r   )r   )r[   r   r   r   r   r   r   r   r	   r
   r   r   r   rD   r   r   )rf   r   rF   rG   r   clfgrid	group_cvs	error_msgr   gs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   rP   r   )rU   z;min_resources_=0: you might have passed an empty dataset X.r   N)r   r[   emptyreshaper   r   r   rD   )r-  r   r   rF   ra   err_msgr   r   r   test_min_resources_null  s   
"r1  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   )r[   array_select_best_index)r-  r   
best_indexr   r   r   test_select_best_index  s   r5  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   rh   *   )rN   
n_featuresr(   rbfr?   )scaleg?)kernelr%  gammapolyrR   rP   )r:  degree)param_Cparam_degreeparam_gammaparam_kernel)rW   mean_train_scorerX   split0_test_scoresplit1_test_scoresplit2_test_scoresplit0_train_scoresplit1_train_scoresplit2_train_scorestd_test_scorestd_train_scoremean_fit_timestd_fit_timemean_score_time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 )rA  r<  r>  r@  r?  Nmaskr   r   
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 )rA  r8  r>  r@  r?  NrP  rR  rS  r   r   rU  M  s    N)r   r   r   r   rD   r   r   rZ   r   r   r`   r3   )	rF   rG   r5   
param_keys
score_keys
extra_keysra   r|   expected_cv_results_kindsr   rS  r   (test_halving_random_search_list_of_dicts  s8   
	rZ  ):mathr   numpyr[   r   scipy.statsr   r   r   sklearn.datasetsr   sklearn.dummyr   sklearn.experimentalr   sklearn.model_selectionr	   r
   r   r   r   r   r   r   r   r   2sklearn.model_selection._search_successive_halvingr   r   )sklearn.model_selection.tests.test_searchr   r   sklearn.svmr   r   r   r>   markfilterwarningsparametrizere   r   r   r   r   r   r   r   r   r   r   r   r  r#  r,  r1  r5  rZ  r   r   r   r   <module>   s    0


!/$
'

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

d
B
 

