B
    	\7                 @   s  d dl Zd dlm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
 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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"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Z*d#d$ Z+d%d& Z,d'd( Z-d)d* Z.d+d, Z/d-d. Z0d/d0 Z1d1d2 Z2d3d4 Z3d5d6 Z4d7d8 Z5d9d: Z6d;d< Z7d=d> Z8d?d@ Z9dAdB Z:G dCdD dDeZ;dEZ<dFdG Z=G dHdI dIeZ>dJdK Z?dLdM Z@G dNdO dOe(ZAG dPdQ dQeeAZBdRdS ZCdTdU ZDG dVdW dWeZEeeFdXdYdZ ZGdS )[    N)assert_array_equal)assert_true)assert_false)assert_equal)assert_not_equal)assert_raises)assert_no_warnings)assert_warns_message)assert_dict_equal)ignore_warnings)BaseEstimatorcloneis_classifier)SVC)Pipeline)GridSearchCV)DecisionTreeClassifier)DecisionTreeRegressor)datasets)TransformerMixin)MockDataFramec               @   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.7/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 )N)cd)r   r"   r#   r   r   r   r   +   s    z
K.__init__)NN)r   r   r    r   r   r   r   r   r!   *   s   r!   c               @   s   e Zd ZdddZdS )TNc             C   s   || _ || _d S )N)ab)r   r%   r&   r   r   r   r   1   s    z
T.__init__)NN)r   r   r    r   r   r   r   r   r$   0   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 )N)copyr%   )r   r%   r   r   r   r   ;   s    zModifyInitParams.__init__N)r   r   r    __doc__nparrayr   r   r   r   r   r'   6   s   r'   c               @   s   e Zd ZdZdddZdS )Buggyz; A buggy estimator that does not set its parameters right. Nc             C   s
   d| _ d S )N   )r%   )r   r%   r   r   r   r   B   s    zBuggy.__init__)N)r   r   r    r)   r   r   r   r   r   r,   ?   s   r,   c               @   s(   e Zd Zdd ZdddZd	ddZdS )
NoEstimatorc             C   s   d S )Nr   )r   r   r   r   r   G   s    zNoEstimator.__init__Nc             C   s   | S )Nr   )r   Xyr   r   r   fitJ   s    zNoEstimator.fitc             C   s   d S )Nr   )r   r/   r   r   r   predictM   s    zNoEstimator.predict)NN)N)r   r   r    r   r1   r2   r   r   r   r   r.   F   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 )Nr   )r   Zvargsr   r   r   r   S   s    zVargEstimator.__init__N)r   r   r    r)   r   r   r   r   r   r3   Q   s   r3   c              C   sl   ddl m} m} | |dd}t|}||k	s0tt| |  | |tdd}t|}||k	shtd S )Nr   )	SelectFpr	f_classifg?)alpha)
      )	sklearn.feature_selectionr4   r5   r   AssertionErrorr   
get_paramsr*   Zzeros)r4   r5   selectornew_selectorr   r   r   
test_cloneZ   s    r>   c              C   s<   ddl m} m} | |dd}d|_t|}tt|d d S )Nr   )r4   r5   g?)r6   testown_attribute)r9   r4   r5   r@   r   r   hasattr)r4   r5   r<   r=   r   r   r   test_clone_2l   s
    rB   c              C   sR   t  } d| _ttt|  t }ttt| t }ttt| t }ttt| d S )Nr8   )	r,   r%   r   RuntimeErrorr   r.   	TypeErrorr3   r'   )ZbuggyZno_estimatorZvarg_estestr   r   r   test_clone_buggyz   s    rF   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   r*   r+   r   r   r   spZ
csr_matrixdata)clfclf2r   r   r   test_clone_empty_array   s    rK   c              C   s(   t tjd} t| }| j|jks$td S )N)r   )r   r*   nanr   r   r:   )rI   rJ   r   r   r   test_clone_nan   s    rM   c              C   sn   dd t tD } xV| D ]N}|td}t|d}t|}|jj|jjksPtt	|j
 |j
  qW d S )Nc             S   s    g | ]}| d rtt|qS )Z_matrix)endswithgetattrrG   ).0namer   r   r   
<listcomp>   s   z.test_clone_sparse_matrices.<locals>.<listcomp>   )r   )dirrG   r*   Zeyer   r   r   	__class__r:   r   Ztoarray)Zsparse_matrix_classesclsZsparse_matrixrI   Z
clf_clonedr   r   r   test_clone_sparse_matrices   s    

rW   c              C   sP   t  } t|  tt t }tt|d tdgd d}ttt|d d S )Nz+T(a=K(c=None, d=None), b=K(c=None, d=None))Zlong_paramsi  )r%   i  )r   reprr$   r!   r   len)my_estimatorr?   Zsome_estr   r   r   	test_repr   s    r[   c              C   s   t  } t|  d S )N)r   str)rZ   r   r   r   test_str   s    r]   c              C   sf   t t t } d| jddks"td| jddks6t| jdd | jjdksRttt| jdd d S )Na__dT)ZdeepFr8   )r^   )Za__a)	r$   r!   r;   r:   
set_paramsr%   r#   r   
ValueError)r?   r   r   r   test_get_params   s    ra   c           	   C   sj   t  } t| sttt| dddgis,tttd| fgsBttttdt| dddgifg d S )NCg?r-   svcZsvc_cv)r   r   r:   r   r   r   )rc   r   r   r   test_is_classifier   s    rd   c              C   s4   t dt fg} tt| jdd tt| jdd d S )Nrc   T)Zsvc__stupid_param)Zsvm__stupid_param)r   r   r   r`   r_   )rI   r   r   r   test_set_params   s    re   c                 sX   G  fdddt  dddx2td  fgt  i gD ]} | jddd q>W 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 )N)superr_   r:   )r   kwargs)TestDecisionTreerU   expected_kwargsr   r   r_      s    zJtest_set_params_passes_all_parameters.<locals>.TestDecisionTree.set_params)r   r   r    r_   __classcell__r   )rh   ri   )rU   r   rh      s   rh   rS   r8   )	max_depthZmin_samples_leaf	estimator)Zestimator__max_depthZestimator__min_samples_leaf)r   r   r   r_   )rE   r   )rh   ri   r   %test_set_params_passes_all_parameters   s    
rm   c              C   s0   t t i } | jt dd | jjdks,td S )Ng      E@)rl   Zestimator__C)r   r   r_   r   rl   rb   r:   )Zgscvr   r   r   $test_set_params_updates_valid_params   s    rn   c              C   s   t jd} tddtddg}t t g}xft||D ]X\}}|	|j
|j | jddt|jd}t||j
|j|j|j
|j|ddd	 q<W d S )
Nr   r8   )rk   r-   r7   )size)sample_weightz5Unweighted and weighted scores are unexpectedly equal)msg)r*   ZrandomZRandomStater   r   r   	load_irisZload_bostonzipr1   rH   targetZrandintrY   r   score)rngZ
estimatorsZsetsrE   Zdsrp   r   r   r   test_score_sample_weight   s    
rw   c              C   s`   G dd dt t} td}t|}| |dd}t|}|j|jkj sNt	t
|j|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
        -----
        Nr-   c             S   s   || _ || _d S )N)dfscalar_param)r   rx   ry   r   r   r   r      s    z<test_clone_pandas_dataframe.<locals>.DummyEstimator.__init__c             S   s   d S )Nr   )r   r/   r0   r   r   r   r1   $  s    z7test_clone_pandas_dataframe.<locals>.DummyEstimator.fitc             S   s   d S )Nr   )r   r/   r   r   r   	transform'  s    z=test_clone_pandas_dataframe.<locals>.DummyEstimator.transform)Nr-   )N)r   r   r    r)   r   r1   rz   r   r   r   r   DummyEstimator  s   

