Mercurial > repos > petr-novak > repeatrxplorer
comparison louvain/main_hierarchy.cpp @ 0:1d1b9e1b2e2f draft
Uploaded
author | petr-novak |
---|---|
date | Thu, 19 Dec 2019 10:24:45 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1d1b9e1b2e2f |
---|---|
1 // File: main_hierarchy.cpp | |
2 // -- output community structure handling (number of levels, communities of one level) | |
3 //----------------------------------------------------------------------------- | |
4 // Community detection | |
5 // Based on the article "Fast unfolding of community hierarchies in large networks" | |
6 // Copyright (C) 2008 V. Blondel, J.-L. Guillaume, R. Lambiotte, E. Lefebvre | |
7 // | |
8 // This program must not be distributed without agreement of the above mentionned authors. | |
9 //----------------------------------------------------------------------------- | |
10 // Author : E. Lefebvre, adapted by J.-L. Guillaume | |
11 // Email : jean-loup.guillaume@lip6.fr | |
12 // Location : Paris, France | |
13 // Time : February 2008 | |
14 //----------------------------------------------------------------------------- | |
15 // see readme.txt for more details | |
16 | |
17 #include <stdlib.h> | |
18 #include <stdio.h> | |
19 #include <iostream> | |
20 #include <iomanip> | |
21 #include <fstream> | |
22 #include <vector> | |
23 #include <map> | |
24 #include <set> | |
25 #include <algorithm> | |
26 | |
27 using namespace std; | |
28 | |
29 int display_level = -1; | |
30 char *filename = NULL; | |
31 | |
32 void | |
33 usage(char *prog_name, const char *more) { | |
34 cerr << more; | |
35 cerr << "usage: " << prog_name << " input_file [options]" << endl << endl; | |
36 cerr << "input_file: read the community tree from this file." << endl; | |
37 cerr << "-l xx\t display the community structure for the level xx." << endl; | |
38 cerr << "\t outputs the community for each node." << endl; | |
39 cerr << "\t xx must belong to [-1,N] if N is the number of levels." << endl; | |
40 cerr << "-n\t displays the number of levels and the size of each level." << endl; | |
41 cerr << "\t equivalent to -l -1." << endl; | |
42 cerr << "-h\tshow this usage message." << endl; | |
43 exit(0); | |
44 } | |
45 | |
46 void | |
47 parse_args(int argc, char **argv) { | |
48 if (argc<2) | |
49 usage(argv[0], "Bad arguments number\n"); | |
50 | |
51 for (int i = 1; i < argc; i++) { | |
52 if(argv[i][0] == '-') { | |
53 switch(argv[i][1]) { | |
54 case 'l': | |
55 display_level = atoi(argv[i+1]); | |
56 i++; | |
57 break; | |
58 case 'n': | |
59 display_level = -1; | |
60 break; | |
61 default: | |
62 usage(argv[0], "Unknown option\n"); | |
63 } | |
64 } else { | |
65 if (filename==NULL) | |
66 filename = argv[i]; | |
67 else | |
68 usage(argv[0], "More than one filename\n"); | |
69 } | |
70 } | |
71 if (filename==NULL) | |
72 usage(argv[0], "No input file has been provided.\n"); | |
73 } | |
74 int | |
75 main(int argc, char **argv) { | |
76 parse_args(argc, argv); | |
77 | |
78 vector<vector<int> >levels; | |
79 | |
80 ifstream finput; | |
81 finput.open(filename,fstream::in); | |
82 | |
83 int l=-1; | |
84 while (!finput.eof()) { | |
85 int node, nodecomm; | |
86 finput >> node >> nodecomm; | |
87 | |
88 if (finput) { | |
89 if (node==0) { | |
90 l++; | |
91 levels.resize(l+1); | |
92 } | |
93 levels[l].push_back(nodecomm); | |
94 } | |
95 } | |
96 | |
97 if (display_level==-1) { | |
98 cout << "Number of levels: " << levels.size() << endl; | |
99 for (unsigned int i=0 ; i<levels.size();i++) | |
100 cout << "level " << i << ": " << levels[i].size() << " nodes" << endl; | |
101 } else if (display_level<0 || (unsigned)display_level>=levels.size()) { | |
102 cerr << "Incorrect level\n"; | |
103 } else { | |
104 vector<int> n2c(levels[0].size()); | |
105 | |
106 for (unsigned int i=0 ; i<levels[0].size() ; i++) | |
107 n2c[i]=i; | |
108 | |
109 for (l=0 ; l<display_level ; l++) | |
110 for (unsigned int node=0 ; node<levels[0].size() ; node++) | |
111 n2c[node] = levels[l][n2c[node]]; | |
112 | |
113 for (unsigned int node=0 ; node<levels[0].size() ; node++) | |
114 cout << node << " " << n2c[node] << endl; | |
115 } | |
116 } |