
    0Phy                     p    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 Z G d	 d
e          ZdS )    )deepcopy   )BaseEstimator)NotFittedError)get_tags)available_if)check_is_fittedc                       fd}|S )zSCheck that final_estimator has `attr`.

    Used together with `available_if`.
    c                 2    t          | j                   dS NT)getattr	estimator)selfattrs    V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/sklearn/frozen/_frozen.pycheckz_estimator_has.<locals>.check   s    %%%t     )r   r   s   ` r   _estimator_hasr      s#        
 Lr   c                   ~    e Zd ZdZd Z e ed                    d             Zd Zd Z	d Z
d Zd	 ZddZ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                     || _         d S Nr   )r   r   s     r   __init__zFrozenEstimator.__init__>   s    "r   __getitem__c                 &     | j         j        |i |S )z__getitem__ is defined in :class:`~sklearn.pipeline.Pipeline` and             :class:`~sklearn.compose.ColumnTransformer`.
        )r   r   )r   argskwargss      r   r   zFrozenEstimator.__getitem__A   s    
 *t~)4:6:::r   c                 X    |dv rt          | d          t          | j        |          S )N)fit_predictfit_transformz( is not available for frozen estimators.)AttributeErrorr   r   )r   names     r   __getattr__zFrozenEstimator.__getattr__H   s9     333 D!R!R!RSSSt~t,,,r   c                     | S r   r   r   s    r   __sklearn_clone__z!FrozenEstimator.__sklearn_clone__O   s    r   c                 R    	 t          | j                   dS # t          $ r Y dS w xY w)NTF)r	   r   r   r'   s    r   __sklearn_is_fitted__z%FrozenEstimator.__sklearn_is_fitted__R   s>    	DN+++4 	 	 	55	s    
&&c                 .    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   s        r   fitzFrozenEstimator.fitY   s    4 	'''r   c                 f    |                     dd          }||| _        |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   s      r   
set_paramszFrozenEstimator.set_paramsv   sM      JJ{D11	 &DN 	  	 	r   Tc                     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   deeps     r   
get_paramszFrozenEstimator.get_params   s      T^,,r   c                 V    t          t          | j                            }d|_        |S r   )r   r   r   
_skip_test)r   tagss     r   __sklearn_tags__z FrozenEstimator.__sklearn_tags__   s%    0011r   N)T)__name__
__module____qualname____doc__r   r   r   r   r%   r(   r*   r.   r2   r5   r9   r   r   r   r   r      s           D# # # \..//00; ; 10;- - -      :  6- - - -$    r   r   N)copyr   baser   
exceptionsr   utilsr   utils.metaestimatorsr   utils.validationr	   r   r   r   r   r   <module>rD      s                      ' ' ' ' ' '       / / / / / / . . . . . .  K K K K Km K K K K Kr   