ATSuite C++  v1.0
Scientific C++ routines originally developed by Alexis Tantet
atgraph_alglib.hpp
1 #ifndef ATGRAPH_ALGLIB_HPP
2 #define ATGRAPH_ALGLIB_HPP
3 
4 #include <cstdio>
5 #include <cstdlib>
6 #include <stack>
7 #include <vector>
8 #include <iostream>
9 #include <igraph/igraph.h>
10 #include "linalg.h"
11 
12 #define plog2p( x ) ( (x) > 0.0 ? (x) * log(x) / log(2) : 0.0 )
13 
14 using namespace std;
15 using namespace alglib;
16 
17 typedef sparsematrix spAlg;
18 
19 spAlg * pajek2HashTable(FILE *f){
20  char label[20];
21  int N, E;
22  int i, j, i0;
23  double x;
24  spAlg *hashTable = new spAlg;
25 
26  // Read vertices
27  fscanf(f, "%s %d", label, &N);
28 
29  // Read first (assume monotonous)
30  fscanf(f, "%d %s", &i0, label);
31  for (int k = 1; k < N; k++){
32  fscanf(f, "%d %s", &i, label);
33  }
34 
35  // Read Edges
36  fscanf(f, "%s %d", label, &E);
37 
38  // Create Hash Table
39  sparsecreate(N, N, E, *hashTable);
40 
41  for (int k = 0; k < E; k++){
42  fscanf(f, "%d %d %lf", &i, &j, &x);
43  sparseset(*hashTable, i, j, x);
44  }
45 
46  return hashTable;
47 }
48 
49 
50 spAlg * igraph2HashTable(igraph_t *srcGraph)
51 {
52  igraph_integer_t N, E;
53  igraph_vector_t edges, weights;
54  spAlg *hashTable = new spAlg;
55 
56  // Get edge list and weights
57  N = igraph_vcount(srcGraph);
58  E = igraph_ecount(srcGraph);
59  igraph_vector_init(&edges, E * 2);
60  igraph_vector_init(&weights, E);
61  igraph_get_edgelist(srcGraph, &edges, true);
62  if ((bool) igraph_cattribute_has_attr(srcGraph, IGRAPH_ATTRIBUTE_EDGE, "weight"))
63  EANV(srcGraph, "weight", &weights);
64  else
65  igraph_vector_fill(&weights, 1.);
66 
67  // Create Hash Table
68  sparsecreate(N, N, E, *hashTable);
69 
70  // Get triplet list from igraph graph
71  for (int k = 0; k < E; k++)
72  sparseset(*hashTable, VECTOR(edges)[k], VECTOR(edges)[E+k], VECTOR(weights)[k]);
73 
74 return hashTable;
75 }
76 
77 void setConstant(real_1d_array *v, double constant)
78 {
79  for (int j = 0; j < v->length(); j++)
80  (*v)(j) = constant;
81  return;
82 }
83 
84 void setConstant(integer_1d_array *v, int constant)
85 {
86  for (int j = 0; j < v->length(); j++)
87  (*v)(j) = constant;
88  return;
89 }
90 
91 void setLinSpaced(real_1d_array *v, double low, double high)
92 {
93  int length = v->length();
94  double stride = (high - low) / length;
95  (*v)(0) = low;
96  for (int j = 1; j < length; j++)
97  (*v)(j) = (*v)(j-1) + stride;
98  return;
99 }
100 
101 void setLinSpaced(integer_1d_array *v, int low, int high)
102 {
103  int length = v->length();
104  int stride = (high - low) / length;
105  (*v)(0) = low;
106  for (int j = 1; j < length; j++)
107  (*v)(j) = (*v)(j-1) + stride;
108  return;
109 }
110 
111 void setRow(real_2d_array *a, real_1d_array *row, int i)
112 {
113  for (int j = 0; j < row->length(); j++)
114  (*a)(i, j) = (*row)(j);
115  return;
116 }
117 
118 void setRow(integer_2d_array *a, integer_1d_array *row, int i)
119 {
120  for (int j = 0; j < row->length(); j++)
121  (*a)(i, j) = (*row)(j);
122  return;
123 }
124 
125 void setCol(real_2d_array *a, real_1d_array *col, int j)
126 {
127  for (int i = 0; i < col->length(); i++)
128  (*a)(i, j) = (*col)(i);
129  return;
130 }
131 
132 void setCol(integer_2d_array *a, integer_1d_array *col, int j)
133 {
134  for (int i = 0; i < col->length(); i++)
135  (*a)(i, j) = (*col)(i);
136  return;
137 }
138 
139 double getMin(real_1d_array *v, int *arg)
140 {
141  double mn = (*v)(0);
142  *arg = 0;
143  for (int j = 0; j < v->length(); j++){
144  if ((*v)(j) < mn){
145  mn = (*v)(j);
146  *arg = j;
147  }
148  }
149  return mn;
150 }
151 
152 int getMin(integer_1d_array *v, int *arg)
153 {
154  int mn = (*v)(0);
155  *arg = 0;
156  for (int j = 0; j < v->length(); j++){
157  if ((*v)(j) < mn){
158  mn = (*v)(j);
159  *arg = j;
160  }
161  }
162  return mn;
163 }
164 
165 int getNNZ(spAlg *s)
166 {
167  int nnz = 0;
168  ae_int_t t0 = 0;
169  ae_int_t t1 = 0;
170  ae_int_t i, j;
171  double v;
172 
173  while (sparseenumerate(*s, t0, t1, i, j, v))
174  nnz++;
175 
176  return nnz;
177 }
178 
179 double entropy(real_1d_array *dist)
180 {
181  double s = 0.;
182  for (int k = 0; k < dist->length(); k++)
183  s -= plog2p((*dist)(k));
184  return s;
185 }
186 
187 double entropyRate(spAlg *T, real_1d_array *dist)
188 {
189  double s = 0.;
190  ae_int_t t0 = 0;
191  ae_int_t t1 = 0;
192  ae_int_t i, j;
193  double v;
194 
195  while (sparseenumerate(*T, t0, t1, i, j, v))
196  s -= (*dist)(i) * plog2p(v);
197 
198  return s;
199 }
200 #endif
#define plog2p(x)
Calculates the log of x by x.
Definition: atmarkov.hpp:13