annotate louvain/main_hierarchy.cpp @ 9:511266aa9235 draft

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