U
    3d\                    @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlZd dlm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! 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/m0Z0m1Z1m2Z2m3Z3 d
d l4m5Z5m6Z6m7Z7 d
d!l8m9Z9 d
d"l:m;Z; d
d#l:m<Z< d
d$l=m>Z> d
d%l?m@Z@ d
d&l?mAZA d
d'l?mBZB d
d(lCmDZD d
d)lCmEZE d
d*lFmGZG d
d+lHmIZImJZJmKZK d
d,lLmMZM d
d-lLmNZN d
d.lOmPZP d
d/lQmRZR d
d0lQmSZS d
d1lQmTZT dd2lmUZU dd3lVmWZWmXZX dd4lYmZZZm[Z[ d
d5l\m]Z] d
d6l\m^Z^ d
d7l_m`Z`maZambZbmcZc dadd8d9d:d;gZed<d= Zfd>d? Zge#ehd@dAdB ZidCdD ZjdEdF ZkdGdH ZldIdJ ZmdKdL ZndMdN ZodOdP ZpdQdR ZqdSdT ZrdUdV ZsdWdX Ztd d[d\Zud]d^ Zvd_d` ZwG dadb dbZxdcdd Zydedf Zzdgdh Z{e#ehd@didj Z|e#ehd@dkdl Z}e#ehd@dmdn Z~e#ehd@dodp Ze#ehd@d!drdsZdtdu Ze#ehefd@dvdw Zdxdy Ze#dzd{ Zd|d} Ze#ehd@d~d Ze#ehd@dd Zdd Ze#ehd@dd Ze#ehd@dd Ze#dd Ze#dd Ze#dd Ze#ehd@d"ddZe#ehd@dd Ze#ehd@dd Zdd Ze#dd Ze#dd Ze#dd Zdd Ze#ehd@dd Ze#ehd@dd Ze#dd Ze#dd Ze#ehd@dd Ze#ehd@dd Ze#ehd@dd Ze#ehd@d#ddZe#ehd@dd Ze#ehd@dd Ze#ehd@dd Ze#d$ddZdd Zd%ddZdd Ze#ehd@dd Ze#ehd@dd Ze#ehd@ddÄ Ze#ehd@ddń Ze#ehd@ddǄ Ze#ehd@d&ddɄZe#dd˄ Ze#ehd@dd̈́ Ze#ddτ Zddф Zddӄ Ze#ehd@ddՄ Ze#ehd@dYejfddׄZe#ddل Ze#ehd@ddۄ Ze#ehd@dd݄ Ze#ehd@dd߄ Ze#ehd@dd Ze#ehd@dd Ze#ehd@dd Ze#ehd@dd Ze#ehd@dd Ze#ehd@dd Zdd Zdd ZeJfddZe#ehd@dd Ze#ehd@dd Ze#ehd@dd Ze#ehd@dd Ze#ehd@dd Ze#ehd@dd Zdd Zǐd d ZȐdd Zɐdd Zʐdd Zːdd	 Ze#ehd@d
d Z͐dd Zΐdd Zϐdd ZАdd Zѐdd ZҐdd ZӐdd ZԐdd ZՐdd Z֐dd ZdS ('      N)deepcopy)partialwraps)	signature)Real)sparse)rankdata   )IS_PYPY   )config_context)Interval	_get_args)assert_raise_message)assert_array_equal)assert_array_almost_equal)assert_allclose)assert_allclose_dense_sparse)assert_array_less)set_random_state)SkipTest)ignore_warnings)create_memmap_backed_data)raises)is_scalar_nan)LinearRegression)LogisticRegressionRANSACRegressor)Ridge)SGDRegressor)cloneClusterMixinis_classifieris_regressoris_outlier_detectorRegressorMixin)accuracy_scoreadjusted_rand_scoref1_score)BaseRandomProjection)SelectKBest)SelectFromModel)make_pipeline)DataConversionWarning)NotFittedError)SkipTestWarning)train_test_split)ShuffleSplit)_safe_split)
rbf_kernellinear_kernelpairwise_distances)
sp_version)parse_version)check_is_fittedmake_constraint)generate_invalid_param_val)InvalidParameterError)shuffle)_DEFAULT_TAGS
_safe_tags)has_fit_parameter_num_samples)StandardScaler)scale)	load_iris
make_blobsmake_multilabel_classificationmake_regressionZPLSCanonicalZPLSRegressionCCAZPLSSVDc                 c   s   | j j}t| }tV  tV  tV  t| drntV  tV  t	V  |d snt
V  tV  ttddV  ttddV  tV  ttddV  |d stV  tV  tV  |tkrtV  |d	 s|d stV  |d rtV  tV  t| d
rtV  tV  tV  tV  d S )Nsample_weightpairwiseones)kindzerosTreadonly_memmapno_validation	allow_nansparsify)	__class____name__rA   check_no_attributes_set_in_initcheck_estimators_dtypescheck_fit_score_takes_yrB   "check_sample_weights_pandas_series!check_sample_weights_not_an_arraycheck_sample_weights_listcheck_sample_weights_shape$check_sample_weights_not_overwrittenr   check_sample_weights_invariance!check_estimators_fit_returns_selfcheck_complex_datacheck_dtype_object$check_estimators_empty_data_messagesCROSS_DECOMPOSITIONcheck_pipeline_consistencycheck_estimators_nan_infcheck_nonsquare_error!check_estimators_overwrite_paramshasattrcheck_sparsify_coefficientscheck_estimator_sparse_datacheck_estimators_pickle%check_estimator_get_tags_default_keys)	estimatornametags rq   B/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/utils/estimator_checks.py_yield_checksU   s@    

rs   c                 c   s   t | }tV  tV  tV  tV  tV  |d r4tV  tV  ttddV  ttdddV  t	V  |d r~t
V  tV  tV  tV  |d stV  |d stV  |d	 rtV  d
|   krtV  tV  tV  d S )NmultioutputTrP   float32rQ   X_dtypeZ
multilabelrR   multioutput_onlyrequires_fitclass_weight)rA   "check_classifier_data_not_an_arraycheck_classifiers_one_label*check_classifiers_one_label_sample_weightscheck_classifiers_classes'check_estimators_partial_fit_n_featurescheck_classifier_multioutputcheck_classifiers_trainr   #check_classifiers_regression_target6check_classifiers_multilabel_representation_invariance2check_classifiers_multilabel_output_format_predict8check_classifiers_multilabel_output_format_predict_proba<check_classifiers_multilabel_output_format_decision_functioncheck_supervised_y_no_nancheck_supervised_y_2dcheck_estimators_unfitted
get_paramskeyscheck_class_weight_classifiers'check_non_transformer_estimators_n_iter check_decision_proba_consistency)
classifierrp   rq   rq   rr   _yield_classifier_checks   s6    r   categoryc           
   
   C   s   t |}tjd}|jdd}tjtjfD ]}td|}t||}|j	}|
dr~d|ks~|ds~t|rxd}qd	}nd }d
|  d}	tt||	d ||| W 5 Q R X q,d S )Nix  )
      sizer   sklearn.test__testingzJInput (y|Y) contains infinity or a value too large for dtype\('float64'\).zInput (y|Y) contains NaN.
Estimator z< should have raised error on fitting array y with inf value.matcherr_msg)r"   nprandomRandomStateZstandard_normalnaninffull_enforce_estimator_tags_y
__module__
startswithendswithisinfr   
ValueErrorfit)
ro   estimator_origrn   rngXvalueymodule_namer   r   rq   rq   rr   r      s*    



