From 47850b1d988483f5939b5bdb4a3bd60604f6930c Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Mon, 31 Dec 2007 12:27:38 +0000 Subject: [PATCH] bugfixes, smaller size --- bgl.cpp | 23 ++++++++++++++++------- energy.c | 12 +++++++----- mgraph.c | 2 +- mgraph.h | 4 ++-- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/bgl.cpp b/bgl.cpp index 4b06897..0d1f355 100644 --- a/bgl.cpp +++ b/bgl.cpp @@ -22,10 +22,11 @@ extern "C" { } /* - * edge descriptor f = 00 | e | y | x - * 3 YBITS XBITS + * edge descriptor f = 0000 | e | y | x + * 3 YBITS XBITS * - * e is 0..5. The edge is edge e out of vertex (x,y). + * e is 0..6. The edge is edge e out of vertex (x,y), or if + * e==6 it's the `at end' value for the out edge iterator. * * BGL expects an undirected graph's edges to have two descriptors * each, one in each direction (otherwise e would be just 0..2). @@ -93,7 +94,7 @@ class OutEdgeIterator : OutEdgeIterator() { } OutEdgeIterator(int _f) : f(_f) { } OutEdgeIterator(int v, int e) : f(e<>ESHIFT); } + inline int target(int f, const Graph&) { + int v2= EDGE_END2(f&VMASK, f>>ESHIFT); + //printf("traversed %03x..%02x\n",f,v2); + return v2; + } inline std::pair out_edges(int v, const Graph&) { return std::make_pair(OutEdgeIterator(v, OutEdgeIterator::voe_min(v)), @@ -198,9 +203,13 @@ double graph_layout_cost(const Vertices v, const double vertex_areas[N]) { FOR_VERTEX(v2) { double a2= vertex_areas[v2]; double d2= hypotD2plus(v[v1],v[v2], d2_epsilon); - double sd= vertex_distances[v2] / d2; + double s= vertex_distances[v2]; + double sd= s / d2; double sd2= sd*sd; - total_cost += a1*a2 * (sd2 - 1) / (d2*d2); + double cost_contrib= a1*a2 * (sd2 - 1) / (d2*d2); + //printf("layout %03x..%03x (a=%g,%g) s=%g d2=%g cost+=%g\n", + // v1,v2, a1,a2, s,d2, cost_contrib); + total_cost += cost_contrib; } } return total_cost; diff --git a/energy.c b/energy.c index 3c76b0c..f6907bc 100644 --- a/energy.c +++ b/energy.c @@ -32,7 +32,7 @@ static double compute_energy(const Vertices vertices) { COST(1000.0, edgewise_vertex_displacement_cost(vertices)); COST(1.0, graph_layout_cost(vertices,vertex_areas)); - COST(1e3, noncircular_rim_cost(vertices)); + COST(1e-30, noncircular_rim_cost(vertices)); printf("| total %# e |", energy); if (energy < best_energy) { @@ -42,9 +42,11 @@ static double compute_energy(const Vertices vertices) { printf(" BEST"); best_f= fopen(BEST_F ".new","wb"); if (!best_f) diee("fopen new best"); - r= fwrite(vertices,sizeof(vertices),1,best_f); if (r!=1) diee("fwrite"); + r= fwrite(vertices,sizeof(Vertices),1,best_f); if (r!=1) diee("fwrite"); if (fclose(best_f)) diee("fclose new best"); if (rename(BEST_F ".new", BEST_F)) diee("rename install new best"); + + best_energy= energy; } putchar('\n'); flushoutput(); @@ -148,11 +150,11 @@ int main(int argc, const char *const *argv) { initial_gsl.owner= 0; step_size_gsl= initial_gsl; - initial_gsl.data= (double*)initial; - step_size_gsl.data= (double*)step_size; + initial_gsl.data= &initial[0][0]; + step_size_gsl.data= &step_size[0][0]; FOR_VERTEX(v) - K step_size[v][k]= 1e-3; + K step_size[v][k]= 1e-4; FOR_RIM_VERTEX(vx,vy,v) step_size[v][3] *= 0.1; diff --git a/mgraph.c b/mgraph.c index 19bb4ba..c66ef48 100644 --- a/mgraph.c +++ b/mgraph.c @@ -5,7 +5,7 @@ #include "mgraph.h" static const unsigned dx[V6]= { +1, +1, 0, -1, -1, 0 }, - dy[V6]= { 0, +Y1, +Y1, 0, -Y1, -Y1 }; + dy[V6]= { 0, -Y1, -Y1, 0, +Y1, +Y1 }; int edge_end2(unsigned v1, int e) { /* The topology is equivalent to that of a square lattice with only diff --git a/mgraph.h b/mgraph.h index 3995d46..acbe5c4 100644 --- a/mgraph.h +++ b/mgraph.h @@ -48,9 +48,9 @@ #include "common.h" -#define XBITS 4 +#define XBITS 3 #define X (1<