#include "mgraph.h"
#include "minimise.h"
+#include "parallel.h"
static int sqdistances[N][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;
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|.
*
*/
//static const double d2_epsilon= 1e-6;
- // double edge_weights[V6<<ESHIFT], vertex_distances[N],
double total_cost=0;
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++;
}
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]);
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);
- //double s2= s*s + d2_epsilon;
- //double sd2= s2 / d2;
- //double cost_contrib= a1*a2 * (sd2 - 1) / (d2*d2);
- //double cost_contrib= sd2;
-
//printf("layout %03x..%03x dist^2=%d s^2=%g d^2=%g "
//" cost+=%g\n", v1,v2, dist2,
// s2,d2, cost);
total_cost += cost;
}
}
- return total_cost;
+ return total_cost/meanedgelength;
}