static glp_prob *best_prob;
static AdjWord *best_adjmatrix;
+static unsigned printcounter;
+
static AdjWord *xalloc_adjmatrix(void) {
return xmalloc(sizeof(*adjmatrix)*n);
}
return total;
}
-static void optimise(void) {
+static void optimise(int doprint) {
glp_prob *prob = 0;
int i, j, totalfrags;
for (i=0, totalfrags=0; i<n; i++) {
int frags = count_set_adj_bits(adjmatrix[i]);
totalfrags += frags;
- printf("%"PRADJ" ", adjmatrix[i]);
+ if (doprint) printf("%"PRADJ" ", adjmatrix[i]);
double maxminsize = (double)m / frags;
if (maxminsize < best) {
- printf(" too fine ");
+ if (doprint) printf(" too fine");
goto out;
}
}
matrix_entries);
int r = glp_simplex(prob, NULL);
- printf(" simplex=%d", r);
+ if (doprint) printf(" simplex=%d", r);
#define OKERR(e) \
- case e: printf(" " #e ); goto out;
+ case e: if (doprint) printf(" " #e ); goto out;
#define BADERR(e) \
- case e: printf(" " #e " CRASHING"); exit(-1);
+ case e: if (doprint) printf(" " #e " CRASHING"); exit(-1);
#define DEFAULT \
- default: printf(" ! CRASHING"); exit(-1);
+ default: if (doprint) printf(" ! CRASHING"); exit(-1);
switch (r) {
OKERR(GLP_ESING);
}
r = glp_get_status(prob);
- printf(" status=%d", r);
+ if (doprint) printf(" status=%d", r);
switch (r) {
OKERR(GLP_NOFEAS);
}
double got = glp_get_obj_val(prob);
- printf(" %g", got);
+ if (doprint) printf(" %g", got);
if (got <= best)
goto out;
+ if (!doprint) {
+ optimise(1);
+ goto out;
+ }
+
best = got;
if (best_prob) glp_delete_prob(best_prob);
out:
if (prob)
glp_delete_prob(prob);
- printf("\r");
+ if (doprint) { printf(" \r"); fflush(stdout); }
}
static void iterate_recurse(int i, AdjWord min) {
if (i >= n) {
- optimise();
+ printcounter++;
+ optimise(!(printcounter & 0xfff));
return;
}
for (adjmatrix[i] = min;