docs: def louvain(adjacency_matrix):
      """
      Performs community embedding using the LOUVAIN method.
  
      Introduced in: Blondel, V. D., Guillaume, J. L., Lambiotte, R., & Lefebvre, E. (2008).
                     Fast unfolding of communities in large networks.
                     Journal of Statistical Mechanics: Theory and Experiment, 2008(10), P10008.
  
      Inputs:  - A in R^(nxn): Adjacency matrix of an undirected network represented as a SciPy Sparse COOrdinate matrix.
  
      Outputs: - X in R^(nxC_n): The latent space embedding represented as a SciPy Sparse COOrdinate matrix.
      """
      # Convert to networkx undirected graph.
      adjacency_matrix = nx.from_scipy_sparse_matrix(adjacency_matrix, create_using=nx.Graph())
  
      # Call LOUVAIN algorithm to calculate a hierarchy of communities.
      tree = community.generate_dendogram(adjacency_matrix, part_init=None)
  
      # Embed communities
      row = list()
      col = list()
      append_row = row.append
      append_col = col.append
  
      community_counter = 0
      for i in range(len(tree)):
          partition = community.partition_at_level(tree, i)
          for n, c in partition.items():
              append_row(n)
              append_col(community_counter + c)
  
          community_counter += max(partition.values()) + 1
  
      row = np.array(row)
      col = np.array(col)
      data = np.ones(row.size, dtype=np.float64)
  
      louvain_features = sparse.coo_matrix((data, (row, col)), shape=(len(partition.keys()), community_counter),
                                           dtype=np.float64)
  
      return louvain_features