+#if XBITS==3
+#define STOP_EPSILON 1e-6
+ COST( 3e3, line_bending_cost)
+ COST( 3e3, edge_length_variation_cost)
+ COST( 0.4e3, rim_proximity_cost)
+ COST( 1e6, edge_angle_cost)
+ #define EDGE_ANGLE_COST_CIRCCIRCRAT (0.5/1.7)
+// COST( 1e1, small_triangles_cost)
+ COST( 1e12, noncircular_rim_cost)
+#endif
+
+#if XBITS==4
+#define STOP_EPSILON 1e-6
+ COST( 3e5, line_bending_cost)
+ COST( 10e2, edge_length_variation_cost)
+ COST( 9.0e1, rim_proximity_cost) // 5e1 is too much
+ // 2.5e1 is too little
+ // 0.2e1 grows compared to previous ?
+ // 0.6e0 shrinks compared to previous ?
+
+ COST( 1e12, edge_angle_cost)
+ #define EDGE_ANGLE_COST_CIRCCIRCRAT (0.5/1.3)
+ COST( 1e18, noncircular_rim_cost)
+#endif
+};
+
+#define NCOSTS ((sizeof(costs)/sizeof(costs[0])))
+
+const double edge_angle_cost_circcircrat= EDGE_ANGLE_COST_CIRCCIRCRAT;
+
+void energy_init(void) {
+ stop_epsilon= STOP_EPSILON;
+}
+
+void compute_energy_separately(const struct Vertices *vs,
+ int section, void *energies_v, void *totals_v) {
+ double *energies= energies_v;
+ int ci;
+
+ compute_edge_lengths(vs->a, section);
+ compute_vertex_areas(vs->a, section);
+
+ for (ci=0; ci<NCOSTS; ci++)
+ energies[ci]= costs[ci].fn(vs->a, section);
+}
+
+/*---------- energy computation machinery ----------*/