U
    9%eNt                    @   sR  d dl Z 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mZ d dlZd dlZd dlmZ d dlmZ dd	lmZ dd
lmZmZmZmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ ddlAmBZBmCZC ddlDmEZE ddlFmGZGmHZH ddlFmIZJ ddlKmLZLmMZMmNZN ddlOmPZPmQZQ ddlRmSZS ddlmTZTmUZUmVZV ddlWmXZX ddlYmZZZm[Z[ ddl\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZh dd limjZjmkZk dald!d"d#d$gZmd%d& Znd'd( Zoefepd)d*d+ Zqd,d- Zrd.d/ Zsd0d1 Ztd2d3 Zud4d5 Zvd6d7 Zwd8d9 Zxd:d; Zyd<d= Zzd>d? Z{d@dA Z|ddCdDZ}dEdF Z~dGdH ZG dIdJ dJZdKdL ZdMdN ZddOdPdQdRZdSdT Zefepd)dUdV Zefepd)dWdX Zefepd)dYdZ Zefepd)d[d\ Zefepd)dd^d_Zd`da Zefepefd)dbdc Zddde Zefdfdg Zdhdi Zefepd)djdk Zefepd)dldm Zdndo Zefepd)dpdq Zefepd)drds Zefdtdu Zefdvdw Zefdxdy Zefepd)ddzd{Zefepd)d|d} Zefepd)d~d Zefepd)dd Zdd Zefdd Zefdd Zefdd Zdd Zefepd)dd Zefepd)dd Zefdd ZefdddZefepd)dd Zefepd)dd Zefepd)dd Zefepd)dddZefepd)dd Zefepd)dd Zefepd)dd ZefdddZdd ZdddZdd Zefepd)dd Zefepd)dd Zefepd)dd Zefepd)dd Zefepd)dd Zefepd)dddZefdd Zefepd)dd Zefdd Zdd Zdd Zefepd)dd Zefepd)dBejfddĄZefddƄ Zefepd)ddȄ Zefepd)ddʄ Zefepd)dd̄ Zefepd)dd΄ Zefepd)ddЄ Zefepd)dd҄ Zefepd)ddԄ Zefepd)ddք Zefepd)dd؄ Zddڄ Zdd܄ Ze7fddބZefepd)dd Zefepd)dd Zefepd)dd Zefepd)dd Zefepd)dd Zefepd)dd Zdd Zdd Zdd Zdd Zdd Zdd Zefepd)dd Zdd Zdd Zdd Zd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)IntegralReal)sparse)rankdata   )config_context)ClusterMixinRegressorMixincloneis_classifieris_outlier_detectoris_regressor)	load_iris
make_blobsmake_classificationmake_multilabel_classificationmake_regression)DataConversionWarningNotFittedErrorSkipTestWarning)SelectFromModelSelectKBest)LinearRegressionLogisticRegressionRANSACRegressorRidgeSGDRegressor)accuracy_scoreadjusted_rand_scoref1_score)linear_kernelpairwise_distances
rbf_kernel)ShuffleSplittrain_test_split)_safe_split)make_pipeline)StandardScalerscale)BaseRandomProjection)_convert_to_numpyget_namespacedevice)InvalidParameterErrorgenerate_invalid_param_valmake_constraint)parse_version
sp_version)check_is_fitted   )IS_PYPYis_scalar_nanshuffle)Interval)_DEFAULT_TAGS
_safe_tags)SkipTest	_get_argsassert_allcloseassert_allclose_dense_sparseassert_array_almost_equalassert_array_equalassert_array_lessassert_raise_messagecreate_memmap_backed_dataignore_warningsraisesset_random_state)_num_sampleshas_fit_parameterZPLSCanonicalZPLSRegressionCCAZPLSSVDc                 c   sb  | 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tddV  tV  |d r^dD ]J}|dkrLtddD ]\}}tt|||dV  q,ntt|dV  qd S )Nsample_weightpairwiseones)kindzerosTreadonly_memmapno_validation	allow_nansparsifyZarray_api_support)znumpy.array_apicupy.array_apicupytorchrZ   )cpucuda)float64float32)array_namespacedtyper1   )r_   )	__class____name__r>   check_no_attributes_set_in_initcheck_estimators_dtypescheck_fit_score_takes_yrL   "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	itertoolsproductcheck_array_api_input)	estimatornametagsr_   r1   r`    r   ]/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sklearn/utils/estimator_checks.py_yield_checksS   s^    



 r   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multioutputTrS   r^   rT   X_dtypeZ
multilabelrU   multioutput_onlyrequires_fitclass_weight)r>   "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)
classifierr   r   r   r   _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isinfrI   
ValueErrorfit)
r~   estimator_origr}   rngXvalueymodule_namer   r   r   r   r   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 )
NTrS   r^   r   r   rU   r   rM   r   )r>   check_regressors_trainr   !check_regressor_data_not_an_arrayr   check_regressor_multioutput%check_regressors_no_decision_functionr   r   ra   rb   check_regressors_intr   r   )	regressorr   r~   r   r   r   _yield_regressor_checks   s$    r   c                 c   s|   t | }|d stV  tV  |d r*tV  ttddV  t | ddsLtV  ntV  ddd	d
ddg}| jj}||krxt	V  d S )NrU   preserves_dtypeTrS   	statelesskeyZIsomapZ	KernelPCAZLocallyLinearEmbeddingRandomizedLassoLogisticRegressionCVZBisectingKMeans)
r>   #check_transformer_data_not_an_arraycheck_transformer_general!check_transformer_preserve_dtypesr   check_transformers_unfitted%check_transformers_unfitted_statelessra   rb   check_transformer_n_iter)transformerr   Zexternal_solverr~   r   r   r   _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FeatureAgglomerationTrS   	transform)&check_clusterer_compute_labels_predictra   rb   check_clusteringr   r   ru   r   )	clustererr~   r   r   r   _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predictTrS   r   r   )	ru   check_outlier_contaminationcheck_outliers_fit_predictcheck_outliers_trainr   r   r>   r   r   )r}   r   r   r   _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_deterministicrU   Z
requires_yrequires_positive_X)#ra   rb   r>   warningswarnformatr   r   r   r   r   r   ru   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)r}   r~   r   checkr   r   r   _yield_all_checks8  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vr   r   r   
<listcomp>  s     z,_get_check_estimator_ids.<locals>.<listcomp>z{}({})r   T)Zprint_changed_onlyz\s N)callabler   r   rb   keywordsfuncjoinitemsr   ru   r   resubstr)objZkwstringr   r   r   _get_check_estimator_idsq  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_parametersr}   Zbase_estimatorr   random_stater8   )C
estimatorsZest1皙?alphaZest2)r  zCan't instantiate estimator z parameters )getattrlen
issubclassr   r   r   r   r   r    r   rb   r   r   r   r?   )	EstimatorZrequired_parametersr}   msgr   r   r   _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)r}   r   pytestZshould_be_markedr  r   r   r   _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?   ra   rb   )argskwargs
check_namer}   r  r   r   wrapped  s    z_maybe_skip.<locals>.wrapped)r  r   r   r  rb   r   )r}   r   Zshould_be_skippedr"  r   r   r   _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  rb   r>   )r}   r   r!  Zxfail_checksr   r   r   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   estr   r   r   	<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%  rb   r   r   r  )r}   r~   r   r  r  r   r   checks_generator'  s
    

z1parametrize_with_checks.<locals>.checks_generatorzestimator, check)Zids)r  any	TypeErrorr  Zparametrizer	  )r  r  r*  r   r)  r   parametrize_with_checks  s    (  r-  Fc                    s   t  trd}t|t j fdd}|r8| S | D ]H\ }z|  W q> tk
r } ztt|t W 5 d}~X Y q>X q>d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.estimator_checks.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

    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.
    r(  c                  3   s,   t  D ]} t | }  t| fV  qd S r$  )r   r#  r   )r   r}   r~   r   r   r*  l  s    
z)check_estimator.<locals>.checks_generatorN)	r   r%  r,  rb   r?   r   r   r  r   )r}   Zgenerate_onlyr  r*  r   	exceptionr   r.  r   check_estimator3  s    /

r0  c                  C   s8   t d kr4tddddddd\} }t | } | |fa t S )N   r   r8         @   *   )	n_samples
n_featuresZn_informativeZbiasnoiser  )REGRESSION_DATASETr   r+   fit_transformr   r   r   r   r   _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 |dkr| jd
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rD| jdd d|krf|d sf| jdd! |d"kr|| jd#d$ |d%krd&| _|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&d0 |d1kr:| jdd2 |d3krP| jd4d5 d6d7g}||krzt	| d8rz| jd9d: t	| d;r| jd9d< |d=kr| jd>d? |d@krttdAkrdBndC}| j|dD |tkr| jd&d/ |dEkr | jdFdG |dHkr| jd&dI d S )JNTSNEr
   Z
perplexityn_iterr   r>  max_iterr@  )Z	LinearSVR	LinearSVCr3  ZNMFi  ZDictionaryLearningZ
lasso_lars)r@  Ztransform_algorithmZMiniBatchNMFT)r@  Zfresh_restarts)ZMLPClassifierZMLPRegressord   ZMiniBatchDictionaryLearningn_resampling)rD  n_estimators)rE  
max_trialsr   )rF  n_init)rG  
batch_sizeZMLP)rH  Z	MeanShift      ?)	bandwidthZTruncatedSVDr8   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   rO  n_splits)rR  ZOneHotEncoderignore)Zhandle_unknownZQuantileRegressorz1.6.0Zhighszinterior-point)solverZSpectralEmbeddinggh㈵>)Z	eigen_tolZHDBSCANZmin_samples)r   ra   rb   
set_paramsr@  minrE  r   rN  ru   rK  rL  Zmax_subpopulationr   r-   r   r6   r5   rp   )r}   paramsr~   Zloo_cvrT  r   r   r   _set_checking_parameters  s    















rY  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)selfr\  r   r   r   __init__  s    z_NotAnArray.__init__Nc                 C   s   | j S r$  )r\  )r]  r`   r   r   r   	__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 {}!)rb   r,  r   )r]  r  typesr  r  r   r   r   __array_function__  s    
z_NotAnArray.__array_function__)N)rb   r   __qualname____doc__r^  r_  ra  r   r   r   r   rZ    s   
rZ  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)r}   rd  r   r   r   _is_pairwise_metric  s    rf  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coori  int64Zcoo_64)rh  rg  Z_64N)	r   AssertionErrorcopyZasformatrowastypecolindicesZindptr)X_csrZsparse_formatZX_coor   r   r   r   _generate_sparse_matrix/  s    


rr  r]   )r1   r`   c             
   C   s  zt |}W n" tk
r0   t| dY nX zddl}W n tk
rZ   tdY nX ||d}|dkr|dkr|jstdn(|d	krddl	}|j
j dkrtd
tdd\}	}
|	j|dd}	t||	}	t||
}
t|}|j|	|d}|j|
|d}||	|
 dd t| D }t|}tdd ||| W 5 Q R X | D ]\}}t||}t|d t|d kstd| dt|t|kstt||d}t||| dt|	jjd d q\d}|D ]}t||d}|dkrq||	}tdd t|||}W 5 Q R X t|d t|d ks^td| dt|t|ksttt||d}t||| dt|	jjd d qdS )zBCheck that the array_api Array gives the same results as ndarrays.z/ is not installed: not checking array_api inputr   Nz?array_api_compat is not installed: not checking array_api inputr8   rZ   r\   z2PyTorch test requires cuda, which is not available>   rX   rY   z/CuPy test requires cuda, which is not availabler4  r  Frl  r0   c                 S   s"   i | ]\}}t |tjr||qS r   )r   r   ndarrayr   r   r   r   r   r   
<dictcomp>|  s      z)check_array_api_input.<locals>.<dictcomp>T)Zarray_api_dispatch'z!' attribute is in wrong namespace)xpz not the samerC  r   atol)decision_functionr   predict_log_probapredict_probar   Zinverse_transformz' output is in wrong namespacez# did not the return the same result)	importlibimport_moduleModuleNotFoundErrorr?   array_api_compatImportErrorr/   r[  Zhas_cudarY   r\   ZruntimeZgetDeviceCountr   rn  _enforce_estimator_tags_Xr   r   r   varsr  r   r  rk  array_devicer.   rA   r   finfor`   eps)r~   r   r_   r1   r`   Z	array_modr  rx  rY   r   r   r&  ZX_xpZy_xpZarray_attributesZest_xpr   	attributeZest_xp_paramZest_xp_param_npmethodsmethod_namemethodresultZ	result_xpZresult_xp_npr   r   r   r|   P  s    








	

