U
    %¼|eK  ã                   @   sô   d dl mZ d dlZddlmZmZ	m
Z ddlmZ dd„ Zdd	„ Zd
d„ Zdd„ Zd4dd„Zddœdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd5d*d+„Zd6d,d-„Z d.d/„ Z!d0d1„ Z"d2d3„ Z#dS )7é    Né   )Úcsr_mean_variance_axis0Úcsc_mean_variance_axis0Úincr_mean_variance_axis0é   )Ú_check_sample_weightc                 C   s,   t  | ¡r| jnt| ƒ}d| }t|ƒ‚dS )z2Raises a TypeError if X is not a CSR or CSC matrixz,Expected a CSR or CSC sparse matrix, got %s.N)ÚspÚissparseÚformatÚtypeÚ	TypeError)ÚXÚ
input_typeÚerr© r   úV/var/www/website-v5/atlas_env/lib/python3.8/site-packages/sklearn/utils/sparsefuncs.pyÚ_raise_typeerror   s    r   c                 C   s   | dkrt d|  ƒ‚d S )N)r   r   z8Unknown axis value: %d. Use 0 for rows, or 1 for columns)Ú
ValueError©Úaxisr   r   r   Ú_raise_error_wrong_axis   s    ÿr   c                 C   s6   |j d | j d kst‚|  j|j| jdd�9  _dS )a
  Inplace column scaling of a CSR matrix.

    Scale each feature of the data matrix by multiplying with specific scale
    provided by the caller assuming a (n_samples, n_features) shape.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Matrix to normalize using the variance of the features.
        It should be of CSR format.

    scale : ndarray of shape (n_features,), dtype={np.float32, np.float64}
        Array of precomputed feature-wise values to use for scaling.
    r   r   Úclip)ÚmodeN)ÚshapeÚAssertionErrorÚdataÚtakeÚindices©r   Úscaler   r   r   Úinplace_csr_column_scale   s    r    c                 C   s:   |j d | j d kst‚|  jt |t | j¡¡9  _dS )aÂ  Inplace row scaling of a CSR matrix.

    Scale each sample of the data matrix by multiplying with specific scale
    provided by the caller assuming a (n_samples, n_features) shape.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Matrix to be scaled. It should be of CSR format.

    scale : ndarray of float of shape (n_samples,)
        Array of precomputed sample-wise values to use for scaling.
    r   N)r   r   r   ÚnpÚrepeatÚdiffÚindptrr   r   r   r   Úinplace_csr_row_scale2   s    r%   Fc                 C   s|   t |ƒ t| tjƒr<|dkr*t| ||d�S t| j||d�S n<t| tjƒrp|dkr^t| ||d�S t| j||d�S nt| ƒ dS )a4  Compute mean and variance along an axis on a CSR or CSC matrix.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Input data. It can be of CSR or CSC format.

    axis : {0, 1}
        Axis along which the axis should be computed.

    weights : ndarray of shape (n_samples,) or (n_features,), default=None
        If axis is set to 0 shape is (n_samples,) or
        if axis is set to 1 shape is (n_features,).
        If it is set to None, then samples are equally weighted.

        .. versionadded:: 0.24

    return_sum_weights : bool, default=False
        If True, returns the sum of weights seen for each feature
        if `axis=0` or each sample if `axis=1`.

        .. versionadded:: 0.24

    Returns
    -------

    means : ndarray of shape (n_features,), dtype=floating
        Feature-wise means.

    variances : ndarray of shape (n_features,), dtype=floating
        Feature-wise variances.

    sum_weights : ndarray of shape (n_features,), dtype=floating
        Returned if `return_sum_weights` is `True`.
    r   )ÚweightsÚreturn_sum_weightsN)	r   Ú
