Ë
    êÿæisa  ã                   óü   — d Z ddlZddlZddlmZ ddlmZ ddl	m
Z
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d„ Zd„ Zd„ Zdd„Zddœd„Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!dd„Z"d d„Z#d„ Z$d„ Z%d„ Z&d„ Z'd!d„Z(y)"zBA collection of utilities to work with sparse matrices and arrays.é    N)ÚLinearOperator)Ú_sparse_min_maxÚ_sparse_nan_min_max)Úcsc_mean_variance_axis0)Úcsr_matmul_csr_to_dense)Úcsr_mean_variance_axis0)Úincr_mean_variance_axis0)Ú_check_sample_weightc                 óz   — t        j                  | «      r| j                  n
t        | «      }d|z  }t	        |«      ‚)z2Raises a TypeError if X is not a CSR or CSC matrixz,Expected a CSR or CSC sparse matrix, got %s.)ÚspÚissparseÚformatÚtypeÚ	TypeError)ÚXÚ
input_typeÚerrs      ún/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/sklearn/utils/sparsefuncs.pyÚ_raise_typeerrorr      s/   € äŸ[™[¨œ^�—’´°a³€JØ
8¸:Ñ
E€CÜ
�C‹.Ðó    c                 ó(   — | dvrt        d| z  «      ‚y )N)r   é   z8Unknown axis value: %d. Use 0 for rows, or 1 for columns)Ú
ValueError©Úaxiss    r   Ú_raise_error_wrong_axisr   #   s$   € Ø�6ÑÜØFÈÑMó
ð 	
ð r   c                 ó¦   — |j                   d   | j                   d   k(  sJ ‚| xj                  |j                  | j                  d¬«      z  c_        y)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.

    Examples
    --------
    >>> from sklearn.utils import sparsefuncs
    >>> from scipy import sparse
    >>> import numpy as np
    >>> indptr = np.array([0, 3, 4, 4, 4])
    >>> indices = np.array([0, 1, 2, 2])
    >>> data = np.array([8, 1, 2, 5])
    >>> scale = np.array([2, 3, 2])
    >>> csr = sparse.csr_matrix((data, indices, indptr))
    >>> csr.todense()
    matrix([[8, 1, 2],
            [0, 0, 5],
            [0, 0, 0],
            [0, 0, 0]])
    >>> sparsefuncs.inplace_csr_column_scale(csr, scale)
    >>> csr.todense()
    matrix([[16,  3,  4],
            [ 0,  0, 10],
            [ 0,  0,  0],
            [ 0,  0,  0]])
    r   r   Úclip)ÚmodeN)ÚshapeÚdataÚtakeÚindices©r   Úscales     r   Úinplace_csr_column_scaler&   *   sB   € ðJ �;‰;�q‰>˜QŸW™W Q™ZÒ'Ð'Ð'Ø‡F‚Fˆe�j‰j˜Ÿ™¨ˆjÓ0Ñ0†Fr   c                 óÒ   — |j                   d   | j                   d   k(  sJ ‚| xj                  t        j                  |t        j                  | j
                  «      «      z  c_        y)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!   ÚnpÚrepeatÚdiffÚindptrr$   s     r   Úinplace_csr_row_scaler,   S   sH   € ð �;‰;�q‰>˜QŸW™W Q™ZÒ'Ð'Ð'Ø‡F‚FŒb�i‰i˜œrŸw™w q§x¡xÓ0Ó1Ñ1†Fr   c                 ól  — t        |«       t        j                  | «      r:| j                  dk(  r+|dk(  rt	        | ||¬«      S t        | j                  ||¬«      S t        j                  | «      r:| j                  dk(  r+|dk(  rt        | ||¬«      S t	        | j                  ||¬«      S t        | «       y)a{  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`.

    Examples
    --------
    >>> from sklearn.utils import sparsefuncs
    >>> from scipy import sparse
    >>> import numpy as np
    >>> indptr = np.array([0, 3, 4, 4, 4])
    >>> indices = np.array([0, 1, 2, 2])
    >>> data = np.array([8, 1, 2, 5])
    >>> scale = np.array([2, 3, 2])
    >>> csr = sparse.csr_matrix((data, indices, indptr))
    >>> csr.todense()
    matrix([[8, 1, 2],
            [0, 0, 5],
            [0, 0, 0],
            [0, 0, 0]])
    >>> sparsefuncs.mean_variance_axis(csr, axis=0)
    (array([2.  , 0.25, 1.75]), array([12.    ,  0.1875,  4.1875]))
    Úcsrr   )ÚweightsÚreturn_sum_weightsÚcscN)r   r   r   r   Ú_csr_mean_var_axis0Ú_csc_mean_var_axis0ÚTr   )r   r   r/   r0   s       r   Úmean_variance_axisr5   e   s³   € ôl ˜DÔ!ä	‡{�{�1„~˜!Ÿ(™( eÒ+Ø�1Š9Ü&Ø˜7Ð7Iôð ô 'Ø—‘˜WÐ9Kôð ô 
�‰�QŒ˜AŸH™H¨Ò-Ø�1Š9Ü&Ø˜7Ð7Iôð ô 'Ø—‘˜WÐ9Kôð ô 	˜Õr   )r/   c                ó’  — t        |«       t        j                  | «      r| j                  dv st	        | «       t        j                  |«      dk(  r,t        j                  |j                  ||j                  ¬«      }t        j                  |«      t        j                  |«      cxk(  r"t        j                  |«      k(  st        d«      ‚ t        d«      ‚|dk(  rWt        j                  |«      | j                  d   k7  r‰t        d| j                  d   › dt        j                  |«      › d�«      ‚t        j                  |«      | j                  d   k7  r2t        d	| j                  d   › dt        j                  |«      › d�«      ‚|dk(  r| j                  n| } |�t        || | j                  ¬«      }t        | ||||¬
«      S )aâ  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.

    Examples
    --------
    >>> from sklearn.utils import sparsefuncs
    >>> from scipy import sparse
    >>> import numpy as np
    >>> indptr = np.array([0, 3, 4, 4, 4])
    >>> indices = np.array([0, 1, 2, 2])
    >>> data = np.array([8, 1, 2, 5])
    >>> scale = np.array([2, 3, 2])
    >>> csr = sparse.csr_matrix((data, indices, indptr))
    >>> csr.todense()
    matrix([[8, 1, 2],
            [0, 0, 5],
            [0, 0, 0],
            [0, 0, 0]])
    >>> sparsefuncs.incr_mean_variance_axis(
    ...     csr, axis=0, last_mean=np.zeros(3), last_var=np.zeros(3), last_n=2
    ... )
    (array([1.33, 0.167, 1.17]), array([8.88, 0.139, 3.47]),
    array([6., 6., 6.]))
    ©r1   r.   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 )Ú	last_meanÚlast_varÚlast_nr/   )r   r   r   r   r   r(   ÚsizeÚfullr    r9   r   r4   r
   Ú_incr_mean_var_axis0)r   r   r:   r;   r<   r/   s         r   Úincr_mean_variance_axisr@   ³   s†  € ôb ˜DÔ!ä�K‰K˜ŒN˜qŸx™x¨>Ñ9Ü˜Ôä	‡w�wˆvƒ˜!ÒÜ—‘˜Ÿ™¨&¸	¿¹ÔHˆä�G‰G�IÓ¤"§'¡'¨(Ó"3ÔF´r·w±w¸v³ÒFÜÐSÓTÐTð GÜÐSÓTÐTàˆq‚yÜ�7‰7�9Ó §¡¨¡Ò+Üð"Ø"#§'¡'¨!¡* ¨V´B·G±G¸IÓ4FÐ3GÀrðKóð ô
 �7‰7�9Ó §¡¨¡Ò+Üð#Ø#$§7¡7¨1¡: ,¨f´R·W±W¸YÓ5GÐ4HÈðLóð ð
 �qŠyˆ�Š˜a€AàÐÜ& w°¸¿¹ÔAˆäØ	�Y¨¸&È'ôð r   c                 óò   — t        j                  | «      r&| j                  dk(  rt        | j                  |«       yt        j                  | «      r| j                  dk(  rt        | |«       yt        | «       y)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.

    Examples
    --------
    >>> from sklearn.utils import sparsefuncs
    >>> from scipy import sparse
    >>> import numpy as np
    >>> indptr = np.array([0, 3, 4, 4, 4])
    >>> indices = np.array([0, 1, 2, 2])
    >>> data = np.array([8, 1, 2, 5])
    >>> scale = np.array([2, 3, 2])
    >>> csr = sparse.csr_matrix((data, indices, indptr))
    >>> csr.todense()
    matrix([[8, 1, 2],
            [0, 0, 5],
            [0, 0, 0],
            [0, 0, 0]])
    >>> sparsefuncs.inplace_column_scale(csr, scale)
    >>> csr.todense()
    matrix([[16,  3,  4],
            [ 0,  0, 10],
            [ 0,  0,  0],
            [ 0,  0,  0]])
    r1   r.   N)r   r   r   r,   r4   r&   r   r$   s     r   Úinplace_column_scalerB   &  sQ   € ôJ 
‡{�{�1„~˜!Ÿ(™( eÒ+Ü˜aŸc™c 5Õ)Ü	�‰�QŒ˜AŸH™H¨Ò-Ü   EÕ*ä˜Õr   c                 óò   — t        j                  | «      r&| j                  dk(  rt        | j                  |«       yt        j                  | «      r| j                  dk(  rt        | |«       yt        | «       y)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.

    Examples
    --------
    >>> from sklearn.utils import sparsefuncs
    >>> from scipy import sparse
    >>> import numpy as np
    >>> indptr = np.array([0, 2, 3, 4, 5])
    >>> indices = np.array([0, 1, 2, 3, 3])
    >>> data = np.array([8, 1, 2, 5, 6])
    >>> scale = np.array([2, 3, 4, 5])
    >>> csr = sparse.csr_matrix((data, indices, indptr))
    >>> csr.todense()
    matrix([[8, 1, 0, 0],
            [0, 0, 2, 0],
            [0, 0, 0, 5],
            [0, 0, 0, 6]])
    >>> sparsefuncs.inplace_row_scale(csr, scale)
    >>> csr.todense()
     matrix([[16,  2,  0,  0],
             [ 0,  0,  6,  0],
             [ 0,  0,  0, 20],
             [ 0,  0,  0, 30]])
    r1   r.   N)r   r   r   r&   r4   r,   r   r$   s     r   Úinplace_row_scalerD   S  sQ   € ôH 
‡{�{�1„~˜!Ÿ(™( eÒ+Ü  §¡ eÕ,Ü	�‰�QŒ˜AŸH™H¨Ò-Ü˜a Õ'ä˜Õr   c                 ó0  — ||fD ]'  }t        |t        j                  «      sŒt        d«      ‚ |dk  r|| j                  d   z  }|dk  r|| j                  d   z  }| j
                  |k(  }|| j
                  | j
                  |k(  <   || j
                  |<   y)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)Ú
isinstancer(   Úndarrayr   r    r#   )r   ÚmÚnÚtÚm_masks        r   Úinplace_swap_row_cscrM     s�   € ð �‹VˆÜ�aœŸ™Õ$ÜÐ>Ó?Ð?ð ð 	ˆ1‚uØ	ˆQ�W‰W�Q‰Z‰ˆØˆ1‚uØ	ˆQ�W‰W�Q‰Z‰ˆà�Y‰Y˜!‰^€FØ !€A‡I�Iˆa�i‰i˜1‰nÑØ€A‡I�IˆfÒr   c           	      óB  — ||fD ]'  }t        |t        j                  «      sŒt        d«      ‚ |dk  r|| j                  d   z  }|dk  r|| j                  d   z  }||kD  r||}}| j
                  }||   }||dz      }||   }||dz      }||z
  }	||z
  }