r|   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   )(   rP  r   g?   r  r   )ZScalerr+   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   r   r8   r}  binary_onlyr
   )r   r   r   uniformr  r   Z
csr_matrixrn  intrH   FutureWarningr   r   r>   rr  rV  rI   r,  r   r   ru   r   shaperk  r}  )r~   r   r   r   rq  r   r}   r   Zmatrix_formatr   predZprobsZexpected_probs_shaper   r   r   rw     sN    







rw   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}|jt||dd}|ddddddddddddg}|dgd }t|d	d
r|j|dd}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   r8   r
   rP  r  Frs     r   r   rN   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	DataFramer  Seriesr>   r   r   r   r  r?   )r~   r   r}   pdr   r   weightsr   r   r   rf     sF    "rf   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 )
Nr8   r
   rP  r  r  r   r   r  )	r   r   r  rZ  r  r>   r\  reshaper   )r~   r   r}   r   r   r  r   r   r   rg     s,     rg   c                 C   sd   t |}tjd}d}t||j|dfd}t|d }t||}dg| }|j|||d d S )Nr      rP  r   r  )	r   r   r   r   r  r  aranger   r   )r~   r   r}   rndr5  r   r   rN   r   r   r   rh   8  s    

rh   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 )Nr8   rP  r
   r  r  )	r   r   r  r   r   rP   r  rI   r   )r~   r   r}   r   r   r   r   r   ri   G  s6    *

(
ri   rP   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  r8   rP  r
   r  r`   rP   )r  zFor z; sample_weight=None is not equivalent to sample_weight=onesrR   z?, a zero sample_weight is not equivalent to removing the sample)r   rN   )r   r}  r{  r   r   )r   rJ   r   r  r]   r  rP   r  vstackZhstackr;   r   r   r   ru   r  rB   )r~   r   rQ   Z
estimator1Z
estimator2ZX1y1ZX2y2Zsw2r   r  X_pred1X_pred2r   r   r   rk   l  sb    .




rk   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  r8   rP  r
   r  r  g      $@r  z8 overwrote the original `sample_weight` given during fitr  )r   rJ   r   r  r]   r  r   rP   r  rl  r   rA   )r~   r   r}   r   r   Zsample_weight_originalZsample_weight_fitr   r   r   r   rj     s<    .

rj   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   )r  r   r   r  r   r   zUnknown label typeTr   r  stringr   Zfoobarr   r   z#argument must be .* string.* numberr   )r   r   r   r  r  rn  objectr>   r  r   r   r   ru   r   r   rI   	Exceptionr,  )r~   r   r   r   r   r   r}   r  r   r   r   rn     s(    





rn   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 )Nr4  r   r   y              ?r  r8   r   r
   lowhighr   r  zComplex data not supportedr  )r   r   r   r  r  randintr   rJ   rI   r   r   )r~   r   r   r   r   r}   r   r   r   rm     s    rm   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   rP  r3  rP  r   r
   rN  r8   rK  rL  r   r   r{  r}  z$Estimator changes __dict__ during %s)r   r   r   r  r  rn  r  r   r   ru   rN  rK  rL  rJ   r   __dict__rl  r  rk  )r~   r   r  r   r   r}   r  Zdict_beforer   r   r   r     s2    







r   c                 C   s   |  dp| d S )N_)r   r   )attrr   r   r   _is_public_parameter4  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   rP  r  r   rN  r8   rK  c                 S   s   g | ]}t |r|qS r   )r  r   r   r   r   r   r   P  s     z3check_dont_overwrite_parameters.<locals>.<listcomp>c                    s   g | ]}|   kr|qS r   )r   r  )dict_before_fitr   r   r   T  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 r   r   r  Zdict_after_fitr  r   r   r   c  s   zEstimator changes public attribute(s) during the fit method. Estimators are only allowed to change attributes started or ended with _, but %s changed)ru   r^  r   r   r   r   r  r  rn  r  r   rN  rK  rJ   r  rl  r   r   rk  r  )	r~   r   r}   r  r   r   Zpublic_keys_after_fitZattrs_added_by_fitZattrs_changed_by_fitr   r  r   r   8  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   rP  r  r   rN  r8   rK  r  zReshape your data)r   r   r   r  r  rn  r  r   r   ru   rN  rK  rJ   r   rF   r   r  )r~   r   r  r   r   r}   r  r   r   r   r   s  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 )Nr8   c                    s   g | ]} | d qS )r8   )r  )r   batchr  r6  r   r   r     s     z%_apply_on_subsets.<locals>.<listcomp>r   c                 S   s   | d S )Nr   r   )xr   r   r   <lambda>      z#_apply_on_subsets.<locals>.<lambda>c                 S   s   g | ]}|  qS r   )Ztoarray)r   r  r   r   r   r     s     )
r  r%  tuplelistmapr   issparseAr   ravel)r  r   result_fullresult_by_batchr   r  r   _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   rP  r  r   rN  r8   rK  r   r   r{  score_samplesr}  z={method} of {name} is not invariant when applied to a subset.r  r~   Hz>rz  r   )r   r   r   r  r  rn  r  r   r   ru   rN  rK  rJ   r   r   r  r  rA   )
r~   r   r  r   r   r}   r  r  r  r  r   r   r   r     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   rP  r  r   r  r   r8   r
   rN  rK  r  zY{method} of {name} is not invariant when applied to a datasetwith different sample order.r  &.>r  )r   r   r   r  r  rn  rj  r>   r   r   ru   rN  rK  rJ   r   Zpermutationr  r   rB   r  )	r~   r   r  r   r   r}   idxr  r  r   r   r   r     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   rP  )r8   r   r   rN  r8   rK  ZOPTICSrI  rU  r<  rM  r=  z1 samplezn_samples = 1zn_samples=1z
one samplez1 classz	one classTr  )r   r   r   r  r  rn  r  r   r   ru   rN  rK  rJ   rV  rI   r   r   r~   r   r  r   r   r}   Zmsgsr   r   r   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   rP  )r   r8   r   rN  r8   rK  ZRandomizedLogisticRegressionr   rM  z1 feature\(s\)zn_features = 1zn_features=1Tr  )r   r   r   r  r  rn  r  r   r   ru   rN  rK  Zsample_fractionZresidual_thresholdrJ   rI   r   r   r  r   r   r   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   rP  r3  r   rN  r8   rK  )r   r   r   r  rn  r  r   r   ru   rN  rK  rJ   rI   r   r   )r~   r   r  r   r   r}   r   r   r   r   7  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   r8   r
   r  r5  centersr  r6  cluster_std)r   r+   r9  r  rG   _check_transformer)r~   r   rT   r   r   r   r   r   r   J  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  )	r   r+   r9  r  rZ  r   r[  r  tolist)r~   r   r   r   Zthis_XZthis_yr   r   r   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   rI   AttributeErrorr   r   )r~   r   r   r   r   r   r   r   n  s    

	r   c                 C   sP   t jd}|jdd}t||}t|}||}|jd |jd ksLtdS )ztCheck that using transform without prior fitting
    doesn't raise a NotFittedError for stateless transformers.
    r   r3  r   r   N)	r   r   r   r  r  r   r   r  rk  )r~   r   r   r   X_transr   r   r   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
   r8   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 %sry  r  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  r  )r   r[  r  r   rJ   rp   c_r   rZ  r   r9  r  rk  ru   r   r>   r?   ziprB   rK   ndimrI   r   )r~   transformer_origr   r   r5  r6  r   y_Ztransformer_cloneZX_predZx_predr  ZX_pred3r  Zx_pred2Zx_pred3r   r   r   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   r8   r
   r  r  kernelscorer9  )r>   r?   r   r  r&   r   r   rJ   r*   r   r  rB   )r~   r   r  r   r   r}   pipelinefuncs	func_namer  Zfunc_pipeliner  Zresult_piper   r   r   rq     s2    




rq   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  rP  r   r   r  partial_fitr   r9  c                 S   s   g | ]
}|j qS r   )r~   r   pr   r   r   r     s     z+check_fit_score_takes_y.<locals>.<listcomp>r]  r8   )r   YzJExpected y or Y as second argument for method %s of %s. Got arguments: %r.)r   r   r   r  r  r  r   r   rJ   r  r   
parametersvaluesrk  r%  rb   )r~   r   r  r5  r   r   r}   r  r  r  r  r   r   r   re   
  s*    


re   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   rP  r  r   r   r   r{  r}  r8   )r   r   r   r  rn  r^   r  r]   rj  int32r   r   rJ   r   ru   r  )r~   r   r  Z
X_train_32Z
X_train_64ZX_train_int_64ZX_train_int_32r   r  X_trainr}   r  r   r   r   rd   (  s     



rd   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   r8   r  )r5  r  r  r  r   r   r9  r   z	 (method=z3) does not preserve dtype. Original/Expected dtype=z, got dtype=.)r   r+   r9  r  r>   rn  r   rJ   r   r   r  r   r  r`   rk  rb   )r~   r  r   r   r`   ZX_castr   ZX_trans1ZX_trans2ZXtr  r   r   r   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 )
Nr8   r   rP  The estimator zc does not raise a ValueError when an empty data is used to train. Perhaps use check_array in train.r  r  zG0 feature\(s\) \(shape=\(\d*, 0\)\) while a minimum of \d* is required.r  )
r   rJ   r   emptyr  rI   r   r   r   r  )r~   r   eZX_zero_samplesr   ZX_zero_featuresr   r  r   r   r   ro   _  s    

(ro   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   rP  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   r8   r   NaNr   r   r   )r   r   r   r  r  r   r   rP   r   rH   r  r   rJ   rI   r   r   ru   r   r   )r~   r   r  ZX_train_finiteZX_train_nanZX_train_infr   error_string_fiterror_string_predictZerror_string_transformr  r}   r   r   r   rr   w  sJ     






rr   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.r3  r   )r5  r6  zThe pairwise estimator z+ does not raise an error on non-square datar  N)r   r   rI   r   r   r~   r   r   r   r}   r   r   r   rs     s    
rs   c                 C   sL  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|	 |	|| |rt|	}
nBt|	}|	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{  r}  r  r   r8   r
   r  r  r  rV   r4  r   F)replacer  r   r   r   s   versionN)r   r  r&   r>   r   r   r   choicer   r   r  r   r   rJ   r   rG   pickledumpsr   r   r   rk  loadsdictru   r  rB   )r~   r   rT   check_methodsr   r   r   r   maskr}   Zunpickled_estimatorZpickled_estimatorr   r  r  Zunpickled_resultr   r   r   rx     sH    






rx   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   r8   r5  r  classesr  zZ does not raise an error when the number of features changes between calls to partial_fit.r  r  )ru   r   r   r  r   r   r   uniquer  NotImplementedErrorrI   r   )r~   r   r}   r   r   r
  r   r   r   r     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)r4  r   rP  r4  )r  r5  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   r}  
poor_scorer
   zTThe shape of the probability for multioutput data is incorrect. Expected {}, got {}.r8   Zaxis)r>   r   r   r   r   r  rk  r   r`   rQ   ru   r{  r   r   rt  rn  r  classes_rD   r}  r  rangeargmaxroundr	   )r~   r}   r5  r  r  r   r   r   y_preddecisiondec_preddec_expy_probr  Zy_probaZ