isinstancer   Ú
csr_matrixÚ_csr_mean_var_axis0Ú_csc_mean_var_axis0ÚTÚ
csc_matrixr   )r   r   r&   r'   r   r   r   Úmean_variance_axisD   s4    $  ÿ  ÿ  ÿ  ÿr.   )r&   c                C   s(  t |ƒ t| tjtjfƒs"t| ƒ t |¡dkrDtj|j	||j
d�}t |¡t |¡  krjt |¡kstn tdƒ‚|dkr´t |¡| j	d krêtd| j	d › dt |¡› d�ƒ‚n6t |¡| j	d krêtd| j	d › dt |¡› d�ƒ‚|dkrø| jn| } |d	k	�rt|| | j
d�}t| ||||d
�S )a7	  Compute incremental mean and variance along an axis on a CSR or CSC matrix.

    last_mean, last_var are the statistics computed at the last step by this
    function. Both must be initialized to 0-arrays of the proper size, i.e.
    the number of features in X. last_n is the number of samples encountered
    until now.

    Parameters
    ----------
    X : CSR or CSC sparse matrix of shape (n_samples, n_features)
        Input data.

    axis : {0, 1}
        Axis along which the axis should be computed.

    last_mean : ndarray of shape (n_features,) or (n_samples,), dtype=floating
        Array of means to update with the new data X.
        Should be of shape (n_features,) if axis=0 or (n_samples,) if axis=1.

    last_var : ndarray of shape (n_features,) or (n_samples,), dtype=floating
        Array of variances to update with the new data X.
        Should be of shape (n_features,) if axis=0 or (n_samples,) if axis=1.

    last_n : float or ndarray of shape (n_features,) or (n_samples,),             dtype=floating
        Sum of the weights seen so far, excluding the current weights
        If not float, it should be of shape (n_features,) if
        axis=0 or (n_samples,) if axis=1. If float it corresponds to
        having same weights for all samples (or features).

    weights : ndarray of shape (n_samples,) or (n_features,), default=None
        If axis is set to 0 shape is (n_samples,) or
        if axis is set to 1 shape is (n_features,).
        If it is set to None, then samples are equally weighted.

        .. versionadded:: 0.24

    Returns
    -------
    means : ndarray of shape (n_features,) or (n_samples,), dtype=floating
        Updated feature-wise means if axis = 0 or
        sample-wise means if axis = 1.

    variances : ndarray of shape (n_features,) or (n_samples,), dtype=floating
        Updated feature-wise variances if axis = 0 or
        sample-wise variances if axis = 1.

    n : ndarray of shape (n_features,) or (n_samples,), dtype=integral
        Updated number of seen samples per feature if axis=0
        or number of seen features per sample if axis=1.

        If weights is not None, n is a sum of the weights of the seen
        samples or features instead of the actual number of seen
        samples or features.

    Notes
    -----
    NaNs are ignored in the algorithm.
    r   )Údtypez8last_mean, last_var, last_n do not have the same shapes.r   zHIf axis=1, then last_mean, last_n, last_var should be of size n_samples z (Got z).zIIf axis=0, then last_mean, last_n, last_var should be of size n_features N)Ú	last_meanÚlast_varÚlast_nr&   )r   r(   r   r)   r-   r   r!   ÚsizeÚfullr   r/   r   r,   r   Ú_incr_mean_var_axis0)r   r   r0   r1   r2   r&   r   r   r   Úincr_mean_variance_axis€   s4    <(ÿÿ
    ÿr6   c                 C   s>   t | tjƒrt| j|ƒ n t | tjƒr2t| |ƒ nt| ƒ dS )a  Inplace column scaling of a CSC/CSR matrix.

    Scale each feature of the data matrix by multiplying with specific scale
    provided by the caller assuming a (n_samples, n_features) shape.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Matrix to normalize using the variance of the features. It should be
        of CSC or CSR format.

    scale : ndarray of shape (n_features,), dtype={np.float32, np.float64}
        Array of precomputed feature-wise values to use for scaling.
    N)r(   r   r-   r%   r,   r)   r    r   r   r   r   r   Úinplace_column_scaleÞ   s
    r7   c                 C   s>   t | tjƒrt| j|ƒ n t | tjƒr2t| |ƒ nt| ƒ dS )aå  Inplace row scaling of a CSR or CSC matrix.

    Scale each row of the data matrix by multiplying with specific scale
    provided by the caller assuming a (n_samples, n_features) shape.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Matrix to be scaled. It should be of CSR or CSC format.

    scale : ndarray of shape (n_features,), dtype={np.float32, np.float64}
        Array of precomputed sample-wise values to use for scaling.
    N)r(   r   r-   r    r,   r)   r%   r   r   r   r   r   Úinplace_row_scaleõ   s
    r8   c                 C   sv   ||fD ]}t |tjƒrtdƒ‚q|dk r8|| jd 7 }|dk rN|| jd 7 }| j|k}|| j| j|k< || j|< dS )aK  Swap two rows of a CSC matrix in-place.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Matrix whose two rows are to be swapped. It should be of
        CSC format.

    m : int
        Index of the row of X to be swapped.

    n : int
        Index of the row of X to be swapped.
    ú m and n should be valid integersr   N)r(   r!   Úndarrayr   r   r   )r   ÚmÚnÚtZm_maskr   r   r   Úinplace_swap_row_csc  s    

