a
    ;ZaQ                     @   sD  d dl Z d dlZd dlm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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) Z.d*d+ Z/d,d- Z0d.d/ Z1d0d1 Z2d2d3 Z3d4d5 Z4d6d7 Z5d8d9 Z6d:d; Z7d<d= Z8d>d? Z9d@dA Z:dBdC Z;dDdE Z<ej=>dFedGd dHej?d dIfedGd dHej@d dIfgdJdK ZAdLdM ZBdNdO ZCG dPdQ dQeZDdRZEdSdT ZFG dUdV dVeZGdWdX ZHdYdZ ZIG d[d\ d\ZJG d]d^ d^eJeZKd_d` ZLdadb ZMG dcdd ddeZNeeOdedfdg ZPdhdi ZQdjdk ZRdldm ZSdndo ZTdpdq ZUdrds ZVdtdu ZWdvdw ZXdS )x    N)assert_array_equal)assert_no_warnings)ignore_warnings)BaseEstimatorcloneis_classifier_is_pairwise)SVC)Pipeline)GridSearchCV)	KernelPCA)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   6lib/python3.9/site-packages/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_tags3   s    zNaNTag._more_tagsNr   r   r   r(   r   r   r   r   r%   2   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(   8   s    zNoNaNTag._more_tagsNr)   r   r   r   r   r*   7   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(   B   s    zDiamondOverwriteTag._more_tagsNr)   r   r   r   r   r-   A   s   r-   c                   @   s   e Zd ZdS )InheritDiamondOverwriteTagN)r   r   r   r   r   r   r   r/   F   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   P   s    zModifyInitParams.__init__N)r   r   r   __doc__nparrayr   r   r   r   r   r0   J   s   r0   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#   r2   r   r   r   r   W   s    zBuggy.__init__)Nr   r   r   r3   r   r   r   r   r   r6   T   s   r6   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   fit_   s    zNoEstimator.fitc                 C   s   d S r   r   r   r<   r   r   r   predictb   s    zNoEstimator.predict)NN)N)r   r   r   r   r>   r@   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   i   s    zVargEstimator.__init__Nr9   r   r   r   r   rA   f   s   rA   c                  C   sn   ddl m} m} | |dd}t|}||us0J | | ksDJ | |tdd}t|}||usjJ d S )Nr   	SelectFpr	f_classif皙?Zalpha)
      )sklearn.feature_selectionrC   rD   r   
get_paramsr4   ZzerosrC   rD   ZselectorZnew_selectorr   r   r   
test_cloneq   s    rL   c                  C   s<   ddl m} m} | |dd}d|_t|}t|dr8J d S )Nr   rB   rE   rF   testown_attribute)rI   rC   rD   rN   r   hasattrrK   r   r   r   test_clone_2   s
    rP   c                  C   s   t  } d| _tt t|  W d    n1 s40    Y  t }tt t| W d    n1 sl0    Y  t }tt t| W d    n1 s0    Y  t	 }tt t| W d    n1 s0    Y  d S )NrH   )
r6   r#   pytestraisesRuntimeErrorr   r:   	TypeErrorrA   r0   )ZbuggyZno_estimatorZvarg_estestr   r   r   test_clone_buggy   s    &&&rV   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   r4   r5   r   r   r   spZ
csr_matrixdataclfZclf2r   r   r   test_clone_empty_array   s    r\   c                  C   s(   t tjd} t| }| j|ju s$J d S NrW   )r   r4   nanr   r   rZ   r   r   r   test_clone_nan   s    r_   c                  C   sj   dd t tD } | D ]N}|td}t|d}t|}|jj|jju sNJ t|j	 |j	  qd S )Nc                 S   s    g | ]}| d rtt|qS )Z_matrix)endswithgetattrrX   ).0namer   r   r   
<listcomp>   s   z.test_clone_sparse_matrices.<locals>.<listcomp>   rW   )
dirrX   r4   Zeyer   r   r   	__class__r   Ztoarray)Zsparse_matrix_classesclsZsparse_matrixr[   Z
clf_clonedr   r   r   test_clone_sparse_matrices   s    
ri   c                  C   s&   t t d} t| }| j|ju s"J d S r]   )r   r   r   rZ   r   r   r   test_clone_estimator_types   s    
rj   c                  C   s>   d} t jt| d tt W d    n1 s00    Y  d S )Nz8You should provide an instance of scikit-learn estimatormatch)rQ   rR   rT   r   r   )msgr   r   r   %test_clone_class_rather_than_instance   s    rn   c                  C   sT   t  } t|  tt t }t|dks,J tdgd d}tt|dksPJ d S )NzT(a=K(), b=K())Zlong_paramsi  r8   i  )r   reprr"   r   len)my_estimatorrM   Zsome_estr   r   r   	test_repr   s    rr   c                  C   s   t  } t|  d S r   )r   str)rq   r   r   r   test_str   s    rt   c                  C   s   t t t } d| jddv s"J d| jddvs6J | jdd | jjdksRJ tt | jdd W d    n1 s~0    Y  d S )Na__dT)ZdeepFrH   )ru   )Za__a)	r"   r   rJ   
set_paramsr#   r!   rQ   rR   
ValueError)rM   r   r   r   test_get_params   s    rx   c                  C   sj   t  } t| sJ tt| dddgis,J ttd| fgsBJ ttdt| dddgifgsfJ d S )NCrE   r7   svcZsvc_cv)r	   r   r   r
   )rz   r   r   r   test_is_classifier   s
    r{   c                  C   s   t dt fg} tt | jdd W d    n1 s<0    Y  tt | jdd W d    n1 sr0    Y  d S )Nrz   T)Zsvc__stupid_param)Zsvm__stupid_param)r
   r	   rQ   rR   rw   rv   )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 i | |ksJ | S r   )superrv   )r   kwargs)rg   expected_kwargsr   r   rv     s    zJtest_set_params_passes_all_parameters.<locals>.TestDecisionTree.set_params)r   r   r   rv   __classcell__r   r   )rg   r   TestDecisionTree  s   r   re   rH   )	max_depthZmin_samples_leaf	estimator)Zestimator__max_depthZestimator__min_samples_leaf)r   r
   r   rv   )r   rU   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,J d S )Ng      E@)r   Zestimator__C)r   r   rv   r	   r   ry   )Zgscvr   r   r   $test_set_params_updates_valid_params!  s    r   ztree,datasetrH   )r   random_state)r   c           	      C   sh   t jd}|\}}| || |jddt|d}| ||}| j|||d}d}||ksdJ |d S )Nr   r7   rG   )size)sample_weightz5Unweighted and weighted scores are unexpectedly equal)r4   ZrandomZRandomStater>   Zrandintrp   score)	treeZdatasetrngr<   r=   r   Zscore_unweightedZscore_weightedrm   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 sNJ |j	|j	ks^J 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
        -----
        Nr7   c                 S   s   || _ || _d S r   )dfscalar_param)r   r   r   r   r   r   r   U  s    z<test_clone_pandas_dataframe.<locals>.DummyEstimator.__init__c                 S   s   d S r   r   r;   r   r   r   r>   Y  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)Nr7   )N)r   r   r   r3   r   r>   r   r   r   r   r   DummyEstimatorE  s   

r   rG   r7   )r   )
r   r   r4   Zaranger   r   r   valuesallr   )r   r!   r   eZcloned_er   r   r   test_clone_pandas_dataframeD  s    
r   c                  C   sl   t  } t | j| j}t|}d|v s0J ttj	|}|
| j| j}|
| j| j}||kshJ d S )N   version)r   	load_irisr   r>   rY   targetpickledumpsr   loadsr   )irisr   Ztree_pickleZtree_restoredZscore_of_originalZscore_of_restoredr   r   r   ?test_pickle_version_warning_is_not_raised_with_matching_versionj  s    
r   c                   @   s   e Zd Zdd ZdS )TreeBadVersionc                 C   s   t | j ddS )N	something)Z_sklearn_version)r.   __dict__itemsr'   r   r   r   __getstate__x  s    zTreeBadVersion.__getstate__Nr   r   r   r   r   r   r   r   r   w  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   sr   t  } t | j| j}t|}tj	ddt
jd}tjt|d t| W d    n1 sd0    Y  d S )Nr   r   r   Zold_versionZcurrent_versionrk   )r   r   r   r>   rY   r   r   r   pickle_error_messageformatsklearn__version__rQ   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   s~   t  } t | j| j}t|}d|vs0J tj	ddt
jd}tjt|d t| W d    n1 sp0    Y  d S )Nr   r   zpre-0.18r   rk   )r   r   r   r>   rY   r   r   r   r   r   r   r   rQ   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   sT   t  } t | j| j}t|}z"tj}dt_t	tj
| W |t_n|t_0 d S )N
notsklearn)r   r   r   r>   rY   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   r1   r   rY   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 )MultiInheritanceEstimatorre   c                 C   s   || _ d | _d S r   attribute_pickledr   r   r   r   r   r   r     s    z"MultiInheritanceEstimator.__init__N)re   r   r   r   r   r   r     s   r   c                  C   sJ   t  } d| _t| }t|}|jdks.J |jd u s<J |jsFJ d S N$this attribute should not be pickledre   )r   r   r   r   r   r   r   r   
serializedZestimator_restoredr   r   r   3test_pickling_when_getstate_is_overwritten_by_mixin  s    

r   c               	   C   s   zvt  } d}|| _t| j}dt| _|  }|d ddks@J d|d< | | | jdks`J | jsjJ W |t| _n|t| _0 d S )Nr   r   re   )r   r      r   )r   r   typer   r   r   r   r   )r   textZold_modr   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 )SingleInheritanceEstimatorre   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)re   )r   r   r   r   r   r   r   r   r   r     s   
r   )categoryc                  C   s@   t  } d| _t| }t|}|jdks.J |jd u s<J d S r   )r   r   r   r   r   r   r   r   r   r   Ctest_pickling_works_when_getstate_is_overwritten_in_the_child_class  s    

