hook up JC's table

This commit is contained in:
lperron@google.com
2012-08-21 15:03:47 +00:00
parent b096d74d02
commit b02828f7aa
3 changed files with 40 additions and 31 deletions

View File

@@ -24,12 +24,12 @@ DEFINE_int32(upper, 10, "Upper bound of variables, lower is always 0");
DEFINE_int32(tuples, 1000, "Number of tuples");
DEFINE_int32(bucket, 64, "Size of buckets");
DEFINE_bool(ac4, false, "Use AC4 Table only");
DECLARE_bool(cp_use_ac4r_table);
namespace operations_research {
extern Constraint* BuildAc4TableConstraint(Solver* const solver,
const IntTupleSet& tuples,
const std::vector<IntVar*>& vars,
int size_bucket);
const std::vector<IntVar*>& vars);
void RandomFillTable(int num_tuples,
int64 lower,
@@ -47,10 +47,10 @@ void RandomFillTable(int num_tuples,
}
}
void TestTable(int arity, int num_tuples, int upper, int size_bucket) {
if (size_bucket > 0) {
LOG(INFO) << "Creation of a Bucketed tuple Table ("
<< size_bucket << ") with :";
void TestTable(int arity, int num_tuples, int upper, bool use_ac4r_table) {
FLAGS_cp_use_ac4r_table = use_ac4r_table;
if (use_ac4r_table) {
LOG(INFO) << "Creation of a AC4-Regin tuple Table with :";
} else {
LOG(INFO) << "Creation of a Allowed Assignment Table with :";
}
@@ -66,8 +66,8 @@ void TestTable(int arity, int num_tuples, int upper, int size_bucket) {
RandomFillTable(num_tuples, 0, upper, &table);
LOG(INFO) << "Table is created";
Constraint* const ct = size_bucket > 0 ?
BuildAc4TableConstraint(&solver, table, vars, size_bucket) :
Constraint* const ct = use_ac4r_table ?
BuildAc4TableConstraint(&solver, table, vars) :
solver.MakeAllowedAssignments(vars, table);
solver.AddConstraint(ct);
@@ -95,12 +95,15 @@ void TestTable(int arity, int num_tuples, int upper, int size_bucket) {
int main(int argc, char** argv) {
google::ParseCommandLineFlags(&argc, &argv, true);
if (!FLAGS_ac4) {
operations_research::TestTable(FLAGS_arity, FLAGS_tuples, FLAGS_upper, 0);
operations_research::TestTable(FLAGS_arity,
FLAGS_tuples,
FLAGS_upper,
false);
}
operations_research::TestTable(FLAGS_arity,
FLAGS_tuples,
FLAGS_upper,
FLAGS_bucket);
true);
return 0;
}

View File

@@ -418,16 +418,14 @@ class Ac4TableConstraint : public Constraint {
// External API.
Constraint* BuildAc4TableConstraint(Solver* const solver,
const IntTupleSet& tuples,
const std::vector<IntVar*>& vars,
int size_bucket) {
const std::vector<IntVar*>& vars) {
return solver->RevAlloc(
new Ac4TableConstraint(solver, new IndexedTable(tuples), true, vars));
}
Constraint* BuildAc4TableConstraint(Solver* const solver,
IndexedTable* const table,
const std::vector<IntVar*>& vars,
int size_bucket) {
const std::vector<IntVar*>& vars) {
return solver->RevAlloc(new Ac4TableConstraint(solver, table, true, vars));
}

View File

@@ -35,6 +35,7 @@ DEFINE_bool(cp_use_compact_table, true,
"Use compact table constraint when possible.");
DEFINE_bool(cp_use_small_table, true,
"Use small compact table constraint when possible.");
DEFINE_bool(cp_use_ac4r_table, true, "Use ac4r table");
namespace operations_research {
namespace {
@@ -819,24 +820,7 @@ bool HasCompactDomains(const IntVar* const * vars, int arity) {
}
return sum_of_spans < 4 * sum_of_sizes;
}
} // namespace
Constraint* Solver::MakeAllowedAssignments(
const std::vector<IntVar*>& vars,
const IntTupleSet& tuples) {
if (FLAGS_cp_use_compact_table
&& HasCompactDomains(vars.data(), vars.size())) {
if (tuples.NumTuples() < kBitsInUint64 && FLAGS_cp_use_small_table) {
return RevAlloc(
new SmallCompactPositiveTableConstraint(this, vars, tuples));
} else {
return RevAlloc(new CompactPositiveTableConstraint(this, vars, tuples));
}
}
return RevAlloc(new PositiveTableConstraint(this, vars, tuples));
}
namespace {
// ---------- Deterministic Finite Automaton ----------
// This constraint implements a finite automaton when transitions are
@@ -948,6 +932,30 @@ const int TransitionConstraint::kNextStatePosition = 2;
const int TransitionConstraint::kTransitionTupleSize = 3;
} // namespace
// --------- API ----------
Constraint* BuildAc4TableConstraint(Solver* const solver,
const IntTupleSet& tuples,
const std::vector<IntVar*>& vars);
Constraint* Solver::MakeAllowedAssignments(
const std::vector<IntVar*>& vars,
const IntTupleSet& tuples) {
if (tuples.NumTuples() > 512 && FLAGS_cp_use_ac4r_table) {
return BuildAc4TableConstraint(this, tuples, vars);
}
if (FLAGS_cp_use_compact_table
&& HasCompactDomains(vars.data(), vars.size())) {
if (tuples.NumTuples() < kBitsInUint64 && FLAGS_cp_use_small_table) {
return RevAlloc(
new SmallCompactPositiveTableConstraint(this, vars, tuples));
} else {
return RevAlloc(new CompactPositiveTableConstraint(this, vars, tuples));
}
}
return RevAlloc(new PositiveTableConstraint(this, vars, tuples));
}
Constraint* Solver::MakeTransitionConstraint(
const std::vector<IntVar*>& vars,
const IntTupleSet& transition_table,