y_decisionr   r   r   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   r8   r4  r   )r  	n_targetsr5  r6  r]   zbMultioutput predictions by a regressor are expected to be floating-point precision. Got {} insteadr  )r   rf  r   r  r   r   r`   r   rk  r   r  )r~   r}   r5  r6  r   r   r  r   r   r   r   H  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  r8   r     r  rP  )r   r
   r  rK  )rK  ZAffinityPropagationi)Z
preferencerC  rA  g?r   r   Trecordr  rj  r   r  )r   r  )r   r   r;   r+   r9  r   r   r   Zconcatenater  rG   r  ru   rV  rJ   r   r  Zlabels_rk  r"   r>   r   catch_warningsr   rD   r`   r  r  r  )r~   clusterer_origrT   r   r   r   r   ZX_noiser5  r6  r  pred2labelsZlabels_sortedrK  r   r   r   r   b  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.r3  r   r  compute_labelsF)r%  N)r   r   rJ   ru   r   r   rV  rD   )r~   r"  r   r   r   r  r  r   r   r   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   classTr  r  )r   r   r   r  rP   rH   r  r   rI   r   r   raised_and_matchedrD   r   )
r~   classifier_origr  r  r  r  X_testr   r   cmr   r   r   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
   rN   z\bclass(es)?\bz\bsample_weight\bNTr  r  r  )r   r   r   r  r  rl  r   rL   rk  r   r,  rI   r   r'  rD   r   rP   )r~   r(  Z	error_fitZerror_predictr  r  r)  r   rN   r   r   Zerr_typer   r*  r   r   r   r     s.    

  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CategoricalNBr  rU   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  r  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.rO   r   r8   r{  r   r  r}  r|     r  )rz  )*r   rn  r;   r+   r9  rW  rG   r>   appendr   r  r  r  r   r  r   rJ   rI   r   r   r  ru   rk  r   r!   r   r  Tr{  r  r  rD   r  r  r}  rC   sumrP   r|  rA   logargsort)r~   r(  rT   r   ZX_mZy_mZy_bZX_bproblemsr   r   r   r
  r  r5  r6  r   r  Zmsg_pairwiser  r  r  r  Z
y_log_probr   r   r   r     s    







	



















r   c                 C   sV   | |k r| }|d }n|}| d }t |}d}tt ||| dksRt|d S )Nr8   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  rk  )num_outliersexpected_outliersr  startendZsorted_decisionr  r   r   r   check_outlier_corruptiont	  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  r  r8   floatr   Znoveltyr  r   )r   r;   rG   r  r   rJ   r   r  r   rk  r`   rQ   rD   r   r  r  r{  r  rI   r   r2  rn  r  Zoffset_rA   ru   rV  r3  r<  )r~   r   rT   r5  r   r  r6  r}   r  r  Zscoresoutputr  Zy_decr9  r   r8  r   r   r   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 r   )r   r<   )r   cr   r   r   r   	  s     z/check_outlier_contamination.<locals>.<listcomp>zDcontamination constraints should contain a Real Interval constraint.        rM  r   >   neitherrightz:contamination constraint should be an interval in (0, 0.5])ru   r@  r+  rk  r   r<   r%  r   leftrD  closed)r~   r   Zcontamination_constraints
constraintr   r   r   r   	  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 )
NrC  r
   r   rP  r  Tr   r5  r6  r  r  lengthZallow_unlabeledr  P   )r   r,   r  r  r   rJ   r   r   rD   r`   rk  r%  )r~   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_arraysr   r   r   r   	  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.rC     r   r
   rP  r  Tr   rH  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   rJ   r   r,   r   r  r?   r   r   rt  rk  r%  r  r`   )r~   r(  r   r5  	test_size	n_outputsr   r   r  r)  rK  y_testresponse_method_nameZpredict_methodr  r   r   r   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.rL  r
   rP  r  Tr   rH  Nr}  rN  rO  zWhen zn.predict_proba returns a list, the list should be of length n_outputs and contain NumPy arrays. Got length of rQ  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 rP  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).r8   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   rJ   r   r,   r   r  r?   r   r  r  rk  r  r`   rQ   rA   r3  r   rt  rE   r   r%  )r~   r(  r   r5  rR  rS  r   r   r  r)  rK  rU  Zpredict_proba_methodr  r  r   r   r   r   r   C
  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.rL  r
   rP  r  Tr   rH  Nr{  rN  rO  z<.decision_function is expected to output a NumPy array. Got rP  z].decision_function is expected to provide a NumPy array of shape (n_samples, n_outputs). Got rQ  r  rV  z?.decision_function is expected to output a floating dtype. Got )r   rJ   r   r,   r   r  r?   r   r   rt  rk  r%  r  r`   rQ   )r~   r(  r   r5  rR  rS  r   r   r  r)  rK  rU  Zdecision_function_methodr  r   r   r   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   rI   r   get_feature_names_out)r~   r   r}   r   r   r   r   !check_get_feature_names_out_error
  s
    
rX  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  r5  N)r   r  r   r   rG   rJ   r   rk  )r~   r   rT   r   r   r}   r   r   r   rl   
  s    

rl   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   r}  r|  N)r;  r   ru   rI   r   r  )r~   r   r   r   r}   r  r   r   r   r   
  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  rP  r   Tr  alwaysrS  z)expected 1 DataConversionWarning, got: %sr  c                 S   s   g | ]}t |qS r   r  )r   Zw_xr   r   r   r     s     z)check_supervised_y_2d.<locals>.<listcomp>r   zPDataConversionWarning('A column-vector y was passed when a 1d array was expected)r>   r   r   r   r  r  r  r   r   rJ   r   r   r   r!  simplefilterr   RuntimeWarningZnewaxisr  r  rk  rA   r  )r~   r   r   r  r5  r   r   r}   r  wZ	y_pred_2dr  r   r   r   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ovrr8   r  r-  z=Unexpected classes_ attribute for %r: expected '%s', got '%s')r   r  r   meanrJ   r   r   ru   r{  r   rt  rk  r  r  rn  r  r  rD   r  r  r  r  r  )r   r   r~   r(  r
  r   r  r  r  r  Z
decision_yZy_expr   r   r   check_classifiers_predictions  s`    





