From e008a8a488c14ab0ba4d550355940791a0a90d4a Mon Sep 17 00:00:00 2001 From: "lperron@google.com" Date: Fri, 15 Jun 2012 16:28:41 +0000 Subject: [PATCH] cache expr * cst and thus cache normal scalprod --- src/constraint_solver/constraint_solveri.h | 30 ++++++++++++---- src/constraint_solver/expressions.cc | 42 +++++++++++++--------- src/constraint_solver/model_cache.cc | 32 +++++++++++++++++ 3 files changed, 80 insertions(+), 24 deletions(-) diff --git a/src/constraint_solver/constraint_solveri.h b/src/constraint_solver/constraint_solveri.h index c540a1e550..b47304c8d9 100644 --- a/src/constraint_solver/constraint_solveri.h +++ b/src/constraint_solver/constraint_solveri.h @@ -1428,13 +1428,7 @@ class ModelCache { }; enum VarConstantExpressionType { - VAR_CONSTANT_DIFFERENCE = 0, - VAR_CONSTANT_DIVIDE, - VAR_CONSTANT_PROD, - VAR_CONSTANT_MAX, - VAR_CONSTANT_MIN, - VAR_CONSTANT_SUM, - VAR_CONSTANT_IS_EQUAL, + VAR_CONSTANT_IS_EQUAL = 0, VAR_CONSTANT_IS_NOT_EQUAL, VAR_CONSTANT_IS_GREATER_OR_EQUAL, VAR_CONSTANT_IS_LESS_OR_EQUAL, @@ -1458,6 +1452,15 @@ class ModelCache { EXPR_EXPR_EXPRESSION_MAX, }; + enum ExprConstantExpressionType { + EXPR_CONSTANT_DIFFERENCE = 0, + EXPR_CONSTANT_DIVIDE, + EXPR_CONSTANT_PROD, + EXPR_CONSTANT_MAX, + EXPR_CONSTANT_MIN, + EXPR_CONSTANT_SUM, + EXPR_CONSTANT_EXPRESSION_MAX, + }; enum VarConstantConstantExpressionType { VAR_CONSTANT_CONSTANT_SEMI_CONTINUOUS = 0, VAR_CONSTANT_CONSTANT_EXPRESSION_MAX, @@ -1565,6 +1568,19 @@ class ModelCache { IntVar* const var2, VarVarExpressionType type) = 0; + // Expr Constant Expressions. + + virtual IntExpr* FindExprConstantExpression( + IntExpr* const expr, + int64 value, + ExprConstantExpressionType type) const = 0; + + virtual void InsertExprConstantExpression( + IntExpr* const expression, + IntExpr* const var, + int64 value, + ExprConstantExpressionType type) = 0; + // Expr Expr Expressions. virtual IntExpr* FindExprExprExpression( diff --git a/src/constraint_solver/expressions.cc b/src/constraint_solver/expressions.cc index d4d677ad17..00b18bfd7f 100644 --- a/src/constraint_solver/expressions.cc +++ b/src/constraint_solver/expressions.cc @@ -347,7 +347,6 @@ class DomainIntVar : public IntVar { } } posted_.Switch(solver()); - // LOG(INFO) << "Posted " << count << " watchers on " << variable_->DebugString() << (void*)variable_; } virtual void InitialPropagate() { @@ -523,6 +522,8 @@ class DomainIntVar : public IntVar { solver()->RevAlloc(new Watcher(solver(), this)))); } IntVar* const boolvar = watcher_->GetOrMakeWatcher(value); + s->Cache()->InsertVarConstantExpression( + boolvar, this, value, ModelCache::VAR_CONSTANT_IS_EQUAL); return boolvar; } } @@ -5235,24 +5236,31 @@ IntExpr* Solver::MakeOpposite(IntExpr* const e) { IntExpr* Solver::MakeProd(IntExpr* const e, int64 v) { CHECK_EQ(this, e->solver()); - IntExpr* result; - if (e->Bound()) { - return MakeIntConst(v * e->Min()); - } else if (v == 1) { - return e; - } else if (v == -1) { - return MakeOpposite(e); - } else if (v > 0) { - result = RegisterIntExpr(RevAlloc(new TimesIntPosCstExpr(this, e, v))); - } else if (v == 0) { - result = MakeIntConst(0); + IntExpr* result = Cache()->FindExprConstantExpression( + e, v, ModelCache::EXPR_CONSTANT_PROD); + if (result != NULL) { + return result; } else { - result = RegisterIntExpr(RevAlloc(new TimesIntNegCstExpr(this, e, v))); + if (e->Bound()) { + return MakeIntConst(v * e->Min()); + } else if (v == 1) { + return e; + } else if (v == -1) { + return MakeOpposite(e); + } else if (v > 0) { + result = RegisterIntExpr(RevAlloc(new TimesIntPosCstExpr(this, e, v))); + } else if (v == 0) { + result = MakeIntConst(0); + } else { + result = RegisterIntExpr(RevAlloc(new TimesIntNegCstExpr(this, e, v))); + } + if (e->IsVar() && !FLAGS_cp_disable_expression_optimization) { + result = result->Var(); + } + Cache()->InsertExprConstantExpression( + result, e, v, ModelCache::EXPR_CONSTANT_PROD); + return result; } - if (e->IsVar() && !FLAGS_cp_disable_expression_optimization) { - result = result->Var(); - } - return result; } IntExpr* Solver::MakeProd(IntExpr* const l, IntExpr* const r) { diff --git a/src/constraint_solver/model_cache.cc b/src/constraint_solver/model_cache.cc index 9219bbe2ef..77b95cc67c 100644 --- a/src/constraint_solver/model_cache.cc +++ b/src/constraint_solver/model_cache.cc @@ -359,6 +359,7 @@ class NonReversibleCache : public ModelCache { typedef Cache2 VarConstantConstraintCache; typedef Cache2 VarVarConstraintCache; typedef Cache2 VarConstantIntExprCache; + typedef Cache2 ExprConstantIntExprCache; typedef Cache2 VarVarIntExprCache; typedef Cache2 ExprExprIntExprCache; typedef Cache2 VarConstantArrayIntExprCache; @@ -388,6 +389,9 @@ class NonReversibleCache : public ModelCache { for (int i = 0; i < VAR_CONSTANT_EXPRESSION_MAX; ++i) { var_constant_expressions_.push_back(new VarConstantIntExprCache); } + for (int i = 0; i < EXPR_CONSTANT_EXPRESSION_MAX; ++i) { + expr_constant_expressions_.push_back(new ExprConstantIntExprCache); + } for (int i = 0; i < VAR_VAR_EXPRESSION_MAX; ++i) { var_var_expressions_.push_back(new VarVarIntExprCache); } @@ -609,6 +613,33 @@ class NonReversibleCache : public ModelCache { } } + // Expr Constant Expressions. + + virtual IntExpr* FindExprConstantExpression( + IntExpr* const expr, + int64 value, + ExprConstantExpressionType type) const { + DCHECK(expr != NULL); + DCHECK_GE(type, 0); + DCHECK_LT(type, EXPR_CONSTANT_EXPRESSION_MAX); + return expr_constant_expressions_[type]->Find(expr, value); + } + + virtual void InsertExprConstantExpression( + IntExpr* const expression, + IntExpr* const expr, + int64 value, + ExprConstantExpressionType type) { + DCHECK(expression != NULL); + DCHECK(expr != NULL); + DCHECK_GE(type, 0); + DCHECK_LT(type, EXPR_CONSTANT_EXPRESSION_MAX); + if (solver()->state() != Solver::IN_SEARCH && + expr_constant_expressions_[type]->Find(expr, value) == NULL) { + expr_constant_expressions_[type]->UnsafeInsert(expr, value, expression); + } + } + // Expr Expr Expression. virtual IntExpr* FindExprExprExpression( @@ -762,6 +793,7 @@ class NonReversibleCache : public ModelCache { std::vector var_expressions_; std::vector var_constant_expressions_; std::vector var_var_expressions_; + std::vector expr_constant_expressions_; std::vector expr_expr_expressions_; std::vector var_constant_constant_expressions_; std::vector var_constant_array_expressions_;