U
    3d8U                     @   s  d dl Z d dlZd dlmZ d dlZd dlZd dl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 d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl m!Z! d dlm"Z" d dl#Z#G dd deZ$G dd deZ%G dd deZ&G dd deZ'G dd deZ(G dd de'Z)G dd de'e(Z*G dd  d e*Z+G d!d" d"eZ,G d#d$ d$eZ-G d%d& d&Z.G d'd( d(eZ/d)d* Z0d+d, Z1d-d. Z2d/d0 Z3d1d2 Z4d3d4 Z5d5d6 Z6d7d8 Z7d9d: Z8d;d< Z9d=d> Z:d?d@ Z;dAdB Z<dCdD Z=dEdF Z>ej?@dGedHd dIejAd dJfedHd dIejBd dJfgdKdL ZCdMdN ZDdOdP ZEG dQdR dReZFdSZGdTdU ZHG dVdW dWeZIdXdY ZJdZd[ ZKG d\d] d]ZLG d^d_ d_eLeZMd`da ZNdbdc ZOG ddde deeZPeeQdfdgdh ZRdidj ZSdkdl ZTdmdn ZUdodp ZVdqdr ZWdsdt ZXdudv ZYdwdx ZZG dydz dzZ[G d{d| d|e[eZ\ej?@d}e e\ gd~d Z]dd Z^dS )    N)assert_array_equal)assert_no_warnings)ignore_warnings)BaseEstimatorcloneis_classifier)SVC)StandardScaler)_get_output_config)Pipeline)GridSearchCV)DecisionTreeClassifier)DecisionTreeRegressor)datasets)TransformerMixin)MockDataFrame)config_contextc                   @   s   e Zd ZdddZdS )MyEstimatorr   Nc                 C   s   || _ || _d S N)l1empty)selfr   r    r   ;/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/tests/test_base.py__init__#   s    zMyEstimator.__init__)r   N__name__
__module____qualname__r   r   r   r   r   r   "   s   r   c                   @   s   e Zd ZdddZdS )KNc                 C   s   || _ || _d S r   )cd)r   r    r!   r   r   r   r   )   s    z
K.__init__)NNr   r   r   r   r   r   (   s   r   c                   @   s   e Zd ZdddZdS )TNc                 C   s   || _ || _d S r   )ab)r   r#   r$   r   r   r   r   /   s    z
T.__init__)NNr   r   r   r   r   r"   .   s   r"   c                   @   s   e Zd Zdd ZdS )NaNTagc                 C   s   ddiS )N	allow_nanTr   r   r   r   r   
_more_tags5   s    zNaNTag._more_tagsNr   r   r   r(   r   r   r   r   r%   4   s   r%   c                   @   s   e Zd Zdd ZdS )NoNaNTagc                 C   s   ddiS Nr&   Fr   r'   r   r   r   r(   :   s    zNoNaNTag._more_tagsNr)   r   r   r   r   r*   9   s   r*   c                   @   s   e Zd Zdd ZdS )OverrideTagc                 C   s   ddiS r+   r   r'   r   r   r   r(   ?   s    zOverrideTag._more_tagsNr)   r   r   r   r   r,   >   s   r,   c                   @   s   e Zd Zdd ZdS )DiamondOverwriteTagc                 C   s   t  S r   )dictr'   r   r   r   r(   D   s    zDiamondOverwriteTag._more_tagsNr)   r   r   r   r   r-   C   s   r-   c                   @   s   e Zd ZdS )InheritDiamondOverwriteTagNr   r   r   r   r   r   r   r/   H   s   r/   c                   @   s$   e Zd ZdZedgfddZdS )ModifyInitParamsz_Deprecated behavior.
    Equal parameters but with a type cast.
    Doesn't fulfill a is a
    r   c                 C   s   |  | _d S r   )copyr#   r   r#   r   r   r   r   R   s    zModifyInitParams.__init__N)r   r   r   __doc__nparrayr   r   r   r   r   r1   L   s   r1   c                   @   s   e Zd ZdZdddZdS )Buggyz9A buggy estimator that does not set its parameters right.Nc                 C   s
   d| _ d S )N   r#   r3   r   r   r   r   Y   s    zBuggy.__init__)Nr   r   r   r4   r   r   r   r   r   r7   V   s   r7   c                   @   s(   e Zd Zdd ZdddZd	ddZdS )
