Implemented Accept on all constraints
This commit is contained in:
@@ -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_;
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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[];
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user