o
    Eb                     @   sB   d Z ddlZddlmZ dddZdd Zdd	d
ZdddZdS )z(
Laplacian of a compressed-sparse graph
    N)
isspmatrixFc                 C   s   | j dks| jd | jd krtd|r*t| jtjs%t| jtjr*| t	} t
| r0tnt}|r6dnd}|| ||d\}}|rG||fS |S )a,  
    Return the Laplacian matrix of a directed graph.

    Parameters
    ----------
    csgraph : array_like or sparse matrix, 2 dimensions
        compressed-sparse graph, with shape (N, N).
    normed : bool, optional
        If True, then compute symmetric normalized Laplacian.
    return_diag : bool, optional
        If True, then also return an array related to vertex degrees.
    use_out_degree : bool, optional
        If True, then use out-degree instead of in-degree.
        This distinction matters only if the graph is asymmetric.
        Default: False.

    Returns
    -------
    lap : ndarray or sparse matrix
        The N x N laplacian matrix of csgraph. It will be a NumPy array (dense)
        if the input was dense, or a sparse matrix otherwise.
    diag : ndarray, optional
        The length-N diagonal of the Laplacian matrix.
        For the normalized Laplacian, this is the array of square roots
        of vertex degrees or 1 if the degree is zero.

    Notes
    -----
    The Laplacian matrix of a graph is sometimes referred to as the
    "Kirchoff matrix" or the "admittance matrix", and is useful in many
    parts of spectral graph theory. In particular, the eigen-decomposition
    of the laplacian matrix can give insight into many properties of the graph.

    Examples
    --------
    >>> from scipy.sparse import csgraph
    >>> G = np.arange(5) * np.arange(5)[:, np.newaxis]
    >>> G
    array([[ 0,  0,  0,  0,  0],
           [ 0,  1,  2,  3,  4],
           [ 0,  2,  4,  6,  8],
           [ 0,  3,  6,  9, 12],
           [ 0,  4,  8, 12, 16]])
    >>> csgraph.laplacian(G, normed=False)
    array([[  0,   0,   0,   0,   0],
           [  0,   9,  -2,  -3,  -4],
           [  0,  -2,  16,  -6,  -8],
           [  0,  -3,  -6,  21, -12],
           [  0,  -4,  -8, -12,  24]])
       r      z(csgraph must be a square matrix or array)normedaxis)ndimshape
ValueErrornpZ
issubdtypeZdtypeZsignedintegerZuintZastypefloatr   _laplacian_sparse_laplacian_dense)Zcsgraphr   Zreturn_diagZuse_out_degreeZ
create_lapZdegree_axisZlapd r   A/usr/lib/python3/dist-packages/scipy/sparse/csgraph/_laplacian.py	laplacian   s   3
r   c                 C   s   || j d d t|d < d S )Nr   )Zflatlen)Ar   r   r   r   _setdiag_denseR   s   r   c                 C   s   | j dv r|  }d}n| }d}|j|d |  }|rX|j|d}|dk}t|dt|}| j||j	   _| j||j
   _| jd9  _|d|  ||fS |j d	krb| }n|j|d}| jd9  _|| ||fS )
N)ZlilZdokFTr   )copyr   r   Zdia)formatZtocoosumZgetA1Zdiagonalr
   wheresqrtdatarowcolZsetdiagr   )graphr   r   mZ
needs_copywisolated_node_maskr   r   r   r   V   s*   



r   c                 C   s   t | }t |d |j|d}|r?|dk}t |dt |}|| }||d d t jf  }|d9 }t|d|  ||fS |d9 }t|| ||fS )Nr   r   r   r   )r
   ZarrayZfill_diagonalr   r   r   Znewaxisr   )r   r   r   r    r!   r"   r   r   r   r   p   s   

r   )FFF)Fr   )	__doc__Znumpyr
   Zscipy.sparser   r   r   r   r   r   r   r   r   <module>   s    	
B
