o
    i9                     @   s  d dl Z d dlmZ d dlmZmZ d dlZd dlm	Z	 ddl
mZ ddlmZ d	d
 Zdd ZeG dd deZG dd dZG dd dZG dd dZe Zee  ee  dd Zd&ddZd&ddZdd Zdd Zdd  ZG d!d" d"Zdd#d$d%ZdS )'    Nwraps)Protocolruntime_checkable)issparse   )
get_config   )available_ifc              
   C   s>   zt | W S  ty } ztd|  d|  d|d}~ww )zCheck library is installed.zSetting output container to 'z' requires z to be installedN)	importlibimport_moduleImportError)libraryexc r   h/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/sklearn/utils/_set_output.pycheck_library_installed   s   r   c                 C   s*   t | rz|  W S  ty   Y d S w | S N)callable	Exceptioncolumnsr   r   r   get_columns   s   r   c                   @   s8   e Zd ZU eed< dddZdd Zdd Zd	d
 ZdS )ContainerAdapterProtocolcontainer_libFc                 C      dS )a  Create container from `X_output` with additional metadata.

        Parameters
        ----------
        X_output : {ndarray, dataframe}
            Data to wrap.

        X_original : {ndarray, dataframe}
            Original input dataframe. This is used to extract the metadata that should
            be passed to `X_output`, e.g. pandas row index.

        columns : callable, ndarray, or None
            The column names or a callable that returns the column names. The
            callable is useful if the column names require some computation. If `None`,
            then no columns are passed to the container's constructor.

        inplace : bool, default=False
            Whether or not we intend to modify `X_output` in-place. However, it does
            not guarantee that we return the same object if the in-place operation
            is not possible.

        Returns
        -------
        wrapped_output : container_type
            `X_output` wrapped into the container type.
        Nr   )selfX_output
X_originalr   inplacer   r   r   create_container'       z)ContainerAdapterProtocol.create_containerc                 C   r   )a  Return True if X is a supported container.

        Parameters
        ----------
        Xs: container
            Containers to be checked.

        Returns
        -------
        is_supported_container : bool
            True if X is a supported container.
        Nr   )r   Xr   r   r   is_supported_containerC   r!   z/ContainerAdapterProtocol.is_supported_containerc                 C   r   )aQ  Rename columns in `X`.

        Parameters
        ----------
        X : container
            Container which columns is updated.

        columns : ndarray of str
            Columns to update the `X`'s columns with.

        Returns
        -------
        updated_container : container
            Container with new names.
        Nr   r   r"   r   r   r   r   rename_columnsQ   r!   z'ContainerAdapterProtocol.rename_columnsc                 C   r   )a  Stack containers horizontally (column-wise).

        Parameters
        ----------
        Xs : list of containers
            List of containers to stack.

        Returns
        -------
        stacked_Xs : container
            Stacked containers.
        Nr   )r   Xsr   r   r   hstackb   r!   zContainerAdapterProtocol.hstackN)F)	__name__
__module____qualname__str__annotations__r    r#   r%   r'   r   r   r   r   r   #   s   
 
r   c                   @   2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )PandasAdapterpandasTc                 C   s|   t d}t|}|rt||js2t||jr|j}nt||j|jfr'|j}nd }|j||| d}|d ur<| ||S |S )Nr/   )indexcopy)r   r   
isinstance	DataFramer0   ZSeriesr%   )r   r   r   r   r   pdr0   r   r   r   r    t   s   zPandasAdapter.create_containerc                 C      t d}t||jS )Nr/   r   r2   r3   )r   r"   r4   r   r   r   r#         z$PandasAdapter.is_supported_containerc                 C   
   ||_ |S r   r   r$   r   r   r   r%         zPandasAdapter.rename_columnsc                 C      t d}|j|ddS )Nr/   r	   )Zaxisr   concat)r   r&   r4   r   r   r   r'         zPandasAdapter.hstackNTr(   r)   r*   r   r    r#   r%   r'   r   r   r   r   r.   q   s    