NoEstimatorc                 C   s   d S r   r   r'   r   r   r   r   ^   s    zNoEstimator.__init__Nc                 C   s   | S r   r   r   Xyr   r   r   fita   s    zNoEstimator.fitc                 C   s   d S r   r   r   r=   r   r   r   predictd   s    zNoEstimator.predict)NN)N)r   r   r   r   r?   rA   r   r   r   r   r;   ]   s   
r;   c                   @   s   e Zd ZdZdd ZdS )VargEstimatorz-scikit-learn estimators shouldn't have vargs.c                 G   s   d S r   r   )r   Zvargsr   r   r   r   k   s    zVargEstimator.__init__Nr:   r   r   r   r   rB   h   s   rB   c                  C   sn   ddl m} m} | |dd}t|}||k	s0t| | ksDt| |tdd}t|}||k	sjtd S )Nr   	SelectFpr	f_classif皙?alpha)
      )sklearn.feature_selectionrD   rE   r   AssertionError
get_paramsr5   zerosrD   rE   selectorZnew_selectorr   r   r   
test_clones   s    rQ   c                  C   s<   ddl m} m} | |dd}d|_t|}t|dr8td S )Nr   rC   rF   rG   testown_attribute)rK   rD   rE   rS   r   hasattrrL   rO   r   r   r   test_clone_2   s
    rU   c               	   C   s   t  } d| _tt t|  W 5 Q R X t }tt t| W 5 Q R X t }tt t| W 5 Q R X t	 }tt t| W 5 Q R X d S )NrJ   )
r7   r#   pytestraisesRuntimeErrorr   r;   	TypeErrorrB   r1   )ZbuggyZno_estimatorZvarg_estestr   r   r   test_clone_buggy   s    r[   c                  C   s^   t tg d} t| }t| j|j t ttdggd} t| }t| jj|jj d S )Nr   r   )	r   r5   r6   r   r   r   spZ
csr_matrixdataclfZclf2r   r   r   test_clone_empty_array   s    ra   c                  C   s(   t tjd} t| }| j|jks$td S Nr\   )r   r5   nanr   r   rL   r_   r   r   r   test_clone_nan   s    rd   c                  C   sj   dd t tD } | D ]N}|td}t|d}t|}|jj|jjksNtt	|j
 |j
  qd S )Nc                 S   s    g | ]}| d rtt|qS )Z_matrix)endswithgetattrr]   ).0namer   r   r   
