From ae2b3d68700df1c1925999f694e2d9de2fd5d99b Mon Sep 17 00:00:00 2001 From: "lperron@google.com" Date: Wed, 18 Sep 2013 17:07:01 +0000 Subject: [PATCH] simplify scal_prod if all abs(coeeficients) are equals; gains 15% on oc-roster.mzn --- src/constraint_solver/expr_array.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/constraint_solver/expr_array.cc b/src/constraint_solver/expr_array.cc index df7dd3f9d0..5eff4fc27a 100644 --- a/src/constraint_solver/expr_array.cc +++ b/src/constraint_solver/expr_array.cc @@ -2827,6 +2827,22 @@ IntExpr* MakeScalProdFct(Solver* solver, const std::vector& pre_vars, coefs.push_back(iter->second); } } + // Are all coefficients equal or abs equals. + int64 abs_coef = std::abs(coefs[0]); + for (int i = 1; i < coefs.size(); ++i) { + int64 new_abs_coef = std::abs(coefs[i]); + if (new_abs_coef != abs_coef) { + abs_coef = 0; + break; + } + } + if (abs_coef > 1 && constant % abs_coef == 0) { + for (int i = 0; i < coefs.size(); ++i) { + coefs[i] /= abs_coef; + } + return solver->MakeProd( + MakeScalProdAux(solver, vars, coefs, constant / abs_coef), abs_coef); + } return MakeScalProdAux(solver, vars, coefs, constant); }