
    sgy                     h    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y)    )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                         yNT)getattr	estimator)selfattrs    I/var/www/html/venv/lib/python3.12/site-packages/sklearn/frozen/_frozen.pycheckz_estimator_has.<locals>.check   s    %     )r   r   s   ` r   _estimator_hasr      s    
 Lr   c                   j    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y)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                     || _         y 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                 R    |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   s1     33 D6)Q!RSSt~~t,,r   c                     | S r   r   r   s    r   __sklearn_clone__z!FrozenEstimator.__sklearn_clone__O   s    r   c                 N    	 t        | j                         y# t        $ r Y yw xY w)NTF)r	   r   r   r'   s    r   __sklearn_is_fitted__z%FrozenEstimator.__sklearn_is_fitted__R   s(    	DNN+ 		s    	$$c                 0    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                 T    |j                  dd      }||| _        |rt        d      y)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   s;      JJ{D1	 &DN  r   c                     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                 P    t        t        | j                              }d|_        |S r   )r   r   r   
_skip_test)r   tagss     r   __sklearn_tags__z FrozenEstimator.__sklearn_tags__   s!    01r   N)T)__name__
__module____qualname____doc__r   r   r   r   r%   r(   r*   r.   r2   r5   r9   r   r   r   r   r      sN     D# ./0; 1;-:6-$r   r   N)copyr   baser   
exceptionsr   utilsr   utils.metaestimatorsr   utils.validationr	   r   r   r   r   r   <module>rD      s,       '  / .Km Kr   