r>   c              	   C   sx  ||fD ]}t |tjƒrtdƒ‚q|dk r8|| jd 7 }|dk rN|| jd 7 }||kr`|| }}| j}|| }||d  }|| }||d  }|| }	|| }
|	|
krä| j|d |…  |
|	 7  < ||
 | j|d < ||	 | j|< t | jd|… | j||… | j||… | j||… | j|d… g¡| _t | jd|… | j||… | j||… | j||… | j|d… g¡| _dS )aK  Swap two rows of a CSR matrix in-place.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Matrix whose two rows are to be swapped. It should be of
        CSR format.

    m : int
        Index of the row of X to be swapped.

    n : int
        Index of the row of X to be swapped.
    r9   r   r   r   N)	r(   r!   r:   r   r   r$   Úconcatenater   r   )r   r;   r<   r=   r$   Úm_startZm_stopÚn_startZn_stopZnz_mZnz_nr   r   r   Úinplace_swap_row_csr(  sH    

ûÿ	ûÿrB   c                 C   s@   t | tjƒrt| ||ƒ n"t | tjƒr4t| ||ƒ nt| ƒ dS )a[  
    Swap two rows of a CSC/CSR matrix in-place.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Matrix whose two rows are to be swapped. It should be of CSR or
        CSC format.

    m : int
        Index of the row of X to be swapped.

    n : int
        Index of the row of X to be swapped.
    N)r(   r   r-   r>   r)   rB   r   ©r   r;   r<   r   r   r   Úinplace_swap_rowg  s
    rD   c                 C   sl   |dk r|| j d 7 }|dk r,|| j d 7 }t| tjƒrFt| ||ƒ n"t| tjƒr`t| ||ƒ nt| ƒ dS )ag  
    Swap two columns of a CSC/CSR matrix in-place.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Matrix whose two columns are to be swapped. It should be of
        CSR or CSC format.

    m : int
        Index of the column of X to be swapped.

    n : int
        Index of the column of X to be swapped.
    r   r   N)r   r(   r   r-   rB   r)   r>   r   rC   r   r   r   Úinplace_swap_column  s    rE   c                 C   sL   t  t  | j¡¡}t| ƒ| j| j| jf| jd�} | | j| j| ¡}||fS )N)r   )	r!   Úflatnonzeror#   r$   r   r   r   r   Úreduceat)r   ÚufuncÚmajor_indexÚvaluer   r   r   Ú_minor_reduce›  s    rK   c                 C   s   | j | }|dkrtdƒ‚| j d|  }|dkr8|  ¡ n|  ¡ }| ¡  t||ƒ\}}t |j¡| |k }||| dƒ||< |dk}	t 	|	|¡}t 	|	|¡}|dkrÎt