ra  c                 C   s   | dkr|S |S )N)ZLabelPropagationZLabelSpreadingSelfTrainingClassifierr   )r~   r   y_namesr   r   r    _choose_check_classifiers_labels_  s    rd  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  )r5  r  r  r  r  r
   onetwothreer  r   Or  r8   )r   r;   r+   r9  r  r   Ztaker>   r1  rn  rd  ra  )r~   r(  ZX_multiclassZy_multiclassZX_binaryZy_binaryZlabels_multiclassZlabels_binaryZy_names_multiclassZy_names_binaryr6  r   r   rc  Z	y_names_ir  r   r   r   r   i  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   rP  r   r
   r  r  )r;  r  r   r   r   r  r  r   r   rJ   rp   r  r  r2  r   r   rn  r=  rA   )r~   regressor_origr   r  r  r   Zregressor_1Zregressor_2r  pred1r#  r   r   r   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  r  r  r   rM  )r;  rn  r,   r   r  r   rp   r   r   r   r  r  r  r2  rG   ru   r  r  rI   r   r   rJ   r  r   r  rk  r>   r  )
r~   ri  rT   r   r   r   r   r  r  r  r   r   r   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   r  r   r{  r}  r|  )
r   r   r   r   normalr  r   r   ru   rk  )r~   ri  r   r   r   r   r  r  r   r   r   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 )Nr  r   r
   rP  r   r3  )r  r  r  rM  rR  r  rO     g-C6?)r   r8   )r   r8   r
   r   r>  rC  r?  r@  rA  min_weight_fraction_leafr  )rp  n_iter_no_change)rq  r  gףp=
