added IO for AbsEquality, Power

This commit is contained in:
lperron@google.com
2012-08-19 15:30:49 +00:00
parent 6cef239f29
commit b478e57bec
3 changed files with 44 additions and 6 deletions

View File

@@ -1477,6 +1477,7 @@ class Solver {
Constraint* MakeElementEquality(const std::vector<IntVar*>& vars,
IntVar* const index,
int64 target);
Constraint* MakeAbsEquality(IntVar* const var, IntVar* const abs_var);
// This constraints is a special case of the element constraint with
// an array of integer variables where all the variables are all
// differents. In that case, and with a constant value, the index

View File

@@ -4687,7 +4687,7 @@ class IntAbsConstraint : public CastConstraint {
}
virtual string DebugString() const {
return StringPrintf("tAbsConstraint(%s, %s)",
return StringPrintf("IntAbsConstraint(%s, %s)",
sub_->DebugString().c_str(),
target_var_->DebugString().c_str());
}
@@ -6465,6 +6465,13 @@ IntExpr* Solver::MakeDiv(IntExpr* const e, int64 v) {
}
}
Constraint* Solver::MakeAbsEquality(IntVar* const sub, IntVar* const abs_var) {
if (Cache()->FindExprExpression(sub, ModelCache::EXPR_ABS) == NULL) {
Cache()->InsertExprExpression(abs_var, sub, ModelCache::EXPR_ABS);
}
return RevAlloc(new IntAbsConstraint(this, sub, abs_var));
}
IntExpr* Solver::MakeAbs(IntExpr* const e) {
CHECK_EQ(this, e->solver());
if (e->Min() >= 0) {
@@ -6479,7 +6486,7 @@ IntExpr* Solver::MakeAbs(IntExpr* const e) {
const string name = StringPrintf("AbsVar(%s)", e->name().c_str());
IntVar* const target = MakeIntVar(0, max_value, name);
AddConstraint(RevAlloc(new IntAbsConstraint(this, e->Var(), target)));
return target;
result = target;
} else {
result = RegisterIntExpr(RevAlloc(new IntAbs(this, e)));
}

View File

@@ -1065,6 +1065,21 @@ IntExpr* BuildAbs(CPModelLoader* const builder,
return builder->solver()->MakeAbs(expr);
}
// ----- kAbsEqual -----
Constraint* BuildAbsEqual(CPModelLoader* const builder,
const CPConstraintProto& proto) {
IntExpr* expr = NULL;
VERIFY(builder->ScanArguments(ModelVisitor::kExpressionArgument,
proto,
&expr));
IntExpr* target = NULL;
VERIFY(builder->ScanArguments(ModelVisitor::kTargetArgument,
proto,
&target));
return builder->solver()->MakeAbsEquality(expr->Var(), target->Var());
}
// ----- kAllDifferent -----
Constraint* BuildAllDifferent(CPModelLoader* const builder,
@@ -2097,10 +2112,10 @@ IntExpr* BuildPerformedExpr(CPModelLoader* const builder,
return var->PerformedExpr();
}
// ----- kProduct -----
// ----- kPower -----
IntExpr* BuildProduct(CPModelLoader* const builder,
const CPIntegerExpressionProto& proto) {
IntExpr* BuildPower(CPModelLoader* const builder,
const CPIntegerExpressionProto& proto) {
IntExpr* left = NULL;
if (builder->ScanArguments(ModelVisitor::kLeftArgument, proto, &left)) {
IntExpr* right = NULL;
@@ -2113,7 +2128,20 @@ IntExpr* BuildProduct(CPModelLoader* const builder,
&expr));
int64 value = 0;
VERIFY(builder->ScanArguments(ModelVisitor::kValueArgument, proto, &value));
return builder->solver()->MakeProd(expr, value);
return builder->solver()->MakePower(expr, value);
}
// ----- kProduct -----
IntExpr* BuildProduct(CPModelLoader* const builder,
const CPIntegerExpressionProto& proto) {
IntExpr* expr = NULL;
VERIFY(builder->ScanArguments(ModelVisitor::kExpressionArgument,
proto,
&expr));
int64 value = 0;
VERIFY(builder->ScanArguments(ModelVisitor::kValueArgument, proto, &value));
return builder->solver()->MakePower(expr, value);
}
// ----- kScalProd -----
@@ -2722,6 +2750,7 @@ Solver::GetSequenceVariableBuilder(const string& tag) const {
void Solver::InitBuilders() {
REGISTER(kAbs, BuildAbs);
REGISTER(kAbsEqual, BuildAbsEqual);
REGISTER(kAllDifferent, BuildAllDifferent);
REGISTER(kAllowedAssignments, BuildAllowedAssignments);
REGISTER(kBetween, BuildBetween);
@@ -2770,6 +2799,7 @@ void Solver::InitBuilders() {
REGISTER(kPack, BuildPack);
REGISTER(kPathCumul, BuildPathCumul);
REGISTER(kPerformedExpr, BuildPerformedExpr);
REGISTER(kPower, BuildPower);
REGISTER(kProduct, BuildProduct);
REGISTER(kScalProd, BuildScalProd);
REGISTER(kScalProdEqual, BuildScalProdEqual);