Implemented Accept on all constraints

This commit is contained in:
lperron@google.com
2012-08-14 21:45:43 +00:00
parent 634b59d2a7
commit b481e43332
9 changed files with 119 additions and 0 deletions

View File

@@ -40,6 +40,7 @@
#include "constraint_solver/constraint_solveri.h"
#include "util/bitset.h"
#include "base/random.h"
#include "util/string_array.h"
DEFINE_int32(symbols_per_card, 8, "Number of symbols per card.");
DEFINE_int32(ls_seed, 1, "Seed for the random number generator (used by "
@@ -177,6 +178,32 @@ class SymbolsSharedByTwoCardsConstraint : public Constraint {
}
}
virtual string DebugString() const {
return StringPrintf(
"SymbolsSharedByTwoCardsConstraint([%s], [%s], %d, %s)",
DebugStringVector(card1_symbol_vars_, ", ").c_str(),
DebugStringVector(card2_symbol_vars_, ", ").c_str(),
num_symbols_,
num_symbols_in_common_var_->DebugString().c_str());
}
void Accept(ModelVisitor* const visitor) const {
const string id = "SymbolsSharedByTwoCardsConstraint";
visitor->BeginVisitConstraint(id, this);
visitor->VisitIntegerVariableArrayArgument(
ModelVisitor::kLeftArgument,
card1_symbol_vars_.data(),
card1_symbol_vars_.size());
visitor->VisitIntegerVariableArrayArgument(
ModelVisitor::kRightArgument,
card2_symbol_vars_.data(),
card2_symbol_vars_.size());
visitor->VisitIntegerArgument(ModelVisitor::kValueArgument, num_symbols_);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kTargetArgument,
num_symbols_in_common_var_);
visitor->EndVisitConstraint(id, this);
}
private:
std::vector<IntVar*> card1_symbol_vars_;
std::vector<IntVar*> card2_symbol_vars_;

View File

@@ -182,6 +182,10 @@ class SatPropagator : public Constraint {
return "MinisatConstraint";
}
void Accept(ModelVisitor* const visitor) const {
LOG(FATAL) << "Should Not Be Visited";
}
private:
Minisat::Solver minisat_;
std::vector<IntVar*> vars_;

View File

@@ -2615,6 +2615,7 @@ const char ModelVisitor::kEquality[] = "Equal";
const char ModelVisitor::kFalseConstraint[] = "FalseConstraint";
const char ModelVisitor::kGreater[] = "Greater";
const char ModelVisitor::kGreaterOrEqual[] = "GreaterOrEqual";
const char ModelVisitor::kGlobalCardinality[] = "GlobalCardinality";
const char ModelVisitor::kIntegerVariable[] = "IntegerVariable";
const char ModelVisitor::kIntervalBinaryRelation[] = "IntervalBinaryRelation";
const char ModelVisitor::kIntervalDisjunction[] = "IntervalDisjunction";
@@ -2637,6 +2638,7 @@ const char ModelVisitor::kMaxEqual[] = "MaxEqual";
const char ModelVisitor::kMember[] = "Member";
const char ModelVisitor::kMin[] = "Min";
const char ModelVisitor::kMinEqual[] = "MinEqual";
const char ModelVisitor::kModuloConstraint[] = "ModuloConstraint";
const char ModelVisitor::kNoCycle[] = "NoCycle";
const char ModelVisitor::kNonEqual[] = "NonEqual";
const char ModelVisitor::kOpposite[] = "Opposite";
@@ -2709,6 +2711,7 @@ const char ModelVisitor::kLeftArgument[] = "left";
const char ModelVisitor::kMaxArgument[] = "max_value";
const char ModelVisitor::kMaximizeArgument[] = "maximize";
const char ModelVisitor::kMinArgument[] = "min_value";
const char ModelVisitor::kModuloArgument[] = "modulo";
const char ModelVisitor::kNextsArgument[] = "nexts";
const char ModelVisitor::kOptionalArgument[] = "optional";
const char ModelVisitor::kRangeArgument[] = "range";

View File