r.   c                   @   r-   )PolarsAdapterpolarsTc                 C   s`   t d}t|}t|tjr| n|}|rt||js$|j||ddS |d ur.| ||S |S )NrA   row)ZschemaZorient)r   r   r2   npZndarraytolistr3   r%   )r   r   r   r   r   plr   r   r   r       s   zPolarsAdapter.create_containerc                 C   r5   )NrA   r6   )r   r"   rE   r   r   r   r#      r7   z$PolarsAdapter.is_supported_containerc                 C   r8   r   r   r$   r   r   r   r%      r9   zPolarsAdapter.rename_columnsc                 C   r:   )NrA   
horizontal)howr;   )r   r&   rE   r   r   r   r'      r=   zPolarsAdapter.hstackNr>   r?   r   r   r   r   r@      s    
r@   c                   @   s(   e Zd Zdd Zedd Zdd ZdS )ContainerAdaptersManagerc                 C   s
   i | _ d S r   )adaptersr   r   r   r   __init__   s   
z!ContainerAdaptersManager.__init__c                 C   s   dht | jB S )Ndefault)setrI   rJ   r   r   r   supported_outputs   s   z*ContainerAdaptersManager.supported_outputsc                 C   s   || j |j< d S r   )rI   r   )r   adapterr   r   r   register   s   z!ContainerAdaptersManager.registerN)r(   r)   r*   rK   propertyrN   rP   r   r   r   r   rH      s
    
rH   c              
   C   s^   | j jdd }ztj| W S  ty. } zttj }td| d| d|d}~ww )zGet the adapter that knows how to handle such container.

    See :class:`sklearn.utils._set_output.ContainerAdapterProtocol` for more
    details.
    .r   zZThe container does not have a registered adapter in scikit-learn. Available adapters are: z" while the container provided is: N)		__class__r)   splitADAPTERS_MANAGERrI   KeyErrorlistkeys
ValueError)	containermodule_namer   Zavailable_adaptersr   r   r   _get_adapter_from_container   s    r\   c                 C   s0   t | |d }ztj| W S  ty   Y dS w )zGet container adapter.denseN)_get_output_configrU   rI   rV   )method	estimatordense_configr   r   r   _get_container_adapter   s   rb   c                 C   s\   t |di }| |v r||  }nt |  d }tj}||vr*tdt| d| d|iS )a  Get output config based on estimator and global configuration.

    Parameters
    ----------
    method : {"transform"}
        Estimator's method for which the output container is looked up.

    estimator : estimator instance or None
        Estimator to get the output configuration from. If `None`, check global
        configuration is used.

    Returns
    -------
    config : dict
        Dictionary with keys:

        - "dense": specifies the dense container for `method`. This can be
          `"default"` or `"pandas"`.
    _sklearn_output_config_outputzoutput config must be in z, got r]   )getattrr   rU   rN   rY   sorted)r_   r`   Zest_sklearn_output_configra   rN   r   r   r   r^      s   
r^   c                 C   sb   t | |}|d dkst|s|S |d }t|r#td|  dtj| }|j|||jdS )a  Wrap output with container based on an estimator's or global config.

    Parameters
    ----------
    method : {"transform"}
        Estimator's method to get container output for.

    data_to_wrap : {ndarray, dataframe}
        Data to wrap with container.

    original_input : {ndarray, dataframe}
        Original input of function.

    estimator : estimator instance
        Estimator with to get the output configuration from.

    Returns
    -------
    output : {ndarray, dataframe}
        If the output config is "default" or the estimator is not configured
        for wrapping return `data_to_wrap` unchanged.
        If the output config is "pandas", return `data_to_wrap` as a pandas
        DataFrame.
    r]   rL   zmThe transformer outputs a scipy sparse matrix. Try to set the transformer output to a dense array or disable z- output with set_output(transform='default').r   )	r^   _auto_wrap_is_configuredr   rY   