r   c                 c   s   t | }tV  ttddV  ttdddV  tV  tV  |d rFtV  tV  |d sb|d sbtV  tV  | j	j
}|dkr~tV  |d	 rtV  tV  d S )
NTrP   ru   rv   rt   rR   rx   rJ   ry   )rA   check_regressors_trainr   !check_regressor_data_not_an_arrayr   check_regressor_multioutput%check_regressors_no_decision_functionr   r   rU   rV   check_regressors_intr   r   )	regressorrp   ro   rq   rq   rr   _yield_regressor_checks   s$    r   c                 c   st   t | }|d stV  tV  |d r*tV  ttddV  t | ddsJtV  ddd	d
ddg}| jj}||krptV  d S )NrR   preserves_dtypeTrP   	statelesskeyZIsomapZ	KernelPCAZLocallyLinearEmbeddingRandomizedLassoLogisticRegressionCVZBisectingKMeans)	rA   #check_transformer_data_not_an_arraycheck_transformer_general!check_transformer_preserve_dtypesr   check_transformers_unfittedrU   rV   check_transformer_n_iter)transformerrp   Zexternal_solverro   rq   rq   rr   _yield_transformer_checks   s&    	r   c                 c   sD   t V  | jj}|dkr0tV  ttddV  tV  t| ds@tV  d S )N)ZWardAgglomerationZFeatureAgglomerationTrP   	transform)&check_clusterer_compute_labels_predictrU   rV   check_clusteringr   r   ri   r   )	clustererro   rq   rq   rr   _yield_clustering_checks  s    
r   c                 c   s`   t | drtV  t | dr tV  t | drVtV  ttddV  tV  t| ddrVtV  tV  d S )Ncontaminationfit_predictpredictTrP   ry   r   )	ri   check_outlier_contaminationcheck_outliers_fit_predictcheck_outliers_trainr   r{   rA   r   r   )rn   rq   rq   rr   _yield_outliers_checks  s    


r   c                 c   s  | j j}t| }d|d kr8td||d t d S |d rVtd|t d S t| D ]
}|V  q^t| rt	| D ]
}|V  qzt
| rt| D ]
}|V  qt| drt| D ]
}|V  qt| trt| D ]
}|V  qt| rt| D ]
}|V  qtV  |d stV  tV  tV  tV  tV  tV  tV  tV  tV  tV  |d srtV  tV  t V  |d	 rrt!V  |d
 rt"V  d S )N2darrayX_typesz8Can't test estimator {} which requires input  of type {}Z
_skip_testz2Explicit SKIP via _skip_test tag for estimator {}.r   non_deterministicrR   Z
requires_yrequires_positive_X)#rU   rV   rA   warningswarnformatr1   rs   r$   r   r%   r   ri   r   
isinstancer#   r   r&   r   &check_parameters_default_constructible%check_methods_sample_order_invariancecheck_methods_subset_invariancecheck_fit2d_1samplecheck_fit2d_1featurecheck_get_params_invariancecheck_set_paramscheck_dict_unchangedcheck_dont_overwrite_parameterscheck_fit_idempotentcheck_fit_check_is_fittedcheck_n_features_incheck_fit1dcheck_fit2d_predict1dcheck_requires_y_nonecheck_fit_non_negative)rn   ro   rp   checkrq   rq   rr   _yield_all_checks)  sl     





r   c              
   C   s   t | rPt| ts| jS | js&| jjS ddd | j D }d| jj|S t	| drt
dd  tdd	t| W  5 Q R  S Q R X d
S )a  Create pytest ids for checks.

    When `obj` is an estimator, this returns the pprint version of the
    estimator (with `print_changed_only=True`). When `obj` is a function, the
    name of the function is returned with its keyword arguments.

    `_get_check_estimator_ids` is designed to be used as the `id` in
    `pytest.mark.parametrize` where `check_estimator(..., generate_only=True)`
    is yielding estimators and checks.

    Parameters
    ----------
    obj : estimator or function
        Items generated by `check_estimator`.

    Returns
    -------
    id : str or None

    See Also
    --------
    check_estimator
    ,c                 S   s   g | ]\}}d  ||qS )z{}={})r   ).0kvrq   rq   rr   
<listcomp>  s     z,_get_check_estimator_ids.<locals>.<listcomp>z{}({})r   T)Zprint_changed_onlyz\s N)callabler   r   rV   keywordsfuncjoinitemsr   ri   r   resubstr)objZkwstringrq   rq   rr   _get_check_estimator_idsb  s    

r   c                 C   s  t | dg }t|r|dgdgfkr|t| tr<| t }n>t| trR| t }n(t| trl| tdd}n| t	dd}n|dgfkrt| tr| d	td
dfdtddfgd}n"| d	t	d
dfdt	ddfgd}n&d| j
 d| }t|t t|n|  }|S )z)Construct Estimator instance if possible._required_parametersrn   Zbase_estimatorr   random_stater	   )C
estimatorsZest1皙?alphaZest2)r   zCan't instantiate estimator z parameters )getattrlen
issubclassr   r   r'   r    r-   r!   r   rV   r   r   r1   r   )	EstimatorZrequired_parametersrn   msgrq   rq   rr   _construct_instance  s4    





r  c                 C   s8   t | |\}}|s| |fS |j| ||jj|ddS d S )N)reason)Zmarks)_should_be_skipped_or_markedparammarkZxfail)rn   r   pytestZshould_be_markedr	  rq   rq   rr   _maybe_mark_xfail  s    r  c                    sJ   t |\}|s|S t|tr(|jjn|j t| fdd}|S )Nc                     s"   t d  djj d d S )Nz	Skipping z for z: )r   rU   rV   )argskwargs
check_namern   r	  rq   rr   wrapped  s    z_maybe_skip.<locals>.wrapped)r
  r   r   r   rV   r   )rn   r   Zshould_be_skippedr  rq   r  rr   _maybe_skip  s    r  c                 C   s@   t |tr|jjn|j}t| ddp&i }||kr<d|| fS dS )NZ_xfail_checksr   T)Fz*placeholder reason that will never be used)r   r   r   rV   rA   )rn   r   r  Zxfail_checksrq   rq   rr   r
    s
    r
  c                    sH   ddl tdd  D r&d}t| fdd}jjd| td	S )
a  Pytest specific decorator for parametrizing estimator checks.

    The `id` of each check is set to be a pprint version of the estimator
    and the name of the check with its keyword arguments.
    This allows to use `pytest -k` to specify which tests to run::

        pytest test_check_estimators.py -k check_estimators_fit_returns_self

    Parameters
    ----------
    estimators : list of estimators instances
        Estimators to generated checks for.

        .. versionchanged:: 0.24
           Passing a class was deprecated in version 0.23, and support for
           classes was removed in 0.24. Pass an instance instead.

        .. versionadded:: 0.24

    Returns
    -------
    decorator : `pytest.mark.parametrize`

    See Also
    --------
    check_estimator : Check if estimator adheres to scikit-learn conventions.

    Examples
    --------
    >>> from sklearn.utils.estimator_checks import parametrize_with_checks
    >>> from sklearn.linear_model import LogisticRegression
    >>> from sklearn.tree import DecisionTreeRegressor

    >>> @parametrize_with_checks([LogisticRegression(),
    ...                           DecisionTreeRegressor()])
    ... def test_sklearn_compatible_estimator(estimator, check):
    ...     check(estimator)

    r   Nc                 s   s   | ]}t |tV  qd S N)r   type)r   estrq   rq   rr   	<genexpr>  s     z*parametrize_with_checks.<locals>.<genexpr>uPassing a class was deprecated in version 0.23 and isn't supported anymore from 0.24.Please pass an instance instead.c                  3   s>    D ]4} t | j}t| D ]}t||}t| |V  qqd S r  )r  rV   r   r   r  )rn   ro   r   r   r  rq   rr   checks_generator  s
    

z1parametrize_with_checks.<locals>.checks_generatorzestimator, check)ids)r  any	TypeErrorr  Zparametrizer   )r   r  r  rq   r  rr   parametrize_with_checks  s    (  r  F
deprecatedc                    s    dkr|dkrd}t ||dkr8d}t|t | t trNd}t|t j fdd}|rp| S | D ]H\ }z|  W qv tk
r } ztt	|t
 W 5 d}~X Y qvX qvdS )a  Check if estimator adheres to scikit-learn conventions.

    This function will run an extensive test-suite for input validation,
    shapes, etc, making sure that the estimator complies with `scikit-learn`
    conventions as detailed in :ref:`rolling_your_own_estimator`.
    Additional tests for classifiers, regressors, clustering or transformers
    will be run if the Estimator class inherits from the corresponding mixin
    from sklearn.base.

    Setting `generate_only=True` returns a generator that yields (estimator,
    check) tuples where the check can be called independently from each
    other, i.e. `check(estimator)`. This allows all checks to be run
    independently and report the checks that are failing.

    scikit-learn provides a pytest specific decorator,
    :func:`~sklearn.utils.parametrize_with_checks`, making it easier to test
    multiple estimators.

    Parameters
    ----------
    estimator : estimator object
        Estimator instance to check.

        .. versionadded:: 1.1
           Passing a class was deprecated in version 0.23, and support for
           classes was removed in 0.24.

    generate_only : bool, default=False
        When `False`, checks are evaluated when `check_estimator` is called.
        When `True`, `check_estimator` returns a generator that yields
        (estimator, check) tuples. The check is run by calling
        `check(estimator)`.

        .. versionadded:: 0.22

    Estimator : estimator object
        Estimator instance to check.

        .. deprecated:: 1.1
            ``Estimator`` was deprecated in favor of ``estimator`` in version 1.1
            and will be removed in version 1.3.

    Returns
    -------
    checks_generator : generator
        Generator that yields (estimator, check) tuples. Returned when
        `generate_only=True`.

    See Also
    --------
    parametrize_with_checks : Pytest specific decorator for parametrizing estimator
        checks.
    Nr   zBEither estimator or Estimator should be passed to check_estimator.ze'Estimator' was deprecated in favor of 'estimator' in version 1.1 and will be removed in version 1.3.r  c                  3   s,   t  D ]} t | }  t| fV  qd S r  )r   r  r   )r   rn   ro   rq   rr   r  p  s    
z)check_estimator.<locals>.checks_generator)r   r   r   FutureWarningr   r  r  rV   r   r   r1   )rn   Zgenerate_onlyr  r  r  r   	exceptionrq   r!  rr   check_estimator$  s*    7

r$  c                  C   s8   t d kr4tddddddd\} }t | } | |fa t S )N   r   r	         @   *   )	n_samples
n_featuresZn_informativeZbiasZnoiser   )REGRESSION_DATASETrI   rD   fit_transformr   r   rq   rq   rr   _regression_dataset  s    
r.  c                 C   s  |   }| jj}|dkr$| jdd d|kr@|dkr@| jdd d|kr| jd k	rf| jtd| jd |d	krz| jd
d |dkr| jdd | jjdkr| jd
dd |dkr| jdd |dkr| jdd d|kr| jdd d|kr| jtd| jd d|kr| jdd d|kr.| jdd d|krP|dsP| jdd |dkrf| jd d! |d"krvd#| _|d$kr| jd d% t	| d&rt| j
d| _
t	| d'rd#| _|d(kr| jd)d* |d+krd| _t| tr| jdd, t| tr| jd#d- |d.kr$| jdd/ |d0kr:| jd1d2 d3d4g}||krdt	| d5rd| jd6d7 t	| d8r|| jd6d9 |d:kr| jd;d< |d=krttd>krd?nd@}| j|dA |tkr| jd#d, |dBkr| jdCdD d S )ENTSNEr   Z
perplexityn_iterr   r1  max_iterr3  )Z	LinearSVR	LinearSVCr'  ZNMFi  ZMiniBatchNMFT)r3  Zfresh_restarts)ZMLPClassifierZMLPRegressord   ZMiniBatchDictionaryLearningn_resampling)r7  n_estimators)r8  
max_trialsr   )r9  n_init)r:  
batch_sizeZMLP)r;  Z	MeanShift      ?)	bandwidthZTruncatedSVDr	   ZLassoLarsIC)Znoise_variance
n_clustersn_bestZ	SelectFdr      ?r  ZTheilSenRegressor)n_components)r   )ZHistGradientBoostingClassifierZHistGradientBoostingRegressor)Zmin_samples_leafZDummyClassifierZ
stratified)ZstrategyZRidgeCVZRidgeClassifierCVcv   rB  n_splits)rE  ZOneHotEncoderignore)Zhandle_unknownZQuantileRegressorz1.6.0Zhighszinterior-point)solverZSpectralEmbeddinggh㈵>)Z	eigen_tol)r   rU   rV   
set_paramsr3  minr8  r   rA  ri   r>  r?  Zmax_subpopulationr   r+   r,   r8   r9   rd   )rn   paramsro   Zloo_cvrG  rq   rq   rr   _set_checking_parameters  s    














rK  c                   @   s*   e Zd ZdZdd Zd	ddZdd ZdS )
_NotAnArrayzvAn object that is convertible to an array.

    Parameters
    ----------
    data : array-like
        The data.
    c                 C   s   t || _d S r  )r   asarraydata)selfrN  rq   rq   rr   __init__  s    z_NotAnArray.__init__Nc                 C   s   | j S r  )rN  )rO  dtyperq   rq   rr   	__array__  s    z_NotAnArray.__array__c                 C   s"   |j dkrdS td|j d S )NZmay_share_memoryTz%Don't want to call array_function {}!)rV   r  r   )rO  r   typesr  r  rq   rq   rr   __array_function__  s    
z_NotAnArray.__array_function__)N)rV   r   __qualname____doc__rP  rR  rT  rq   rq   rq   rr   rL    s   
rL  c                 C   s   t | dd}t|dkS )zReturns True if estimator accepts pairwise metric.

    Parameters
    ----------
    estimator : object
        Estimator object to test.

    Returns
    -------
    out : bool
        True if _pairwise is set to True and False otherwise.
    metricNZprecomputed)r  bool)rn   rW  rq   rq   rr   _is_pairwise_metric  s    rY  c                 c   s   | j dkstd|  fV  dD ]}|| |fV  q | d}|jd|_|jd|_d|fV  dD ]8}| |}|jd|_|jd|_|d |fV  qjdS )	a;  Generate sparse matrices with {32,64}bit indices of diverse format.

    Parameters
    ----------
    X_csr: CSR Matrix
        Input matrix in CSR format.

    Returns
    -------
    out: iter(Matrices)
        In format['dok', 'lil', 'dia', 'bsr', 'csr', 'csc', 'coo',
        'coo_64', 'csc_64', 'csr_64']
    csr)ZdokZlilZdiaZbsrcsccoor\  int64Zcoo_64)r[  rZ  Z_64N)	r   AssertionErrorcopyZasformatrowastypecolindicesZindptr)X_csrZsparse_formatZX_coor   rq   rq   rr   _generate_sparse_matrix-  s    


re  c                 C   s  t jd}|jdd}d||dk < t||}t|}d|jdd t}t	t
d t|}W 5 Q R X t||}t|}t|D ]J\}}t	t
d" t|}| dkr|jd	d
 W 5 Q R X d|krd|  d| d}	nd|  d}	tttfddgd|	d t	t
d ||| W 5 Q R X t|drz||}
|d rb|
j|jd dfksztn|
j|jd fksztt|dr||}|d r|jd df}n|jd df}|j|kstW 5 Q R X qd S )Nr   )(   rC  r   g?   rf  r   )ZScalerrD   F)Z	with_meanZ64r   z doesn't seem to support z_ matrix, and is not failing gracefully, e.g. by using check_array(X, accept_large_sparse=False)z doesn't seem to fail gracefully on sparse data: error message should state explicitly that sparse input is not supported if this is not the case.r   ZSparseTr   may_passr   r   rx   r	   predict_probabinary_onlyr   )r   r   r   uniform_enforce_estimator_tags_Xr   Z
csr_matrixra  intr   r"  r"   r   rA   re  rH  r   r  r   r   ri   r   shaper^  rj  )ro   r   r   r   rd  r   rn   rp   Zmatrix_formatr   predZprobsZexpected_probs_shaperq   rq   rr   rk   N  sN    







rk   c                 C   s  t |}zdd l}tddgddgddgddgddgddgddgddgddgddgddgddgg}|t||}|ddddddddddddg}|dgd }t|ddr||}z|j|||d	 W n" t	k
r   t	d

| Y nX W n tk
r   tdY nX d S )Nr   r	   r   rC  rg     rx   r   rK   zPEstimator {0} raises error if 'sample_weight' parameter is of type pandas.SerieszUpandas is not installed: not testing for input of type pandas.Series to class weight.)r"   pandasr   array	DataFramerm  SeriesrA   r   r   r   ImportErrorr   )ro   r   rn   pdr   r   weightsrq   rq   rr   rZ     sF    "
rZ   c                 C   s   t |}tddgddgddgddgddgddgddgddgddgddgddgddgg}tt||}tddddddddddddg}tdgd }t|ddrt|jdd}|j|||d	 d S )
Nr	   r   rC  rg  rq  rx   r   rr  )	r"   r   rt  rL  rm  rA   rN  reshaper   )ro   r   rn   r   r   ry  rq   rq   rr   r[     s,     r[   c                 C   sd   t |}tjd}d}t||j|dfd}t|d }t||}dg| }|j|||d d S )Nr      rC  r   rr  )	r"   r   r   r   rm  rl  aranger   r   )ro   r   rn   rndr)  r   r   rK   rq   rq   rr   r\     s    

r\   c                 C   s(  t |}tddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgg}tddddddddddddddddg}t||}|j||tt|d tt$ |j||tdt| d W 5 Q R X tt$ |j||tt|dfd W 5 Q R X d S )Nr	   rC  r   rg  rr  )	r"   r   rt  r   r   rM   r  r   r   )ro   r   rn   r   r   rq   rq   rr   r]     s6    *

(
r]   rM   c                 C   s  t |}t |}t|dd t|dd tjddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddggtjd}tjddddddddddddddddgtd}|dkr|}|}tjt|d	}	d
|  d}
nz|dkrjt||d g}t	|d| g}tjt|d d	}	d|	t|d < t
|||	dd\}}}	d
|  d}
ntt||}t||}|j||d d |j|||	d dD ]<}t||rt|||}t|||}t|||
d qd S )Nr   r   r	   rC  r   rg  rQ  rM   )ro  zFor z; sample_weight=None is not equivalent to sample_weight=onesrO   z?, a zero sample_weight is not equivalent to removing the sample)r   rK   )r   rj  decision_functionr   r   )r"   r   r   rt  float64rn  rM   r  vstackZhstackr?   r   r   r   ri   r  r   )ro   r   rN   Z
estimator1Z
estimator2ZX1y1ZX2y2Zsw2r   methodX_pred1X_pred2rq   rq   rr   r_     sb    .




r_   c                 C   s  t |}t|dd tjddgddgddgddgddgddgddgddgddgddgddgddgddgddgddgddggtjd}tjddddddddddddddddgtd}t||}t|jd }d|d< |	 }|j
|||d	 |  d
}t|||d d S )Nr   r   r	   rC  r   rg  r  g      $@rr  z8 overwrote the original `sample_weight` given during fitr  )r"   r   r   rt  r  rn  r   rM   ro  r_  r   r   )ro   r   rn   r   r   Zsample_weight_originalZsample_weight_fitr   rq   rq   rr   r^   F  s<    .

r^   c              	   C   s  t jd}t||jdd}|t}t|}|d d df d t}t	|}t
||}||| t|dr||| t|dr|| ttddd	 |||t W 5 Q R X d
|d krddi|d< d}tt|d ||| W 5 Q R X n||| d S )Nr   )rf  r   r   rg  r   r   zUnknown label typeTr   ri  stringr   Zfoobarr   r   z"argument must be a string.* numberr   )r   r   r   rm  rl  ra  objectrA   rn  r"   r   r   ri   r   r   r   	Exceptionr  )ro   r   r   r   rp   r   rn   r  rq   rq   rr   rb   n  s(    





rb   c              	   C   s   t jd}|jddd|jdd  }|dd}|jdddd	d }t|}t|dd
 tt	dd |
|| W 5 Q R X d S )Nr(  r   r   y              ?rz  r	   r   r   lowhighr   r   zComplex data not supportedr  )r   r   r   rl  r{  randintr"   r   r   r   r   )ro   r   r   r   r   rn   rq   rq   rr   ra     s    ra   c                 C   s   | dkrd S t jd}| dkr2d|jdd }nd|jdd }t||}|d d df t}t|}t||}t	|drd	|_
t	|d
rd	|_t	|drd	|_t|d	 ||| dD ]<}t	||r|j }t||| |j|kstd| qd S )N)ZSpectralCoclusteringr   r   rC  r'  rC  r   r   rA  r	   r>  r?  r   r   r  rj  z$Estimator changes __dict__ during %s)r   r   r   rl  rm  ra  rn  r"   r   ri   rA  r>  r?  r   r   __dict__r_  r  r^  )ro   r   r~  r   r   rn   r  Zdict_beforerq   rq   rr   r     s2    







r   c                 C   s   |  dp| d S )N_)r   r   )attrrq   rq   rr   _is_public_parameter  s    r  c           	         s  t |jdrd S t|}tjd}d|jdd }t||}|d d df t	}t
||}t |drnd|_t |dr~d|_t|d |j ||| |j d	d
   D }fdd
|D }|rtdd|  fdd
|D }|r
tdd| d S )Ndeprecated_originalr   rC  r  r   rA  r	   r>  c                 S   s   g | ]}t |r|qS rq   )r  r   r   rq   rq   rr   r     s     z3check_dont_overwrite_parameters.<locals>.<listcomp>c                    s   g | ]}|   kr|qS rq   )r   r  )dict_before_fitrq   rr   r     s     zEstimator adds public attribute(s) during the fit method. Estimators are only allowed to add private attributes either started with _ or ended with _ but %s added, c                    s    g | ]}|  | k	r|qS rq   rq   r  Zdict_after_fitr  rq   rr   r     s   zEstimator changes public attribute(s) during the fit method. Estimators are only allowed to change attributes started or ended with _, but %s changed)ri   rP  r"   r   r   r   rl  rm  ra  rn  r   rA  r>  r   r  r_  r   r   r^  r   )	ro   r   rn   r~  r   r   Zpublic_keys_after_fitZattrs_added_by_fitZattrs_changed_by_fitrq   r  rr   r     sF    







r   c                 C   s   t jd}d|jdd }t||}|d d df t}t|}t||}t	|dr^d|_
t	|drnd|_t|d ||| dD ]&}t	||rttd	t|||d  qd S )
Nr   rC  r  r   rA  r	   r>  r  zReshape your data)r   r   r   rl  rm  ra  rn  r"   r   ri   rA  r>  r   r   r   r   r  )ro   r   r~  r   r   rn   r  rq   rq   rr   r     s(    





   r   c                    s~    |}|j d  fdd|D }t|tkrL|d }ttdd |}t|rj|j}dd |D }t	|t	|fS )Nr	   c                    s   g | ]} | d qS )r	   )r{  )r   batchr   r*  rq   rr   r   "  s     z%_apply_on_subsets.<locals>.<listcomp>r   c                 S   s   | d S )Nr   rq   )xrq   rq   rr   <lambda>'      z#_apply_on_subsets.<locals>.<lambda>c                 S   s   g | ]
}|j qS rq   )A)r   r  rq   rq   rr   r   +  s     )
ro  r  tuplelistmapr   issparser  r   ravel)r   r   result_fullresult_by_batchrq   r  rr   _apply_on_subsets  s    

r  c           
      C   s   t jd}d|jdd }t||}|d d df t}t|}t||}t	|dr^d|_
t	|drnd|_t|d ||| dD ]@}d	j|| d
}t	||rtt|||\}}	t||	d|d qd S )Nr   rC  r  r   rA  r	   r>  r   r   r  score_samplesrj  z={method} of {name} is not invariant when applied to a subset.r  ro   Hz>atolr   )r   r   r   rl  rm  ra  rn  r"   r   ri   rA  r>  r   r   r   r  r  r   )
ro   r   r~  r   r   rn   r  r  r  r  rq   rq   rr   r   0  s.    




 
 r   c           	      C   s  t jd}d|jdd }t||}|d d df t j}t|ddrVd||dk< t|}t	||}t
|d	rxd|_t
|d
rd|_t|d ||| t j|jd }dD ]H}dj|| d}t
||rtt|||| t|||| d|d qd S )Nr   rC  r  r   rk  r   r	   r   rA  r>  r  zY{method} of {name} is not invariant when applied to a datasetwith different sample order.r  &.>r  )r   r   r   rl  rm  ra  r]  rA   r"   r   ri   rA  r>  r   r   Zpermutationro  r   r   r  )	ro   r   r~  r   r   rn   idxr  r  rq   rq   rr   r   V  s8    




 
r   c              	   C   s   t jd}d|jdd }t||}|d d df t}t|}t||}t	|dr^d|_
t	|drnd|_t|d | dkr|jdd	 | d
kr|jdd ddddddg}tt|dd ||| W 5 Q R X d S )Nr   rC  )r	   r   r   rA  r	   r>  ZOPTICS)Zmin_samplesr/  r@  r0  z1 samplezn_samples = 1zn_samples=1z
one samplez1 classz	one classTr  )r   r   r   rl  rm  ra  rn  r"   r   ri   rA  r>  r   rH  r   r   r   ro   r   r~  r   r   rn   Zmsgsrq   rq   rr   r     s0    




	r   c              	   C   s   t jd}d|jdd }t||}|d d df t}t|}t||}t	|dr^d|_
t	|drnd|_| dkr|d|_| d	krd
|_t||}t|d dddg}tt|dd ||| W 5 Q R X d S )Nr   rC  )r   r	   r   rA  r	   r>  ZRandomizedLogisticRegressionr   r@  z1 feature\(s\)zn_features = 1zn_features=1Tr  )r   r   r   rl  rm  ra  rn  r"   r   ri   rA  r>  Zsample_fractionZresidual_thresholdr   r   r   r   r  rq   rq   rr   r     s&    






r   c              	   C   s   t jd}d|jdd }|t}t|}t||}t|drHd|_	t|drXd|_
t|d tt ||| W 5 Q R X d S )Nr   rC  r'  r   rA  r	   r>  )r   r   r   rl  ra  rn  r"   r   ri   rA  r>  r   r   r   r   )ro   r   r~  r   r   rn   rq   rq   rr   r     s    





r   c                 C   sb   t ddddgdddggdddd\}}t |}t||}|rPt||g\}}t| ||| d S Nr|  r   r	   r   r   r)  centersr   r*  cluster_std)rG   rD   r,  rm  r   _check_transformer)ro   r   rQ   r   r   rq   rq   rr   r     s    

r   c                 C   sz   t ddddgdddggdddd\}}t |}t||}t|}tt|}t| ||| t| || |  d S r  )	rG   rD   r,  rm  rL  r   rM  r  tolist)ro   r   r   r   Zthis_XZthis_yrq   rq   rr   r     s    

r   c              	   C   sD   t  \}}t|}tttfd|  dd || W 5 Q R X d S )NzThe unfitted transformer z\ does not raise an error when transform is called. Perhaps use check_is_fitted in transform.r  )r.  r"   r   AttributeErrorr   r   )ro   r   r   r   rq   rq   rr   r     s    

	r   c              	   C   sT  t |j\}}t|}t| | tkrpt jt |t |f }|d d ddf  d9  < t|trtt|}n|}|	|| t|}|j
||d}	t|	tr|	D ]}
|
jd |kstqn|	jd |kstt|drP| tkr|||}|j
||d}n||}|j
||d}t|ddr8| d }t|t|	trt|trt|	||D ]4\}
}}t|
|d	d
| d t|
|d	d| d q\nLt|	|d
| d	d t|	|d	d| d t||kstt||kstt|drPt|ddsP|jdkrP|jd dkrPttd|  dd  ||d d d df  W 5 Q R X d S )Nr   r	   r   r   r   r   r    is non deterministic{Gz?z9fit_transform and transform outcomes not consistent in %sr  z7consecutive fit_transform outcomes not consistent in %s)r   r  ro  r   zThe transformer zr does not raise an error when the number of features in transform is different from the number of features in fit.r  rz  )r   rM  ro  r"   r   rd   c_r   rL  r   r,  r  r^  ri   r   rA   r   zipr   rC   ndimr   r   )ro   transformer_origr   r   r)  r*  r   y_Ztransformer_cloneZX_predZx_predr  ZX_pred3r  Zx_pred2Zx_pred3rq   rq   rr   r    s    






r  c                 C   s   t |ddr| d }t|tddddgdddggdddd	\}}t||td
}t|}t||}t| t|}|	|| |	|| ddg}|D ]@}t
||d }	|	d k	rt
||}
|	||}|
||}t|| qd S )Nr   r   r  r|  r   r	   r   r   r  kernelscorer,  )rA   r   rG   rm  r5   r"   r   r   r.   r   r  r   )ro   r   r  r   r   rn   pipelinefuncs	func_namer   Zfunc_pipelineresultZresult_piperq   rq   rr   re   n  s2    




re   c                 C   s   t jd}d}|j|dfd}t||}t |d }t|}t||}t| ddddd	g}|D ]v}t	||d }	|	d k	rd|	|| d
d t
|	j D }
|
d dkr|
dd  }
|
d dksdtd|t|j|
f qdd S )Nr   r|  rC  r   r   r  partial_fitr   r,  c                 S   s   g | ]
}|j qS rq   )ro   r   prq   rq   rr   r     s     z+check_fit_score_takes_y.<locals>.<listcomp>rO  r	   )r   YzJExpected y or Y as second argument for method %s of %s. Got arguments: %r.)r   r   r   rl  rm  r}  r"   r   r   r  r   
parametersvaluesr^  r  rV   )ro   r   r~  r)  r   r   rn   r  r  r   r  rq   rq   rr   rY     s*    


rY   c                 C   s   t jd}d|jddt j }t||}|t j}|t j}|t j	}|d d df }t
||}ddddg}||||fD ]D}	t|}
t|
d	 |
|	| |D ]}t|
|rt|
||	 qqd S )
Nr   rC  r'  r   r   r   r   r  rj  r	   )r   r   r   rl  ra  ru   rm  r  r]  int32r   r"   r   r   ri   r  )ro   r   r~  Z
X_train_32Z
X_train_64ZX_train_int_64ZX_train_int_32r   methodsX_trainrn   r  rq   rq   rr   rX     s     



rX   c                 C   s   t ddddgdddggddd\}}t |}t||}t|ddD ]}||}t|}t| |||}|||	|}t
||gdd	gD ]H\}	}
t|	tr|	d }	|	j|kst|  d
|
 d|j d|	j dqqFd S )Nr|  r   r	   r   )r)  r  r   r  r   r   r,  r   z	 (method=z3) does not preserve dtype. Original/Expected dtype=z, got dtype=.)rG   rD   r,  rm  rA   ra  r"   r   r   r   r  r   r  rQ  r^  rV   )ro   r  r   r   rQ  ZX_castr   ZX_trans1ZX_trans2ZXtr  rq   rq   rr   r     s(    



r   c                 C   s   t |}t|d tddd}d|  d}tt|d ||g  W 5 Q R X tddd}t|t	ddddddddddddg}d}tt|d	 ||| W 5 Q R X d S )
Nr	   r   rC  The estimator zc does not raise a ValueError when an empty data is used to train. Perhaps use check_array in train.r  rq  zG0 feature\(s\) \(shape=\(\d*, 0\)\) while a minimum of \d* is required.r  )
r"   r   r   emptyr{  r   r   r   r   rt  )ro   r   eZX_zero_samplesr   ZX_zero_featuresr   r  rq   rq   rr   rc     s    

(rc   c                 C   sf  t jd}t||jdd}|jdd}t j|d< |jdd}t j|d< t d}d|d d< t||}d|  d}d|  d	}d|  d
}	||fD ]}
t	t
d t|}t|d ttddg|d ||
| W 5 Q R X ||| t|dr"ttddg|d ||
 W 5 Q R X t|drVttddg|	d ||
 W 5 Q R X W 5 Q R X qd S )Nr   r   rC  r   r  r   r   r   z& doesn't check for NaN and inf in fit.z* doesn't check for NaN and inf in predict.z, doesn't check for NaN and inf in transform.r   r	   r   NaNr   r   r   )r   r   r   rm  rl  r   r   rM   r   r   r"  r"   r   r   r   r   ri   r   r   )ro   r   r~  ZX_train_finiteZX_train_nanZX_train_infr   error_string_fiterror_string_predictZerror_string_transformr  rn   rq   rq   rr   rf     sJ     






rf   c              	   C   sH   t ddd\}}t|}ttd|  dd ||| W 5 Q R X dS )z8Test that error is thrown when non-square data provided.r'  r   )r)  r*  zThe pairwise estimator z+ does not raise an error on non-square datar  N)rG   r"   r   r   r   ro   r   r   r   rn   rq   rq   rr   rg   -  s    
rg   c                 C   s>  ddddg}t ddddgdddggddd	d
\}}t||td}t|}|d r~tjd}|j|jddd}tj	|
d|< t|}t||}t| ||| t|}	|j}
|
drd|
ks|
dsd|	kstt|	}t }|D ] }t||rt|||||< q|D ]"}t|||}t|| | qdS )z'Test that we can pickle all estimators.r   r   r  rj  r|  r   r	   r   r   r  r  rS   r(  r   F)replacerz  r   r   r   s   versionN)rG   rm  r5   rA   r   r   r   choicer   r   r{  r"   r   r   r   pickledumpsr   r   r   r^  loadsdictri   r  r   )ro   r   check_methodsr   r   rp   r   maskrn   Zpickled_estimatorr   Zunpickled_estimatorr  r  Zunpickled_resultrq   rq   rr   rl   =  sD    





rl   c              	   C   s   t |dsd S t|}tddd\}}t||}t||}z4t|r`t|}|j|||d n||| W n t	k
r   Y d S X t
td|  dd" ||d d d d	f | W 5 Q R X d S )
Nr  2   r	   r)  r   classesr  zZ does not raise an error when the number of features changes between calls to partial_fit.r  rz  )ri   r"   rG   rm  r   r$   r   uniquer  NotImplementedErrorr   r   )ro   r   rn   r   r   r  rq   rq   rr   r   p  s$    




r   c                 C   s&  d\}}}t |}t|}td|||d\}}||| ||}|j||fkshtd||f|j|jj	dksxtt
|dr||}	t|	tjst|	j||fkstd||f|	j|	dkt}
|j|
 }t|| t
|d	r||}t|trx|d
 sxt|D ]^}|| j|dfksHtd|df|| jttj|| ddt|d d |f  qnD|d
 s|j||fkstd||f|jt| t| t
|dr"t
|d	r"t|D ]D}||d d |f }||}tt|t|d d |f  qd S )N)r(  r   rC  r(  )r   r)  n_labels	n_classesSThe shape of the prediction for multioutput data is incorrect. Expected {}, got {}.ir  zaThe shape of the decision function output for multioutput data is incorrect. Expected {}, got {}.r   rj  
poor_scorer   zTThe shape of the probability for multioutput data is incorrect. Expected {}, got {}.r	   Zaxis)rA   r"   rH   r   r   ro  r^  r   rQ  rN   ri   r  r   r   ndarrayra  rn  classes_r   rj  r  rangeargmaxroundr   )ro   rn   r)  r  r  rp   r   r   y_preddecisiondec_preddec_expy_probr  Zy_probaZ
y_decisionrq   rq   rr   r     sr    
   

 

 


  

 
r   c                 C   s   t |}d }}t|s |d }tdd||d\}}t||}||| ||}|jtdksttd	|j|j
|j
kstdd S )	Nr   r	   r(  r   )r   	n_targetsr)  r*  r  zbMultioutput predictions by a regressor are expected to be floating-point precision. Got {} insteadr  )r"   rY  rI   rm  r   r   rQ  r   r^  r   ro  )ro   rn   r)  r*  r   r   r  rq   rq   rr   r     s*       


r   c              	   C   s  t |}tddd\}}t||dd\}}t |}tjd}t||j	dddd	g}|rtt
|||g\}}}|j\}}	t|d
r|jdd t| | dkr|jdd |jdd || ||  |j}
|
j|fkstt|
|dkstt|ddrd S t| tjdd ||}W 5 Q R X t|
| |
jtdtdfksbt|jtdtdfkst||}t|}t|t|d |d d  |d dkstt|d
rt|d
}|d |d kstd S )Nr  r	   r     r   rC  )r   r   r  r>  )r>  ZAffinityPropagationi)Z
preferencer6  r4  g?r   r   Trecordr  r]  r   rz  )r   rz  )r"   rG   r?   rD   r,  r   r   r   Zconcatenaterl  r   ro  ri   rH  r   r   r  Zlabels_r^  r)   rA   r   catch_warningsr   r   rQ  r  r}  r  )ro   clusterer_origrQ   r   r   r   r   ZX_noiser)  r*  rp  pred2labelsZlabels_sortedr>  rq   rq   rr   r     sL    



  

 
r   c                 C   sd   t ddd\}}t|}t| t|dr`|||}|jdd |||}t|| dS )z2Check that predict is invariant of compute_labels.r'  r   r  compute_labelsF)r  N)rG   r"   r   ri   r   r   rH  r   )ro   r  r   r   r   r  r  rq   rq   rr   r      s    
r   c           
   
   C   s   d}d}t jd}|jdd}|jdd}t d}ttd^ t|}tt	dd	|d
}	|
|| W 5 Q R X |	jrW 5 Q R  d S t||||d W 5 Q R X d S )Nz6Classifier can't train when only one class is present.z8Classifier can't predict when only one class is present.r   r  r   r   r   classTrh  r  )r   r   r   rl  rM   r   r"  r"   r   r   r   raised_and_matchedr   r   )
ro   classifier_origr  r  r~  r  X_testr   r   cmrq   rq   rr   r|   /  s&    
   r|   c              	   C   s   |  d}|  d}t jd}|jdd}|jdd}t dd }| }t|}	t|	drxd	|g}
tt	f| }}nd
}
t
t	fd }}t||
d|dD}|	j|||d |jrW 5 Q R  dS t|	|t d|d W 5 Q R X dS )zCheck that classifiers accepting sample_weight fit or throws a ValueError with
    an explicit message if the problem is reduced to one class.
    zu failed when fitted on one label after sample_weight trimming. Error message is not explicit, it should have 'class'.z; prediction results should only output the remaining class.r   )r   r   r   r   r   rK   z\bclass(es)?\bz\bsample_weight\bNTrh  rr  r  )r   r   r   rl  r}  r_  r"   rB   r^  r   r  r   r   r  r   r   rM   )ro   r	  Z	error_fitZerror_predictr~  r  r
  r   rK   r   r   Zerr_typer   r  rq   rq   rr   r}   F  s.    

  r}   r  c              
   C   s`  t ddd\}}||}t||dd\}}t |}||dk }||dk }| dkrp|| 8 }|| 8 }|rt||||g\}}}}||fg}t|}	|	d s|||f |D ]\}
}t	
|}t|}|
j\}}t|}t||
}
t||}t| |	d	 s@ttd
|  dd ||
|d d  W 5 Q R X ||
| ||
 |  t|dspt||
}|j|fkst|	d st||dkstd}d}|	d	 s&|	d rtt|| dd ||
dd W 5 Q R X n,tt|| dd ||
j W 5 Q R X t|drPz||
}|dkr|	d sh|j|fks|tn|j|dfks|t| dkt}t|| n(|j||fksttt	j |dd| |	d	 s6|	d r
tt|| dd ||
dd W 5 Q R X n,tt|| dd ||
j W 5 Q R X W n t!k
rN   Y nX t|dr|"|
}|j||fksxttt	j |dd| t#t	j$|ddt	%| |	d	 s|	d rtt|| dd |"|
dd W 5 Q R X n,tt|| dd |"|
j W 5 Q R X t|dr|&|
}t'|t	(|ddd tt	)|t	)| qd S )N,  r   r  r  r   r   )BernoulliNBZMultinomialNBComplementNBZCategoricalNBrk  rR   The classifier  does not raise an error when incorrect/malformed input data for fit is passed. The number of training examples is not the same as the number of labels. Perhaps use check_X_y in fit.r  rz  r  r  g(\?zuThe classifier {} does not raise an error when shape of X in  {} is not equal to (n_test_samples, n_training_samples)z|The classifier {} does not raise an error when the number of features in {} is different from the number of features in fit.rL   r   r	   r  rx   r  rj  predict_log_proba   r  )r  )*rG   ra  r?   rD   r,  rI  r   rA   appendr   r  r  ro  r"   rm  r   r   r   r   r   r  ri   r^  r   r(   r   r{  Tr  r  rn  r   r  r  rj  r   sumrM   r  r   logargsort)ro   r	  rQ   rw   ZX_mZy_mZy_bZX_bproblemsrp   r   r   r  r  r)  r*  r   r  Zmsg_pairwiser  r  r  r  Z
y_log_probrq   rq   rr   r   k  s    







	



















r   c                 C   sV   | |k r| }|d }n|}| d }t |}d}tt ||| dksRt|d S )Nr	   zThe number of predicted outliers is not equal to the expected number of outliers and this difference is not explained by the number of ties in the decision_function values)r   sortr  r  r^  )num_outliersexpected_outliersr  startendZsorted_decisionr  rq   rq   rr   check_outlier_corruption  s    

r  Tc              	   C   s  d}t |dd\}}t|dd}|r,t|}|j\}}t|}t| || ||  ||}|j|fksxt	|j
jdkst	tt|tddg ||}	||}
|	|
fD ](}|j
t
d	kst	|j|fkst	qtt ||j W 5 Q R X |	dkt}d||dk< t|| tt ||j W 5 Q R X |
|j }t||	 tt ||j W 5 Q R X t|d
rt|dsd}|| }|j|d || ||}t|dk}||kr||}	t|||	 d S )Nr  r   r  r  r   r  rz  r	   floatr   Znoveltyr|  r   )rG   r?   r   ro  r"   r   r   r  r   r^  rQ  rN   r   r   r  rt  r  r  r   r   r  ra  rn  Zoffset_r   ri   rH  r  r  )ro   r   rQ   r)  r   r  r*  rn   r  r  Zscoresoutputr  Zy_decr  r   r  rq   rq   rr   r   	  sP    














r   c                 C   s   t |dsd S d|jkrd S |jd }tdd |D s@td|D ]H}t|trD|jtkr|jdkr|j	dkr|jdksD|j
d	ksDtd
qDd S )N_parameter_constraintsr   c                 S   s   g | ]}t |tqS rq   )r   r   )r   crq   rq   rr   r   `	  s     z/check_outlier_contamination.<locals>.<listcomp>zDcontamination constraints should contain a Real Interval constraint.        r@  r   >   rightneitherz:contamination constraint should be an interval in (0, 0.5])ri   r"  r  r^  r   r   r  r   leftr%  closed)ro   r   Zcontamination_constraints
constraintrq   rq   rr   r   T	  s.    



r   c              	   C   s   t dddddddd\}}t|}|d d	 |d d	  }}|d	d  }| }t|}t|}	t|	 |	|||}
|	|||}|	|||}t|
| t|
| |
j	|j	kst
|
j	|j	kst
t|
t|kst
t|
t|kst
d S )
Nr6  r   r   rC  r  Tr   r)  r*  r  r  lengthZallow_unlabeledr   P   )rH   rE   r  r  r"   r   r   r   r   rQ  r^  r  )ro   r	  r   r   r  y_trainr
  Zy_train_list_of_listsZy_train_list_of_arraysr   r  Zy_pred_list_of_listsZy_pred_list_of_arraysrq   rq   rr   r   o	  s:    
	

r   c              	   C   s8  t |}t| d\}}}t|d|ddddd\}}t|}|d|  || d  }}	|d|  || d  }
}|||
 d	}t||d}|dkrt|  d
| d||	}t|tj	st
|  dt| d|j|jkst
|  d|j d|j d|j|jks4t
|  d|j d|j ddS )zeCheck the output of the `predict` method for classifiers supporting
    multilabel-indicator targets.r6     r   r   rC  r  Tr   r*  Nr    does not have a  method.z2.predict is expected to output a NumPy array. Got 	 instead.z(.predict outputs a NumPy array of shape  instead of r  z>.predict does not output the same dtype than the targets. Got )r"   r   rH   rE   r   r  r   r   r   r  r^  r  ro  rQ  )ro   r	  r   r)  	test_size	n_outputsr   r   r  r
  r-  y_testresponse_method_nameZpredict_methodr  rq   rq   rr   r   	  s<    

	r   c              	   C   s  t |}t| d\}}}t|d|ddddd\}}t|}|d|  || d  }}	|d|  }
|||
 d	}t||d}|dkrt|  d
| d||	}t|trft	||kst
d|  dt	| d| d|D ]~}|j|dfkst
d|  d|j d|df d|jjdks@t
d|  d|j dd|  d}t|jddd|d qnt|tjr|j||fkst
d|  d|j d||f d|jjdkst
d|  d|j dd|  d}td||d t|d|d ntdt| d|  ddS )zkCheck the output of the `predict_proba` method for classifiers supporting
    multilabel-indicator targets.r.  r   rC  r  Tr   r*  Nrj  r0  r1  zWhen zn.predict_proba returns a list, the list should be of length n_outputs and contain NumPy arrays. Got length of r3  r  zx.predict_proba returns a list, this list should contain NumPy arrays of shape (n_samples, 2). Got NumPy arrays of shape fzW.predict_proba returns a list, it should contain NumPy arrays with floating dtype. Got r2  z.predict_proba returns a list, each NumPy array should contain probabilities for each class and thus each row should sum to 1 (or close to 1 due to numerical errors).r	   r  r  zX.predict_proba returns a NumPy array, the expected shape is (n_samples, n_outputs). Got zN.predict_proba returns a NumPy array, the expected data type is floating. Got z.predict_proba returns a NumPy array, this array is expected to provide probabilities of the positive class and should therefore contain values between 0 and 1.zUnknown returned type z by z4.predict_proba. A list or a Numpy array is expected.)r"   r   rH   rE   r   r  r   r   r  r  r^  ro  rQ  rN   r   r  r   r  r   r   r  )ro   r	  r   r)  r4  r5  r   r   r  r
  r-  r7  Zpredict_proba_methodr  rp  r   rq   rq   rr   r   	  sb    

	

r   c              	   C   s"  t |}t| d\}}}t|d|ddddd\}}t|}|d|  || d  }}	|d|  }
|||
 d	}t||d}|dkrt|  d
| d||	}t|tj	st
|  dt| d|j||fkst
|  d|j d||f d|jjdkst
|  d|j ddS )zoCheck the output of the `decision_function` method for classifiers supporting
    multilabel-indicator targets.r.  r   rC  r  Tr   r*  Nr  r0  r1  z<.decision_function is expected to output a NumPy array. Got r2  z].decision_function is expected to provide a NumPy array of shape (n_samples, n_outputs). Got r3  r  r8  z?.decision_function is expected to output a floating dtype. Got )r"   r   rH   rE   r   r  r   r   r   r  r^  r  ro  rQ  rN   )ro   r	  r   r)  r4  r5  r   r   r  r
  r-  r7  Zdecision_function_methodr  rq   rq   rr   r   
  s<    

	r   c              	   C   s8   t |}d|  d}tt|d |  W 5 Q R X dS )zCheck the error raised by get_feature_names_out when called before fit.

    Unfitted estimators with get_feature_names_out should raise a NotFittedError.
    r   zU should have raised a NotFitted error when fit is called before get_feature_names_outr  N)r"   r   r0   get_feature_names_out)ro   r   rn   r   rq   rq   rr   !check_get_feature_names_out_errorG
  s
    
r:  c                 C   s`   t ddd\}}t||}t|}t||}|r@t||g\}}t| ||||ks\tdS )z+Check if self is returned when calling fit.r      r   r)  N)rG   rm  r"   r   r   r   r   r^  )ro   r   rQ   r   r   rn   rq   rq   rr   r`   W
  s    

