chiark / gitweb /
in mc_iterate_worker, use maxhamweight_ok and preconsider_ok on incoming suggestions...
[matchsticks-search.git] / main.c
diff --git a/main.c b/main.c
index 38bd8541ca6d5c382aa6beb06cd5d088f18f6ed8..5eb9e19d6b0b7caa3324e9c515561b895639a14e 100644 (file)
--- a/main.c
+++ b/main.c
  * GNU General Public License for more details.
  */
 
+#define _GNU_SOURCE
+
+#include <publib.h>
+
 #include <stdio.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -35,7 +39,6 @@
 #include <sys/uio.h>
 #include <sys/fcntl.h>
 
-#include <publib.h>
 #include <glpk.h>
 
 /*
@@ -95,6 +98,8 @@ static unsigned printcounter;
 
 static void iterate(void);
 static void iterate_recurse(int i, AdjWord min);
+static bool preconsider_ok(int nwords, bool doprint);
+static bool maxhamweight_ok(void);
 static void optimise(bool doprint);
 
 static void progress_eol(void) {
@@ -142,6 +147,8 @@ typedef struct {
 } Worker;
 static Worker *mc_us;
 
+static void multicore_check_for_new_best(void);
+
 #define MAX_NIOVS 3
 static AdjWord mc_iter_min;
 static int mc_niovs;
@@ -210,6 +217,13 @@ static void mc_iterate_worker(void) {
     ssize_t r = readv(mc_work[0], mc_iov, mc_niovs);
     if (r == 0) break;
     assert(r == mc_iovlen);
+    
+    bool ok = maxhamweight_ok();
+    if (!ok) continue;
+
+    ok = preconsider_ok(multicore_iteration_boundary, 1);
+    progress_eol();
+    if (!ok) continue;
 
     /* stop iterate_recurse from trying to run multicore_outer_iteration */
     int mc_org_it_bound = multicore_iteration_boundary;
@@ -331,6 +345,11 @@ static int count_set_adj_bits(AdjWord w) {
 
 static int totalfrags;
 
+static bool maxhamweight_ok(void) {
+  double maxminsize = (double)m / maxhamweight;
+  return maxminsize > best;
+}
+
 static bool preconsider_ok(int nwords, bool doprint) {
   int i;
 
@@ -580,8 +599,7 @@ static void iterate_recurse(int i, AdjWord min) {
 
 static void iterate(void) {
   for (maxhamweight=1; maxhamweight<=m; maxhamweight++) {
-    double maxminsize = (double)m / maxhamweight;
-    if (maxminsize <= best)
+    if (!maxhamweight_ok())
       continue;
 
     iterate_recurse(0, 1);