capitalizerU   rI   r    get_feature_names_out)r_   data_to_wrapZoriginal_inputr`   Zoutput_configra   rO   r   r   r   _wrap_data_with_container	  s    

rk   c                    s   t   fdd}|S )z@Wrapper used by `_SetOutputMixin` to automatically wrap methods.c                    sr    | |g|R i |}t |tr2t|d || g|dd  R }tt|dr0t||S |S t||| S )Nr   r	   _make)r2   tuplerk   hasattrtyperl   )r   r"   argskwargsrj   Zreturn_tuplefr_   r   r   wrapped:  s   

z$_wrap_method_output.<locals>.wrappedr   )rs   r_   rt   r   rr   r   _wrap_method_output7  s   ru   c                 C   s    t | dt }t| dod|v S )zReturn True if estimator is configured for auto-wrapping the transform method.

    `_SetOutputMixin` sets `_sklearn_auto_wrap_output_keys` to `set()` if auto wrapping
    is manually disabled.
    _sklearn_auto_wrap_output_keysri   	transform)re   rM   rn   )r`   auto_wrap_output_keysr   r   r   rg   N  s   
rg   c                       s8   e Zd ZdZd fdd	ZeeddddZ  ZS )	_SetOutputMixina\  Mixin that dynamically wraps methods to return container based on config.

    Currently `_SetOutputMixin` wraps `transform` and `fit_transform` and configures
    it based on `set_output` of the global configuration.

    `set_output` is only defined if `get_feature_names_out` is defined and
    `auto_wrap_output_keys` is the default value.
    rw   c                    s   t  jdi | t|ts|d u std|d u r t | _d S ddd}t | _| D ](\}}t| |r:||vr;q-| j	| || j
vrGq-tt| ||}t| || q-d S )Nz6auto_wrap_output_keys must be None or a tuple of keys.rw   )rw   fit_transformr   )super__init_subclass__r2   rm   rY   rM   rv   itemsrn   add__dict__ru   re   setattr)clsrx   rq   Zmethod_to_keyr_   keyZwrapped_methodrS   r   r   r}   e  s*   
z!_SetOutputMixin.__init_subclass__Nc                C   s*   |du r| S t | dsi | _|| jd< | S )a  Set output container.

        See :ref:`sphx_glr_auto_examples_miscellaneous_plot_set_output.py`
        for an example on how to use the API.

        Parameters
        ----------
        transform : {"default", "pandas", "polars"}, default=None
            Configure output of `transform` and `fit_transform`.

            - `"default"`: Default output format of a transformer
            - `"pandas"`: DataFrame output
            - `"polars"`: Polars output
            - `None`: Transform configuration is unchanged

            .. versionadded:: 1.4
                `"polars"` option was added.

        Returns
        -------
        self : estimator instance
            Estimator instance.
        Nrc   rw   )rn   rc   )r   rw   r   r   r   
set_output  s   

z_SetOutputMixin.set_output)rz   )	r(   r)   r*   __doc__r}   r
   rg   r   __classcell__r   r   r   r   ry   [  s
    	 ry   rz   c                C   sJ   t | dpt | do|du}|sdS t | dstd|  d| j|dS )a)  Safely call estimator.set_output and error if it not available.

    This is used by meta-estimators to set the output for child estimators.

    Parameters
    ----------
    estimator : estimator instance
        Estimator instance.

    transform : {"default", "pandas", "polars"}, default=None
        Configure output of the following estimator's methods:

        - `"transform"`
        - `"fit_transform"`

        If `None`, this operation is a no-op.

    Returns
    -------
    estimator : estimator instance
        Estimator instance.
    rw   r{   Nr   zUnable to configure output for z' because `set_output` is not available.rz   )rn   rY   r   )r`   rw   Zset_output_for_transformr   r   r   _safe_set_output  s   


r   r   )r   	functoolsr   typingr   r   numpyrC   Zscipy.sparser   _configr   Z_available_ifr
   r   r   r   r.   r@   rH   rU   rP   r\   rb   r^   rk   ru   rg   ry   r   r   r   r   r   <module>   s2   	M*

	#.M