float* circuitModel(vtx_data * graph, int nG) { int i, j, e, rv, count; float *Dij = N_NEW(nG * (nG + 1) / 2, float); double **Gm; double **Gm_inv; Gm = new_array(nG, nG, 0.0); Gm_inv = new_array(nG, nG, 0.0); /* set non-diagonal entries */ if (graph->ewgts) { for (i = 0; i < nG; i++) { for (e = 1; e < graph[i].nedges; e++) { j = graph[i].edges[e]; /* conductance is 1/resistance */ Gm[i][j] = Gm[j][i] = -1.0 / graph[i].ewgts[e]; /* negate */ } } } else { for (i = 0; i < nG; i++) { for (e = 1; e < graph[i].nedges; e++) { j = graph[i].edges[e]; /* conductance is 1/resistance */ Gm[i][j] = Gm[j][i] = -1.0; /* ewgts are all 1 */ } } } rv = solveCircuit(nG, Gm, Gm_inv); if (rv) { float v; count = 0; for (i = 0; i < nG; i++) { for (j = i; j < nG; j++) { if (i == j) v = 0.0; else v = (float) (Gm_inv[i][i] + Gm_inv[j][j] - 2.0 * Gm_inv[i][j]); Dij[count++] = v; } } } else { free(Dij); Dij = NULL; } free_array(Gm); free_array(Gm_inv); return Dij; }
int circuit_model(graph_t * g, int nG) { double **Gm; double **Gm_inv; int rv; long i, j; node_t *v; edge_t *e; Gm = new_array(nG, nG, 0.0); Gm_inv = new_array(nG, nG, 0.0); /* set non-diagonal entries */ for (v = agfstnode(g); v; v = agnxtnode(g, v)) { for (e = agfstedge(g, v); e; e = agnxtedge(g, e, v)) { i = AGID(agtail(e)); j = AGID(aghead(e)); if (i == j) continue; /* conductance is 1/resistance */ Gm[i][j] = Gm[j][i] = -1.0 / ED_dist(e); /* negate */ } } rv = solveCircuit(nG, Gm, Gm_inv); if (rv) 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]; } } free_array(Gm); free_array(Gm_inv); return rv; }