Mercurial > repos > petr-novak > repeatrxplorer
diff louvain/graph.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/graph.cpp Thu Dec 19 10:24:45 2019 -0500 @@ -0,0 +1,157 @@ +// File: graph.cpp +// -- simple graph handling source file +//----------------------------------------------------------------------------- +// 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 "graph.h" + +using namespace std; + +Graph::Graph(char *filename, int type) { + ifstream finput; + finput.open(filename,fstream::in); + + int nb_links=0; + + while (!finput.eof()) { + unsigned int src, dest; + double weight=1.; + + if (type==WEIGHTED) { + finput >> src >> dest >> weight; + } else { + finput >> src >> dest; + } + + if (finput) { + if (links.size()<=max(src,dest)+1) { + links.resize(max(src,dest)+1); + } + + links[src].push_back(make_pair(dest,weight)); + if (src!=dest) + links[dest].push_back(make_pair(src,weight)); + + nb_links++; + } + } + + finput.close(); +} + +void +Graph::renumber(int type) { + vector<int> linked(links.size(),-1); + vector<int> renum(links.size(),-1); + int nb=0; + + for (unsigned int i=0 ; i<links.size() ; i++) { + for (unsigned int j=0 ; j<links[i].size() ; j++) { + linked[i]=1; + linked[links[i][j].first]=1; + } + } + + for (unsigned int i=0 ; i<links.size() ; i++) { + if (linked[i]==1) + renum[i]=nb++; + } + + for (unsigned int i=0 ; i<links.size() ; i++) { + if (linked[i]==1) { + for (unsigned int j=0 ; j<links[i].size() ; j++) { + links[i][j].first = renum[links[i][j].first]; + } + links[renum[i]]=links[i]; + } + } + links.resize(nb); +} + +void +Graph::clean(int type) { + for (unsigned int i=0 ; i<links.size() ; i++) { + map<int, float> m; + map<int, float>::iterator it; + + for (unsigned int j=0 ; j<links[i].size() ; j++) { + it = m.find(links[i][j].first); + if (it==m.end()) + m.insert(make_pair(links[i][j].first, links[i][j].second)); + else if (type==WEIGHTED) + it->second+=links[i][j].second; + } + + vector<pair<int,float> > v; + for (it = m.begin() ; it!=m.end() ; it++) + v.push_back(*it); + links[i].clear(); + links[i]=v; + } +} + +void +Graph::display(int type) { + for (unsigned int i=0 ; i<links.size() ; i++) { + for (unsigned int j=0 ; j<links[i].size() ; j++) { + int dest = links[i][j].first; + float weight = links[i][j].second; + if (type==WEIGHTED) + cout << i << " " << dest << " " << weight << endl; + else + cout << i << " " << dest << endl; + } + } +} + +void +Graph::display_binary(char *filename, char *filename_w, int type) { + ofstream foutput; + foutput.open(filename, fstream::out | fstream::binary); + + unsigned int s = links.size(); + + // outputs number of nodes + foutput.write((char *)(&s),4); + + // outputs cumulative degree sequence + long tot=0; + for (unsigned int i=0 ; i<s ; i++) { + tot+=(long)links[i].size(); + foutput.write((char *)(&tot),8); + } + + // outputs links + for (unsigned int i=0 ; i<s ; i++) { + for (unsigned int j=0 ; j<links[i].size() ; j++) { + int dest = links[i][j].first; + foutput.write((char *)(&dest),4); + } + } + foutput.close(); + + // outputs weights in a separate file + if (type==WEIGHTED) { + ofstream foutput_w; + foutput_w.open(filename_w,fstream::out | fstream::binary); + for (unsigned int i=0 ; i<s ; i++) { + for (unsigned int j=0 ; j<links[i].size() ; j++) { + float weight = links[i][j].second; + foutput_w.write((char *)(&weight),4); + } + } + foutput_w.close(); + } +} +