00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "neato.h"
00024
00025 int solveCircuit(int nG, double **Gm, double **Gm_inv)
00026 {
00027 double sum;
00028 int i, j;
00029
00030 if (Verbose)
00031 fprintf(stderr, "Calculating circuit model");
00032
00033
00034 for (i = 0; i < nG; i++) {
00035 sum = 0.0;
00036 for (j = 0; j < nG; j++)
00037 if (i != j)
00038 sum += Gm[i][j];
00039 Gm[i][i] = -sum;
00040 }
00041 return matinv(Gm, Gm_inv, nG - 1);
00042 }
00043
00044 int circuit_model(graph_t * g, int nG)
00045 {
00046 double **Gm;
00047 double **Gm_inv;
00048 int rv, i, j;
00049 node_t *v;
00050 edge_t *e;
00051
00052 Gm = new_array(nG, nG, 0.0);
00053 Gm_inv = new_array(nG, nG, 0.0);
00054
00055
00056 for (v = agfstnode(g); v; v = agnxtnode(g, v)) {
00057 for (e = agfstedge(g, v); e; e = agnxtedge(g, e, v)) {
00058 i = ND_id(e->tail);
00059 j = ND_id(e->head);
00060 if (i == j)
00061 continue;
00062
00063 Gm[i][j] = Gm[j][i] = -1.0 / ED_dist(e);
00064 }
00065 }
00066
00067 rv = solveCircuit(nG, Gm, Gm_inv);
00068
00069 if (rv)
00070 for (i = 0; i < nG; i++) {
00071 for (j = 0; j < nG; j++) {
00072 GD_dist(g)[i][j] =
00073 Gm_inv[i][i] + Gm_inv[j][j] - 2.0 * Gm_inv[i][j];
00074 }
00075 }
00076 free_array(Gm);
00077 free_array(Gm_inv);
00078 return rv;
00079 }