|	|
k7  rE| j
                  |dz   |xxx |
|	z
  z  ccc ||
z   | j
                  |dz   <   ||	z
  | j
                  |<   t        j                  | j                  d| | j                  || | j                  || | j                  || | j                  |d g«      | _        t        j                  | j                  d| | j                  || | j                  || | j                  || | j                  |d g«      | _        y)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.
    rF   r   r   é   N)	rG   r(   rH   r   r    r+   Úconcatenater#   r!   )r   rI   rJ   rK   r+   Úm_startÚm_stopÚn_startÚn_stopÚnz_mÚnz_ns              r   Úinplace_swap_row_csrrW   œ  s»  € ð �‹VˆÜ�aœŸ™Õ$ÜÐ>Ó?Ð?ð ð 	ˆ1‚uØ	ˆQ�W‰W�Q‰Z‰ˆØˆ1‚uØ	ˆQ�W‰W�Q‰Z‰ˆð 	ˆ1‚uØ�!ˆ1ˆà�X‰X€FØ�Q‰i€GØ�A˜‘E‰]€FØ�Q‰i€GØ�A˜‘E‰]€FØ�GÑ€DØ�GÑ€Dàˆt‚|à	�‰��Q‘˜Ó˜t d™{Ñ*ÓØ! D™.ˆ�‰��Q‘‰Ø˜t‘mˆ�‰�‰ä—‘à�I‰I�h�wÐØ�I‰I�g˜fÐ%Ø�I‰I�f˜WÐ%Ø�I‰I�g˜fÐ%Ø�I‰I�f�gÐð	
ó€A„Iô �^‰^à�F‰F�8�GÐØ�F‰F�7˜6Ð"Ø�F‰F�6˜'Ð"Ø�F‰F�7˜6Ð"Ø�F‰F�6�7ˆOð	
ó€A…Fr   c                 óâ   — t        j                  | «      r| j                  dk(  rt        | ||«       yt        j                  | «      r| j                  dk(  rt	        | ||«       yt        | «       y)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.

    Examples
    --------
    >>> from sklearn.utils import sparsefuncs
    >>> from scipy import sparse
    >>> import numpy as np
    >>> indptr = np.array([0, 2, 3, 3, 3])
    >>> indices = np.array([0, 2, 2])
    >>> data = np.array([8, 2, 5])
    >>> csr = sparse.csr_matrix((data, indices, indptr))
    >>> csr.todense()
    matrix([[8, 0, 2],
            [0, 0, 5],
            [0, 0, 0],
            [0, 0, 0]])
    >>> sparsefuncs.inplace_swap_row(csr, 0, 1)
    >>> csr.todense()
    matrix([[0, 0, 5],
            [8, 0, 2],
            [0, 0, 0],
            [0, 0, 0]])
    r1   r.   N)r   r   r   rM   rW   r   ©r   rI   rJ   s      r   Úinplace_swap_rowrZ   Û  sQ   € ôJ 
‡{�{�1„~˜!Ÿ(™( eÒ+Ü˜Q  1Õ%Ü	�‰�QŒ˜AŸH™H¨Ò-Ü˜Q  1Õ%ä˜Õr   c                 ó>  — |dk  r|| j                   d   z  }|dk  r|| j                   d   z  }t        j                  | «      r| j                  dk(  rt	        | ||«       yt        j                  | «      r| j                  dk(  rt        | ||«       yt        | «       y)a²  
    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.

    Examples
    --------
    >>> from sklearn.utils import sparsefuncs
    >>> from scipy import sparse
    >>> import numpy as np
    >>> indptr = np.array([0, 2, 3, 3, 3])
    >>> indices = np.array([0, 2, 2])
    >>> data = np.array([8, 2, 5])
    >>> csr = sparse.csr_matrix((data, indices, indptr))
    >>> csr.todense()
    matrix([[8, 0, 2],
            [0, 0, 5],
            [0, 0, 0],
            [0, 0, 0]])
    >>> sparsefuncs.inplace_swap_column(csr, 0, 1)
    >>> csr.todense()
    matrix([[0, 8, 2],
            [0, 0, 5],
            [0, 0, 0],
            [0, 0, 0]])
    r   r   r1   r.   N)r    r   r   r   rW   rM   r   rY   s      r   Úinplace_swap_columnr\     s�   € ðJ 	ˆ1‚uØ	ˆQ�W‰W�Q‰Z‰ˆØˆ1‚uØ	ˆQ�W‰W�Q‰Z‰ˆÜ	‡{�{�1„~˜!Ÿ(™( eÒ+Ü˜Q  1Õ%Ü	�‰�QŒ˜AŸH™H¨Ò-Ü˜Q  1Õ%ä˜Õr   c                 ó˜   — t        j                  | «      r*| j                  dv r|rt        | |¬«      S t	        | |¬«      S t        | «       y)a�  Compute minimum 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.   r1   r   N)r   r   r   r   r   r   )r   r   Ú
ignore_nans      r   Úmin_max_axisr_   9  s?   € ô6 
‡{�{�1„~˜!Ÿ(™( nÑ4ÙÜ& q¨tÔ4Ð4ä" 1¨4Ô0Ð0ä˜Õr   c                 óè  — |dk(  rd}n;|dk(  rd}n3| j                   dk7  r$t        dj                  | j                   «      «      ‚|€A|€| j                  S t        j                  t        j
                  | j                  «      |«      S |dk(  r7t        j
                  | j                  «      }|€|j                  d«      S ||z  S |dk(  r’|€.t        j                  | j                  | j                  d   ¬«      S t        j                  |t        j
                  | j                  «      «      }t        j                  | j                  | j                  d   |¬	«      S t        d
j                  |«      «      ‚)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   r.   z#Expected CSR sparse format, got {0}Úintp)Ú	minlength)rd   r/   zUnsupported axis: {0})r   r   Únnzr(   Údotr*   r+   ÚastypeÚbincountr#   r    r)   r   )r   r   Úsample_weightÚoutr/   s        r   Úcount_nonzerork   ]  s-  € ð, ˆr‚zØ‰Ø	�ŠØ‰Ø	
�‰�UÒ	ÜÐ=×DÑDÀQÇXÁXÓNÓOÐOð €|ØÐ Ø—5‘5ˆLä—6‘6œ"Ÿ'™' !§(¡(Ó+¨]Ó;Ð;Ø	�ŠÜ�g‰g�a—h‘hÓˆØÐ à—:‘:˜fÓ%Ð%Ø�]Ñ"Ð"Ø	�ŠØÐ Ü—;‘;˜qŸy™y°A·G±G¸A±JÔ?Ð?ä—i‘i ¬r¯w©w°q·x±xÓ/@ÓAˆGÜ—;‘;˜qŸy™y°A·G±G¸A±JÈÔPÐPäÐ0×7Ñ7¸Ó=Ó>Ð>r   c                 ó  — t        | «      |z   }|st        j                  S t        j                  | dk  «      }t	        |d«      \  }}| j                  «        |rt        || ||«      S t        |dz
  | ||«      t        || ||«      z   dz  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   rO   r   g       @)Úlenr(   Únanrk   ÚdivmodÚsortÚ_get_elem_at_rank)r!   Ún_zerosÚn_elemsÚ
n_negativeÚmiddleÚis_odds         r   Ú_get_medianrw   “  s“   € ô �$‹i˜'Ñ!€GÙÜ�v‰vˆÜ×!Ñ! $¨¡(Ó+€JÜ˜G QÓ'�N€FˆFØ‡I�I„KáÜ  ¨¨z¸7ÓCÐCô 	˜& 1™* d¨J¸Ó@Ü
˜F D¨*°gÓ
>ñ	?àñð r   c                 ó8   — | |k  r||    S | |z
  |k  ry|| |z
     S )z@Find the value in data augmented with n_zeros for the given rankr   © )Úrankr!   rt   rr   s       r   rq   rq   ©  s3   € àˆjÒØ�D‰zÐØˆjÑ˜7Ò"ØØ��w‘ÑÐr   c                 ó°  — t        j                  | «      r| j                  dk(  st        d| j                  z  «      ‚| j                  }| j
                  \  }}t        j                  |«      }t        t        j                  |«      «      D ]H  \  }\  }}t        j                  | j                  || «      }||j                  z
  }	t        ||	«      ||<   ŒJ |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.
    r1   z%Expected matrix of CSC format, got %s)r   r   r   r   r+   r    r(   ÚzerosÚ	enumerateÚ	itertoolsÚpairwiseÚcopyr!   r=   rw   )
r   r+   Ú	n_samplesÚ
n_featuresÚmedianÚf_indÚstartÚendr!   Únzs
             r   Úcsc_median_axis_0rˆ   ²  s¶   € ô �K‰K˜ŒN˜qŸx™x¨5Ò0ÜÐ?À!Ç(Á(ÑJÓKÐKà�X‰X€FØŸG™GÑ€IˆzÜ�X‰X�jÓ!€Fä(¬×);Ñ);¸FÓ)CÖDÑˆ‰|��sä�w‰w�q—v‘v˜e CÐ(Ó)ˆØ˜Ÿ™Ñ"ˆÜ# D¨"Ó-ˆˆuŠð	  Eð €Mr   c                 óœ   ‡ ‡‡— ‰ddd…f   Š‰ j                   Št        ˆ ˆfd„ˆ ˆfd„ˆˆfd„ˆˆfd„‰ j                  ‰ j                  ¬«      S )aA  Create an implicitly offset linear operator.

    This is used by PCA on sparse data to avoid densifying the whole data
    matrix.

    Params
    ------
        X : sparse matrix of shape (n_samples, n_features)
        offset : ndarray of shape (n_features,)

    Returns
    -------
    centered : LinearOperator
    Nc                 ó   •— ‰| z  ‰| z  z
  S ©Nry   ©Úxr   Úoffsets    €€r   Ú<lambda>z)_implicit_column_offset.<locals>.<lambda>ã  ó   ø€ ˜˜Q™ ¨!¡Ò+r   c                 ó   •— ‰| z  ‰| z  z
  S r‹   ry   rŒ   s    €€r   r�   z)_implicit_column_offset.<locals>.<lambda>ä  r�   r   c                 ó6   •— ‰| z  ‰| j                  «       z  z
  S r‹   )Úsum©r�   ÚXTrŽ   s    €€r   r�   z)_implicit_column_offset.<locals>.<lambda>å  s   ø€ ˜"˜q™& F¨Q¯U©U«WÑ$4Ò5r   c                 ó\   •— ‰| z  ‰j                   | j                  d¬«      d d d …f   z  z
  S )Nr   r   )r4   r“   r”   s    €€r   r�   z)_implicit_column_offset.<locals>.<lambda>æ  s*   ø€ ˜"˜q™& 6§8¡8¨a¯e©e¸¨e«m¸DÂ!¸GÑ.DÑ#DÒDr   )ÚmatvecÚmatmatÚrmatvecÚrmatmatr9   r    )r4   r   r9   r    )r   rŽ   r•   s   ``@r   Ú_implicit_column_offsetr›   Ñ  sB   ú€ ð �Dš!�G‰_€FØ	
�‰€BÜÜ+Ü+Ü5ÜDØ�g‰gØ�g‰gôð r   c                 ó@  — t        j                  | «      r| j                  dv r| j                  dk(  st	        d«      ‚t        j                  |«      r|j                  dv r|j                  dk(  st	        d«      ‚| j
                  d   |j
                  d   k7  r.d| j
                  d   › d|j
                  d   › d	�}t	        |«      ‚| j
                  \  }}|j
                  d   }| j                  |j                  k7  s,| j                  t        j                  t        j                  fvrd
}t	        |«      ‚|€.t        j                  ||f| j                  j                  ¬«      }n]|j
                  d   |k7  s|j
                  d   |k7  rt	        d«      ‚|j                  | j                  j                  k7  rt	        d«      ‚d}| j                  dk(  rK|j                  dk(  r+d}|j                  | j                  |j                  }}} ||}}n0| j                  «       } n|j                  dk(  r|j                  «       }t        | j                  | j                  | j                   |j                  |j                  |j                   ||||«
       |r|j                  }|S )aÜ  Compute A @ B for sparse and 2-dim A and B while returning an ndarray.

    Parameters
    ----------
    A : sparse matrix of shape (n1, n2) and format CSC or CSR
        Left-side input matrix.
    B : sparse matrix of shape (n2, n3) and format CSC or CSR
        Right-side input matrix.
    out : ndarray of shape (n1, n3) or None
        Optional ndarray into which the result is written.

    Returns
    -------
    out
        An ndarray, new created if out=None.
    r7   rO   z2Input 'A' must be a sparse 2-dim CSC or CSR array.z2Input 'B' must be a sparse 2-dim CSC or CSR array.r   r   z1Shapes must fulfil A.shape[1] == B.shape[0], got z == Ú.zBDtype of A and B must be the same, either both float32 or float64.r8   z3Shape of out must be ({n1}, {n3}), got {out.shape}.z)Dtype of out must match that of input A..Fr1   T)r   r   r   Úndimr   r    r9   r(   Úfloat32Úfloat64Úemptyr!   r4   Útocsrr   r#   r+   )ÚAÚBrj   ÚmsgÚn1Ún2Ún3Útranspose_outs           r   Úsparse_matmul_to_denserª   ì  s  € ô" �K‰K˜ŒN˜qŸx™x¨>Ñ9¸a¿f¹fÈºkÜÐMÓNÐNÜ�K‰K˜ŒN˜qŸx™x¨>Ñ9¸a¿f¹fÈºkÜÐMÓNÐNØ‡w�wˆq�z�Q—W‘W˜Q‘ZÒðØ—7‘7˜1‘:�,˜d 1§7¡7¨1¡: ,¨að1ð 	ô ˜‹oÐØ�W‰W�F€BˆØ	
�‰�‰€BØ‡w�w�!—'‘'Ò˜QŸW™W¬R¯Z©Z¼¿¹Ð,DÑDØRˆÜ˜‹oÐØ
€{Ü�h‰h˜˜B�x q§v¡v§|¡|Ô4‰à�9‰9�Q‰<˜2Ò §¡¨1¡°Ò!3ÜÐRÓSÐSØ�9‰9˜Ÿ™Ÿ™Ò$ÜÐHÓIÐIà€MØ‡x�x�5ÒØ�8‰8�uÒà ˆMØŸ™˜QŸS™S #§%¡%�#ˆqˆAØ˜�‰Bð —‘“	‰AØ	
�‰�UÒ	à�G‰G‹IˆäØ	�‰�—	‘	˜1Ÿ8™8 Q§V¡V¨Q¯Y©Y¸¿¹À#ÀrÈ2Èrôñ Ø�e‰eˆà€Jr   )NF)F)NNr‹   ))Ú__doc__r~   Únumpyr(   Úscipy.sparseÚsparser   Úscipy.sparse.linalgr   Úsklearn.utils.fixesr   r   Úsklearn.utils.sparsefuncs_fastr   r3   r   r   r2   r	   r?   Úsklearn.utils.validationr
   r   r   r&   r,   r5   r@   rB   rD   rM   rW   rZ   r\   r_   rk   rw   rq   rˆ   r›   rª   ry   r   r   Ú<module>r³      s¤   ðÙ Hó
 ã Ý Ý .ç Dõõõõõ :òò
ò&1òR2ó$Kð\ NRô pòf*òZ)òXò:<ò~*òZ.ób!óH3?òlò, òò>ô6<r   