Commit 5956838a authored by Masahiko Sakai's avatar Masahiko Sakai

version1.02b

parent b15c685e
......@@ -35,6 +35,7 @@ Contains types, macros, and inline functions generally useful in a C++ program.
#include <climits>
#include <cfloat>
#include <new>
#include <string>
#include <map>
......@@ -214,6 +215,10 @@ inline bool operator < (const Pair<Fst, Snd>& x, const Pair<Fst, Snd>& y) {
return x.fst < y.fst ||
(!(y.fst < x.fst) && x.snd < y.snd); }
//template <class Fst, class Snd>
//inline bool less_fst (const Pair<Fst, Snd>& x, const Pair<Fst, Snd>& y) {
// return x.fst < y.fst; }
template <class Fst, class Snd>
inline Pair<Fst, Snd> Pair_new(const Fst& x, const Snd& y) {
return Pair<Fst, Snd>(x, y); }
......
......@@ -53,6 +53,12 @@ void dump(Formula f) {
}
void dump(const vec<int>& base)
{
for (int i = 0; i < base.size(); i++)
reportf("%d ", base[i]);
}
void dump(const vec<Lit>& ps, const vec<Int>& Cs)
{
assert(ps.size() == Cs.size());
......
......@@ -32,6 +32,7 @@ extern vec<cchar*>* debug_names;
void dump(Int num);
void dump(Lit p);
void dump(Formula f);
void dump(const vec<int>& base);
void dump(const vec<Lit>& ps, const vec<Int>& Cs);
void dump(const vec<Lit>& ps, const vec<Int>& Cs, const vec<int>& assigns);
void dump(const vec<Formula>& ps, const vec<Int>& Cs);
......
* #variable= 701 #constraint= 351
*
* Euclidean Cycle (EC) formula as constructed by
* Markstrom and described in the paper available at
* http://jsat.ewi.tudelft.nl/content/volume2/JSAT2_11_Markstrom.pdf .
* Generated by running graph2ec on grid5x70split.graph.
*
* VERTEX 1 : x_{1, 6} + x_{1, 2} + x_{1, 346} + x_{1, 5} = 2
*
+1 x1 +1 x2 +1 x3 +1 x4 = 2;
*
* VERTEX 1 : x_{1, 6} + x_{1, 2} + x_{1, 346} + x_{1, 5} = 2
+1 x5 +1 x6 +1 x7 +1 x2 = 2;
*
1 x1 -1 x2 1 x3 -1 x4 >= -1 ;
1 x1 -1 x2 1 x3 -1 x4 >= ~2 ;
c
c comments Max-SAT
c
p cnf 3 7
1 -2 0
-1 2 -3 0
-3 2 0
1 3 0
-1 -2 3 0
-1 2 3 0
-1 -2 -3 0
c
c comments Max-SAT
c
p wcnf 3 7 99
99 1 -2 0
99 -1 2 -3 0
1 -3 2 0
1 1 3 0
1 -1 -2 3 0
1 -1 2 3 0
1 -1 -2 -3 0
1 x1 -1 x2 1 x3 -1 x4 >= -1 ;
d x0 <=> 1 x1 >= 2 ;
1 x1 1 x2 2 x3 2 x4 = 3 ;
d x0 <=> 1 x1 >= 2 ;
c
c comments Max-SAT
c
p wcnf 3 7
2 1 -2 0
10 -1 2 -3 0
4 -3 2 0
30 1 3 0
2 -1 -2 3 0
c
1 -1 2 3 0
5 -1 -2 -3 0
c
c comments Max-SAT
c
p wcnf 3 7 99
99 1 -2 0
99 -1 2 -3 0
4 -3 2 0
30 1 3 0
2 -1 -2 3 0
1 -1 2 3 0
5 -1 -2 -3 0
......@@ -110,11 +110,13 @@ Lit Clausifier::polarityClausify(Formula f)
}else
#endif
result = Lit(index(f),sign(f));
}else if (vmapp.at(f) != lit_Undef && !s.varElimed(var(vmapp.at(f)))){
result = vmapp.at(f);
}else{
result = (vmapp.at(~f) != lit_Undef && !s.varElimed(var(vmapp.at(~f)))) ?
Lit(var(vmapp.at(~f))) : Lit(s.newVar(!opt_branch_pbvars));
}else if (vmapp.at(f) != lit_Undef &&
( !opt_simp_solver || !s.varElimed(var(vmapp.at(f))) ) ){
result = vmapp.at(f);
}else{
result = (vmapp.at(~f) != lit_Undef &&
(!opt_simp_solver || !s.varElimed(var(vmapp.at(~f)))) ) ?
Lit(var(vmapp.at(~f))) : Lit(s.newVar(!opt_branch_pbvars));
if (Bin_p(f)){
if (op(f) == op_And){
vec<Formula> conj;
......
......@@ -12,8 +12,13 @@ To make the BigNum version, type
make rs
To use them together (trying the faster 64-bit version first), use the script
gpw_script
-----
TIPS:
For compile error related to gmp.h, install libgmp3-dev library.
For compile error related to gmp.h, install libgmp3-dev gmp-devel library.
For compile error related to zlib.h, install zlib-devel library.
On FreeBSD, use gmake for make.
......@@ -39,27 +39,40 @@ Read a DIMACS file and apply the SAT-solver to it.
// Tricky hack for priventing memory allocation error in SIGTERM_handler.
char* dummy_heap = (char*) malloc(32*1024);
// Command line options:
// Controlling optimization/
bool minimization_mode; // turned on after first SAT-solver execution
std::map<Pair< int, Pair< Interval<Int> , Interval<Int> > >, Pair<Pair< Interval<Int> , Interval<Int> >, Formula> > memo_bdd_conv_int_in_min_mode;
Map<Pair<int,Int>, Formula> memo_bdd_conv_in_min_mode;
// Command line options:
bool opt_satlive = true;
bool opt_ansi = true;
char* opt_cnf = NULL;
bool opt_ansi = false;
char* opt_cnf = NULL; // export as cnf
int opt_verbosity = 0;
bool opt_try = false; // (hidden option -- if set, then "try" to parse, but don't output "s UNSUPPORTED" if you fail, instead exit with error code 5)
bool opt_model_out = true;
//bool opt_dimacs = false; // read Dimacs format
bool opt_dimacs = false; // read Dimacs format
bool opt_eager_cl = true; // sending SAT solver eagerly
bool opt_maxsat = false; // MaxSat mode
SolverT opt_solver = st_GlueMiniSat;
bool opt_simp_solver = true;
ConvertT opt_convert = ct_Mixed;
ConvertT opt_convert_goal = ct_Undef;
ConvertT opt_convert_goal = ct_Sorters; //ct_Undef;
bool opt_convert_goal_reusing = true;
bool opt_convert_weak = true;
//bool opt_avoid_band_constraint = false;
int opt_opt_base_method = 2; // 0: original 1: BB, 2: hashBB
int opt_avoid_band_constraint = 0;
// 0: band form, 1: band form if not-eq constraint, 2: only standard form
bool opt_split = false;
GpwT opt_convert_gpw = gt_positive;
bool opt_convert_bdd_monotonic = true;
int opt_convert_bdd_decomposition = 5; // 1:binary base, 2:multi base
int opt_convert_bdd_decomposition = 5; // 0: non-decomposition, 1:binary base, 2:multi base
// 2: always, n: strategy n-2 (3<=n<=5)
bool opt_convert_bdd_interval = true;
bool opt_convert_bdd_increasing_order = false;
......@@ -68,14 +81,16 @@ bool opt_es1_detection = false;
bool opt_cc_detection = false;
bool opt_cc_sort = false;
int opt_cc_thres = 30; // use cc if k is less than <thres> %
double opt_bdd_thres = 120; // 3
double opt_sort_thres = 70; // 20
double opt_bdd_thres = 180; // 3
double opt_sort_thres = 90; // 20
double opt_goal_bias = 3;
int opt_max_bdd_cost = 2500000;
int opt_bdd_max_const = 2500000;
Int opt_goal = Int_MAX;
Command opt_command = cmd_Minimize;
//bool opt_binary_minimization = true;
int opt_minimization = 2; // 0: sequential, 1: binary, 2: alternative
int opt_minimization = 1; // 0: sequential, 1: binary, 2: alternative
int opt_bin_coeff = 3;
int opt_seq_thres = 3;
bool opt_band_for_goal = false;
bool opt_goal_gcd = true;
bool opt_branch_pbvars = false;
......@@ -105,6 +120,7 @@ int stats_bdd_nodes = 0;
int stats_es1_detection = 0;
int stats_cc_detection = 0;
double stats_cnf_coding_time;
double stats_opt_base_calc_time = 0.0;
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
cchar* doc =
......@@ -123,13 +139,15 @@ cchar* doc =
" -GL -glucose1.0 Use Glucose v1.0 as backend\n"
" -E -es1sat Use ES1Sat v1.0 as backend\n"
" -C -ccminisat Use CCMiniSat v1.0 as backend\n"
" -Simp Use Simplification facility if possible (default)\n"
" -noSimp Don't use Simplification facility\n"
"\n"
" -ca -adders Convert PB-constrs to clauses through adders.\n"
" -cs -sorters Convert PB-constrs to clauses through sorters.\n"
" -cb -bdds Convert PB-constrs to clauses through bdds.\n"
" -cm -mixed Convert PB-constrs to clauses by a mix of the above. (default)\n"
// " -cm2 -mixed2 Convert PB-constrs to clauses by another mix mode of the above.\n"
" -ga/gs/gb/gm Override conversion for goal function (long name: -goal-xxx).\n"
" -ga/gs/gb/gm Override conversion for goal function (long name: -goal-xxx). (default: gs)\n"
" -w -weak-off Clausify with equivalences instead of implications.\n"
" -or-detection-off Don't detect OR clause.\n"
" -es1, -es1-detection Produce ES1 clause if possible.\n"
......@@ -147,8 +165,8 @@ cchar* doc =
" -gpw-both Code both GPW mode of Positve and Negative in sorter conversions.\n"
" -bdd-m-off Clausify BDDs by 3-clauses coding.\n"
" -bdd-b Clausify BDDs after binary-decomposition of coefficients.\n"
" -bdd-d,-bdd-d3 Clausify BDDs after multi-based-decomposition of coefficients by strategy 3. (default)\n"
" -bdd-d0 Clausify BDDs after multi-based-decomposition of coefficients.\n"
" -bdd-d3 Clausify BDDs after multi-based-decomposition of coefficients by strategy 3.\n"
" -bdd-d -bdd-d0 Clausify BDDs after multi-based-decomposition of coefficients. (default)\n"
" -bdd-dN Clausify BDDs after multi-based-decomposition of coefficients by strategy N=1,2,3.\n"
" -bdd-d-off Clausify BDDs without multi-based-decomposition of coefficients.\n"
" -bdd-i-off Construct non-ROBDDs.\n"
......@@ -158,7 +176,7 @@ cchar* doc =
" -bdd-thres= Threshold for prefering BDDs in mixed mode. [def: %g]\n"
" -sort-thres= Threshold for prefering sorters. Tried after BDDs. [def: %g]\n"
" -goal-bias= Bias goal function convertion towards sorters. [def: %g]\n"
" -bdd-max= Max cost for prefering BDDs in mixed mode. [def: %d]\n"
" -bdd-max= Max constraint size for prefering BDDs in mixed mode. [def: %d]\n"
"\n"
" -1 -first Don\'t minimize, just give first solution found\n"
" -A -all Don\'t minimize, give all solutions\n"
......@@ -168,6 +186,9 @@ cchar* doc =
" -alt Alternative search for minimization (default).\n"
" -gg -goal-gcd-off Don\'t simplify goal expression.\n"
" -bg -goal-band Use band-form constraint for binary or alternative minimization.\n"
" -bin-coeff= Set spritting parameter in binary optimization search. [def: %d]\n"
" -seq-thres= Set distance for switching bin to seq strateby in optimization search. [def: %d]\n"
" -ngr -goal-non-reuse Reusing memo to produce goal constraints.\n"
" -goal=<num> Set initial goal limit to '<= num'.\n"
"\n"
" -p -pbvars Restrict decision heuristic of SAT to original PB variables.\n"
......@@ -180,10 +201,13 @@ cchar* doc =
"\n"
"Input options:\n"
" -of -old-fmt Use old variant of OPB file format.\n"
" -dm -dimacs Use Dimacs cnf or wcnf file format.\n"
" -ec Don't send clauses eagerly to SAT-solver.\n"
" -mx -max-sat Act as MaxSat solver.\n"
"\n"
"Output options:\n"
" -s -satlive Turn off SAT competition output.\n"
" -a -ansi Turn off ANSI codes in output.\n"
" -a -ansi Turn on ANSI codes for emphasizing output.\n"
" -v0,-v1,-v2 Set verbosity level (1 default)\n"
" -cnf=<file> Write SAT problem to a file. Trivial UNSAT => no file written.\n"
// " -mo -model-out Output model / unsat-core.\n"
......@@ -221,7 +245,7 @@ void parseOptions(int argc, char** argv)
for (int i = 1; i < argc; i++){
char* arg = argv[i];
if (arg[0] == '-'){
if (oneof(arg,"h,help")) fprintf(stderr, doc, opt_cc_thres, opt_bdd_thres, opt_sort_thres, opt_goal_bias, opt_max_bdd_cost), exit(0);
if (oneof(arg,"h,help")) fprintf(stderr, doc, opt_cc_thres, opt_bdd_thres, opt_sort_thres, opt_goal_bias, opt_bdd_max_const, opt_bin_coeff, opt_seq_thres), exit(0);
else if (oneof(arg, "M,minisat" )) opt_solver = st_MiniSat;
else if (oneof(arg, "S,satelite" )) opt_solver = st_SatELite;
......@@ -230,6 +254,8 @@ void parseOptions(int argc, char** argv)
else if (oneof(arg, "GL,glucose1.0" )) opt_solver = st_Glucose10;
else if (oneof(arg, "E,es1sat" )) opt_solver = st_ES1Sat;
else if (oneof(arg, "C,ccminisat" )) opt_solver = st_CCMiniSat;
else if (oneof(arg, "Simp" )) opt_simp_solver = true; // default
else if (oneof(arg, "noSimp" )) opt_simp_solver = false;
else if (oneof(arg, "ca,adders" )) opt_convert = ct_Adders;
else if (oneof(arg, "cs,sorters")) opt_convert = ct_Sorters;
......@@ -241,9 +267,11 @@ void parseOptions(int argc, char** argv)
else if (oneof(arg, "gs,goal-sorters")) opt_convert_goal = ct_Sorters;
else if (oneof(arg, "gb,goal-bdds" )) opt_convert_goal = ct_BDDs;
else if (oneof(arg, "gm,goal-mixed" )) opt_convert_goal = ct_Mixed;
// else if (oneof(arg, "gm2,goal-mixed" )) opt_convert_goal = ct_Mixed2;
// else if (oneof(arg, "gm2,goal-mixed" )) opt_convert_goal = ct_Mixed2;
else if (oneof(arg, "ngr,goal-non-reusing")) opt_convert_goal_reusing = false;
else if (oneof(arg, "w,weak-off" )) opt_convert_weak = false;
else if (strncmp(arg, "-om=", 4) == 0) opt_opt_base_method = atoi(arg+4);
else if (oneof(arg, "or-detection-off")) opt_or_detection = false;
else if (oneof(arg, "es1,es1-detection")) opt_es1_detection = true;
else if (oneof(arg, "cc,cc-detection")) opt_cc_detection = true;
......@@ -262,7 +290,8 @@ void parseOptions(int argc, char** argv)
else if (oneof(arg, "gpw-both" )) opt_convert_gpw = gt_both;
else if (oneof(arg, "bdd-m-off" )) opt_convert_bdd_monotonic = false;
else if (oneof(arg, "bdd-b" )) opt_convert_bdd_decomposition = 1;
else if (oneof(arg, "bdd-d" )) opt_convert_bdd_decomposition = 3+2;
else if (oneof(arg, "bdd-d-off" )) opt_convert_bdd_decomposition = 0;
else if (oneof(arg, "bdd-d" )) opt_convert_bdd_decomposition = 2+2;
else if (oneof(arg, "bdd-d0" )) opt_convert_bdd_decomposition = 2; //always convert by multi-base
else if (oneof(arg, "bdd-d1" )) opt_convert_bdd_decomposition = 1+2; //strategy 1
else if (oneof(arg, "bdd-d2" )) opt_convert_bdd_decomposition = 2+2; //strategy 2
......@@ -276,7 +305,7 @@ void parseOptions(int argc, char** argv)
else if (strncmp(arg, "-bdd-thres=" , 11) == 0) opt_bdd_thres = atof(arg+11);
else if (strncmp(arg, "-sort-thres=", 12) == 0) opt_sort_thres = atof(arg+12);
else if (strncmp(arg, "-goal-bias=", 11) == 0) opt_goal_bias = atof(arg+11);
else if (strncmp(arg, "-bdd-max=", 9) == 0) opt_bdd_thres = atof(arg+9);
else if (strncmp(arg, "-bdd-max=", 9) == 0) opt_bdd_max_const = atoi(arg+9);
else if (strncmp(arg, "-goal=" , 6) == 0) opt_goal = atoi(arg+ 6); // <<== real bignum parsing here
else if (strncmp(arg, "-cnf=" , 5) == 0) opt_cnf = arg + 5;
//(end)
......@@ -289,7 +318,9 @@ void parseOptions(int argc, char** argv)
else if (oneof(arg, "alt" )) opt_minimization = 2;
else if (oneof(arg, "gg,goal-gcd-off")) opt_goal_gcd = false;
else if (oneof(arg, "bg,goal-band")) opt_band_for_goal = true;
else if (strncmp(arg, "-bin-coeff=", 11) == 0) opt_bin_coeff = atoi(arg+11);
else if (strncmp(arg, "-seq-thres=", 11) == 0) opt_seq_thres = atoi(arg+11);
else if (oneof(arg, "p,pbvars" )) opt_branch_pbvars = true;
else if (oneof(arg, "pI,pbvars-interests")) opt_branch_pbvars = true,
opt_branch_goal_vars = true;
......@@ -297,12 +328,15 @@ void parseOptions(int argc, char** argv)
else if (oneof(arg, "ps-" )) opt_polarity_sug = -1;
else if (oneof(arg, "ps0" )) opt_polarity_sug = 0;
else if (oneof(arg, "of,old-fmt" )) opt_old_format = true;
else if (oneof(arg, "of,old-fmt")) opt_old_format = true;
else if (oneof(arg, "dm,dimacs" )) opt_dimacs = true;
else if (oneof(arg, "ec" )) opt_eager_cl = false;
else if (oneof(arg, "mx,max-sat")) opt_maxsat = true, opt_dimacs = true;
else if (oneof(arg, "u,ucore=" )) opt_extract_ucore = true;
else if (strncmp(arg, "-ucore-mode=", 12) == 0) opt_ucore_mode = atof(arg+12);
else if (oneof(arg, "s,satlive" )) opt_satlive = false;
else if (oneof(arg, "a,ansi" )) opt_ansi = false;
else if (oneof(arg, "a,ansi" )) opt_ansi = true;
else if (oneof(arg, "try" )) opt_try = true;
else if (oneof(arg, "nm,no-model" )) opt_model_out = false;
else if (oneof(arg, "v0" )) opt_verbosity = 0;
......@@ -330,16 +364,18 @@ void parseOptions(int argc, char** argv)
reportf("-cnf option is not handled by ES1Sat/CCMiniSat. We set -M2 instead.\n"), opt_solver = st_MiniSat22;
if (opt_es1_detection && opt_cc_detection)
reportf("Conflict with -es1 and -cc. We ignore the latter.\n"), opt_cc_detection = false;
reportf("Conflict between -es1 and -cc. We ignore the latter.\n"), opt_cc_detection = false;
if (opt_es1_detection && opt_solver != st_ES1Sat)
reportf("We set -E because of -es1-detection.\n"), opt_solver = st_ES1Sat;
if (opt_cc_detection && opt_solver != st_CCMiniSat)
reportf("We set -CC because of -cc-detection.\n"), opt_solver = st_CCMiniSat;
reportf("We set -C because of -cc-detection.\n"), opt_solver = st_CCMiniSat;
if (opt_simp_solver && opt_solver != st_CCMiniSat && opt_solver != st_GlueMiniSat)
reportf("We set -noSimp.\n"), opt_simp_solver = false;
if (args.size() == 0)
fprintf(stderr, doc, opt_bdd_thres, opt_sort_thres, opt_goal_bias, opt_max_bdd_cost), exit(0);
fprintf(stderr, doc, opt_bdd_thres, opt_sort_thres, opt_goal_bias, opt_bdd_max_const), exit(0);
if (args.size() >= 1)
opt_input = args[0];
if (args.size() == 2)
......@@ -415,7 +451,7 @@ bool model_check(PbSolver& solver){
return true;
}
void printStats(BasicSolverStats& stats, double cpu_time)
void printStats(BasicSolverStats& stats, double cpu_time, double solving_time)
{
reportf("_____________________________________________________________________________\n\n");
reportf("std/band forms : %d,%d\n", stats_std_form, stats_band_form);
......@@ -430,7 +466,8 @@ void printStats(BasicSolverStats& stats, double cpu_time)
reportf("decisions : %-12"I64_fmt" (%.0f /sec)\n", stats.decisions , stats.decisions /cpu_time);
reportf("propagations : %-12"I64_fmt" (%.0f /sec)\n", stats.propagations, stats.propagations/cpu_time);
reportf("inspects : %-12"I64_fmt" (%.0f /sec)\n", stats.inspects , stats.inspects /cpu_time);
reportf("CPU time (CNF coding) : %.4g s (%.4g s)\n", cpu_time, stats_cnf_coding_time);
reportf("CPU time (solving tm) : %.4g s (%.4g s)\n", cpu_time, solving_time);
reportf("Time for Opt-base : %.4g s\n", stats_opt_base_calc_time);
reportf("_____________________________________________________________________________\n");
}
......@@ -449,9 +486,10 @@ void outputResult(PbSolver& S, bool normalExit = true)
else {
S.best_goalvalue *= S.goal_coeff;
char* tmp = toString(S.best_goalvalue);
printf("s SATISFIABLE\n");
// printf("s BEST FOUND: %s\n", tmp);
xfree(tmp);
if (!opt_maxsat) printf("s SATISFIABLE\n");
// else printf("s UNKNOWN\n");
// printf("s SATISFIABLE\n");
xfree(tmp);
}
break;
case PbSolver::sst_best:
......@@ -475,7 +513,7 @@ void outputResult(PbSolver& S, bool normalExit = true)
// if (opt_verbosity >= 1) {
{
printStats(S.stats, cpuTime());
printStats(S.stats, cpuTime(), S.sat_solver.solving_time);
}
if (opt_model_out) {
......@@ -527,7 +565,7 @@ static void SIGTERM_handler(int signum) {
free(dummy_heap);
reportf("\n");
if(signum <= 15) {
reportf("*** TERMINATED ***\n");
reportf("*** TERMINATED *** by signal %d\n", signum);
outputResult(*pb_solver, false);
} else outputResult(*pb_solver, true);
// printStats(pb_solver->stats, cpuTime());
......@@ -535,7 +573,6 @@ static void SIGTERM_handler(int signum) {
_exit(pb_solver->best_goalvalue == Int_MAX ? 0 : 10); }
//=================================================================================================
......@@ -543,12 +580,13 @@ int main(int argc, char** argv)
{
/*DEBUG*/if (argc > 1 && (strcmp(argv[1], "-debug") == 0 || strcmp(argv[1], "--debug") == 0)){ void test(); test(); exit(0); }
reportf("NaPS %s.\n", naps_version);
parseOptions(argc, argv);
pb_solver = new PbSolver(); // (must be constructed AFTER parsing commandline options -- constructor uses 'opt_solver' to determinte which SAT solver to use)
// signal(SIGINT , SIGINT_handler);
signal(SIGINT , SIGTERM_handler); // 2, SIGINT, terminate process, interrupt program
signal(SIGABRT , SIGTERM_handler); // 6, SIGABRT, create core image, abort program (formerly SIGIOT)
signal(SIGABRT , SIGTERM_handler); // 6, SIGABRT, create core image, abort program (formerly SIGIOT)
signal(SIGSEGV , SIGTERM_handler); // 11, SIGSEGV, create core image, segmentation violation
signal(SIGTERM, SIGTERM_handler); // 15, SIGTERM, terminate process, software termination signal
signal(SIGUSR1, SIGTERM_handler); // 30, SIGUSR1, terminate process, User defined signal 1
......@@ -558,9 +596,14 @@ int main(int argc, char** argv)
reportf("Setting switch '-first' from environment variable 'PBSATISFIABILITYONLY'.\n"),
opt_command = cmd_FirstSolution;
if (opt_verbosity >= 1) reportf("Parsing PB file...\n");
parse_PB_file(opt_input, *pb_solver, opt_old_format);
if (opt_dimacs) {
if (opt_verbosity >= 1) reportf("Parsing Dimacs file...\n");
parse_Dimacs_file(opt_input, *pb_solver, opt_maxsat);
} else {
if (opt_verbosity >= 1) reportf("Parsing PB file...\n");
parse_PB_file(opt_input, *pb_solver, opt_old_format);
}
//if(opt_command == cmd_AllSolutions) pb_solver->goal = NULL;
if(pb_solver->goal == NULL && opt_command == cmd_Minimize)
opt_command = cmd_FirstSolution;
......
......@@ -21,6 +21,8 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
#define Main_h
#include "Int.h"
#include "Version.h"
#include "FEnv.h"
//=================================================================================================
......@@ -30,6 +32,11 @@ enum ConvertT { ct_Sorters, ct_Adders, ct_BDDs, ct_Mixed, ct_Mixed2, ct_Undef };
enum Command { cmd_Minimize, cmd_FirstSolution, cmd_AllSolutions, cmd_InterestSolutions, cmd_Soft };
enum GpwT { gt_none, gt_positive, gt_negative, gt_low, gt_high, gt_both };
// Controlling optimization
extern bool minimization_mode; // turned on after first SAT-solver execution
extern std::map<Pair< int, Pair< Interval<Int> , Interval<Int> > >, Pair<Pair< Interval<Int> , Interval<Int> >, Formula> > memo_bdd_conv_int_in_min_mode;
extern Map<Pair<int,Int>, Formula> memo_bdd_conv_in_min_mode;
// -- output options:
extern bool opt_satlive;
extern bool opt_ansi;
......@@ -37,11 +44,15 @@ extern char* opt_cnf;
extern int opt_verbosity;
extern bool opt_try;
extern bool opt_model_out;
extern bool opt_dimacs;
extern bool opt_eager_cl;
// -- solver options:
extern SolverT opt_solver;
extern bool opt_simp_solver;
extern ConvertT opt_convert;
extern ConvertT opt_convert_goal;
extern bool opt_convert_goal_reusing;
extern GpwT opt_convert_gpw;
extern bool opt_convert_bdd_monotonic;
//extern bool opt_convert_bdd_binary_decomposition;
......@@ -49,6 +60,7 @@ extern int opt_convert_bdd_decomposition;
extern bool opt_convert_bdd_interval;
extern bool opt_convert_bdd_increasing_order;
extern bool opt_convert_weak;
extern int opt_opt_base_method;
extern bool opt_or_detection;
extern bool opt_es1_detection;
extern bool opt_cc_detection;
......@@ -59,11 +71,13 @@ extern int opt_cc_thres;
extern double opt_bdd_thres;
extern double opt_sort_thres;
extern double opt_goal_bias;
extern int opt_max_bdd_cost;
extern int opt_bdd_max_const;
extern Int opt_goal;
extern Command opt_command;
//extern bool opt_binary_minimization;
extern int opt_minimization;
extern int opt_bin_coeff;
extern int opt_seq_thres;
extern bool opt_band_for_goal;
extern bool opt_goal_gcd;
extern bool opt_branch_pbvars;
......@@ -88,6 +102,7 @@ extern int stats_bdd_nodes;
extern int stats_es1_detection;
extern int stats_cc_detection;
extern double stats_cnf_coding_time;
extern double stats_opt_base_calc_time;
// -- debug:
extern bool opt_model_check;
......
......@@ -38,13 +38,14 @@ rx: WAY="release static / 64-bit integers"
s: CFLAGS+=$(COPTIMIZE) -ggdb -D DEBUG
p: CFLAGS+=$(COPTIMIZE) -pg -ggdb -D DEBUG
d: CFLAGS+=-O0 -ggdb -D DEBUG -D PARANOID -D NO_GMP
#d: CFLAGS+=-O0 -ggdb -D DEBUG -D PARANOID
#r: CFLAGS+=$(COPTIMIZE) -D NDEBUG
r: CFLAGS+=$(COPTIMIZE) -D ND_GMP
rs: CFLAGS+=$(COPTIMIZE)
#rx: CFLAGS+=$(COPTIMIZE) -D NDEBUG -D NO_GMP
rx: CFLAGS+=$(COPTIMIZE) -D NO_GMP
#d: CFLAGS+=-O0 -ggdb -D DEBUG -D PARANOID -D NO_GMP
d: CFLAGS+=-O0 -ggdb -D DEBUG -D PARANOID
r: CFLAGS+=$(COPTIMIZE) -D NDEBUG
#r: CFLAGS+=$(COPTIMIZE) -D ND_GMP
rs: CFLAGS+=$(COPTIMIZE) -D NDEBUG
#rs: CFLAGS+=$(COPTIMIZE) -D NO_GMP
rx: CFLAGS+=$(COPTIMIZE) -D NO_GMP -D NDEBUG
#rx: CFLAGS+=$(COPTIMIZE) -D NO_GMP
s: build $(EXEC)
p: build $(EXEC)_profile
......@@ -154,7 +155,7 @@ $(EXEC)_profile: $(PCOBJS)
$(EXEC)_debug: $(DCOBJS)
@echo Linking $@
@$(CXX) $(DCOBJS) $(LDFLAGS) -lz -ggdb -Wall -o $@
@$(CXX) $(DCOBJS) $(LDFLAGS) -lz -lgmp -ggdb -Wall -o $@
$(EXEC)_release: $(RCOBJS)
@echo Linking $@
......
/**************************************************************************[PbSolver_convertSort.C]
/**************************************************************************[OptimalBase.C]
Copyright (c) 2005-2010, Niklas Een, Niklas Sorensson
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
......@@ -17,36 +17,33 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**************************************************************************************************/
#include "Map.h"
#include "PbSolver.h"
#include "OptimalBase.h"
#include "Main.h"
#include "Sort.h"
#include "Debug.h"
#include <queue>
#include <utility>
//=================================================================================================
int primes[] = { 2, 3, 5, 7, 11, 13, 17 };
//int primes[] = { 2, 3, 5, 7, 11, 13, 17 };
//int primes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 };
//int primes[] = { 2, 3, 4, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997 };
//int primes[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997 };
int primes[] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999,2003,2011,2017,2027,2029,2039,2053,2063,2069,2081,2083,2087,2089,2099,2111,2113,2129,2131,2137,2141,2143,2153,2161,2179,2203,2207,2213,2221,2237,2239,2243,2251,2267,2269,2273,2281,2287,2293,2297,2309,2311,2333,2339,2341,2347,2351,2357,2371,2377,2381,2383,2389,2393,2399,2411,2417,2423,2437,2441,2447,2459,2467,2473,2477,2503,2521,2531,2539,2543,2549,2551,2557,2579,2591,2593,2609,2617,2621,2633,2647,2657,2659,2663,2671,2677,2683,2687,2689,2693,2699,2707,2711,2713,2719,2729,2731,2741,2749,2753,2767,2777,2789,2791,2797,2801,2803,2819,2833,2837,2843,2851,2857,2861,2879,2887,2897,2903,2909,2917,2927,2939,2953,2957,2963,2969,2971,2999,3001,3011,3019,3023,3037,3041,3049,3061,3067,3079,3083,3089,3109,3119,3121,3137,3163,3167,3169,3181,3187,3191,3203,3209,3217,3221,3229,3251,3253,3257,3259,3271,3299,3301,3307,3313,3319,3323,3329,3331,3343,3347,3359,3361,3371,3373,3389,3391,3407,3413,3433,3449,3457,3461,3463,3467,3469,3491,3499,3511,3517,3527,3529,3533,3539,3541,3547,3557,3559,3571,3581,3583,3593,3607,3613,3617,3623,3631,3637,3643,3659,3671,3673,3677,3691,3697,3701,3709,3719,3727,3733,3739,3761,3767,3769,3779,3793,3797,3803,3821,3823,3833,3847,3851,3853,3863,3877,3881,3889,3907,3911,3917,3919,3923,3929,3931,3943,3947,3967,3989,4001,4003,4007,4013,4019,4021,4027,4049,4051,4057,4073,4079,4091,4093,4099,4111,4127,4129,4133,4139,4153,4157,4159,4177,4201,4211,4217,4219,4229,4231,4241,4243,4253,4259,4261,4271,4273,4283,4289,4297,4327,4337,4339,4349,4357,4363,4373,4391,4397,4409,4421,4423,4441,4447,4451,4457,4463,4481,4483,4493,4507,4513,4517,4519,4523,4547,4549,4561,4567,4583,4591,4597,4603,4621,4637,4639,4643,4649,4651,4657,4663,4673,4679,4691,4703,4721,4723,4729,4733,4751,4759,4783,4787,4789,4793,4799,4801,4813,4817,4831,4861,4871,4877,4889,4903,4909,4919,4931,4933,4937,4943,4951,4957,4967,4969,4973,4987,4993,4999,5003,5009,5011,5021,5023,5039,5051,5059,5077,5081,5087,5099,5101,5107,5113,5119,5147,5153,5167,5171,5179,5189,5197,5209,5227,5231,5233,5237,5261,5273,5279,5281,5297,5303,5309,5323,5333,5347,5351,5381,5387,5393,5399,5407,5413,5417,5419,5431,5437,5441,5443,5449,5471,5477,5479,5483,5501,5503,5507,5519,5521,5527,5531,5557,5563,5569,5573,5581,5591,5623,5639,5641,5647,5651,5653,5657,5659,5669,5683,5689,5693,5701,5711,5717,5737,5741,5743,5749,5779,5783,5791,5801,5807,5813,5821,5827,5839,5843,5849,5851,5857,5861,5867,5869,5879,5881,5897,5903,5923,5927,5939,5953,5981,5987,6007,6011,6029,6037,6043,6047,6053,6067,6073,6079,6089,6091,6101,6113,6121,6131,6133,6143,6151,6163,6173,6197,6199,6203,6211,6217,6221,6229,6247,6257,6263,6269,6271,6277,6287,6299,6301,6311,6317,6323,6329,6337,6343,6353,6359,6361,6367,6373,6379,6389,6397,6421,6427,6449,6451,6469,6473,6481,6491,6521,6529,6547,6551,6553,6563,6569,6571,6577,6581,6599,6607,6619,6637,6653,6659,6661,6673,6679,6689,6691,6701,6703,6709,6719,6733,6737,6761,6763,6779,6781,6791,6793,6803,6823,6827,6829,6833,6841,6857,6863,6869,6871,6883,6899,6907,6911,6917,6947,6949,6959,6961,6967,6971,6977,6983,6991,6997,7001,7013,7019,7027,7039,7043,7057,7069,7079,7103,7109,7121,7127,7129,7151,7159,7177,7187,7193,7207,7211,7213,7219,7229,7237,7243,7247,7253,7283,7297,7307,7309,7321,7331,7333,7349,7351,7369,7393,7411,7417,7433,7451,7457,7459,7477,7481,7487,7489,7499,7507,7517,7523,7529,7537,7541,7547,7549,7559,7561,7573,7577,7583,7589,7591,7603,7607,7621,7639,7643,7649,7669,7673,7681,7687,7691,7699,7703,7717,7723,7727,7741,7753,7757,7759,7789,7793,7817,7823,7829,7841,7853,7867,7873,7877,7879,7883,7901,7907,7919,7927,7933,7937,7949,7951,7963,7993,8009,8011,8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111,8117,8123,8147,8161,8167,8171,8179,8191,8209,8219,8221,8231,8233,8237,8243,8263,8269,8273,8287,8291,8293,8297,8311,8317,8329,8353,8363,8369,8377,8387,8389,8419,8423,8429,8431,8443,8447,8461,8467,8501,8513,8521,8527,8537,8539,8543,8563,8573,8581,8597,8599,8609,8623,8627,8629,8641,8647,8663,8669,8677,8681,8689,8693,8699,8707,8713,8719,8731,8737,8741,8747,8753,8761,8779,8783,8803,8807,8819,8821,8831,8837,8839,8849,8861,8863,8867,8887,8893,8923,8929,8933,8941,8951,8963,8969,8971,8999,9001,9007,9011,9013,9029,9041,9043,9049,9059,9067,9091,9103,9109,9127,9133,9137,9151,9157,9161,9173,9181,9187,9199,9203,9209,9221,9227,9239,9241,9257,9277,9281,9283,9293,9311,9319,9323,9337,9341,9343,9349,9371,9377,9391,9397,9403,9413,9419,9421,9431,9433,9437,9439,9461,9463,9467,9473,9479,9491,9497,9511,9521,9533,9539,9547,9551,9587,9601,9613,9619,9623,9629,9631,9643,9649,9661,9677,9679,9689,9697,9719,9721,9733,9739,9743,9749,9767,9769,9781,9787,9791,9803,9811,9817,9829,9833,9839,9851,9857,9859,9871,9883,9887,9901,9907,9923,9929,9931,9941,9949,9967,9973 };
//#define PickSmallest
#define ExpensiveBigConstants
#define AllDigitsImportant
// returns the cardinarity of the set given as a sorted sequence.
int CountKind_Sort(vec<Int>& seq)
void optimizeBase(vec<Int>& seq, int carry_ins, vec<Int>& rhs, int dcost, vec<int>& base, int& cost_bestfound, vec<int>& base_bestfound, OptBaseT obt)
{
int i,c=1;
for(i=0;i<(seq.size()-1);i++){
if(seq[i]!=seq[i+1])
c++;
}
return(c);
}
void optimizeBase(vec<Int>& seq, int carry_ins, vec<Int>& rhs, int cost, vec<int>& base, int& cost_bestfound, vec<int>& base_bestfound)
{
if (cost >= cost_bestfound)
if (dcost >= cost_bestfound)
return;
#ifdef DEBUG
/**/static int depth = 0;
#endif
// "Base case" -- don't split further, build sorting network for current sequence:
int final_cost = 0;
......@@ -62,70 +59,86 @@ void optimizeBase(vec<Int>& seq, int carry_ins, vec<Int>& rhs, int cost, vec<int
if (final_cost < 0)
goto TooBig;
}
if (cost + final_cost < cost_bestfound){
#ifdef DEBUG
if(opt_verbosity >=2) {
for (int n = depth; n != 0; n--) reportf(" "); reportf("dcost=%d,final_cost(msd)=%d,h=%d cost_bestfound=%d Best_base:", dcost, final_cost, seq.size(),cost_bestfound);
}
#endif
if (dcost + seq.size() > cost_bestfound){ //cost_alpha = dcost + seq.size(), final_cost = dcost + SUM of seqs
#ifdef DEBUG
if(opt_verbosity >=2) reportf("Pruned.\n");
#endif
return;
}
if (dcost + final_cost < cost_bestfound){
base.copyTo(base_bestfound);
cost_bestfound = cost + final_cost;
cost_bestfound = dcost + final_cost;
#ifdef DEBUG
if(opt_verbosity >=2)
for (int j = 0; j < base_bestfound.size(); j++)
reportf(" %d", base_bestfound[j]);
#endif
}
TooBig:;
/**/static int depth = 0;
#ifdef DEBUG
if(opt_verbosity >=2) reportf("\n");
#endif
TooBig:;
// <<== could count 1:s here for efficiency
vec<Int> new_seq;
vec<Int> new_rhs;
#ifdef DEBUG
if(opt_verbosity >=2) {
reportf("\nbase: ");
dump(base);
}
#endif
#ifdef PickSmallest
int p = -1;
for (int i = 0; i < seq.size(); i++)
if (seq[i] > 1){ p = seq[i]; break; }
if (p != -1){
#else
//int upper_lim = (seq.size() == 0) ? 1 : seq.last(); // <<== Check that sqRoot is an 'int' (no truncation of 'Int')