r   c                  C   sr   t  } t }|  d sJ | d r,J t }| d rBJ t }| d sXJ t }| d snJ d S )Nr&   )r%   r*   Z	_get_tagsr,   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   sT   G dd dt } |  }d}tjt|d |  W d    n1 sF0    Y  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>.MyEstimatorre   c                 S   s   d S r   r   )r   Z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)re   )N)r   r   r   r   r>   r   r   r   r   r     s   
r   z-'MyEstimator' object has no attribute 'param'rk   )r   rQ   rR   AttributeErrorrJ   )r   rU   rm   r   r   r   'test_raises_on_get_params_non_attribute  s
    r   c                  C   st   t  } |  }d|v sJ d|vs&J tdd0 |  }d|v sFJ d|v sRJ W d    n1 sf0    Y  d S )Nz
text/plainz	text/htmldiagramZdisplay)r   Z_repr_mimebundle_r   )r   outputr   r   r   test_repr_mimebundle_  s    r   c                  C   s   t  } d}tjt|d |  }W d    n1 s60    Y  tdd$ |  }d|v s`J W d    n1 st0    Y  d S )Nz _repr_html_ is only defined whenrk   r   r   z<style>)r   rQ   rR   r   Z_repr_html_r   )r   rm   r   r   r   r   test_repr_html_wraps'  s    &r   c                  C   s>  t dd} td }t| s"J W d    n1 s60    Y  |rHJ G dd dt }|dd} d}tjt|d t| rJ W d    n1 s0    Y  G dd dt}| }tjt|d t|sJ W d    n1 s0    Y  t }td }t|rJ W d    n1 s&0    Y  |r:J d S )	NZprecomputed)Zkernelc                   @   s   e Zd ZdZdS )z)test_is_pairwise.<locals>.IncorrectTagPCAFNr   r   r   Z	_pairwiser   r   r   r   IncorrectTagPCA<  s   r   z;_pairwise was deprecated in 0.24 and will be removed in 1.1rk   c                   @   s   e Zd ZdZdS )z&test_is_pairwise.<locals>.TruePairwiseTNr   r   r   r   r   TruePairwiseF  s   r   )r   rQ   r   r   FutureWarningr   )Zpcarecordr   rm   r   Ztrue_pairwiserU   r   r   r   test_is_pairwise4  s"    
*
**.r   c                  C   sv   t  } g dg dg}| j|dd | jdks2J d}tjt|d | jdd	d W d
   n1 sh0    Y  d
S )z>Check that `_check_n_features` validates data when reset=False)r7   rH      )r   re      Tresetr   zHX does not contain any features, but MyEstimator is expecting 3 featuresrk   	invalid XFN)r   _check_n_featuresn_features_in_rQ   rR   rw   )rU   ZX_trainrm   r   r   r   test_n_features_in_validationT  s    r   c                  C   s4   t  } | jddd t| dr"J | 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   rO   )rU   r   r   r    test_n_features_in_no_validationa  s    r   c               	   C   s  t d} t }|j}| j||jd}G dd dtt}| 	|}t
|j|j |	| t|drlJ |	| d}| j||jddd d}t jt|d	 || W d   n1 s0    Y  d
}t jt|d	 || W d   n1 s0    Y  d}| 	|}t jt|d	 || W d   n1 sH0    Y  | |}| }t d}	|	| W d   n1 s0    Y  |	rJ ||g}
|
D ]F}t d}	|| W d   n1 s0    Y  |	rJ q| j|g dd}| }td}t jt|d	}	|	| W d   n1 sH0    Y  t jt|d	}	|| W d   n1 s0    Y  dS )z;Check that feature_name_in are recorded by `_validate_data`Z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>   u  s    
z2test_feature_names_in.<locals>.NoOpTransformer.fitc                 S   s   | j |dd |S )NFr   r   r?   r   r   r   r   y  s    z8test_feature_names_in.<locals>.NoOpTransformer.transform)N)r   r   r   r>   r   r   r   r   r   NoOpTransformert  s   
r   feature_names_in_z5The feature names should match those that were passedNrk   zVX does not have valid feature names, but NoOpTransformer was fitted with feature nameszIX has feature names, but NoOpTransformer was fitted without feature names)r#   r$   r7   rH   zdFeature names only support names that are all strings. Got feature names with dtypes: ['int', 'str'])rQ   Zimportorskipr   r   rY   Z	DataFrameZfeature_namesr   r   r>   r   r   r   rO   r   r   r   r   reescape)Zpdr   ZX_npr   r   Ztransrm   Zdf_badZdf_int_namesr   ZXsr<   Zdf_mixedr   r   r   test_feature_names_inm  sR    



((*
*
**r   )Yr   Znumpyr4   Zscipy.sparseZsparserX   rQ   r   Zsklearn.utils._testingr   r   r   Zsklearn.baser   r   r   r   Zsklearn.svmr	   Zsklearn.pipeliner
   Zsklearn.model_selectionr   Zsklearn.decompositionr   Zsklearn.treer   r   r   r   Zsklearn.utils._mockingr   r   r   r   r   r"   r%   r*   r,   r-   r/   r0   r6   r:   rA   rL   rP   rV   r\   r_   ri   rj   rn   rr   rt   rx   r{   r|   r   r   Z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   <module>   s   
	




&	

 