docs: def laplacian_eigenmaps(adjacency_matrix, k):
      """
      Performs spectral graph embedding using the graph symmetric normalized Laplacian matrix.
  
      Introduced in: Belkin, M., & Niyogi, P. (2003).
                     Laplacian eigenmaps for dimensionality reduction and data representation.
                     Neural computation, 15(6), 1373-1396.
  
      Inputs:  -   A in R^(nxn): Adjacency matrix of an network represented as a SciPy Sparse COOrdinate matrix.
               -              k: The number of eigenvectors to extract.
  
      Outputs: - X in R^(nxk): The latent space embedding represented as a NumPy array. We discard the first eigenvector.
      """
      # Calculate sparse graph Laplacian.
      laplacian = get_normalized_laplacian(adjacency_matrix)
  
      # Calculate bottom k+1 eigenvalues and eigenvectors of normalized Laplacian.
      try:
          eigenvalues, eigenvectors = spla.eigsh(laplacian,
                                                 k=k,
                                                 which='SM',
                                                 return_eigenvectors=True)
      except spla.ArpackNoConvergence as e:
          print("ARPACK has not converged.")
          eigenvalue = e.eigenvalues
          eigenvectors = e.eigenvectors
  
      # Discard the eigenvector corresponding to the zero-valued eigenvalue.
      eigenvectors = eigenvectors[:, 1:]
  
      return eigenvectors