18 #include <grass/gis.h>
19 #include <grass/Vect.h>
20 #include <grass/glocale.h>
21 #include <grass/dgl/graph.h>
22 #include <grass/neta.h>
37 for (i = 1; i <= nnodes; i++)
55 double error,
double *eigenvector)
61 tmp = (
double *)G_calloc(nnodes + 1,
sizeof(
double));
68 for (i = 1; i <= nnodes; i++)
70 for (iter = 0; iter < iterations; iter++) {
71 for (i = 1; i <= nnodes; i++)
80 double cur_value = eigenvector[node_id];
93 double cum_error = 0, max_value = tmp[1];
95 for (i = 2; i <= nnodes; i++)
96 if (tmp[i] > max_value)
98 for (i = 1; i <= nnodes; i++) {
101 (tmp[i] - eigenvector[i]) * (tmp[i] - eigenvector[i]);
102 eigenvector[i] = tmp[i];
104 if (cum_error < error)
129 int i, j, nnodes, stack_size,
count;
139 prev = (
struct ilist **)G_calloc(nnodes + 1,
sizeof(
struct ilist *));
144 if (!dst || !prev || !stack || !cnt || !delta) {
150 for (i = 1; i <= nnodes; i++) {
168 for (i = 1; i <= nnodes; i++)
170 for (i = 1; i <= nnodes; i++) {
185 dist = heap_node.
key;
188 stack[stack_size++] = v;
202 if (dst[to_id] == -1 || dst[to_id] > dist + d) {
203 dst[to_id] = dist + d;
205 heap_data.
ul = to_id;
208 if (dst[to_id] == dist + d) {
209 cnt[to_id] += cnt[v];
217 for (i = 1; i <= nnodes; i++)
219 for (i = stack_size - 1; i >= 0; i--) {
223 closeness[
s] += dst[
w];
225 for (j = 0; j < prev[
w]->n_values; j++) {
228 delta[v] += (cnt[v] / (double)cnt[w]) * (1.0 + delta[
w]);
230 if (w != s && betweenness)
231 betweenness[
w] += delta[
w];
235 closeness[
s] /= (double)stack_size;
239 for (i = 1; i <= nnodes; i++)