X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=moebius2.git;a=blobdiff_plain;f=graph.c;h=a81de42e89e2bb3839ccf2517c25af38b30f1b9d;hp=31e317d363112027ef1eae6b7405c50cab299218;hb=ad8f9959ed7e147b88a57a7634c78faa69cefc6a;hpb=72f8ad06842d28b84b9ec4f15e0890a1caedf3d0 diff --git a/graph.c b/graph.c index 31e317d..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,26 +32,29 @@ 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; - beta= -log(10)/log(alpha); + beta= log(10)/log(alpha); beta_prime= (1-beta)/2; printf("alpha=%g beta=%g beta'=%g\n", alpha,beta,beta_prime); } -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]); @@ -93,12 +97,12 @@ double graph_layout_cost(const Vertices v, const double vertex_areas[N]) { double s2= dist2 * meanedgelength2; - /* energy = (d/s)^(1-beta) where beta is -log\_{alpha}(10) + /* energy = (d/s)^(1-beta) where beta is log\_{alpha}(10) * energy = ((d/s)^2) ^ (1-beta)/2 * 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; }