chiark / gitweb /
get rid of debugging for checking OUTER iteration; leave SIGINT handler and fix to...
[moebius2.git] / graph.c
diff --git a/graph.c b/graph.c
index 31e317d363112027ef1eae6b7405c50cab299218..a81de42e89e2bb3839ccf2517c25af38b30f1b9d 100644 (file)
--- 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;
 }