<listcomp>   s    
 z.test_clone_sparse_matrices.<locals>.<listcomp>   r\   )dirr]   r5   Zeyer   r   r   	__class__rL   r   Ztoarray)Zsparse_matrix_classesclsZsparse_matrixr`   Z
clf_clonedr   r   r   test_clone_sparse_matrices   s    
rn   c                  C   s&   t t d} t| }| j|jks"td S rb   )r   r   r   rL   r_   r   r   r   test_clone_estimator_types   s    
ro   c               	   C   s*   d} t jt| d tt W 5 Q R X d S )Nz8You should provide an instance of scikit-learn estimatormatch)rV   rW   rY   r   r   )msgr   r   r   %test_clone_class_rather_than_instance   s    rs   c                  C   sT   t  } t|  tt t }t|dks,ttdgd d}tt|dksPtd S )NzT(a=K(), b=K())Zlong_paramsi  r9   i  )r   reprr"   r   rL   len)my_estimatorrR   Zsome_estr   r   r   	test_repr   s    rw   c                  C   s   t  } t|  d S r   )r   str)rv   r   r   r   test_str   s    ry   c               	   C   sv   t t t} d| jddks td| jddks4t| jdd | jjdksPttt	 | jdd W 5 Q R X d S )Na__dT)deepFrJ   )rz   )Za__a)
r"   r   rM   rL   
set_paramsr#   r!   rV   rW   
ValueError)rR   r   r   r   test_get_params   s    r~   c                  C   sj   t  } t| sttt| dddgis,tttd| fgsBtttdt| dddgifgsftd S )NCrF   r8   svcZsvc_cv)r   r   rL   r   r   )r   r   r   r   test_is_classifier   s
    r   c               	   C   sX   t dt fg} tt | jdd W 5 Q R X tt | jdd W 5 Q R X d S )Nr   T)Zsvc__stupid_param)Zsvm__stupid_param)r   r   rV   rW   r}   r|   )r`   r   r   r   test_set_params   s
    r   c                     sR   G  fdddt } ddd td|  fgt|  i fD ]}|jddd q:d S )Nc                       s   e Zd Z fddZ  ZS )z?test_set_params_passes_all_parameters.<locals>.TestDecisionTreec                    s   t  jf | |kst| S r   )superr|   rL   )r   kwargs)rl   expected_kwargsr   r   r|     s    zJtest_set_params_passes_all_parameters.<locals>.TestDecisionTree.set_params)r   r   r   r|   __classcell__r   r   )rl   r   TestDecisionTree  s   r   rj   rJ   )	max_depthZmin_samples_leaf	estimator)Zestimator__max_depthZestimator__min_samples_leaf)r   r   r   r|   )r   rZ   r   r   r   %test_set_params_passes_all_parameters  s    

r   c                  C   s0   t t i } | jt dd | jjdks,td S )Ng      E@)r   Zestimator__C)r   r   r|   r   r   r   rL   )Zgscvr   r   r   $test_set_params_updates_valid_params#  s    r   ztree,datasetrJ   )r   random_state)r   c           	      C   sh   t jd}|\}}| || |jddt|d}| ||}| j|||d}d}||ksdt|d S )Nr   r8   rI   )size)sample_weightz5Unweighted and weighted scores are unexpectedly equal)r5   randomZRandomStater?   randintru   scorerL   )	treeZdatasetrngr=   r>   r   Zscore_unweightedZscore_weightedrr   r   r   r   test_score_sample_weight+  s    r   c                  C   sb   G dd dt t} td}t|}| |dd}t|}|j|jkj sNt	|j
|j
ks^t	d S )Nc                   @   s,   e Zd ZdZd
ddZdddZdd	 ZdS )z3test_clone_pandas_dataframe.<locals>.DummyEstimatora,  This is a dummy class for generating numerical features

        This feature extractor extracts numerical features from pandas data
        frame.

        Parameters
        ----------

        df: pandas data frame
            The pandas data frame parameter.

        Notes
        -----
        Nr8   c                 S   s   || _ || _d S r   )dfscalar_param)r   r   r   r   r   r   r   W  s    z<test_clone_pandas_dataframe.<locals>.DummyEstimator.__init__c                 S   s   d S r   r   r<   r   r   r   r?   [  s    z7test_clone_pandas_dataframe.<locals>.DummyEstimator.fitc                 S   s   d S r   r   r@   r   r   r   	transform^  s    z=test_clone_pandas_dataframe.<locals>.DummyEstimator.transform)Nr8   )N)r   r   r   r4   r   r?   r   r   r   r   r   DummyEstimatorG  s   