?)r>   r   r(   r&   r  r   r  r   rV  ru   rJ   r   r   r`  rk  )r~   r(  r6  Z	n_centersr   r   r  r)  rK  rT  r   r   r  r   r   r   r     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 )Nr>  rC  r?  r@  rn  rA  balancedro  Zweighted)Zaverage)r   ru   rV  rJ   r   r   r#   rk  )
r~   r(  r  rK  r)  rT  r  r   r  Zy_pred_balancedr   r   r   'check_class_weight_balanced_classifiers  s     



  rs  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   grI  rB  r8   r  r>  rn  r?  r@  rA  rO  rP  rQ  rr  ro  )r8   r  z>Classifier %s is not computing class_weight=balanced properly.r  N)r   r  ru   rV  rJ   r   coef_rl  r  r=  r  r3  rA   )
r~   
Classifierr   r   r   Zcoef_balancedr5  r  r   Zcoef_manualr   r   r   -check_class_weight_balanced_linear_classifier.  s0    (


rw  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   rY  rZ  r  zTEstimator %s should not change or mutate  the parameter %s from %s to %s during fit.)r   r  r&   r   r   rJ   r   r   r   r  joblibhashrk  )r~   r   r   r   r}   rX  Zoriginal_params
new_params
param_nameoriginal_value	new_valuer   r   r   rt   W  s     

rt   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	| }t	d
d |D }|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 r   r   )r   Zparams_parentr  r   r   r   r     s    z3check_no_attributes_set_in_init.<locals>.<listcomp>c                 s   s   | ]}t |V  qd S r$  )r@   )r   parentr   r   r   r'    s     z2check_no_attributes_set_in_init.<locals>.<genexpr>c                 S   s   g | ]}| d s|qS )r  )r   )r   r  r   r   r   r     s     
 zaEstimator %s should not set any attribute apart from parameters during init. Found attributes %s.)r   r  ru   r%  r^  r@   r9   remove__mro__setr  rk  sorted)r~   r   r}   init_paramsr   Zparents_init_paramsZinvalid_attrr   r   r   rc   y  s.    


rc   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 )Nr  r8   r
   rP  )r   r  r   r   r   r   rW   r   r  ru  rk  rD   r  r  r  )r~   r   r   r   r&  Z	pred_origr  r   r   r   rv     s2    




rv   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 )NrP  r   r8   r
   r  
NotAnArrayZPandasDataframe)r   r  r  r   "check_estimators_data_not_an_arrayr~   r   r   r   obj_typer   r   r   r     s(    
"
r   c                 C   s<   t  \}}t||}t||}dD ]}t| |||| q"d S )Nr  )r;  r  r   r  r  r   r   r   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|}npzRdd l	}	t|}|j
dkr|	j|dd}n|	j|dd}|	jt|dd}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.r  zData type {0} not supportedr  r   r8   Frs  zDpandas is not installed: not checking estimators for pandas objects.r  r  )rp   r?   r   rJ   r   r   rZ  r   r[  r  r  r  r  r  r   r   rA   )r~   r   r   r   r  Zestimator_1Zestimator_2r  ZX_r  rj  r#  r   r   r   r    s:    




r  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 ]R}|j|jkstd|jt|jf ttttttd th}|tjjj  t|j|kp*t |j}|svtd	|j d
|j dt|jj d|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.r]  )r~   rQ   VAR_KEYWORDVAR_POSITIONAL)r  r   r   r   param_filter,  s
    


z<check_parameters_default_constructible.<locals>.param_filterc                    s   g | ]} |r|qS r   r   r  r  r   r   r   4  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. 'z(' must be a callable or must be of type c                 s   s   | ]}|j V  qd S r$  )rb   )r   r%  r   r   r   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.)'ra   rH   r  r  r   reprrV  rk  r  r^  r   r  r  r,  r   r   r  defaultr  r~   r%  rb   r  r  r=  re  r  updater   coreZnumerictypesZallTypesr   r  r   r   rt  rD   r:   )r~   r  r}   initr  rX  Z
init_paramZallowed_typesZallowed_valueZparam_valueZfailure_textr   r  r   r     sh    





>

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   r8   r  r   r   )r  r8   )r>   absrW  r   r   whereZflatr  )r}   r   r   r   r   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rxt | ddrZtjntj}t||  |}| jjdkr||  }t	| rt
|d	d
}nt | ddr|||}|S )NZ1darrayr   r   r   r   categoricalrV   ZSkewedChi2SamplerZ	euclidean)rd  rO   )r>   rW  r   r]   r  r  rn  ra   rb   rf  r%   )r}   r   r  r`   r   r   r   r    s    
r  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   rB  r   rb  Z	LassoLarsrB  r  r@  r   r8   )rp   r   rV  ru   r   r\  targetr   rJ   r  r   r   alln_iter_rk  )r~   r   Znot_run_check_n_iterr}   Zirisr   r  r   r   r   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 )Nr@  rB  rI  g       @r2  g      @r  gɿg?g?g      g333333?r  r   r8   r
   r  )	r   ru   rp   r   r  rJ   r   r  rk  )r~   r   r}   r   r  Ziter_r   r   r   r     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_paramsr   r   r'    s     z.check_get_params_invariance.<locals>.<genexpr>)r   r   r  r  rk  )r~   r   r  Zshallow_paramsr   r  r   r     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 )NFr  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   rV  r  r   rk  r  r   r   r   r,  r   ra   rb   r   r   r   )r~   r   r}   Zorig_paramsr  Zcurr_paramsr   r   Ztest_valuesZtest_paramsr{  default_valuer   r  e_typeZchange_warning_msgZparams_before_exceptionr   r   r   r     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: rU   r   r  )r;  r  r   r>   rI   r   r   )r~   r   r   r   r  r  r   r   r   r   4  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
   )r  r  rC  r   r  rI  T)r5  r  r6  r  r  r;   皙?rm  r{  r}  r8   r   )Zdecimalsc                    s   g | ]} |k   qS r   )r`  )r   groupbZ
rank_probar   r   r   i  s     z4check_decision_proba_consistency.<locals>.<listcomp>)r   r(   r   ru   r   r}  r  r{  r	   rC   rk  r   r  r  r5  rD   r  r  )r~   r   r  r   r   r  r)  rK  rT  r}   aZ
rank_scoreZgrouped_y_scoreZ
sorted_idxr   r  r   r   B  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  r  r8   r   r   r  r>  r{  )r   r;   r  r   rJ   r   rk  r`   rQ   rD   r   r  r  ru   r   r   r=  rV  r3  r{  r<  )r~   r   r5  r   r  r6  r}   r  Zy_pred_2r9  r   r8  r  r   r   r   r   o  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 )Nrt  r8   r
   )r   r  r   rI   r   r   r  r   r   r   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{  r}  r   
