CommunityStructure(Graph hgraph) {
      this.graph = hgraph;
      N = hgraph.getNodeCount();
      invMap = new HashMap<>();
      nodeConnectionsWeight = new HashMap[N];
      nodeConnectionsCount = new HashMap[N];
      nodeCommunities = new Community[N];
      map = new HashMap<>();
      topology = new LinkedList[N];
      communities = new LinkedList<>();
      int index = 0;
      weights = new double[N];
      for (Node node : hgraph.getNodes()) {
        map.put(node, index);
        nodeCommunities[index] = new Community(this);
        nodeConnectionsWeight[index] = new HashMap<>();
        nodeConnectionsCount[index] = new HashMap<>();
        weights[index] = 0;
        nodeCommunities[index].seed(index);
        Community hidden = new Community(structure);
        hidden.nodes.add(index);
        invMap.put(index, hidden);
        communities.add(nodeCommunities[index]);
        index++;
      }

      for (Node node : hgraph.getNodes()) {
        int node_index = map.get(node);
        topology[node_index] = new LinkedList<>();

        for (Node neighbor : hgraph.getNeighbors(node)) {
          if (node == neighbor) {
            continue;
          }
          int neighbor_index = map.get(neighbor);
          double weight = 1; // TODO : change to actual weight

          weights[node_index] += weight;
          Edge me = new Edge(node_index, neighbor_index, weight);
          topology[node_index].add(me);
          Community adjCom = nodeCommunities[neighbor_index];
          nodeConnectionsWeight[node_index].put(adjCom, weight);
          nodeConnectionsCount[node_index].put(adjCom, 1);
          nodeCommunities[node_index].connectionsWeight.put(adjCom, weight);
          nodeCommunities[node_index].connectionsCount.put(adjCom, 1);
          nodeConnectionsWeight[neighbor_index].put(nodeCommunities[node_index], weight);
          nodeConnectionsCount[neighbor_index].put(nodeCommunities[node_index], 1);
          nodeCommunities[neighbor_index].connectionsWeight.put(
              nodeCommunities[node_index], weight);
          nodeCommunities[neighbor_index].connectionsCount.put(nodeCommunities[node_index], 1);
          graphWeightSum += weight;
        }
      }
      graphWeightSum /= 2.0;
    }
 public static void printGraph(Graph hgraph) {
   for (Node n : hgraph.getNodes()) {
     for (Node m : hgraph.getNeighbors(n)) {
       System.out.println(n.getID() + " --> " + m.getID());
     }
     System.out.println();
   }
 }
 public int buildCommunities(Graph hgraph) {
   int[] comStructure = new int[hgraph.getNodeCount()];
   computeModularity(hgraph, structure, comStructure, resolution);
   Set<Integer> communityCount = new HashSet<>();
   int idx = 0;
   for (Node n : hgraph.getNodes()) {
     communityCount.add(comStructure[idx]);
     n.setProperty("communityID", comStructure[idx++]);
   }
   return communityCount.size();
 }