o
    }Th                     @   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 r|| W  d    S W d    n1 s%w   Y  t|rQ| jjdkr;t	
| }|S | jjdv rKt	j| jtd}|S t| }|S | |k}|S )Nr   f)iudtype)r   ImportErrorAttributeErrorpandasNAisnar   r   kindnpisnanzerosshapeboolr   )Xvalue_to_maskr   Xt r   T/home/air/segue/gemini/back/venv/lib/python3.10/site-packages/sklearn/utils/_mask.py_get_dense_mask   s$   


r   c                 C   s\   t | s
t| |S t| j|}| jdkrt 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.
    csr)r   r   )spissparser   dataformat
csr_matrix
csc_matrixindicescopyindptrr   r   )r   r   r   sparse_constructor	Xt_sparser   r   r   	_get_mask&   s   

r*   z
array-likezsparse matrix)r   maskT)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]])
    toarrayr   )r   asarray
issubdtyper   signedintegerhasattraranger   )r   r+   indr   r   r   	safe_maskF   s   
#
r4   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   )r4   r   r   r   )r   r+   len_maskr   r   r   axis0_safe_slices   s    r6   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%   mask_lengthr+   r   r   r   indices_to_mask   s
   r:   )
contextlibr   numpyr   scipyr   r   _missingr   _param_validationr   fixesr   r   r*   r4   r6   r:   r   r   r   r   <module>   s"    
&%