j|t t|ƒ¡|ff| jd|fd�}
n(t
j||t t|ƒ¡ff| j|dfd�}
|
j ¡ S )Nr   ú&zero-size array to reduction operationr   )r/   r   )r   r   ÚtocscÚtocsrÚsum_duplicatesrK   r!   r#   r$   Úcompressr   Ú
coo_matrixÚzerosÚlenr/   ÚAÚravel)r   r   Ú
min_or_maxÚNÚMÚmatrI   rJ   Únot_fullÚmaskÚresr   r   r   Ú_min_or_max_axis¦  s0    
  ÿ  ÿr]   c                 C   sœ   |d krdd| j krtdƒ‚| j d¡}| jdkr4|S | | j ¡ ¡}| jt 	| j ¡kr`|||ƒ}|S |dk rt|d7 }|dks„|dkr�t
| ||ƒS tdƒ‚d S )Nr   rL   r   r   z.invalid axis, use 0 for rows, or 1 for columns)r   r   r/   r   ÚnnzÚreducer   rU   r!   Úproductr]   )r   r   rV   Úzeror;   r   r   r   Ú_sparse_min_or_max¿  s    


rb   c                 C   s   t | |tjƒt | |tjƒfS ©N)rb   r!   ÚminimumÚmaximum©r   r   r   r   r   Ú_sparse_min_maxÒ  s    þrg   c                 C   s   t | |tjƒt | |tjƒfS rc   )rb   r!   ÚfminÚfmaxrf   r   r   r   Ú_sparse_nan_min_maxÙ  s    rj   c                 C   s<   t | tjtjfƒr0|r"t| |d�S t| |d�S nt| ƒ dS )až  Compute minimium and maximum along an axis on a CSR or CSC matrix.

     Optionally ignore NaN values.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Input data. It should be of CSR or CSC format.

    axis : {0, 1}
        Axis along which the axis should be computed.

    ignore_nan : bool, default=False
        Ignore or passing through NaN values.

        .. versionadded:: 0.20

    Returns
    -------

    mins : ndarray of shape (n_features,), dtype={np.float32, np.float64}
        Feature-wise minima.

    maxs : ndarray of shape (n_features,), dtype={np.float32, np.float64}
        Feature-wise maxima.
    r   N)r(   r   r)   r-   rj   rg   r   )r   r   Z
ignore_nanr   r   r   Úmin_max_axisÝ  s
    rk   c                 C   sö   |dkrd}n(|dkrd}n| j dkr6td  | j ¡ƒ‚|dkrb|dkrL| jS t t | j¡|¡S n�|dkr�t | j¡}|dkrˆ| d¡S || S |dkrä|dkr¶tj| j	| j
d d	�S t |t | j¡¡}tj| j	| j
d |d
�S ntd  |¡ƒ‚dS )a¾  A variant of X.getnnz() with extension to weighting on axis 0.

    Useful in efficiently calculating multilabel metrics.

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_labels)
        Input data. It should be of CSR format.

    axis : {0, 1}, default=None
        The axis on which the data is aggregated.

    sample_weight : array-like of shape (n_samples,), default=None
        Weight for each row of X.

    Returns
    -------
    nnz : int, float, ndarray of shape (n_samples,) or ndarray of shape (n_features,)
        Number of non-zero values in the array along a given axis. Otherwise,
        the total number of non-zero values in the array is returned.
    éÿÿÿÿr   éþÿÿÿr   Úcsrz#Expected CSR sparse format, got {0}NÚintp)Ú	minlength)rp   r&   zUnsupported axis: {0})r
   r   r^   r!   Údotr#   r$   ÚastypeÚbincountr   r   r"   r   )r   r   Úsample_weightÚoutr&   r   r   r   Úcount_nonzero  s*    

rv   c                 C   sp   t | ƒ| }|stjS t | dk ¡}t|dƒ\}}|  ¡  |rLt|| ||ƒS t|d | ||ƒt|| ||ƒ d S )z”Compute the median of data with n_zeros additional zeros.

    This function is used to support sparse matrices; it modifies data
    in-place.
    r   r   r   g       @)rS   r!   Únanrv   ÚdivmodÚsortÚ_get_elem_at_rank)r   Ún_zerosZn_elemsÚ
n_negativeÚmiddleZis_oddr   r   r   Ú_get_median7  s    ÿýr~   c                 C   s,   | |k r||  S | | |k r dS || |  S )z@Find the value in data augmented with n_zeros for the given rankr   r   )Úrankr   r|   r{   r   r   r   rz   M  s
    rz   c           
      C   s�   t | tjƒstd| j ƒ‚| j}| j\}}t |¡}t	t
|dd… |dd… ƒƒD ]8\}\}}t | j||… ¡}||j }	t||	ƒ||< qR|S )aC  Find the median across axis 0 of a CSC matrix.

    It is equivalent to doing np.median(X, axis=0).

    Parameters
    ----------
    X : sparse matrix of shape (n_samples, n_features)
        Input data. It should be of CSC format.

    Returns
    -------
    median : ndarray of shape (n_features,)
        Median.
    z%Expected matrix of CSC format, got %sNrl   r   )r(   r   r-   r   r
   r$   r   r!   rR   Ú	enumerateÚzipÚcopyr   r3   r~   )
r   r$   Ú	n_samplesÚ
n_featuresÚmedianZf_indÚstartÚendr   Únzr   r   r   Úcsc_median_axis_0V  s    

*
r‰   )NF)F)NN)$Úscipy.sparseÚsparser   Únumpyr!   Úsparsefuncs_fastr   r*   r   r+   r   r5   Úutils.validationr   r   r   r    r%   r.   r6   r7   r8   r>   rB   rD   rE   rK   r]   rb   rg   rj   rk   rv   r~   rz   r‰   r   r   r   r   Ú<module>   s2   
<^?
$
6	