X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=moebius2.git;a=blobdiff_plain;f=graph.c;h=a81de42e89e2bb3839ccf2517c25af38b30f1b9d;hp=74d93bfd6dd454164d6c1cf0b02a652e04a5a927;hb=4c2fa1edde3eff50648b6782e0b6e63add9b4943;hpb=7e2e842bbff916e29b2927ae2057b8028b475a32 diff --git a/graph.c b/graph.c index 74d93bf..a81de42 100644 --- a/graph.c +++ b/graph.c @@ -4,6 +4,7 @@ #include "mgraph.h" #include "minimise.h" +#include "parallel.h" static int sqdistances[N][N]; @@ -14,7 +15,7 @@ static void breadth_first_search(int start, int sqdistances_r[N]) { int v,e, current, future, dfuture; buf_push= buf_pop= buffer; - FOR_VERTEX(v) d[v]= -1; + FOR_VERTEX(v,INNER) d[v]= -1; d[start]= 0; *buf_push++= start; @@ -31,16 +32,19 @@ static void breadth_first_search(int start, int sqdistances_r[N]) { assert(buf_pop==buf_push); assert(buf_push <= buffer+sizeof(buffer)/sizeof(buffer[0])); - FOR_VERTEX(v) { + FOR_VERTEX(v,INNER) { assert(d[v] >= 0); sqdistances_r[v]= d[v] * d[v]; } + +// FOR_VERTEX(v) { +// } -void graph_layout_prepare() { +void graph_layout_prepare(void) { int v1; - FOR_VERTEX(v1) + FOR_VERTEX(v1,INNER) breadth_first_search(v1, sqdistances[v1]); alpha= 2; @@ -50,7 +54,7 @@ void graph_layout_prepare() { } -double graph_layout_cost(const Vertices v, const double vertex_areas[N]) { +double graph_layout_cost(const Vertices v, int section) { /* For each (vi,vj) computes shortest path s_ij = |vi..vj| * along edges, and actual distance d_ij = |vi-vj|. * @@ -73,7 +77,7 @@ double graph_layout_cost(const Vertices v, const double vertex_areas[N]) { int v1,v2,e, nedges=0; double totaledgelength=0, meanedgelength, meanedgelength2; - FOR_EDGE(v1,e,v2) { + FOR_EDGE(v1,e,v2,INNER) { totaledgelength += hypotD(v[v1], v[v2]); nedges++; } @@ -82,8 +86,8 @@ double graph_layout_cost(const Vertices v, const double vertex_areas[N]) { meanedgelength2= meanedgelength * meanedgelength; // printf("mean=%g mean^2=%g\n", meanedgelength, meanedgelength2); - FOR_VERTEX(v1) { - FOR_VERTEX(v2) { + FOR_VERTEX(v1,OUTER) { + FOR_VERTEX(v2,INNER) { if (v1 == v2) continue; double d2= hypotD2(v[v1],v[v2]); @@ -98,7 +102,7 @@ double graph_layout_cost(const Vertices v, const double vertex_areas[N]) { * let beta' = (1-beta)/2 */ - double cost= pow(d2/s2, beta_prime); + double cost= (vertex_mean_edge_lengths[v1]) * pow(d2/s2, beta_prime); //printf("layout %03x..%03x dist^2=%d s^2=%g d^2=%g " //" cost+=%g\n", v1,v2, dist2, @@ -106,5 +110,5 @@ double graph_layout_cost(const Vertices v, const double vertex_areas[N]) { total_cost += cost; } } - return total_cost; + return total_cost/meanedgelength; }