r   rI   r8   )r   )r   r   r5   Zaranger   r   r   valuesallrL   r   )r   r!   r   eZcloned_er   r   r   test_clone_pandas_dataframeF  s    
r   c                  C   sl   t  } t | j| j}t|}d|ks0tt	tj
|}|| j| j}|| j| j}||kshtd S )N   version)r   	load_irisr   r?   r^   targetpickledumpsrL   r   loadsr   )irisr   Ztree_pickleZtree_restoredZscore_of_originalZscore_of_restoredr   r   r   ?test_pickle_version_warning_is_not_raised_with_matching_versionl  s    
r   c                   @   s   e Zd Zdd ZdS )TreeBadVersionc                 C   s   t | j ddS )N	something)_sklearn_version)r.   __dict__itemsr'   r   r   r   __getstate__z  s    zTreeBadVersion.__getstate__Nr   r   r   r   r   r   r   r   r   y  s   r   zTrying to unpickle estimator {estimator} from version {old_version} when using version {current_version}. This might lead to breaking code or invalid results. Use at your own risk.c               	   C   s^   t  } t | j| j}t|}tj	ddt
jd}tjt|d t| W 5 Q R X d S )Nr   r   r   Zold_versioncurrent_versionrp   )r   r   r   r?   r^   r   r   r   pickle_error_messageformatsklearn__version__rV   warnsUserWarningr   )r   r   Ztree_pickle_othermessager   r   r   <test_pickle_version_warning_is_issued_upon_different_version  s    
r   c                   @   s   e Zd Zdd ZdS )TreeNoVersionc                 C   s   | j S r   )r   r'   r   r   r   r     s    zTreeNoVersion.__getstate__Nr   r   r   r   r   r     s   r   c               	   C   sj   t  } t | j| j}t|}d|ks0tt	j
ddtjd}tjt|d t| W 5 Q R X d S )Nr   r   zpre-0.18r   rp   )r   r   r   r?   r^   r   r   r   rL   r   r   r   r   rV   r   r   r   )r   r   tree_pickle_noversionr   r   r   r   Dtest_pickle_version_warning_is_issued_when_no_version_info_in_pickle  s    
r   c                  C   sN   t  } t | j| j}t|}ztj}dt_t	tj
| W 5 |t_X d S )N
notsklearn)r   r   r   r?   r^   r   r   r   r   r   r   )r   r   r   Zmodule_backupr   r   r   Ctest_pickle_version_no_warning_is_issued_with_non_sklearn_estimator  s    
r   c                   @   s   e Zd Zdd Zdd ZdS )DontPickleAttributeMixinc                 C   s   | j  }d |d< |S N_attribute_not_pickledr   r2   r   r^   r   r   r   r     s    
z%DontPickleAttributeMixin.__getstate__c                 C   s   d|d< | j | d S )NT	_restored)r   update)r   stater   r   r   __setstate__  s    z%DontPickleAttributeMixin.__setstate__N)r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd ZdddZdS )MultiInheritanceEstimatorrj   c                 C   s   || _ d | _d S r   attribute_pickledr   r   r   r   r   r   r     s    z"MultiInheritanceEstimator.__init__N)rj   r   r   r   r   r   r     s   r   c                  C   sJ   t  } d| _t| }t|}|jdks.t|jd ks<t|jsFtd S N$this attribute should not be pickledrj   )r   r   r   r   r   r   rL   r   r   
serializedZestimator_restoredr   r   r   3test_pickling_when_getstate_is_overwritten_by_mixin  s    

