typedef uint32_t AdjWord;
#define PRADJ "08"PRIx32
+#define FOR_BITS(j,m) for (j=0, j##bit=1; j < (m); j++, j##bit<<=1)
+
static int n, m, maxhamweight;
static AdjWord *adjmatrix;
static AdjWord adjall;
n_over_best = INT_MAX;
}
+#if 0
static AdjWord one_adj_bit(int bitnum) {
return (AdjWord)1 << bitnum;
}
+#endif
static int count_set_adj_bits(AdjWord w) {
- int j, total;
- for (j=0, total=0; j<m; j++)
- total += !!(w & one_adj_bit(j));
+ int j, total = 0;
+ AdjWord jbit;
+ FOR_BITS(j,m)
+ total += !!(w & jbit);
return total;
}
/* Consider the best answer (if any) for a given adjacency matrix */
glp_prob *prob = 0;
int i, j;
+ AdjWord jbit;
/*
* Up to a certain point, optimise() can be restarted. We use this
glp_set_obj_coef(prob, X_minimum, 1);
for (i=0; i<n; i++) {
- for (j=0; j<m; j++) {
- if (!(adjmatrix[i] & one_adj_bit(j)))
+ for (j=0, jbit=1; j<m; j++, jbit<<=1) {
+ if (!(adjmatrix[i] & jbit))
continue;
/* x_total_i += x_minimum */
/* x_total_j += x_minimum */
}
static void iterate_recurse(int i, AdjWord min) {
+ int j;
+ AdjWord jbit;
+
if (i >= n) {
printcounter++;
optimise(!(printcounter & 0xfff));
if (i == 0 && (adjmatrix[i] & (1+adjmatrix[i])))
goto again;
- for (int j = 0; j < m; j++)
- if (adjmatrix[i] & one_adj_bit(j))
+ FOR_BITS(j,m)
+ if (adjmatrix[i] & jbit)
weight[j]++;
for (int j = 0; j < m; j++)
if (weight[j] >= n_over_best)
iterate_recurse(i+1, adjmatrix[i]);
takeout:
- for (int j = 0; j < m; j++)
- if (adjmatrix[i] & one_adj_bit(j))
+ FOR_BITS(j,m)
+ if (adjmatrix[i] & jbit)
weight[j]--;
again: