docs: def _compute_normalized_laplacian(H,
                                    nodes_to_indices,
                                    hyperedge_ids_to_indices):
      """Computes the normalized Laplacian as described in the paper:
      Zhou, Dengyong, Jiayuan Huang, and Bernhard Scholkopf.
      "Learning with hypergraphs: Clustering, classification, and embedding."
      Advances in neural information processing systems. 2006.
      (http://machinelearning.wustl.edu/mlpapers/paper_files/NIPS2006_630.pdf)
  
      :param H: the hypergraph to compute the normalized Laplacian
                      matrix for.
      :param nodes_to_indices: for each node, maps the node to its
                              corresponding integer index.
      :param hyperedge_ids_to_indices: for each hyperedge ID, maps the hyperedge
                                      ID to its corresponding integer index.
      :returns: sparse.csc_matrix -- the normalized Laplacian matrix as a sparse
              matrix.
  
      """
      M = umat.get_incidence_matrix(H,
                                    nodes_to_indices, hyperedge_ids_to_indices)
      W = umat.get_hyperedge_weight_matrix(H, hyperedge_ids_to_indices)
      D_v = umat.get_vertex_degree_matrix(M, W)
      D_e = umat.get_hyperedge_degree_matrix(M)
  
      D_v_sqrt = D_v.sqrt()
      D_v_sqrt_inv = np.real(umat.fast_inverse(D_v_sqrt).todense())
      D_v_sqrt_inv = sparse.csc_matrix(D_v_sqrt_inv)
      D_e_inv = umat.fast_inverse(D_e)
      M_trans = M.transpose()
  
      theta = D_v_sqrt_inv * M * W * D_e_inv * M_trans * D_v_sqrt_inv
  
      node_count = len(H.get_node_set())
      I = sparse.eye(node_count)
  
      delta = I - theta
      return delta