warm_startFr  rC  r
   locr   r   r  r  rm  c                    s&   i | ]}t |r|t| qS r   )ru   r  )r   r  r)  r}   r   r   rv    s   
 z(check_fit_idempotent.<locals>.<dictcomp>r  r  z&Idempotency check failed for method {})rz  Zrtolr   )r   r   r   r   rJ   r   r   rV  rl  r  r   r  r   nextr'   splitr)   r   ru   r  Z
issubdtyper`   Zfloatingr  r  r]   rB   maxr   )r~   r   r  r   r5  r   r   traintestr  rK  rT  r  r  Z
new_resultZtolr   r  r   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 )Nr4  r  Fr  rC  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   rJ   r   rV  rl  r  r   r  r   r>   getr7   rk  ra   rb   r   r   )r~   r   r   r}   r5  r   r   r  r   r   r   r     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  rC  r
   r  r   r  n_features_in_r8   )r   r   r   r   rJ   r   rV  rl  r  r   r  r   ru   rk  r   r  r  )r~   r   r   r}   r5  r   r   r   r   r   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   rC  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  ver   r   r'  5  s     z(check_requires_y_none.<locals>.<genexpr>)
r   r   r   r   rJ   rl  r  r   r   r+  )r~   r   r   r}   r5  r   Zexpected_err_msgsr   r  r   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   r  rU   r   r  Fr     r0  r   r
   r  r8   r   r   r{  r}  r  z'X has 1 features, but \w+ is expecting z features as inputr  r  r  r	  )r>   r   r   r   r   rJ   r   rV  rl  r  r   r  r   r   r  r  rk  ru   r  r   rI   r   r   r  r  )r~   r   r   is_supported_X_typesr   r}   r5  r   r   r  X_badr  r  callable_methodr   r   r   !check_n_features_in_after_fitting9  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   ru   r  r  r   r=   intersectionrk  )r~   r   r}   Z	tags_keysZdefault_tags_keysr   r   r   ry   ~  s    
ry   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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s4tdt|jtjsHt|jjtksZt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d}t,-d(| }|D ]2\} }t.t||  d)d* || W 5 Q R X qt|d+r|r&qt|}t/|rTt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   r  rU   )r  r0  r   c                 S   s   g | ]}d | qS )Zcol_r   r   r  r   r   r   r     s     z<check_dataframe_column_names_consistency.<locals>.<listcomp>Fcolumnsrl  r
   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{  r}  r  r  r|  r  r  r  z<Feature names must be in the same order as they were in fit.c                 S   s   g | ]}d | qS )Zanother_prefix_r   r  r   r   r   r     s     zHFeature names unseen at fit time:
- another_prefix_0
- another_prefix_1
rP  z3Feature names seen at fit time, yet now missing:
- 
c                 S   s   i | ]\}}d |kr||qS )Zearly_stoppingr   ru  r   r   r   rv    s    z<check_dataframe_column_names_consistency.<locals>.<dictcomp>c                 s   s   | ]}|d kV  qdS )TNr   )r   r   r   r   r   r'    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  )2r  r  r?   r>   r   r   r   r   rJ   rl  r  r  r  r  r  r   r  r   r   r!  filterwarningsUserWarningr   ru   r   r   r  rt  rk  r`   r  rD   r   r   r   rc  r  r   r1  rW  r   r  r+  r  r  escaperI   r   r  r  )r~   r   r  r   r  r   r}   ZX_origr5  r6  namesr   r   r   r  r  r  r  invalid_namesrX  Zearly_stopping_enabledZinvalid_nameZadditional_messager  Zexpected_msgr
  r   r   r   (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   rU   r  r   r8   r
   r  r  r  c                 S   s   g | ]}d | qS )featurer   r  r   r   r   r   6  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   r~   r   r   r   r'  @  s     z:check_transformer_get_feature_names_out.<locals>.<genexpr>	Expected  feature names, got )r  r   r+   r9  r   r  r  rJ   rp   r   r  r[  r  rI   r   rW  rk  r   rt  r`   r  r  r  r  )r~   r  r   r   r   r   r6  r  X_transformZinput_featuresZfeature_names_outn_features_outr   r   r   '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d}
|j|
|d}dd t|D }ttdd || W 5 Q R X | }||	}t|| t|tr||d j	d }n
|j	d }t||kstd| dt| d S )Nr   r  r   r   rU   r  r8   r
   r  r  c                 S   s   g | ]}d | qS ro  r   r  r   r   r   r   l  s     zBcheck_transformer_get_feature_names_out_pandas.<locals>.<listcomp>Fr  r  c                 S   s   g | ]}d | qS )badr   r  r   r   r   r   q  s     z0input_features is not equal to feature_names_in_r  r  r  )r  r  r?   r  r   r+   r9  r   r  r  rJ   rp   r   r  r[  r  r  rI   r   rW  rD   r   r  r  rk  )r~   r  r  r   r   r   r   r6  r  feature_names_indfr  Zinvalid_feature_namesZfeature_names_out_defaultZfeature_names_in_explicit_namesr  r   r   r   .check_transformer_get_feature_names_out_pandasL  sV    






r  c                 C   s  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rqtdd |D rtdd |D rtd| d|  dd| d|  d}|  d| d}	t|}|jf ||
i |D ]l}t||s^qJtt||	dB tdd t|dd D rt||| nt|||| W 5 Q R X qJd!d" |D }|D ]}zt|}W n tk
r   Y qY nX |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qqd S )$Nr   r  r   r
   r3  Fr  z>Mismatch between _parameter_constraints and the parameters of z%.
Consider the unexpected parameters z% and expected but missing parameters ZBadTyper   r   r  r9  r   rU   c                 s   s"   | ]}t |to|jtkV  qd S r$  )r   r<   r%  r   r   rG  r   r   r   r'    s   z)check_param_validation.<locals>.<genexpr>c                 s   s"   | ]}t |to|jtkV  qd S r$  )r   r<   r%  r   r  r   r   r   r'    s   zThe constraint for parameter z of zc can't have a mix of intervals of Integral and Real types. Use the type RealNotInt instead of Real.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_typer   r   r   r'    s   r   r   c                 S   s   g | ]}t |qS r   )r4   r  r   r   r   r     s     z*check_param_validation.<locals>.<listcomp>c                 s   s   | ]}| d V  qdS r  )r   r  r   r   r   r'    s   )r   r   r   r  r  r   r   r   r@  r  rk  r%  r+  r   r   rV  ru   rI   r2   r>   r  r3   r  )r~   r   r   r   r   Zestimator_paramsZvalidation_paramsZunexpected_paramsZmissing_paramsr   Zparam_with_bad_typeZfit_methodsr{  constraintsr   r}   r  rG  Z	bad_valuer   r   r   check_param_validation  st    






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

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}||d}|
 D ]b\}t|}t|sq||}	tkr|	d }	|jdd ||}
tkr|
d }
t|	|
 qd S )Nr   r   rU   r   r  r   r
   r3  c                    s.   t kr|   S |   S r$  )rp   r   r   r&  r   r~   r   r   r   fit_then_transform  s    z6check_set_output_transform.<locals>.fit_then_transformc                    s   |   S r$  )r9  r  r:  r   r   r9    s    z1check_set_output_transform.<locals>.fit_transform)r   r9  r  r   )r  r   r   r   r   r  r  r  r   rJ   r  ru   rp   
set_outputrB   )r~   r  r   r   r   r  r9  Ztransform_methodsZtransform_methodZX_trans_no_settingZX_trans_defaultr   r  r   check_set_output_transform  s6    


r  c                    s   i }d||fd||fd||fd||fg}t  fdddD r|D ]J\}}}	 || |tkrr |	|\}
}n
 |	}
|
  f||< qBd|fd	|fg}t d
r|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/arrayc                 3   s   | ]}t  |V  qd S r$  )ru   )r   methr   r   r   r'  ,  s     z-_output_from_fit_transform.<locals>.<genexpr>)r   r   zfit_transform/dfzfit_transform/arrayr9  )r  r   rp   r   rW  ru   r9  )r   r~   r   r  r   outputsZcasescaseZdata_fitZdata_transformr  r  r\  r   r  r   _output_from_fit_transform  s6    

r  c              
   C   s   dd l }|\}}|\}}	t||js(t|dr6|nd }
|j||	d|
d}z|j|| W n< tk
r } zt|  d| d| |W 5 d }~X Y nX d S )Nr   r  Fr  rl  indexz, does not generate a valid dataframe in the z] case. The generated dataframe is not equal to the expected dataframe. The error message is: )r  r   r  rk  r   testingZassert_frame_equal)r~   r  r  outputs_defaultoutputs_pandasr  r  Zfeature_names_defaultZdf_transZfeature_names_pandasZexpected_indexZexpected_dataframer  r   r   r   _check_generated_dataframeI  s&       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jd}t|}|jdd}t	||}|j
ddd	d}t||}t| d
d t|jd D }dd t|jd D }	|j||d|	d}
t|jdd}t|| ||
|}t|jdd}zt|| ||
|}W n@ tk
r\ } z dt|ksFt|W Y d S d }~X Y nX |D ]}t| ||	|| ||  qbd S )Nr   r  r   r   rU   r  r   r
   r3  c                 S   s   g | ]}d | qS r  r   r  r   r   r   r   z  s     z5check_set_output_transform_pandas.<locals>.<listcomp>r8   c                 S   s   g | ]}d | qS r  r   r  r   r   r   r   {  s     Fr  r  r  r  +Pandas output does not support sparse data.)r  r  r?   r  r   r   r   r   r  r  r  r   rJ   r  r  r  r  r  r   r  rk  r  r~   r  r  r   r   r   r   r   r  r  r  Ztransformer_defaultr  Ztransformer_pandasr  r  r  r   r   r   !check_set_output_transform_pandasd  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jd}t|}|jdd}t	||}|j
dd	d
d}t||}t| dd t|jd D }dd t|jd D }	|j||d|	d}
t|jdd}t|| ||
|}t|}z*tdd t|| ||
|}W 5 Q R X W n@ tk
rj } z dt|ksTt|W Y dS d}~X Y nX |D ]}t| ||	|| ||  qpdS )z`Check that setting globally the output of a transformer to pandas lead to the
    right results.r   Nr  r   r   rU   r  r   r
   r3  c                 S   s   g | ]}d | qS r  r   r  r   r   r   r     s     z8check_global_output_transform_pandas.<locals>.<listcomp>r8   c                 S   s   g | ]}d | qS r  r   r  r   r   r   r     s     Fr  r  r  r  )Ztransform_outputr  )r  r  r?   r  r   r   r   r   r  r  r  r   rJ   r  r  r  r  r  r   r   r  rk  r  r  r   r   r   $check_global_output_transform_pandas  sT    


        r  )NF)rP   )F)F)F)Fr]   )T)F)r~  rz   r  r  r   rl  r   	functoolsr   r   inspectr   numbersr   r   rx  numpyr   Zscipyr   Zscipy.statsr	   r   r   baser   r   r   r   r   r   Zdatasetsr   r   r   r   r   
exceptionsr   r   r   Zfeature_selectionr   r   Zlinear_modelr   r   r   r   r    Zmetricsr!   r"   r#   Zmetrics.pairwiser$   r%   r&   Zmodel_selectionr'   r(   Zmodel_selection._validationr)   r  r*   Zpreprocessingr+   r,   Zrandom_projectionr-   Zutils._array_apir.   r/   r1   r  Zutils._param_validationr2   r3   r4   Zutils.fixesr5   r6   Zutils.validationr7   r9   r:   r;   Z_param_validationr<   Z_tagsr=   r>   r   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   Z
validationrK   rL   r8  rp   r   r   r  r   r   r   r   r   r   r	  r  r  r#  r  r-  r0  r;  rY  rZ  rf  rr  r|   rw   rf   rg   rh   ri   rk   rj   r  rn   rm   r   r  r   r   r  r   r   r   r   r   r   r   r   r   r  rq   re   rd   r   ro   rr   rs   rx   r   r   r   r   r   r   r   r   r<  r   r   r   r   r   r   rX  rl   r   r   ra  rd  r   r   r]   r   r   r   rs  rw  rt   rc   rv   r   r   r  r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   r  ry   r  r  r  r  r  r  r  r  r  r   r   r   r   <module>   s   8D$
"9&,>J{" i6
+


$D(
$
'
:

$
+
(




[
 

 

0
5

<
;


$   H
(
,
S
-


#
@
"
 2

,

(
!
%
"


.i
*



8

,+
:'
D 0
9g0-*