diff louvain/main_hierarchy.cpp @ 0:1d1b9e1b2e2f draft

Uploaded
author petr-novak
date Thu, 19 Dec 2019 10:24:45 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/louvain/main_hierarchy.cpp	Thu Dec 19 10:24:45 2019 -0500
@@ -0,0 +1,116 @@
+// File: main_hierarchy.cpp
+// -- output community structure handling (number of levels, communities of one level)
+//-----------------------------------------------------------------------------
+// Community detection 
+// Based on the article "Fast unfolding of community hierarchies in large networks"
+// Copyright (C) 2008 V. Blondel, J.-L. Guillaume, R. Lambiotte, E. Lefebvre
+//
+// This program must not be distributed without agreement of the above mentionned authors.
+//-----------------------------------------------------------------------------
+// Author   : E. Lefebvre, adapted by J.-L. Guillaume
+// Email    : jean-loup.guillaume@lip6.fr
+// Location : Paris, France
+// Time	    : February 2008
+//-----------------------------------------------------------------------------
+// see readme.txt for more details
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <iostream>
+#include <iomanip>
+#include <fstream>
+#include <vector>
+#include <map>
+#include <set>
+#include <algorithm>
+
+using namespace std;
+
+int display_level = -1;
+char *filename = NULL;
+
+void
+usage(char *prog_name, const char *more) {
+  cerr << more;
+  cerr << "usage: " << prog_name << " input_file [options]" << endl << endl;
+  cerr << "input_file: read the community tree from this file." << endl;
+  cerr << "-l xx\t display the community structure for the level xx." << endl;
+  cerr << "\t outputs the community for each node." << endl;
+  cerr << "\t xx must belong to [-1,N] if N is the number of levels." << endl;
+  cerr << "-n\t displays the number of levels and the size of each level." << endl;
+  cerr << "\t equivalent to -l -1." << endl;
+  cerr << "-h\tshow this usage message." << endl;
+  exit(0);
+}
+
+void
+parse_args(int argc, char **argv) {
+  if (argc<2)
+    usage(argv[0], "Bad arguments number\n");
+
+  for (int i = 1; i < argc; i++) {
+    if(argv[i][0] == '-') {
+      switch(argv[i][1]) {
+      case 'l':
+	display_level = atoi(argv[i+1]);
+	i++;
+	break;
+      case 'n':
+	display_level = -1;
+	break;
+      default:
+	usage(argv[0], "Unknown option\n");
+      }
+    } else {
+      if (filename==NULL)
+        filename = argv[i];
+      else
+        usage(argv[0], "More than one filename\n");
+    }
+  }
+  if (filename==NULL)
+    usage(argv[0], "No input file has been provided.\n");
+}
+int
+main(int argc, char **argv) {
+  parse_args(argc, argv);
+
+  vector<vector<int> >levels;
+
+  ifstream finput;
+  finput.open(filename,fstream::in);
+
+  int l=-1;
+  while (!finput.eof()) {
+    int node, nodecomm;
+    finput >> node >> nodecomm;
+
+    if (finput) {
+      if (node==0) {
+	l++;
+	levels.resize(l+1);
+      }
+      levels[l].push_back(nodecomm);
+    }
+  }
+
+  if (display_level==-1) {
+    cout << "Number of levels: " << levels.size() << endl;
+    for (unsigned int i=0 ; i<levels.size();i++)
+      cout << "level " << i << ": " << levels[i].size() << " nodes" << endl;
+  } else if (display_level<0 || (unsigned)display_level>=levels.size()) {
+    cerr << "Incorrect level\n";
+  } else {
+    vector<int> n2c(levels[0].size());
+
+    for (unsigned int i=0 ; i<levels[0].size() ; i++)
+      n2c[i]=i;
+    
+    for (l=0 ; l<display_level ; l++)
+      for (unsigned int node=0 ; node<levels[0].size() ; node++)
+	n2c[node] = levels[l][n2c[node]];
+    
+    for (unsigned int node=0 ; node<levels[0].size() ; node++)
+      cout << node << " " << n2c[node] << endl;
+  }
+}