@@ -3176,6 +3176,7 @@ class ModelVisitor : public BaseObject {
static const char kEndExpr[];
static const char kEquality[];
static const char kFalseConstraint[];
static const char kGlobalCardinality[];
static const char kGreater[];
static const char kGreaterOrEqual[];
static const char kIntegerVariable[];
@@ -3200,6 +3201,7 @@ class ModelVisitor : public BaseObject {
static const char kMember[];
static const char kMin[];
static const char kMinEqual[];
static const char kModuloConstraint[];
static const char kNoCycle[];
static const char kNonEqual[];
static const char kOpposite[];
@@ -3271,6 +3273,7 @@ class ModelVisitor : public BaseObject {
static const char kMaxArgument[];
static const char kMaximizeArgument[];
static const char kMinArgument[];
static const char kModuloArgument[];
static const char kNextsArgument[];
static const char kOptionalArgument[];
static const char kRangeArgument[];

View File

@@ -915,6 +915,14 @@ class IntModulo : public Constraint {
y_->DebugString().c_str());
}
virtual void Accept(ModelVisitor* const visitor) const {
visitor->BeginVisitConstraint(ModelVisitor::kModuloConstraint, this);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kLeftArgument, x_);
visitor->VisitIntegerArgument(ModelVisitor::kModuloArgument, mod_);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kRightArgument, y_);
visitor->EndVisitConstraint(ModelVisitor::kModuloConstraint, this);
}
private:
IntVar* const x_;
const int64 mod_;
@@ -969,6 +977,15 @@ class VariableModulo : public Constraint {
y_->DebugString().c_str());
}
virtual void Accept(ModelVisitor* const visitor) const {
visitor->BeginVisitConstraint(ModelVisitor::kModuloConstraint, this);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kLeftArgument, x_);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kModuloArgument,
mod_);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kRightArgument, y_);
visitor->EndVisitConstraint(ModelVisitor::kModuloConstraint, this);
}
private:
IntVar* const x_;
IntVar* const mod_;
@@ -1003,6 +1020,15 @@ class BoundModulo : public Constraint {
mod_->DebugString().c_str());
}
virtual void Accept(ModelVisitor* const visitor) const {
visitor->BeginVisitConstraint(ModelVisitor::kModuloConstraint, this);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kExpressionArgument,
x_);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kModuloArgument,
mod_);
visitor->EndVisitConstraint(ModelVisitor::kModuloConstraint, this);
}
private:
IntVar* const x_;
IntVar* const mod_;
@@ -1047,6 +1073,15 @@ class PositiveModulo : public Constraint {
y_->DebugString().c_str());
}
virtual void Accept(ModelVisitor* const visitor) const {
visitor->BeginVisitConstraint(ModelVisitor::kModuloConstraint, this);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kLeftArgument, x_);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kModuloArgument,
mod_);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kRightArgument, y_);
visitor->EndVisitConstraint(ModelVisitor::kModuloConstraint, this);
}
private:
IntVar* const x_;
IntVar* const mod_;

View File

@@ -368,6 +368,11 @@ class GccConstraint : public Constraint {
return "GccConstraint";
}
void Accept(ModelVisitor* const visitor) const {
LOG(FATAL) << "Not yet implemented";
// TODO(user): IMPLEMENT ME.
}
private:
void PathSet(std::vector<int64>* const tree,
int64 start,

View File

@@ -934,6 +934,11 @@ class RankedPropagator : public Constraint {
partial_sequence_.DebugString().c_str());
}
void Accept(ModelVisitor* const visitor) const {
LOG(FATAL) << "Not yet implemented";
// TODO(user): IMPLEMENT ME.
}
private:
scoped_array<IntVar*> nexts_;
scoped_array<IntervalVar*> intervals_;

View File

@@ -144,6 +144,7 @@ class LightFunctionElementConstraint : public Constraint {
values_->CheckIsRepeatable();
}
virtual ~LightFunctionElementConstraint() {}
virtual void Post() {
Demon* demon =
MakeConstraintDemon0(solver(),
@@ -152,12 +153,22 @@ class LightFunctionElementConstraint : public Constraint {
"IndexBound");
index_->WhenBound(demon);
}
virtual void InitialPropagate() {
if (index_->Bound()) {
IndexBound();
}
}
virtual string DebugString() const {
return "LightFunctionElementConstraint";
}
void Accept(ModelVisitor* const visitor) const {
LOG(FATAL) << "Not yet implemented";
// TODO(user): IMPLEMENT ME.
}
private:
void IndexBound() {
var_->SetValue(values_->Run(index_->Value()));
@@ -208,6 +219,15 @@ class LightFunctionElement2Constraint : public Constraint {
IndexBound();
}
virtual string DebugString() const {
return "LightFunctionElement2Constraint";
}
void Accept(ModelVisitor* const visitor) const {
LOG(FATAL) << "Not yet implemented";
// TODO(user): IMPLEMENT ME.
}
private:
void IndexBound() {
if (index1_->Bound() && index2_->Bound()) {

View File

@@ -934,6 +934,23 @@ class SoftGCC : public Constraint{
return "SoftGCC";
}
virtual void Accept(ModelVisitor* const visitor) const {
visitor->BeginVisitConstraint(ModelVisitor::kGlobalCardinality, this);
visitor->VisitIntegerVariableArrayArgument(ModelVisitor::kVarsArgument,
vars_.data(),
vars_.size());
visitor->VisitIntegerArgument(ModelVisitor::kValueArgument, min_value_);
visitor->VisitIntegerArrayArgument(ModelVisitor::kMinArgument,
card_mins_.get(),
num_values_);
visitor->VisitIntegerArrayArgument(ModelVisitor::kMaxArgument,
card_max_.get(),
num_values_);
visitor->VisitIntegerExpressionArgument(ModelVisitor::kTargetArgument,
violation_var_);
visitor->EndVisitConstraint(ModelVisitor::kGlobalCardinality, this);
}
private:
int64* NewIntArray(int size) {
int64* const result = new int64[size];