r`   c              
   C   sL   t  \}}t|}dD ]0}t||rtt t||| W 5 Q R X qdS )z}Check that predict raises an exception in an unfitted estimator.

    Unfitted estimators should raise a NotFittedError.
    )r  r   rj  r  N)r.  r"   ri   r   r0   r  )ro   r   r   r   rn   r  rq   rq   rr   r   g
  s    


r   c              	   C   s"  t |}tjd}d}t||j|dfd}t|d }t||}t|}t	| |
|| ||}t	| tjdd8}	tdt tdt |
||d d tjf  W 5 Q R X ||}
d	d
dd |	D  }|d st|	dkst|d|kstt| |
  d S )Nr   r|  rC  r   Tr   alwaysrF  z)expected 1 DataConversionWarning, got: %sr  c                 S   s   g | ]}t |qS rq   r   )r   Zw_xrq   rq   rr   r   
  s     z)check_supervised_y_2d.<locals>.<listcomp>rt   zPDataConversionWarning('A column-vector y was passed when a 1d array was expected)rA   r   r   r   rm  rl  r}  r   r"   r   r   r   r   r  simplefilterr/   RuntimeWarningZnewaxisr   r  r^  r   r  )ro   r   rp   r~  r)  r   r   rn   r  wZ	y_pred_2dr  rq   rq   rr   r   |
  s4    

$

r   c                 C   s|  t |}t|}|dkr&| |  k} t| || | || }t|dr$|| }t	|t j
sjtt|dkr| dkt}|j| }	t|	|d|dtt|	dtt|f d n`t|dd	d	kr$t j|d
dt}
|j|
 }t||d|dtt|dtt|f d |dkrDtt |t | t||jd|dtt|dtt|jf d d S )Nr  r  r   r   zKdecision_function does not match classifier for %r: expected '%s', got '%s'r  r  Zdecision_function_shapeZovrr	   r  r  z=Unexpected classes_ attribute for %r: expected '%s', got '%s')r   r  r"   meanr   r   r   ri   r  r   r  r^  r  r  ra  rn  r  r   r   r  r   r  r  )r   r   ro   r	  r  r   r  r  r  r  Z
decision_yZy_exprq   rq   rr   check_classifiers_predictions
  s`    





rC  c                 C   s   | dkr|S |S )N)ZLabelPropagationZLabelSpreadingSelfTrainingClassifierrq   )ro   r   y_namesrq   rq   rr    _choose_check_classifiers_labels
  s    rF  c                 C   s  t dddd\}}t||dd\}}t |}||dk }||dk }t||}t||}dd	d
g}dd	g}t||}t||}	|||	fg}
t|dds|
|||f |
D ]8\}}}||	dfD ]}t
| ||}t||| | qqddg}t||}	t
| ||	}t||| | d S )Nr|  r   r   )r)  r   r  r  r   r   ZoneZtwoZthreerk  r   Orz  r	   )rG   r?   rD   r,  rm  r   ZtakerA   r  ra  rF  rC  )ro   r	  ZX_multiclassZy_multiclassZX_binaryZy_binaryZlabels_multiclassZlabels_binaryZy_names_multiclassZy_names_binaryr  r   r   rE  Z	y_names_ir  rq   rq   rr   r~   
  s4      



r~   c                 C   s   t  \}}t||d d }tjd}|jd|jd d}t||}tjd}t|}t|}t	| t	| | t
krt|d| |jdt|d g}|j}n|}||| ||}	|||t ||}
t|	|
d| d d S )Nr  r   rC  r   r   r  r  )r.  rm  r   r   r   r  ro  r   r"   r   rd   r  r  r  r   r   ra  r  r   )ro   regressor_origr   r  r~  r   Zregressor_1Zregressor_2r  pred1r  rq   rq   rr   r     s&    

$

r   c           
   	   C   s\  t  \}}||}t|}t|}t||}t||}| tkrxtj	d}t
|d| |jdt|d g}|j}n|}|rt|||g\}}}t|dst|drd|_| dkrd|_ttd|  d	d
 |||d d  W 5 Q R X t| ||| || |  ||}	|	j|jks4tt|ddsX|||dksXtd S )Nr   r   r   alphasr  r  ZPassiveAggressiveRegressorr  r  r  rz  r  r   r@  )r.  ra  rE   r"   rm  r   rd   r   r   r   r  r  r  r  r   ri   r  r   r   r   r   r   r  r   ro  r^  rA   r  )
ro   rH  rQ   rw   r   r   r   r~  r  r  rq   rq   rr   r   )  s:    



$
	
r   c                 C   sr   t jd}t|}|jdd}t||}t||d d df }||| dddg}|D ]}t||rZt	qZd S )Nr   )r   rg  r   r  rj  r  )
r   r   r   r"   normalrm  r   r   ri   r^  )ro   rH  r   r   r   r   r  r  rq   rq   rr   r   \  s    

r   c                 C   sN  t |ddrdg}nddg}|D ]&}t|ddd\}}t||ddd	\}}}}	t |d
drpt||}t||}tt|}|dkrddd}
ndddd}
t|j|
d}t	|dr|jdd t	|dr|jdd t	|dr|jdd t	|dr|jdd t
| ||| ||}t |dds t|dkdks tq d S )Nrk  r   r   rC  r   r'  )r  r   r  r@  r4  r   rL     g-C6?)r   r	   )r   r	   r   rz   r1  r6  r2  r3  r4  min_weight_fraction_leafr  )rO  n_iter_no_change)rP  r  gףp=
?)rA   rG   r2   r5   r  r   r  r"   rH  ri   r   r   r   rB  r^  )ro   r	  r  Z	n_centersr   r   r  r
  r-  r6  rz   r   r  rq   rq   rr   r   m  s@    
   





r   c           
      C   s   t |}t|dr|jdd t|dr4|jdd t| ||| ||}|jdd ||| ||}	t||	d	d
t||d	d
kstd S )Nr1  r6  r2  r3  rM  r4  balancedrN  Zweighted)Zaverage)r"   ri   rH  r   r   r   r*   r^  )
ro   r	  r  r-  r
  r6  ry  r   r  Zy_pred_balancedrq   rq   rr   'check_class_weight_balanced_classifiers  s     



  rR  c           
      C   s&  t ddgddgddgddgddgg}t dddddg}| }t|drX|jd	d
 t|drn|jd	d t|dr|jdd t| |jdd |||j }t|}t	tt 
|}|t |dk|  |t |dk|  d}|j|d |||j }	t||	d|  d dS )z4Test class weights with non-contiguous class labels.      r   gr<  r$  r	   rz  r1  rM  r2  r3  r4  rB  rC  rD  rQ  rN  )r	   rz  z>Classifier %s is not computing class_weight=balanced properly.r  N)r   rt  ri   rH  r   r   coef_r_  r  r  r  r  r   )
ro   
Classifierr   r   r   Zcoef_balancedr)  r  rz   Zcoef_manualrq   rq   rr   -check_class_weight_balanced_linear_classifier  s0    (


rV  c                 C   s   t ddd\}}t||td}t|}t||}t| | }t|}||| | }|	 D ]8\}}	|| }
t
|
t
|	ksdtd| ||	|
f qdd S )Nr   r;  r<  r  zTEstimator %s should not change or mutate  the parameter %s from %s to %s during fit.)rG   rm  r5   r"   r   r   r   r   r   r   joblibhashr^  )ro   r   r   r   rn   rJ  Zoriginal_params
new_params
param_nameoriginal_value	new_valuerq   rq   rr   rh     s     

rh   c                 C   s   zt |}W n$ tk
r0   td|  dY nX tt|jdrFdS tt|j}trtdD ]}||kr\|| q\dd dd	 t|jD D }t	t
|t	| t	| }|rtd
| t|f dS )zCheck setting during init.r   z9 should store all parameters as an attribute during init.r  N)r   c                 S   s   g | ]}|D ]}|qqS rq   rq   )r   Zparams_parentr  rq   rq   rr   r     s    z3check_no_attributes_set_in_init.<locals>.<listcomp>c                 s   s   | ]}t |V  qd S r  r   )r   parentrq   rq   rr   r    s     z2check_no_attributes_set_in_init.<locals>.<genexpr>zaEstimator %s should not set any attribute apart from parameters during init. Found attributes %s.)r"   r  ri   r  rP  r   r
   remove__mro__setvarsr^  sorted)ro   r   rn   init_paramsr   Zparents_init_paramsZinvalid_attrrq   rq   rr   rW     s,    


rW   c                 C   s   t ddgddgddgddgddgddgddgddgddgg	}t dddddddddg	}t||}t|}||| ||}|  t|j	st
||}t|| tt|}t|j	st
||}t|| d S )Nrz  r	   r   rC  )r   rt  r   r"   r   r   rT   r   r  rT  r^  r   r  r  r  )ro   r   r   r   r  Z	pred_origrp  rq   rq   rr   rj      s2    




rj   c                 C   s   t ddgddgddgddgddgddgddgddgddgddgddgddgg}t||}t ddddddddddddg}t||}dD ]}t| |||| qd S )NrC  r   r	   r   rg  
NotAnArrayZPandasDataframe)r   rt  rm  r   "check_estimators_data_not_an_arrayro   r   r   r   obj_typerq   rq   rr   r{   C  s(    
"
r{   c                 C   s<   t  \}}t||}t||}dD ]}t| |||| q"d S )Nre  )r.  rm  r   rg  rh  rq   rq   rr   r   \  s
    


r   c                 C   s  | t krtdt|}t|}t| t| |dkrFtd||dkrltt|}tt|}ndzFdd l	}	t|}|j
dkr|	|}n
|	|}|	t|}W n tk
r   tdY nX ||| ||}
||| ||}t|
|d| d	 d S )
NzoSkipping check_estimators_data_not_an_array for cross decomposition module as estimators are not deterministic.re  zData type {0} not supportedrf  r   r	   zDpandas is not installed: not checking estimators for pandas objects.r  r  )rd   r   r"   r   r   r   rL  r   rM  rs  r  rv  ru  rw  r   r   r   )ro   r   r   r   ri  Zestimator_1Zestimator_2r  ZX_rx  rI  r  rq   rq   rr   rg  e  s:    





rg  c           
         s  |j }ttd t|}t| t| | |ks<tt|j	d|j	}z(dd   fddt
|j D }W n$ ttfk
r   Y W 5 Q R  d S X | }|tt|dg d  }|D ]B}|j|jkstd|jt|jf ttttttd ttjtjh	}|t j!j"j#  t|j|ksftd	|j d
|j dt|jj dt$dd |D  d	|j|% kr|jd kstd|j d
|j dq||j }t&|t j'rt(||j qd|j d}	t)|r||jkst|	q||jkst|	qW 5 Q R X d S )Nr   r  c                 S   s"   | j dko | j| jko | j| jkS )z*Identify hyper parameters of an estimator.rO  )ro   rN   VAR_KEYWORDVAR_POSITIONAL)r  rq   rq   rr   param_filter  s
    


z<check_parameters_default_constructible.<locals>.param_filterc                    s   g | ]} |r|qS rq   rq   r  rl  rq   rr   r     s     z:check_parameters_default_constructible.<locals>.<listcomp>r   z(parameter %s for %s has no default valuezParameter 'z' of estimator 'z' is of type z which is not allowed. All init parameters have to be immutable to make cloning possible. Therefore we restrict the set of legal types to c                 s   s   | ]}|j V  qd S r  )rV   )r   r  rq   rq   rr   r    s     z9check_parameters_default_constructible.<locals>.<genexpr>r  zEstimator parameter 'zT' is not returned by get_params. If it is deprecated, set its default value to None.z
Parameter z> was mutated on init. All parameters must be stored unchanged.)*rU   r   r"  r  r"   reprrH  r^  r  rP  r   r  r  r  r   r   r  defaultr  ro   r  rV   r   rn  r  rX  r  rS  FunctionTyperW  ZMemoryupdater   coreZnumerictypesZallTypesr`  r   r   r  r   r   )
ro   r  rn   initrc  rJ  Z
init_paramZallowed_typesZparam_valueZfailure_textrq   rm  rr   r     sf    



6	

r   c                 C   st   t | ddr |dt|  7 }t | ddrX|jdkrXt||jd k||jd d }t | ddrpt|dS |S )NZrequires_positive_yr   r	   rk  r   rx   )rz  r	   )rA   absrI  r   r   whereZflatr{  )rn   r   rq   rq   rr   r     s    "r   c                 C   s   dt | ddkr |d d df }t | ddr8||  }dt | ddkr\||  tj}| jjdkrt||  }t| rt|dd	}nt | d
dr|||}|S )NZ1darrayr   r   r   r   categoricalZSkewedChi2SamplerZ	euclidean)rW  rL   )	rA   rI  ra  r   r  rU   rV   rY  r7   )rn   r   r  rq   rq   rr   rm    s    
rm  c                 C   s   dddddddg}|t 7 }| |kr&d S | dkr@t|jd	d
}nt|}t|drt }|j|j }}t||}t|d t	||}|
|| t|jdkstd S )Nr    ZRidgeClassifierr   r   r5  r   rD  Z	LassoLarsr$  r  r3  r   r	   )rd   r"   rH  ri   rF   rN  targetr   r   rm  r   r   alln_iter_r^  )ro   r   Znot_run_check_n_iterrn   Zirisr   r  rq   rq   rr   r      s,    




r   c                 C   s   t |}t|dr| tkr\dddgdddgdddgdddgg}ddgd	d
gddgddgg}n0tddddgdddggdddd\}}t||}t|d ||| | tkr|jD ]}|dkstqn|jdkstd S )Nr3  r$  r<  g       @r&  g      @r   gɿg?g?g      g333333?r|  r   r	   r   r  )	r"   ri   rd   rG   rm  r   r   ry  r^  )ro   r   rn   r   r  Ziter_rq   rq   rr   r   K  s&    
$



r   c                    sB   t |}|jdd}|jdd t fdd| D s>td S )NFdeepTc                 3   s   | ]}|   kV  qd S r  )r   )r   itemZdeep_paramsrq   rr   r  r  s     z.check_get_params_invariance.<locals>.<genexpr>)r"   r   rx  r   r^  )ro   r   r  Zshallow_paramsrq   r}  rr   r   j  s    r   c                 C   s  t |}|jdd}d}|jf | |jdd}t| t| ksPt|| D ]\}}|| |ksXt|qXtj tjd g}t	|}	| D ]Z}
||
 }|D ]>}||	|
< z|jf |	 W n t
tfk
r } z|jj}td||
|  d|}|}|jdd}zHt| t| ks4t| D ]\}}|| |ks<tq<W n  tk
r|   t| Y nX W 5 d }~X Y qX |jdd}t|	 t| kst|| D ] \}}|	| |kst|qq||	|
< qd S )NFrz  z>get_params result does not match what was passed to set_paramszn{0} occurred during set_params of param {1} on {2}. It is recommended to delay parameter validation until fit.z9Estimator's parameters changed after set_params raised {})r"   r   rH  r`  r   r^  r   r   r   r   r  r   rU   rV   r   r   r   )ro   r   rn   Zorig_paramsr  Zcurr_paramsr   r   Ztest_valuesZtest_paramsrZ  default_valuer   r  e_typeZchange_warning_msgZparams_before_exceptionrq   rq   rr   r   u  sX     
  ""r   c              	   C   sT   t  \}}t||}t|}d}t|ddsPtt|d ||| W 5 Q R X d S )NzUnknown label type: rR   r   r  )r.  rm  r"   rA   r   r   r   )ro   r   r   r   r  r  rq   rq   rr   r     s    

r   c              	      s  ddg}t ddd|ddd\}}t||d	dd
\}}}}t|}	t|	dr
t|	dr
|	|| |	|d d df jdd}
|	|jdd t|
t  }zt	| W nT t
k
r   t fddtD }t|}t|tt| Y nX d S )N)r   r   )rg  rg  r6  r   rg  r<  T)r)  r   r*  r  r  r?   皙?rL  r  rj  r	   r   )Zdecimalsc                    s   g | ]} |k   qS rq   )rB  )r   groupbZ
rank_probarq   rr   r     s     z4check_decision_proba_consistency.<locals>.<listcomp>)rG   r2   r"   ri   r   rj  r  r  r   r   r^  r   rt  r  r  r   r}  r  )ro   r   r  r   r   r  r
  r-  r6  rn   aZ
rank_scoreZgrouped_y_scoreZ
sorted_idxrq   r  rr   r     s:    
   
r   c                 C   s  d}t |dd\}}t|dd}|j\}}t|}t| ||}|j|fksTt|jjdksdtt	t
|t
ddg t|d	r|||}t	|| t|d
rd}	t|	| }
|j|
d ||}t
|dk}||	krt|dr||}t||	| d S )Nr  r   r  r  r   r  rz  r	   r   r   r|  r   r  )rG   r?   ro  r"   r   r   r^  rQ  rN   r   r   r  rt  ri   r   r   r  rH  r  r  r  )ro   r   r)  r   r  r*  rn   r  Zy_pred_2r  r   r  r  rq   rq   rr   r     s2    




 
r   c              	   C   sP   t ddgddgg}t ddg}t|}tt ||| W 5 Q R X d S )NrS  r	   r   )r   rt  r"   r   r   r   r  rq   rq   rr   r     s
    
r   c              	      s  ddddg}t jd}t|t d  krDjdd d	}|jd	|d
fd}t	|}t
|rz|j|d}n|jdd
|d}t|}ttd|d|\}}t|||\}	}
t||||\ }|	|
  fdd|D }t |	|
 |D ]}t|rt| }t |jt jrPd
t |jj }nd
t t jj }t|| |t|dt|dd|d qd S )Nr   r   r  rj  r   
warm_startFr  r6  r   locr   r   r  r  rL  c                    s&   i | ]}t |r|t| qS rq   )ri   r  )r   r  r
  rn   rq   rr   
<dictcomp>?  s   
 z(check_fit_idempotent.<locals>.<dictcomp>r  r  z&Idempotency check failed for method {})r  Zrtolr   )r   r   r   r"   r   r   r   rH  rK  rm  r%   r  r   nextr3   splitr4   r   ri   r  Z
issubdtyperQ  ZfloatingZfinfoZepsr  r   maxr   )ro   r   r  r   r)  r   r   Ztraintestr  r-  r6  r  r  Z
new_resultZtolrq   r  rr   r     sF    

r   c              
   C   s  t jd}t|}t| d| kr4|jdd d}|jd|dfd}t||}t	|rj|j|d}n|j
d	d|d
}t||}t|ddszt| t|jj dW n tk
r   Y nX ||| zt| W n. tk
r } ztd|W 5 d }~X Y nX d S )Nr(  r  Fr  r6  r   r  r   r   r  r   z) passes check_is_fitted before being fit!zFEstimator fails to pass `check_is_fitted` even though it has been fit.)r   r   r   r"   r   r   rH  rK  rm  r%   r  r   rA   getr:   r^  rU   rV   r0   r   )ro   r   r   rn   r)  r   r   r  rq   rq   rr   r   Y  s:    

r   c                 C   s   t jd}t|}t| d| kr4|jdd d}|jd|dfd}t||}t	|rj|j|d}n|j
dd|d	}t||}t|d
rt||| t|d
st|j|jd kstd S )Nr   r  Fr  r6  r   r  r   r  n_features_in_r	   )r   r   r   r"   r   r   rH  rK  rm  r%   r  r   ri   r^  r   r  ro  )ro   r   r   rn   r)  r   r   rq   rq   rr   r     s     

r   c              
      s   t jd}t|}t| d}|jd|dfd}t||}d}z||d  W n< tk
r   zt	 fdd|D s| W 5 d   X Y nX d S )Nr   r6  r   r  )z1requires y to be passed, but the target y is Nonez<Expected array-like (array or non-string sequence), got Nonezy should be a 1d arrayc                 3   s   | ]}|t  kV  qd S r  r>  )r   r  verq   rr   r    s     z(check_requires_y_none.<locals>.<genexpr>)
r   r   r   r"   r   rK  rm  r   r   r  )ro   r   r   rn   r)  r   Zexpected_err_msgsrq   r  rr   r     s    
r   c              
   C   s  t |}d|d kpd|d k}|r,|d r0d S tjd}t|}t| d| krd|jdd d	}|j|d
fd}t	||}t
|r|j|d}n|jdd|d}t||}||| |j|jd kstdddddg}	|d d dgf }
d|jd  d}|	D ]V}t||sqt||}|dkr<t||d}tt|d ||
 W 5 Q R X qt|dspd S t|}t|r|j||t|d n||| |j|jd ksttt|d ||
| W 5 Q R X d S )Nr   r   rv  rR   r   r  Fr     r  r   r   r  r	   r   r   r  rj  r  z'X has 1 features, but \w+ is expecting z features as inputr  r  r  r  )rA   r   r   r   r"   r   r   rH  rK  rm  r%   r  r   r   r  ro  r^  ri   r  r   r   r   r$   r  r  )ro   r   rp   is_supported_X_typesr   rn   r)  r   r   r  X_badr  r  callable_methodrq   rq   rr   !check_n_features_in_after_fitting  sX    




r  c                 C   s`   t |}t|dsd S t|  }tt }|||ks\t|  d|||  d S )N	_get_tagsz@._get_tags() is missing entries for the following default tags: )r"   ri   r`  r  r   r@   intersectionr^  )ro   r   rn   Z	tags_keysZdefault_tags_keysrq   rq   rr   rm     s    
rm   c                 C   s  zdd l }W n tk
r(   tdY nX t|}d|d kpHd|d k}|rV|d rZd S tjd}t|}t| |j	dd}t
||}|j\}}	td	d
 t|	D }
|j||
d}t|r|j	|d}n|jdd|d}t||}t $ tjddtdd ||| W 5 Q R X t|ds2tdt|jtjsFt|jjtksXtt|j|
 |j }|!drd|ks|"dsd|j#krtd|  dg }dD ]D}t||sĐqt$||}|dkrt%||d}|&||f q|D ]8\}}t   tjddtdd || W 5 Q R X q|
d d d dfdd
 t|	D df|
d d  d!t'|
d d   d"fg}d#d$ |( ) D }t*d%d& |+ D }|D ]\}}|j||d}t,-d'| }|D ]2\} }t.t||  d(d) || W 5 Q R X qt|d*r|r"qt|}t/|rPt0|}|j1|||d+ n|1|| t.t|d, |1|| W 5 Q R X qd S )-Nr   Hpandas is not installed: not checking column name consistency for pandasr   r   rv  rR   )r  r  r   c                 S   s   g | ]}d | qS )Zcol_rq   r   r  rq   rq   rr   r   "  s     z<check_dataframe_column_names_consistency.<locals>.<listcomp>columnsr   r  errorz#X does not have valid feature namesZsklearn)messager   modulefeature_names_in_zTEstimator does not have a feature_names_in_ attribute after fitting with a dataframer   r   r   r   z2 does not document its feature_names_in_ attribute)r   r   r  rj  r  r  r  r  r  rz  z<Feature names must be in the same order as they were in fit.c                 S   s   g | ]}d | qS )Zanother_prefix_rq   r  rq   rq   rr   r   h  s     zHFeature names unseen at fit time:
- another_prefix_0
- another_prefix_1
rC  z3Feature names seen at fit time, yet now missing:
- 
c                 S   s   i | ]\}}d |kr||qS )Zearly_stoppingrq   )r   r   r   rq   rq   rr   r  q  s    z<check_dataframe_column_names_consistency.<locals>.<dictcomp>c                 s   s   | ]}|d kV  qdS )TNrq   )r   r   rq   rq   rr   r  v  s     z;check_dataframe_column_names_consistency.<locals>.<genexpr>zBThe feature names should match those that were passed during fit.
z did not raiser   r  r  r  )2rs  rw  r   rA   r   r   r   r"   r   rK  rm  ro  rt  r  ru  r%   r  r   r   r  filterwarningsUserWarningr   ri   r   r   r  r  r^  rQ  r  r   r   r   r   rV  r  r   r  rI  r   r   r  r  r   escaper   r$   r  r  )ro   r   rx  rp   r  r   rn   ZX_origr)  r*  namesr   r   r   r  r  r  r  invalid_namesrJ  Zearly_stopping_enabledZinvalid_nameZadditional_messager  Zexpected_msgr  rq   rq   rr   (check_dataframe_column_names_consistency  s    





	




  

