U
    Ç»|e®  ã                   @   s`   d 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	m
Z
mZ dgZdd„ Zd
d	d„ZdS )zSparse matrix norms.

é    N)Úissparse)Úsvds)ÚInfÚsqrtÚabsÚnormc                 C   s   t j | ¡}tj |¡S )N)ÚspÚ_sputilsÚ_todataÚnpÚlinalgr   )ÚxÚdata© r   úV/var/www/website-v5/atlas_env/lib/python3.8/site-packages/scipy/sparse/linalg/_norm.pyÚ_sparse_frobenius_norm   s    r   c              
   C   s~  t | ƒstdƒ‚|dkr(|dkr(t| ƒS |  ¡ } |dkr>d}n^t|tƒsœd}zt|ƒ}W n, tk
r„ } zt|ƒ|‚W 5 d}~X Y nX ||kr–t|ƒ‚|f}d}t|ƒdk�r|\}}| |  krÌ|k rèn n| |  kræ|k sún td|| j	f ƒ‚|| || k�rtdƒ‚|dk�r:t
| d	d
d�\}	}
}	|
d S |dk�rJt‚n´|d	k�rpt| ƒj|d�j|d�d S |tk�r–t| ƒj|d�j|d�d S |dk�r¼t| ƒj|d�j|d�d S |t k�rät| ƒj|d�j|d�d S |dk�röt| ƒS tdƒ‚�nxt|ƒd	k�rr|\}| |  k�r0|k �sDn td|| j	f ƒ‚|tk�r`t| ƒj|d�}nÚ|t k�r~t| ƒj|d�}n¼|dk�rš| dkj|d�}n |d	k�r¶t| ƒj|d�}n„|dk�rÜtt| ƒ d¡j|d�ƒ}n^z|d	  W n. tk
�r } ztdƒ|‚W 5 d}~X Y nX t t| ƒ |¡j|d�d	| ¡}t|dƒ�rR| ¡  ¡ S t|dƒ�rh|j ¡ S | ¡ S ntdƒ‚dS )a�
  
    Norm of a sparse matrix

    This function is able to return one of seven different matrix norms,
    depending on the value of the ``ord`` parameter.

    Parameters
    ----------
    x : a sparse matrix
        Input sparse matrix.
    ord : {non-zero int, inf, -inf, 'fro'}, optional
        Order of the norm (see table under ``Notes``). inf means numpy's
        `inf` object.
    axis : {int, 2-tuple of ints, None}, optional
        If `axis` is an integer, it specifies the axis of `x` along which to
        compute the vector norms.  If `axis` is a 2-tuple, it specifies the
        axes that hold 2-D matrices, and the matrix norms of these matrices
        are computed.  If `axis` is None then either a vector norm (when `x`
        is 1-D) or a matrix norm (when `x` is 2-D) is returned.

    Returns
    -------
    n : float or ndarray

    Notes
    -----
    Some of the ord are not implemented because some associated functions like,
    _multi_svd_norm, are not yet available for sparse matrix.

    This docstring is modified based on numpy.linalg.norm.
    https://github.com/numpy/numpy/blob/main/numpy/linalg/linalg.py

    The following norms can be calculated:

    =====  ============================
    ord    norm for sparse matrices
    =====  ============================
    None   Frobenius norm
    'fro'  Frobenius norm
    inf    max(sum(abs(x), axis=1))
    -inf   min(sum(abs(x), axis=1))
    0      abs(x).sum(axis=axis)
    1      max(sum(abs(x), axis=0))
    -1     min(sum(abs(x), axis=0))
    2      Spectral norm (the largest singular value)
    -2     Not implemented
    other  Not implemented
    =====  ============================

    The Frobenius norm is given by [1]_:

        :math:`||A||_F = [\sum_{i,j} abs(a_{i,j})^2]^{1/2}`

    References
    ----------
    .. [1] G. H. Golub and C. F. Van Loan, *Matrix Computations*,
        Baltimore, MD, Johns Hopkins University Press, 1985, pg. 15

    Examples
    --------
    >>> from scipy.sparse import *
    >>> import numpy as np
    >>> from scipy.sparse.linalg import norm
    >>> a = np.arange(9) - 4
    >>> a
    array([-4, -3, -2, -1, 0, 1, 2, 3, 4])
    >>> b = a.reshape((3, 3))
    >>> b
    array([[-4, -3, -2],
           [-1, 0, 1],
           [ 2, 3, 4]])

    >>> b = csr_matrix(b)
    >>> norm(b)
    7.745966692414834
    >>> norm(b, 'fro')
    7.745966692414834
    >>> norm(b, np.inf)
    9
    >>> norm(b, -np.inf)
    2
    >>> norm(b, 1)
    7
    >>> norm(b, -1)
    6

    The matrix 2-norm or the spectral norm is the largest singular
    value, computed approximately and with limitations.

    >>> b = diags([-1, 1], [0, 1], shape=(9, 10))
    >>> norm(b, 2)
    1.9753...
    z*input is not sparse. use numpy.linalg.normN)NÚfroÚf)r   é   z6'axis' must be None, an integer or a tuple of integersé   z*Invalid axis %r for an array with shape %rzDuplicate axes given.r   Úlobpcg)ÚkÚsolverr   éþÿÿÿ)Úaxis)r   r   éÿÿÿÿ)Nr   r   z Invalid norm order for matrices.)r   NzInvalid norm order for vectors.ÚtoarrayÚAz&Improper number of dimensions to norm.)r   Ú	TypeErrorr   ÚtocsrÚ
isinstanceÚtupleÚintÚlenÚ
ValueErrorÚshaper   ÚNotImplementedErrorr   ÚsumÚmaxr   Úminr   Úpowerr   Úhasattrr   Úravelr   )r   Úordr   ÚmsgZint_axisÚeÚndÚrow_axisÚcol_axisÚ_ÚsÚaÚMr   r   r   r      sˆ    ^
2ÿ





ÿ



"

)NN)Ú__doc__Únumpyr   Úscipy.sparser   Úscipy.sparse.linalgr   Úsparser   r   r   r   Ú__all__r   r   r   r   r   r   Ú<module>   s   