X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=main.c;h=69f56d1a30e8bba421e9e7a7231019a45f08b09d;hb=41013cb05383473c8ffdcf9afc89dde04760a847;hp=d2900152f1336eaace2a8b656024f9f48dde100e;hpb=c40dd9fe9a488a35d31dcf0083c4271660678f08;p=matchsticks-search.git diff --git a/main.c b/main.c index d290015..69f56d1 100644 --- a/main.c +++ b/main.c @@ -91,6 +91,8 @@ 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; @@ -99,7 +101,7 @@ static double best; static glp_prob *best_prob; static AdjWord *best_adjmatrix; -static int n_over_best; +static int n_over_best, m_over_best; static int *weight; static unsigned printcounter; @@ -118,6 +120,7 @@ static void progress_eol(void) { static void set_best(double new_best) { best = new_best; n_over_best = floor(n / best); + m_over_best = floor(m / best); } /*----- multicore support -----*/ @@ -308,10 +311,10 @@ static void multicore(void) { for (w=0; w best; + return maxhamweight <= m_over_best; } static bool preconsider_ok(int nwords, bool doprint) { @@ -384,14 +390,13 @@ static bool preconsider_ok(int nwords, bool doprint) { bool had_max = 0; for (i=0, totalfrags=0; i= maxhamweight); - totalfrags += frags; PRINTF("%"PRADJ" ", adjmatrix[i]); - double maxminsize = (double)m / frags; - if (maxminsize <= best) { + if (frags > m_over_best) { PRINTF(" too fine"); goto out; } + had_max += (frags >= maxhamweight); + totalfrags += frags; } if (!had_max) { /* Skip this candidate as its max hamming weight is lower than @@ -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; + AdjWord jbit; /* * 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) { 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; - 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) @@ -625,8 +634,8 @@ static void iterate_recurse(int i, AdjWord min) { 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: