o
    `^hy                     @   sd   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	 ZG d
d deZdS )    )deepcopy   )BaseEstimator)NotFittedError)get_tags)available_if)check_is_fittedc                    s    fdd}|S )zSCheck that final_estimator has `attr`.

    Used together with `available_if`.
    c                    s   t | j  dS NT)getattr	estimatorselfattr T/home/air/shanriGPT/back/venv/lib/python3.10/site-packages/sklearn/frozen/_frozen.pycheck   s   z_estimator_has.<locals>.checkr   )r   r   r   r   r   _estimator_has   s   r   c                   @   sf   e Zd ZdZdd Zeeddd Zdd Zd	d
 Z	dd Z
dd Zdd ZdddZdd ZdS )FrozenEstimatora  Estimator that wraps a fitted estimator to prevent re-fitting.

    This meta-estimator takes an estimator and freezes it, in the sense that calling
    `fit` on it has no effect. `fit_predict` and `fit_transform` are also disabled.
    All other methods are delegated to the original estimator and original estimator's
    attributes are accessible as well.

    This is particularly useful when you have a fitted or a pre-trained model as a
    transformer in a pipeline, and you'd like `pipeline.fit` to have no effect on this
    step.

    Parameters
    ----------
    estimator : estimator
        The estimator which is to be kept frozen.

    See Also
    --------
    None: No similar entry in the scikit-learn documentation.

    Examples
    --------
    >>> from sklearn.datasets import make_classification
    >>> from sklearn.frozen import FrozenEstimator
    >>> from sklearn.linear_model import LogisticRegression
    >>> X, y = make_classification(random_state=0)
    >>> clf = LogisticRegression(random_state=0).fit(X, y)
    >>> frozen_clf = FrozenEstimator(clf)
    >>> frozen_clf.fit(X, y)  # No-op
    FrozenEstimator(estimator=LogisticRegression(random_state=0))
    >>> frozen_clf.predict(X)  # Predictions from `clf.predict`
    array(...)
    c                 C   s
   || _ d S Nr   )r   r   r   r   r   __init__>   s   
zFrozenEstimator.__init____getitem__c                 O   s   | j j|i |S )z__getitem__ is defined in :class:`~sklearn.pipeline.Pipeline` and             :class:`~sklearn.compose.ColumnTransformer`.
        )r   r   )r   argskwargsr   r   r   r   A   s   zFrozenEstimator.__getitem__c                 C   s"   |dv rt | dt| j|S )N)fit_predictfit_transformz( is not available for frozen estimators.)AttributeErrorr
   r   )r   namer   r   r   __getattr__H   s   zFrozenEstimator.__getattr__c                 C   s   | S r   r   r   r   r   r   __sklearn_clone__O   s   z!FrozenEstimator.__sklearn_clone__c                 C   s&   zt | j W dS  ty   Y dS w )NTF)r   r   r   r   r   r   r   __sklearn_is_fitted__R   s   
z%FrozenEstimator.__sklearn_is_fitted__c                 O   s   t | j | S )aG  No-op.

        As a frozen estimator, calling `fit` has no effect.

        Parameters
        ----------
        X : object
            Ignored.

        y : object
            Ignored.

        *args : tuple
            Additional positional arguments. Ignored, but present for API compatibility
            with `self.estimator`.

        **kwargs : dict
            Additional keyword arguments. Ignored, but present for API compatibility
            with `self.estimator`.

        Returns
        -------
        self : object
            Returns the instance itself.
        )r   r   )r   Xyr   r   r   r   r   fitY   s   
zFrozenEstimator.fitc                 K   s*   | dd}|dur|| _|rtddS )aZ  Set the parameters of this estimator.

        The only valid key here is `estimator`. You cannot set the parameters of the
        inner estimator.

        Parameters
        ----------
        **kwargs : dict
            Estimator parameters.

        Returns
        -------
        self : FrozenEstimator
            This estimator.
        r   NzYou cannot set parameters of the inner estimator in a frozen estimator since calling `fit` has no effect. You can use `frozenestimator.estimator.set_params` to set parameters of the inner estimator.)popr   
ValueError)r   r   r   r   r   r   
set_paramsv   s   zFrozenEstimator.set_paramsTc                 C   s
   d| j iS )ah  Get parameters for this estimator.

        Returns a `{"estimator": estimator}` dict. The parameters of the inner
        estimator are not included.

        Parameters
        ----------
        deep : bool, default=True
            Ignored.

        Returns
        -------
        params : dict
            Parameter names mapped to their values.
        r   r   )r   deepr   r   r   
get_params   s   
zFrozenEstimator.get_paramsc                 C   s   t t| j}d|_|S r	   )r   r   r   
_skip_test)r   tagsr   r   r   __sklearn_tags__   s   z FrozenEstimator.__sklearn_tags__N)T)__name__
__module____qualname____doc__r   r   r   r   r   r    r!   r$   r'   r)   r,   r   r   r   r   r      s    "


r   N)copyr   baser   
exceptionsr   utilsr   utils.metaestimatorsr   utils.validationr   r   r   r   r   r   r   <module>   s   