a
    h                     @   s   d dl m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 dd	 Zd
d Ze
ddgdgddddd Zdd Zdd ZdS )    )suppressN)sparse   )is_scalar_nan)validate_params)_object_dtype_isnanc                 C   s   t tt: dd l}||ju r6|| W  d    S W d    n1 sJ0    Y  t|r| jjdkrtt	
| }q| jjdv rt	j| jtd}qt| }n| |k}|S )Nr   f)iudtype)r   ImportErrorAttributeErrorpandasZNAZisnar   r   kindnpisnanzerosshapeboolr   )Xvalue_to_maskr   Xt r   O/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/utils/_mask.py_get_dense_mask   s    
6
r   c                 C   s\   t | st| |S t| j|}| jdkr0t jnt j}||| j | j	 f| j
td}|S )a  Compute the boolean mask X == value_to_mask.

    Parameters
    ----------
    X : {ndarray, sparse matrix} of shape (n_samples, n_features)
        Input data, where ``n_samples`` is the number of samples and
        ``n_features`` is the number of features.

    value_to_mask : {int, float}
        The value which is to be masked in X.

    Returns
    -------
    X_mask : {ndarray, sparse matrix} of shape (n_samples, n_features)
        Missing mask.
    Zcsr)r   r   )spissparser   dataformatZ
csr_matrixZ
csc_matrixindicescopyZindptrr   r   )r   r   r   Zsparse_constructorZ	Xt_sparser   r   r   	_get_mask&   s    

r"   z
array-likezsparse matrix)r   maskT)Zprefer_skip_nested_validationc                 C   sD   t |}t |jt jr|S t| dr@t |jd }|| }|S )as  Return a mask which is safe to use on X.

    Parameters
    ----------
    X : {array-like, sparse matrix}
        Data on which to apply mask.

    mask : array-like
        Mask to be used on X.

    Returns
    -------
    mask : ndarray
        Array that is safe to use on X.

    Examples
    --------
    >>> from sklearn.utils import safe_mask
    >>> from scipy.sparse import csr_matrix
    >>> data = csr_matrix([[1], [2], [3], [4], [5]])
    >>> condition = [False, True, True, False, True]
    >>> mask = safe_mask(data, condition)
    >>> data[mask].toarray()
    array([[2],
           [3],
           [5]])
    Ztoarrayr   )r   ZasarrayZ
issubdtyper   ZsignedintegerhasattrZaranger   )r   r#   indr   r   r   	safe_maskF   s    #

r&   c                 C   s4   |dkr| t | |ddf S tjd| jd fdS )a  Return a mask which is safer to use on X than safe_mask.

    This mask is safer than safe_mask since it returns an
    empty array, when a sparse matrix is sliced with a boolean mask
    with all False, instead of raising an unhelpful error in older
    versions of SciPy.

    See: https://github.com/scipy/scipy/issues/5361

    Also note that we can avoid doing the dot product by checking if
    the len_mask is not zero in _huber_loss_and_gradient but this
    is not going to be the bottleneck, since the number of outliers
    and non_outliers are typically non-zero and it makes the code
    tougher to follow.

    Parameters
    ----------
    X : {array-like, sparse matrix}
        Data on which to apply mask.

    mask : ndarray
        Mask to be used on X.

    len_mask : int
        The length of the mask.

    Returns
    -------
    mask : ndarray
        Array that is safe to use on X.
    r   Nr   )r   )r&   r   r   r   )r   r#   Zlen_maskr   r   r   axis0_safe_slices   s     r'   c                 C   s0   |t | krtdt j|td}d|| < |S )aY  Convert list of indices to boolean mask.

    Parameters
    ----------
    indices : list-like
        List of integers treated as indices.
    mask_length : int
        Length of boolean mask to be generated.
        This parameter must be greater than max(indices).

    Returns
    -------
    mask : 1d boolean nd-array
        Boolean array that is True where indices are present, else False.

    Examples
    --------
    >>> from sklearn.utils._mask import indices_to_mask
    >>> indices = [1, 2 , 3, 4]
    >>> indices_to_mask(indices, 5)
    array([False,  True,  True,  True,  True])
    z-mask_length must be greater than max(indices)r   T)r   max
ValueErrorr   r   )r    Zmask_lengthr#   r   r   r   indices_to_mask   s
    r*   )
contextlibr   numpyr   Zscipyr   r   Z_missingr   Z_param_validationr   fixesr   r   r"   r&   r'   r*   r   r   r   r   <module>   s     
&%