/*---------- main energy computation and subroutines ----------*/
double compute_energy(const struct Vertices *vs) {
+ static int bests_unprinted;
+
double energy;
int printing;
printing= printing_check(pr_cost,0);
- if (printing) printf("cost > energy |");
-
- COST(3e2, line_bending_cost(vs->a));
- COST(1e3, edge_length_variation_cost(vs->a));
- COST(0.2e3, rim_proximity_cost(vs->a));
-// COST(1e2, graph_layout_cost(vs->a));
- COST(1e8, noncircular_rim_cost(vs->a));
+ if (printing) printf("%15lld c>e |", evaluations);
+
+ if (XBITS==3) {
+ COST( 3e2, line_bending_cost(vs->a));
+ COST( 1e3, edge_length_variation_cost(vs->a));
+ COST( 0.2e3, rim_proximity_cost(vs->a));
+ COST( 1e8, noncircular_rim_cost(vs->a));
+ stop_epsilon= 1e-6;
+ } else if (XBITS==4) {
+ COST( 3e2, line_bending_cost(vs->a));
+ COST( 3e3, edge_length_variation_cost(vs->a));
+ COST( 3.8e1, rim_proximity_cost(vs->a)); // 5e1 is too much
+ // 2.5e1 is too little
+ // 0.2e1 grows compared to previous ?
+ // 0.6e0 shrinks compared to previous ?
+ COST( 1e12, noncircular_rim_cost(vs->a));
+ stop_epsilon= 1e-5;
+ } else {
+ abort();
+ }
if (printing) printf("| total %# e |", energy);
FILE *best_f;
int r;
- if (printing) printf(" BEST");
+ if (printing) {
+ printf(" BEST");
+ if (bests_unprinted) printf(" [%4d]",bests_unprinted);
+ bests_unprinted= 0;
+ } else {
+ bests_unprinted++;
+ }
- best_f= fopen(output_file_tmp,"wb"); if (!best_f) diee("fopen new out");
+ best_f= fopen(best_file_tmp,"wb"); if (!best_f) diee("fopen new out");
r= fwrite(vs->a,sizeof(vs->a),1,best_f); if (r!=1) diee("fwrite");
if (fclose(best_f)) diee("fclose new best");
- if (rename(output_file_tmp,output_file)) diee("rename install new best");
+ if (rename(best_file_tmp,best_file)) diee("rename install new best");
best_energy= energy;
}
flushoutput();
}
+ evaluations++;
return energy;
}
static void addcost(double *energy, double tweight, double tcost, int pr) {
double tenergy= tweight * tcost;
- if (pr) printf(" %# e x %# e > %# e* |", tcost, tweight, tenergy);
+ if (pr) printf(" %# e x %g > %# e* |", tcost, tweight, tenergy);
*energy += tenergy;
}
double delta= atan2(magnD(axb) + axb_epsilon, dotprod(a,b));
double cost= pow(delta,exponent_r);
- if (!e && !(qi & YMASK))
+ if (!e && !(qi & ~XMASK))
cost *= 10;
total_cost += cost;