static void printa (PicoSAT * picosat, int partial) { int max_idx = picosat_variables (picosat), i, lit, val; assert (bhead == buffer); for (i = 1; i <= max_idx; i++) { if (partial) { val = picosat_deref_partial (picosat, i); if (!val) continue; } else val = picosat_deref (picosat, i); lit = (val > 0) ? i : -i; printi (lit); } printi (0); if (bhead > buffer) bflush (); }
CAMLprim value caml_model(value unit) { CAMLparam0 (); CAMLlocal1( tl ); tl = Val_emptylist; int i, max_idx = picosat_variables (); for (i = 1; i <= max_idx; i++) /* discard all variables that are unknown */ if (picosat_deref (i)) tl = append (Val_int(i), tl); CAMLreturn(tl); }
static void blocksol (PicoSAT * picosat) { int max_idx = picosat_variables (picosat), i; if (!sol) { sol = malloc (max_idx + 1); memset (sol, 0, max_idx + 1); } for (i = 1; i <= max_idx; i++) sol[i] = (picosat_deref (picosat, i) > 0) ? 1 : -1; for (i = 1; i <= max_idx; i++) picosat_add (picosat, (sol[i] < 0) ? i : -i); picosat_add (picosat, 0); }
int main (int argc, char ** argv) { int i, * p, n, oldn, red, nonred, res, round, printed, len; const char * err; const int * q; char * cmd; Cls * c; #ifndef NDEBUG int tmp; #endif start = picosat_time_stamp (); for (i = 1; i < argc; i++) { if (!strcmp (argv[i], "-h")) { fputs (USAGE, stdout); exit (0); } else if (!strcmp (argv[i], "-v")) { if (verbose < 0) die ("'-v' option after '-q'"); verbose++; } else if (!strcmp (argv[i], "-q")) { if (verbose < 0) die ("two '-q' options"); if (verbose > 0) die ("'-q' option after '-v'"); verbose = -1; } else if (!strcmp (argv[i], "-n")) nowitness = 1; else if (argv[i][0] == '-' && argv[i][1]) die ("invalid command line option '%s'", argv[i]); else if (output_name) die ("too many arguments"); else if (!input_name) input_name = argv[i]; else output_name = argv[i]; } if (!output_name) warn ("no output file given"); if (input_name && strcmp (input_name, "-")) { len = strlen (input_name); if (len >= 3 && !strcmp (input_name + len - 3, ".gz")) { cmd = malloc (len + 20); sprintf (cmd, "gunzip -c %s 2>/dev/null", input_name); input_file = popen (cmd, "r"); pclose_input = 1; free (cmd); } else input_file = fopen (input_name, "r"), fclose_input = 1; if (!input_file) die ("can not read '%s'", input_name); } else input_file = stdin, input_name = "-"; if ((err = parse ())) { fprintf (stdout, "%s:%d: %s\n", input_name, lineno, err); fflush (stdout); exit (1); } if (fclose_input) fclose (input_file); if (pclose_input) pclose (input_file); ps = picosat_init (); picosat_set_prefix (ps, "c [picosat] "); picosat_set_output (ps, stdout); if (verbose > 1) picosat_set_verbosity (ps, verbose - 1); printed = 0; if (!picosat_enable_trace_generation (ps)) warn ("PicoSAT compiled without trace generation"), warn ("core extraction disabled"); else { n = nclauses; nonred = 0; for (round = 1; round <= MAXCOREROUNDS; round++) { if (verbose > 1) msg (1, "starting core extraction round %d", round); picosat_set_seed (ps, round); for (i = 0; i < nclauses; i++) { c = clauses + i; if (c->red) { picosat_add (ps, 1); picosat_add (ps, -1); } else { for (p = c->lits; *p; p++) picosat_add (ps, *p); } #ifndef NDEBUG tmp = #endif picosat_add (ps, 0); assert (tmp == i); } res = picosat_sat (ps, -1); if (res == 10) { assert (round == 1); goto SAT; } assert (res == 20); if (!printed) { assert (round == 1); printed = 1; if (verbose >= 0) printf ("s UNSATISFIABLE\n"), fflush (stdout); } for (i = 0; i < nclauses; i++) { c = clauses + i; if (c->red) { assert (!picosat_coreclause (ps, i)); continue; } if (picosat_coreclause (ps, i)) continue; c->red = 1; } oldn = n; n = 0; for (i = 0; i < nclauses; i++) if (!clauses[i].red) n++; msg (1, "extracted core %d of size %d = %0.f%% out of %d after %.1f sec", round, n, percent (n, nclauses), nclauses, picosat_time_stamp () - start); assert (oldn >= n); picosat_reset (ps); ps = picosat_init (); picosat_set_prefix (ps, "c [picosat] "); picosat_set_output (ps, stdout); if (round >= MINCOREROUNDS) { red = oldn - n; if (red < 10 && (100*red + 99)/oldn < 2) { nonred++; if (nonred > MAXNONREDROUNDS) break; } } if (round < MAXCOREROUNDS) picosat_enable_trace_generation (ps); } } for (i = 0; i < nclauses; i++) { c = clauses + i; if (c->red) { picosat_add (ps, 1); picosat_add (ps, -1); #ifndef NDEBUG tmp = #endif picosat_add (ps, 0); assert (tmp == i); continue; } c->lit = nvars + i + 1; picosat_add (ps, -c->lit); for (p = c->lits; *p; p++) (void) picosat_add (ps, *p); #ifndef NDEBUG tmp = #endif picosat_add (ps, 0); assert (tmp == i); } for (i = 0; i < nclauses; i++) { c = clauses + i; if (c->red) continue; picosat_assume (ps, c->lit); } res = picosat_sat (ps, -1); if (res == 20) { if (!printed && verbose >= 0) printf ("s UNSATISFIABLE\n"), fflush (stdout); for (i = 0; i < nclauses; i++) clauses[i].red = 1; q = picosat_mus_assumptions (ps, 0, callback, 1); while ((i = *q++)) { i -= nvars + 1; assert (0 <= i && i < nclauses); clauses[i].red = 0; } } else { SAT: assert (res == 10); if (!printed && verbose >= 0) printf ("s SATISFIABLE\n"), fflush (stdout); if (!nowitness && verbose >= 0) { for (i = 1; i <= nvars; i++) printf ("v %d\n", ((picosat_deref (ps, i) < 0) ? -1 : 1) * i); printf ("v 0\n"); } } if (verbose > 0) picosat_stats (ps); picosat_reset (ps); n = 0; for (i = 0; i < nclauses; i++) if (!clauses[i].red) n++; red = nclauses - n; msg (1, "found %d redundant clauses %.0f%%", red, percent (red, nclauses)); if (res == 20) msg (0, "computed MUS of size %d out of %d (%.0f%%)", n, nclauses, percent (n, nclauses)); if (output_name && strcmp (output_name, "-")) { output_file = fopen (output_name, "w"); if (!output_file) die ("can not write '%s'", output_name); close_output = 1; } else if (output_name && !strcmp (output_name, "-")) output_file = stdout; if (output_file) { fprintf (output_file, "p cnf %d %d\n", nvars, n); for (i = 0; i < nclauses; i++) if (!clauses[i].red) { for (p = clauses[i].lits; *p; p++) fprintf (output_file, "%d ", *p); fprintf (output_file, "0\n"); } if (close_output) fclose (output_file); } if (res == 20) { if (!nowitness && verbose >= 0) { for (i = 0; i < nclauses; i++) if (!clauses[i].red) printf ("v %d\n", i+1); printf ("v 0\n"); } } msg (1, "%s %d irredundant clauses %.0f%%", output_file ? "printed" : "computed", n, percent (n, nclauses)); for (i = 0; i < nclauses; i++) free (clauses[i].lits); free (clauses); free (lits); msg (1, "%d reductions in %.1f seconds", reductions, picosat_time_stamp () - start); return res; }
static int btor_picosat_deref (BtorSATMgr * smgr, int lit) { return picosat_deref (smgr->solver, lit); }
static void solveNext(int in) { static int boardNumber = 0; /* read board */ fprintf(stderr, "reading board %d ...\n", ++boardNumber); int i, j, row = 0, col = 0; while (in != EOF) { char c = (char) in; if (0 == (col % 3) && col != 0) { fprintf(stderr, " "); } fprintf(stderr, "%c", c); if (c > '0' && c <= '9') { int num = c - '0'; picosat_assume(p[num-1][row][col]); } if (col == 8) { row++, col = 0; fprintf(stderr, "\n"); if (row != 0 && row != 9 && 0 == (row % 3)) fprintf(stderr, "\n"); } else col++; if (row >= N) break; in = fgetc(inputFile); } fprintf(stderr, "solving ..."); int result = picosat_sat(-1); switch (result) { case PICOSAT_SATISFIABLE: fprintf(stderr, " solution found\n"); for (row = 0; row < N; row++) { if (row != 0 && 0 == (row % 3)) printf("\n"); for (col = 0; col < N; col++) { int printed = 0; for (i = 0; i < N; i++) { if (1 == picosat_deref(p[i][row][col])) { if (0 == (col % 3) && col != 0) { printf(" "); } printf("%c", i+1 + '0'); printed = 1; for (j = i+1; j < N; j++) { assert(-1 == picosat_deref(p[j][row][col])); } break; } } assert(printed); } printf("\n"); } if (alwaysRemoveLearned) picosat_remove_learned(100); break; case PICOSAT_UNSATISFIABLE: fprintf(stderr, "no solution! please report to [email protected]\n"); assert(0); break; default: assert(0); } }
CAMLprim value caml_picosat_deref(value lit) { CAMLparam1 (lit); CAMLreturn(Val_int(picosat_deref(Int_val(lit)))); }
void printResults(PicoSAT *p, int* fields) { int verbose = 0; int y, x, d; for (y = 0; y < S; y++) { for (x = 0; x < S; x++) { int f = field(x, y); if (picosat_deref(p, black(f)) == 1) printf("B"); else if (picosat_deref(p, nblack(f)) == 1) printf("N"); /* else if (verbose && picosat_deref(p, numfield(f)) == 1) */ /* printf("#"); */ else if (verbose && picosat_deref(p, white(f)) == 1) printf("w"); else printf(" "); if (fields) printf("%c", fields[f] ? '.' : ' '); if (verbose) { if (picosat_deref(p, xblack(f)) == 1) printf("x"); else printf(" ");} int fo = 0; for (d = 0; d < S; d++) { if (picosat_deref(p, num(f, d)) == 1) { printf("%i", 1+d); fo++;}} if (fo == 0) { printf("_"); fo+=1;} while (fo < 2) { printf(" "); fo++;} printf(" "); } printf("\n"); } return; for (int row = 0; row < S; row++) { for (int col = 0; col < S; col++) { for (int len = 2; len < S-col; len++) { if (picosat_deref(p, hstr(field(col, row), len))) printf("hstr(field(%i,%i), %i) -> 1\n", col, row, len); } } } printf("\n"); for (int row = 0; row < S; row++) { for (int col = 0; col < S; col++) { for (int len = 2; len < S-row; len++) { if (picosat_deref(p, vstr(field(col, row), len))) printf("vstr(field(%i,%i), %i) -> 1\n", col, row, len); } } } }