r   c               	   C   s~   zlt }d}||_t |j} dt |_| }|d ddks@td|d< || |jdks`t|jsjtW 5 | t |_X d S )Nr   r   rj   )r   r      r   )	typer   r   r   r   rL   r   r   r   )old_modr   textr   r   r   r   Ftest_pickling_when_getstate_is_overwritten_by_mixin_outside_of_sklearn  s    


r   c                   @   s   e Zd ZdddZdd ZdS )SingleInheritanceEstimatorrj   c                 C   s   || _ d | _d S r   r   r   r   r   r   r     s    z#SingleInheritanceEstimator.__init__c                 C   s   | j  }d |d< |S r   r   r   r   r   r   r     s    
z'SingleInheritanceEstimator.__getstate__N)rj   )r   r   r   r   r   r   r   r   r   r     s   
r   )categoryc                  C   s@   t  } d| _t| }t|}|jdks.t|jd ks<td S r   )r   r   r   r   r   r   rL   r   r   r   r   Ctest_pickling_works_when_getstate_is_overwritten_in_the_child_class  s    

r   c                  C   sr   t  } t }|  d st| d r,tt }| d rBtt }| d sXtt }| d sntd S )Nr&   )r%   r*   Z	_get_tagsrL   r,   r-   r/   )Znan_tag_estZno_nan_tag_estZredefine_tags_estZdiamond_tag_estZinherit_diamond_tag_estr   r   r   test_tag_inheritance  s    r   c               	   C   s@   G dd dt } |  }d}tjt|d |  W 5 Q R X d S )Nc                   @   s    e Zd ZdddZdddZdS )	z<test_raises_on_get_params_non_attribute.<locals>.MyEstimatorrj   c                 S   s   d S r   r   )r   paramr   r   r   r     s    zEtest_raises_on_get_params_non_attribute.<locals>.MyEstimator.__init__Nc                 S   s   | S r   r   r<   r   r   r   r?     s    z@test_raises_on_get_params_non_attribute.<locals>.MyEstimator.fit)rj   )N)r   r   r   r   r?   r   r   r   r   r     s   
r   z-'MyEstimator' object has no attribute 'param'rp   )r   rV   rW   AttributeErrorrM   )r   rZ   rr   r   r   r   'test_raises_on_get_params_non_attribute  s
    r   c               	   C   s`   t  } |  }d|kstd|ks&ttdd& |  }d|ksFtd|ksRtW 5 Q R X d S )Nz
text/plainz	text/htmlr   Zdisplay)r   Z_repr_mimebundle_rL   r   )r   outputr   r   r   test_repr_mimebundle_  s    r   c               
   C   sZ   t  } |  }d|ksttdd, d}tjt|d |  }W 5 Q R X W 5 Q R X d S )Nz<style>r   r   z _repr_html_ is only defined whenrp   )r   Z_repr_html_rL   r   rV   rW   r   )r   r   rr   r   r   r   test_repr_html_wraps)  s    r   c               	   C   sf   t  } dddgdddgg}| j|dd | jdks6td	}tjt|d
 | jddd W 5 Q R X dS )z>Check that `_check_n_features` validates data when reset=Falser8   rJ      r   rj      TresetzHX does not contain any features, but MyEstimator is expecting 3 featuresrp   	invalid XFN)r   _check_n_featuresn_features_in_rL   rV   rW   r}   )rZ   ZX_trainrr   r   r   r   test_n_features_in_validation6  s    r   c                  C   s4   t  } | jddd t| dr"t| jddd dS )z]Check that `_check_n_features` does not validate data when
    n_features_in_ is not defined.r   Tr   r   FN)r   r   rT   rL   )rZ   r   r   r    test_n_features_in_no_validationC  s    r   c               
   C   s  t d} t }|j}| j||jd}G dd dtt}| 	|}t
|j|j |	| t|drlt|	| d}| j||jddd d}t jt|d	 || W 5 Q R X d
}t jt|d	 || W 5 Q R X d}| 	|}t jt|d	 || W 5 Q R X | |}| }t  tdt |	| W 5 Q R X ||g}	|	D ]0}
t  tdt ||
 W 5 Q R X qZ| j|ddddgd}| }td}t jt|d	 |	| W 5 Q R X t jt|d	 || W 5 Q R X dS )z;Check that feature_name_in are recorded by `_validate_data`pandas)columnsc                   @   s   e Zd ZdddZdd ZdS )z.test_feature_names_in.<locals>.NoOpTransformerNc                 S   s   |  | | S r   Z_validate_datar<   r   r   r   r?   W  s    
z2test_feature_names_in.<locals>.NoOpTransformer.fitc                 S   s   | j |dd |S )NFr   r   r@   r   r   r   r   [  s    z8test_feature_names_in.<locals>.NoOpTransformer.transform)N)r   r   r   r?   r   r   r   r   r   NoOpTransformerV  s   
r   feature_names_in_z5The feature names should match those that were passedNrp   zVX does not have valid feature names, but NoOpTransformer was fitted with feature nameszIX has feature names, but NoOpTransformer was fitted without feature nameserrorr#   r$   r8   rJ   a  Feature names are only supported if all input features have string names, but your input has ['int', 'str'] as feature name / column name types. If you want feature names to be stored and validated, you must convert them all to strings, by using X.columns = X.columns.astype(str) for example. Otherwise you can remove feature / column names from your input data, or convert them all to a non-string data type.)rV   Zimportorskipr   r   r^   Z	DataFrameZfeature_namesr   r   r?   r   r   r   rT   rL   rW   r}   r   r   r   warningscatch_warningssimplefilterreescaperY   )pdr   ZX_npr   r   Ztransrr   Zdf_badZdf_int_namesZXsr=   Zdf_mixedr   r   r   test_feature_names_inO  sR    






r   c                  C   s:   t  jdd} td| }t| }td|}||ks6tdS )z-Check that clone keeps the set_output config.r   )r   r   N)r	   Z
set_outputr
   r   rL   )ssconfigZss_cloneZconfig_cloner   r   r   test_clone_keeps_output_config  s
    

r   c                   @   s   e Zd ZdS )_EmptyNr0   r   r   r   r   r     s   r   c                   @   s   e Zd ZdS )EmptyEstimatorNr0   r   r   r   r   r     s   r   r   c                 C   s4   |   }dtji}||kstttt  dS )zCheck that ``__getstate__`` returns an empty ``dict`` with an empty
    instance.

    Python 3.11+ changed behaviour by returning ``None`` instead of raising an
    ``AttributeError``. Non-regression test for gh-25188.
    r   N)r   r   r   rL   r   r   r   r   )r   r   expectedr   r   r   "test_estimator_empty_instance_dict  s    
r   c               	   C   sr   G dd d} G dd dt | }d}tjt|d |   W 5 Q R X tjt|d t|  W 5 Q R X dS )z:Using a `BaseEstimator` with `__slots__` is not supported.c                   @   s   e Zd ZdZdS )zDtest_estimator_getstate_using_slots_error_message.<locals>.WithSlots)xN)r   r   r   	__slots__r   r   r   r   	WithSlots  s   r   c                   @   s   e Zd ZdS )zDtest_estimator_getstate_using_slots_error_message.<locals>.EstimatorNr0   r   r   r   r   	Estimator  s   r   zRYou cannot use `__slots__` in objects inheriting from `sklearn.base.BaseEstimator`rp   N)r   rV   rW   rY   r   r   r   )r   r   rr   r   r   r   1test_estimator_getstate_using_slots_error_message  s    r   )_r   Znumpyr5   Zscipy.sparsesparser]   rV   r   r   Zsklearn.utils._testingr   r   r   Zsklearn.baser   r   r   Zsklearn.svmr   Zsklearn.preprocessingr	   Zsklearn.utils._set_outputr
   Zsklearn.pipeliner   Zsklearn.model_selectionr   Zsklearn.treer   r   r   r   Zsklearn.utils._mockingr   r   r   r   r   r"   r%   r*   r,   r-   r/   r1   r7   r;   rB   rQ   rU   r[   ra   rd   rn   ro   rs   rw   ry   r~   r   r   r   r   markZparametrizeZmake_classificationZmake_regressionr   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   r   <module>   s   
	




&	

N
