chiark
/
gitweb
/
~ianmdlvl
/
matchsticks-search.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
provide and use FOR_BITS
[matchsticks-search.git]
/
main.c
diff --git
a/main.c
b/main.c
index d8ae901500852542834597f73332f1e5d70fbc1e..e8915f7c5661dcd93fb75479e22f80ebce7f629a 100644
(file)
--- a/
main.c
+++ b/
main.c
@@
-91,6
+91,8
@@
typedef uint32_t AdjWord;
#define PRADJ "08"PRIx32
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;
static int n, m, maxhamweight;
static AdjWord *adjmatrix;
static AdjWord adjall;
@@
-356,14
+358,17
@@
static void prep(void) {
n_over_best = INT_MAX;
}
n_over_best = INT_MAX;
}
+#if 0
static AdjWord one_adj_bit(int bitnum) {
return (AdjWord)1 << bitnum;
}
static AdjWord one_adj_bit(int bitnum) {
return (AdjWord)1 << bitnum;
}
+#endif
static int count_set_adj_bits(AdjWord w) {
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;
}
return total;
}
@@
-411,6
+416,7
@@
static void optimise(bool doprint) {
/* Consider the best answer (if any) for a given adjacency matrix */
glp_prob *prob = 0;
int i, j;
/* 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
/*
* Up to a certain point, optimise() can be restarted. We use this
@@
-496,8
+502,8
@@
static void optimise(bool doprint) {
glp_set_obj_coef(prob, X_minimum, 1);
for (i=0; i<n; i++) {
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 */
continue;
/* x_total_i += x_minimum */
/* x_total_j += x_minimum */
@@
-598,6
+604,9
@@
static void optimise(bool doprint) {
}
static void iterate_recurse(int i, AdjWord min) {
}
static void iterate_recurse(int i, AdjWord min) {
+ int j;
+ AdjWord jbit;
+
if (i >= n) {
printcounter++;
optimise(!(printcounter & 0xfff));
if (i >= n) {
printcounter++;
optimise(!(printcounter & 0xfff));
@@
-615,8
+624,8
@@
static void iterate_recurse(int i, AdjWord min) {
if (i == 0 && (adjmatrix[i] & (1+adjmatrix[i])))
goto again;
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)
weight[j]++;
for (int j = 0; j < m; j++)
if (weight[j] >= n_over_best)
@@
-625,8
+634,8
@@
static void iterate_recurse(int i, AdjWord min) {
iterate_recurse(i+1, adjmatrix[i]);
takeout:
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:
weight[j]--;
again: