#include "neato.h"
int circuit_model(graph_t *g, int nG)
{
double **Gm, **Gm_inv, sum;
int i, j;
node_t *v;
edge_t *e;
if (Verbose) fprintf (stderr, "Calculating circuit model\n");
Gm = new_array(nG, nG, 0.0);
Gm_inv = new_array(nG, nG, 0.0);
for (v = agfstnode(g); v; v = agnxtnode(g,v)) {
for (e = agfstedge(g,v); e; e = agnxtedge(g,e,v)) {
i = ND_id(e->tail);
j = ND_id(e->head);
if (i == j) continue;
Gm[i][j] = Gm[j][i] = -1.0 / ED_dist(e);
}
}
for (i = 0; i < nG ; i++) {
sum = 0.0;
for (j = 0; j < nG ; j++)
if (i != j) sum += Gm[i][j];
Gm[i][i] = -sum;
}
if (!matinv(Gm, Gm_inv, nG - 1)) return 0;
for (i = 0; i < nG ; i++) {
for (j = 0; j < nG ; j++) {
GD_dist(g)[i][j] = Gm_inv[i][i] + Gm_inv[j][j] - 2.0 * Gm_inv[i][j];
}
}
return 1;
}