9 #include <igraph/igraph.h> 10 #include <Eigen/Dense> 11 #include <Eigen/Sparse> 14 typedef Eigen::SparseMatrix<double> SpMat;
15 typedef Eigen::SparseMatrix<double, RowMajor>
SpMatCSR;
16 typedef Eigen::Triplet<double>
Tri;
19 int pajek2igraph(FILE *f, igraph_t * dst_graph){
22 int vertex_id, vertex_id2, vertex_id0;
25 igraph_vector_t vertices, edges, weights;
29 fscanf(f,
"%s %d", label, &N);
30 igraph_vector_init(&vertices, N);
32 fscanf(f,
"%d %s", &vertex_id0, label);
33 igraph_vector_set(&vertices, 0, 0.);
34 for (
long int i = 1; i < N; i++){
35 fscanf(f,
"%d %s", &vertex_id, label);
36 igraph_vector_set(&vertices, i, vertex_id - vertex_id0);
40 igraph_empty(dst_graph, N, IGRAPH_DIRECTED);
43 fscanf(f,
"%s %d", label, &E);
44 igraph_vector_init(&edges, E * 2);
45 igraph_vector_init(&weights, E);
47 for (
long int i = 0; i < E; i++){
48 fscanf(f,
"%d %d %lf", &vertex_id, &vertex_id2, &edge_weight);
49 igraph_vector_set(&edges, i*2, vertex_id - vertex_id0);
50 igraph_vector_set(&edges, i*2+1, vertex_id2 - vertex_id0);
51 igraph_vector_set(&weights, i, edge_weight);
55 igraph_add_edges(dst_graph, &edges, 0);
58 igraph_cattribute_EAN_setv(dst_graph,
"weight", &weights);
62 igraph_vector_destroy(&edges);
63 igraph_vector_destroy(&vertices);
69 int pajek2igraphNoVertices(FILE *f, igraph_t * dst_graph,
int vertex_id0){
72 int vertex_id, vertex_id2;
75 igraph_vector_t vertices, edges, weights;
79 fscanf(f,
"%s %d", label, &N);
80 igraph_vector_init(&vertices, N);
82 for (
long int i = 0; i < N; i++){
83 igraph_vector_set(&vertices, i, i);
87 igraph_empty(dst_graph, N, IGRAPH_DIRECTED);
90 fscanf(f,
"%s %d", label, &E);
91 igraph_vector_init(&edges, E * 2);
92 igraph_vector_init(&weights, E);
94 for (
long int i = 0; i < E; i++){
95 fscanf(f,
"%d %d %lf", &vertex_id, &vertex_id2, &edge_weight);
96 igraph_vector_set(&edges, i*2, vertex_id - vertex_id0);
97 igraph_vector_set(&edges, i*2+1, vertex_id2 - vertex_id0);
98 igraph_vector_set(&weights, i, edge_weight);
102 igraph_add_edges(dst_graph, &edges, 0);
105 igraph_cattribute_EAN_setv(dst_graph,
"weight", &weights);
109 igraph_vector_destroy(&edges);
110 igraph_vector_destroy(&vertices);
116 int pajek2igraphSym(FILE *f, igraph_t * dst_graph){
119 int vertex_id, vertex_id2, vertex_id0;
122 igraph_vector_t vertices, edges, weights;
126 fscanf(f,
"%s %d", label, &N);
127 igraph_vector_init(&vertices, N);
129 fscanf(f,
"%d %s", &vertex_id0, label);
130 igraph_vector_set(&vertices, 0, 0.);
131 for (
long int i = 1; i < N; i++){
132 fscanf(f,
"%d %s", &vertex_id, label);
133 igraph_vector_set(&vertices, i, vertex_id - vertex_id0);
137 igraph_empty(dst_graph, N, IGRAPH_UNDIRECTED);
140 fscanf(f,
"%s %d", label, &E);
141 igraph_vector_init(&edges, E * 2);
142 igraph_vector_init(&weights, E);
144 for (
long int i = 0; i < E; i++){
145 fscanf(f,
"%d %d %lf", &vertex_id, &vertex_id2, &edge_weight);
146 igraph_vector_set(&edges, i*2, vertex_id - vertex_id0);
147 igraph_vector_set(&edges, i*2+1, vertex_id2 - vertex_id0);
148 igraph_vector_set(&weights, i, edge_weight);
152 igraph_add_edges(dst_graph, &edges, 0);
155 igraph_cattribute_EAN_setv(dst_graph,
"weight", &weights);
159 igraph_vector_destroy(&edges);
160 igraph_vector_destroy(&vertices);
166 SpMat * pajek2EigenSparse(FILE *f){
172 vector<Tri> tripletList;
175 fscanf(f,
"%s %d", label, &N);
178 SpMat *T =
new SpMat(N, N);
181 fscanf(f,
"%d %s", &i0, label);
182 for (
int k = 1; k < N; k++){
183 fscanf(f,
"%d %s", &i, label);
187 fscanf(f,
"%s %d", label, &E);
190 tripletList.reserve(E);
192 for (
int k = 0; k < E; k++){
193 fscanf(f,
"%d %d %lf", &i, &j, &x);
194 tripletList.push_back(
Tri(i - i0, j - i0, x));
198 T->setFromTriplets(tripletList.begin(), tripletList.end());
204 void EigenSparse2Pajek(FILE *f, SpMatCSR *P){
206 int E = P->nonZeros();
209 fprintf(f,
"*Vertices %d\n", N);
210 for (
int k = 0; k < N; k++)
211 fprintf(f,
"%d ""%d""\n", k, k);
214 fprintf(f,
"Edges %d\n", E);
215 for (
int i = 0; i < P->rows(); i++)
216 for (SpMatCSR::InnerIterator it(*P, i); it; ++it)
217 fprintf(f,
"%d %d %lf\n", i, it.col(), it.value());
223 SpMat * igraph2EigenSparse(igraph_t *srcGraph)
225 igraph_integer_t N, E;
226 igraph_vector_t edges, weights;
229 N = igraph_vcount(srcGraph);
230 E = igraph_ecount(srcGraph);
231 igraph_vector_init(&edges, E * 2);
232 igraph_vector_init(&weights, E);
233 igraph_get_edgelist(srcGraph, &edges,
true);
234 if ((
bool) igraph_cattribute_has_attr(srcGraph, IGRAPH_ATTRIBUTE_EDGE,
"weight"))
235 EANV(srcGraph,
"weight", &weights);
237 igraph_vector_fill(&weights, 1.);
240 vector<Tri> tripletList;
241 for (
int k = 0; k < E; k++)
242 tripletList.push_back(Tri(VECTOR(edges)[k], VECTOR(edges)[E+k],
243 VECTOR(weights)[k]));
246 SpMat *T =
new SpMat(N, N);
248 T->setFromTriplets(tripletList.begin(), tripletList.end());
250 igraph_vector_destroy(&edges);
256 int array2igraph(FILE *f,
int N, igraph_t * dst_graph){
260 igraph_vector_t vertices, edges, weights;
263 igraph_vector_init(&vertices, N);
264 igraph_vector_init(&edges, N*N*2);
265 igraph_vector_init(&weights, N*N);
266 igraph_empty(dst_graph, N, IGRAPH_DIRECTED);
268 for (i = 0; i < N; i++){
269 igraph_vector_set(&vertices, i, i);
270 for (j = 0; j < N; j++){
271 fscanf(f,
"%lf", &edge_weight);
272 igraph_vector_set(&edges, (i*N+j)*2, i);
273 igraph_vector_set(&edges, (i*N+j)*2+1, j);
274 igraph_vector_set(&weights, i*N+j, edge_weight);
279 igraph_add_edges(dst_graph, &edges, 0);
281 igraph_cattribute_EAN_setv(dst_graph,
"weight", &weights);
285 igraph_vector_destroy(&edges);
286 igraph_vector_destroy(&vertices);
291 void addCol2Col(SpMat *T,
int j_src,
int j_dst)
293 stack<double> insertValue;
294 stack<int> insertRow;
297 for (SpMat::InnerIterator it_src(*T, j_src); it_src; ++it_src){
299 SpMat::InnerIterator it_dst(*T, j_dst);
300 for (; it_dst && (it_dst.row() < it_src.row()); ++it_dst);
301 if (it_dst && (it_dst.row() == it_src.row()))
302 it_dst.valueRef() = it_dst.value() + it_src.value();
304 insertValue.push(it_src.value());
305 insertRow.push(it_src.row());
308 while (insertValue.size() > 0){
309 T->insert(insertRow.top(), j_dst) = insertValue.top();
318 void addCol2ColTriplet(SpMat *T,
int jSrc,
int jDst)
323 vector<Tri> tripletT, tripletInsert;
326 tripletInsert.reserve(N);
329 for (SpMat::InnerIterator itSrc(*T, jSrc); itSrc; ++itSrc){
331 SpMat::InnerIterator itDst(*T, jDst);
332 for (; itDst && (itDst.row() < itSrc.row()); ++itDst);
333 if (itDst && (itDst.row() == itSrc.row()))
334 itDst.valueRef() += itSrc.value();
336 tripletInsert.push_back(
Tri(itSrc.row(), jDst, itSrc.value()));
340 tripletT = EigenSparse2Triplet(T);
343 tripletT.reserve(tripletT.size() + tripletInsert.size());
346 for (
unsigned int alpha = 0; alpha < tripletInsert.size(); alpha++)
347 tripletT.push_back(tripletInsert.at(alpha));
350 T->setFromTriplets(tripletT.begin(), tripletT.end());
356 void addRow2Row(SpMat *T,
int i_src,
int i_dst)
360 stack<double> insertValue;
361 stack<int> insertCol;
362 for (
int j = 0; j < T->outerSize(); j++){
365 SpMat::InnerIterator it(*T, j);
366 for(; it && (it.row() < i_src); ++it);
367 if (it && (it.row() == i_src)){
375 SpMat::InnerIterator it(*T, j);
376 for (; it && (it.row() < i_dst); ++it);
378 if (it && (it.row() == i_dst)){
379 it.valueRef() += val;
383 insertValue.push(val);
384 insertCol.push(it.col());
388 while (insertValue.size() > 0){
389 T->insert(i_dst, insertCol.top()) = insertValue.top();
398 void addRow2RowTriplet(SpMat *T,
int iSrc,
int iDst)
403 vector<Tri> tripletT, tripletInsert;
406 tripletInsert.reserve(N);
408 for (
int j = 0; j < T->outerSize(); j++){
410 SpMat::InnerIterator itSrc(*T, j);
411 for(; itSrc && (itSrc.row() < iSrc); ++itSrc);
412 if (itSrc && (itSrc.row() == iSrc)){
414 SpMat::InnerIterator itDst(*T, j);
415 for (; itDst && (itDst.row() < iDst); ++itDst);
417 if (itDst && (itDst.row() == iDst))
418 itDst.valueRef() += itSrc.value();
421 tripletInsert.push_back(
Tri(iDst, j, itSrc.value()));
426 tripletT = EigenSparse2Triplet(T);
429 tripletT.reserve(tripletT.size() + tripletInsert.size());
432 for (
unsigned int alpha = 0; alpha < tripletInsert.size(); alpha++)
433 tripletT.push_back(tripletInsert.at(alpha));
436 T->setFromTriplets(tripletT.begin(), tripletT.end());
442 void addRow2RowTriplet(SpMat *T,
int iSrc,
int iDst, SpMatCSR *TCSR)
447 vector<Tri> tripletT, tripletInsert;
450 tripletInsert.reserve(N);
453 for(SpMat::InnerIterator itSrc(*TCSR, iSrc); itSrc; ++itSrc){
455 SpMat::InnerIterator itDst(*TCSR, iDst);
456 for (; itDst && (itDst.col() < itSrc.col()); ++itDst);
457 if (itDst && (itDst.col() == itSrc.col()))
458 itDst.valueRef() += itSrc.value();
461 tripletInsert.push_back(
Tri(iDst, itSrc.col(), itSrc.value()));
465 tripletT = EigenSparse2Triplet(T);
468 tripletT.reserve(tripletT.size() + tripletInsert.size());
471 for (
unsigned int alpha = 0; alpha < tripletInsert.size(); alpha++)
472 tripletT.push_back(tripletInsert.at(alpha));
475 T->setFromTriplets(tripletT.begin(), tripletT.end());
481 void scalProdInner(SpMat *T,
int outer,
double coef)
483 for (SpMat::InnerIterator it(*T, outer); it; ++it)
484 it.valueRef() *= coef;
490 void scalProdOuter(SpMat *T,
int inner,
double coef)
492 for (
int j = 0; j < T->outerSize(); j++)
493 for (SpMat::InnerIterator it(*T, j); it; ++it)
494 if (it.index() == inner)
495 it.valueRef() *= coef;
501 double getModularity(SpMat *T)
503 int N = T->innerSize();
505 VectorXd
self = VectorXd::Zero(T->innerSize());
508 for (
int j = 0; j < T->outerSize(); j++){
509 for (SpMat::InnerIterator it(*T, j); it; ++it){
511 self(j) = it.value();
516 modularity = (
self.sum() - 1) / N;
Eigen::Triplet< double > Tri
Eigen triplet of double.
Eigen::SparseMatrix< double, Eigen::RowMajor > SpMatCSR
Eigen sparse CSR matrix of double type.
Input, output and conversion routines.