r{   r7   r-   )ry   )r   r   r*   Zaranger   r   rx   valuesallr:   r   ry   )r{   r#   rx   eZcloned_er   r   r   test_clone_pandas_dataframe  s    
r   c              C   sj   t  } t | j| j}t|}d|ks0tt	tj
|}|| j| j}|| j| j}t|| d S )Ns   version)r   rr   r   r1   rH   rt   pickledumpsr:   r   loadsru   r   )iristreeZtree_pickleZtree_restoredZscore_of_originalZscore_of_restoredr   r   r   ?test_pickle_version_warning_is_not_raised_with_matching_version5  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)dict__dict__items)r   r   r   r   __getstate__C  s    zTreeBadVersion.__getstate__N)r   r   r    r   r   r   r   r   r   B  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   sJ   t  } t | j| j}t|}tj	ddt
jd}tt|tj| d S )Nr   r   )rl   old_versioncurrent_version)r   rr   r   r1   rH   rt   r   r   pickle_error_messageformatsklearn__version__r	   UserWarningr   )r   r   Ztree_pickle_othermessager   r   r   <test_pickle_version_warning_is_issued_upon_different_versionO  s    

r   c               @   s   e Zd Zdd ZdS )TreeNoVersionc             C   s   | j S )N)r   )r   r   r   r   r   Z  s    zTreeNoVersion.__getstate__N)r   r   r    r   r   r   r   r   r   Y  s   r   c              C   sV   t  } t | j| j}t|}td|k t	j
ddtjd}tt|tj| d S )Ns   versionr   zpre-0.18)rl   r   r   )r   rr   r   r1   rH   rt   r   r   r   r   r   r   r   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 d |t_X d S )N
notsklearn)r   rr   r   r1   rH   rt   r   r   r   r   r   )r   r   r   Zmodule_backupr   r   r   Ctest_pickle_version_no_warning_is_issued_with_non_sklearn_estimatorm  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   r(   )r   rH   r   r   r   r   z  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   y  s   r   c               @   s   e Zd ZdddZdS )MultiInheritanceEstimatorrS   c             C   s   || _ d | _d S )N)attribute_pickledr   )r   r   r   r   r   r     s    z"MultiInheritanceEstimator.__init__N)rS   )r   r   r    r   r   r   r   r   r     s   r   c              C   sF   t  } d| _t| }t|}t|jd t|jd  |jsBtd S )Nz$this attribute should not be pickledrS   )	r   r   r   r   r   r   r   r   r:   )rl   
serializedestimator_restoredr   r   r   3test_pickling_when_getstate_is_overwritten_by_mixin  s    

r   c           	   C   sz   zht  } d}|| _t| j}dt| _|  }t|d dd d|d< | | t| jd | j	sft
W d |t| _X d S )Nz$this attribute should not be pickledr   rS   )r   r      r   )r   r   typer   r   r
   r   r   r   r   r:   )rl   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 )SingleInheritanceEstimatorrS   c             C   s   || _ d | _d S )N)r   r   )r   r   r   r   r   r     s    z#SingleInheritanceEstimator.__init__c             C   s   | j  }d |d< |S )Nr   )r   r(   )r   rH   r   r   r   r     s    
z'SingleInheritanceEstimator.__getstate__N)rS   )r   r   r    r   r   r   r   r   r   r     s   
r   )categoryc              C   s<   t  } d| _t| }t|}t|jd t|jd  d S )Nz$this attribute should not be pickledrS   )r   r   r   r   r   r   r   )rl   r   r   r   r   r   Ctest_pickling_works_when_getstate_is_overwritten_in_the_child_class  s    

r   )HZnumpyr*   Zscipy.sparseZsparserG   r   Zsklearn.utils.testingr   r   r   r   r   r   r   r	   r
   r   Zsklearn.baser   r   r   Zsklearn.svmr   Zsklearn.pipeliner   Zsklearn.model_selectionr   Zsklearn.treer   r   r   r   Zsklearn.utils.mockingr   r   r   r!   r$   r'   r,   objectr.   r3   r>   rB   rF   rK   rM   rW   r[   r]   ra   rd   re   rm   rn   rw   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   sr   			&