r  c              	   C   s  |  }d|d ks|d r d S tddddgdddggdddd	\}}t |}t|}t||}|jd }t| |}| tkrt	j
t	|t	|f }|d d ddf  d9  < |j||d
}dd t|D }	ttdd ||	d d d  W 5 Q R X ||	}
|
d k	stt|
t	js,t|
jtks<ttdd |
D sTtt|trp|d jd }n
|jd }t|
|kstd| dt|
 d S )Nr   r   rR   r|  r   r	   r   r   r  r  c                 S   s   g | ]}d | qS )Zfeaturerq   r  rq   rq   rr   r     s     z;check_transformer_get_feature_names_out.<locals>.<listcomp>z'input_features should have length equalr  c                 s   s   | ]}t |tV  qd S r  )r   r   )r   ro   rq   rq   rr   r    s     z:check_transformer_get_feature_names_out.<locals>.<genexpr>	Expected  feature names, got )r  rG   rD   r,  r"   rm  ro  r   rd   r   r  rM  r  r   r   r9  r^  r   r  rQ  r  rx  r  r  )ro   r  rp   r   r   r   r*  r  X_transformZinput_featuresZfeature_names_outn_features_outrq   rq   rr   'check_transformer_get_feature_names_out  sF    





r  c              	   C   s  zdd l }W n tk
r(   tdY nX | }d|d ksF|d rJd S tddddgdddggddd	d
\}}t |}t|}t||}|j	d }t
| |}| tkrtjt|t|f }|d d ddf  d9  < dd t|D }	|j||	d}
|j|
|d}dd t|D }ttdd || W 5 Q R X | }||	}t|| t|trz|d j	d }n
|j	d }t||kstd| dt| d S )Nr   r  r   r   rR   r|  r	   r   r   r  c                 S   s   g | ]}d | qS rb  rq   r  rq   rq   rr   r     s     zBcheck_transformer_get_feature_names_out_pandas.<locals>.<listcomp>r  r  c                 S   s   g | ]}d | qS )badrq   r  rq   rq   rr   r     s     z0input_features is not equal to feature_names_in_r  r  r  )rs  rw  r   r  rG   rD   r,  r"   rm  ro  r   rd   r   r  rM  r  ru  r   r   r9  r   r   r  r  r^  )ro   r  rx  rp   r   r   r   r*  r  feature_names_indfr  Zinvalid_feature_namesZfeature_names_out_defaultZfeature_names_in_explicit_namesr  rq   rq   rr   .check_transformer_get_feature_names_out_pandas  sV    






r  c                 C   sH  t jd}|jdd}|jdddd}t||}|jdd }|r|j }t	|t	| }t	|t	| }d|  d	| d
| }	||kst
|	tddi  }
ddddg}|D ]}|j| }|dkrqd| d|  d}|  d| d}	t|}|jf ||
i |D ]l}t||s qtt||	dB tdd t|ddD r\t||| nt|||| W 5 Q R X qdd |D }|D ]}zt||}W n tk
r   Y qY nX |jf ||i |D ]l}t||sqtt||	dB tdd t|ddD r t||| nt|||| W 5 Q R X qАqqd S )Nr   r  r   r   r'  Frz  z>Mismatch between _parameter_constraints and the parameters of z%.
Consider the unexpected parameters z% and expected but missing parameters ZBadTyperq   r   r  r,  r   rR   zThe 'z' parameter of z must be .* Got .* instead.z@ does not raise an informative error message when the parameter z% does not have a valid type or value.r   c                 s   s"   | ]}t |to|d V  qdS r  N)r   r   r   r   ZX_typerq   rq   rr   r  1  s   z)check_param_validation.<locals>.<genexpr>r   r   c                 S   s   g | ]}t |qS rq   r;   )r   r)  rq   rq   rr   r   =  s     z*check_param_validation.<locals>.<listcomp>c                 s   s   | ]}| d V  qdS r  )r   r  rq   rq   rr   r  M  s   )r   r   r   rl  r  r   r   r   r"  r`  r^  r  r"   rH  ri   r   r>   r  rA   r  r=   r  )ro   r   r   r   r   Zestimator_paramsZvalidation_paramsZunexpected_paramsZmissing_paramsr   Zparam_with_bad_typeZfit_methodsrZ  constraintsr   rn   r  r)  Z	bad_valuerq   rq   rr   check_param_validation  s`    







r  c                    s   |  }d|d ks|d r d S tjd}t|}|jdd t|  |jddddt|t	|  fd	d
} fdd}||g}|D ]R}t|}||}	t
kr|	d }	|jdd ||}
t
kr|
d }
t|	|
 qd S )Nr   r   rR   r   r  r   r   r'  c                    s.   t kr|   S |   S r  )rd   r   r   r  r   ro   r   rq   rr   fit_then_transformg  s    z6check_set_output_transform.<locals>.fit_then_transformc                    s   |   S r  )r,  r  r-  rq   rr   r,  l  s    z1check_set_output_transform.<locals>.fit_transformro  r   )r  r   r   r   r"   rl  rm  r  r   r   rd   
set_outputr   )ro   r  rp   r   r   r  r,  Ztransform_methodsZtransform_methodZX_trans_no_settingZX_trans_defaultrq   r  rr   check_set_output_transformW  s.    

r  c                 C   s   i }d||fd||fd||fd||fg}|D ]J\}}}	|  || |tkr\| |	|\}
}n
| |	}
|
|  f||< q,d|fd|fg}|D ]>\}}|tkr| ||\}
}n| ||}
|
|  f||< q|S )zGenerate output to test `set_output` for different configuration:

    - calling either `fit.transform` or `fit_transform`;
    - passing either a dataframe or a numpy array to fit;
    - passing either a dataframe or a numpy array to transform.
    zfit.transform/df/dfzfit.transform/df/arrayzfit.transform/array/dfzfit.transform/array/arrayzfit_transform/dfzfit_transform/array)r   rd   r   r9  r,  )r   ro   r   r  r   outputsZcasescaseZdata_fitZdata_transformX_transr  rN  rq   rq   rr   _output_from_fit_transform  s2    

r  c              
   C   s   dd l }|\}}|\}}t||js(t|j||d}	z|j||	 W n< tk
r }
 zt|  d| d|
 |
W 5 d }
~
X Y nX d S )Nr   r  z, does not generate a valid dataframe in the z] case. The generated dataframe is not equal to the expected dataframe. The error message is: )rs  r   ru  r^  ZtestingZassert_frame_equal)ro   r  outputs_defaultoutputs_pandasrx  r  Zfeature_names_defaultZdf_transZfeature_names_pandasZexpected_dataframer  rq   rq   rr   _check_generated_dataframe  s    r  c              
   C   sh  zdd l }W n tk
r(   tdY nX | }d|d ksF|d rJd S tjd}t|}|jdd}t	||}|j
ddd	d}t||}t| d
d t|jd D }|j||d}	t|jdd}
t|
| ||	|}t|jdd}zt|| ||	|}W n@ tk
r@ } z t|dks*t|W Y d S d }~X Y nX |D ]}t| ||| ||  qFd S )Nr   r  r   r   rR   r  r   r   r'  c                 S   s   g | ]}d | qS r  rq   r  rq   rq   rr   r     s     z5check_set_output_transform_pandas.<locals>.<listcomp>r	   r  ro  r  rs  +Pandas output does not support sparse data.)rs  rw  r   r  r   r   r   r"   rl  rm  r  r   r   r  ro  ru  r  r  r   r   r^  r  ro   r  rx  rp   r   r   r   r   r  r  Ztransformer_defaultr  Ztransformer_pandasr  r  r  rq   rq   rr   !check_set_output_transform_pandas  sB    


   r  c              
   C   sv  zddl }W n tk
r(   tdY nX | }d|d ksF|d rJdS tjd}t|}|jdd}t	||}|j
dd	d
d}t||}t| dd t|jd D }|j||d}	t|jdd}
t|
| ||	|}t|}z*tdd t|| ||	|}W 5 Q R X W n@ tk
rN } z t|dks8t|W Y dS d}~X Y nX |D ]}t| ||| ||  qTdS )z`Check that setting globally the output of a transformer to pandas lead to the
    right results.r   Nr  r   r   rR   r  r   r   r'  c                 S   s   g | ]}d | qS r  rq   r  rq   rq   rr   r     s     z8check_global_ouptut_transform_pandas.<locals>.<listcomp>r	   r  ro  r  rs  )Ztransform_outputr  )rs  rw  r   r  r   r   r   r"   rl  rm  r  r   r   r  ro  ru  r  r  r   r   r   r^  r  r  rq   rq   rr   $check_global_ouptut_transform_pandas  sP    


       r  )NFr   )rM   )F)F)Fr  )T)F)rS  r   r  r   r_  r   	functoolsr   r   inspectr   Znumbersr   Znumpyr   Zscipyr   Zscipy.statsr   rW  r   r
   r   Z_param_validationr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zlinear_modelr   r   r   r    r!   baser"   r#   r$   r%   r&   r'   Zmetricsr(   r)   r*   Zrandom_projectionr+   Zfeature_selectionr,   r-   r  r.   
exceptionsr/   r0   r1   Zmodel_selectionr2   r3   Zmodel_selection._validationr4   Zmetrics.pairwiser5   r6   r7   Zutils.fixesr8   r9   Zutils.validationr:   Zutils._param_validationr<   r=   r>   r?   Z_tagsr@   rA   Z
validationrB   rC   ZpreprocessingrD   rE   ZdatasetsrF   rG   rH   rI   r+  rd   rs   r   r"  r   r   r   r   r   r   r   r  r  r  r
  r  r$  r.  rK  rL  rY  re  rk   rZ   r[   r\   r]   r_   r^   r  rb   ra   r   r  r   r   r  r   r   r   r   r   r   r   r   r  re   rY   rX   r   rc   rf   rg   rl   r   r   r   r   r   r|   r}   r   r  r   r   r   r   r   r   r:  r`   r   r   rC  rF  r~   r   r  r   r   r   rR  rV  rh   rW   rj   r{   r   rg  r   r   rm  r   r   r   r   r   r   r   r   r   r   r   r   r  rm   r  r  r  r  r  r  r  r  r  rq   rq   rq   rr   <module>   s   	4$
"9&,>]u!6
+


$D(
!
'
:

%
+
(



\
 

 

0

2

<
;


$   H
(
,
S
-


#
@
"
 2

-

(
!
#
"


.b
*



8

-+
:'D 09Y++)