From 46ffc703e217c63c3ac4d229d020a74aa3408bf7 Mon Sep 17 00:00:00 2001 From: Andrea Sgattoni Date: Fri, 22 Dec 2023 16:24:17 +0100 Subject: [PATCH] improve perf and fix error --- ortools/linear_solver/xpress_interface.cc | 5 ++-- .../linear_solver/xpress_interface_test.cc | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/ortools/linear_solver/xpress_interface.cc b/ortools/linear_solver/xpress_interface.cc index d8877aff31..0fa937c2a6 100644 --- a/ortools/linear_solver/xpress_interface.cc +++ b/ortools/linear_solver/xpress_interface.cc @@ -840,8 +840,7 @@ XpressInterface::XpressInterface(MPSolver* const solver, bool mip) mLp(nullptr), mMip(mip), supportIncrementalExtraction(false), - slowUpdates(static_cast(SlowSetObjectiveCoefficient | - SlowClearObjective)), + slowUpdates(SlowClearObjective), mapStringControls_(getMapStringControls()), mapDoubleControls_(getMapDoubleControls()), mapIntegerControls_(getMapIntControls()), @@ -1728,7 +1727,7 @@ void XpressInterface::SetLpAlgorithm(int value) { std::vector XpressBasisStatusesFrom( const std::vector& statuses) { std::vector result; - result.reserve(statuses.size()); + result.resize(statuses.size()); std::transform(statuses.cbegin(), statuses.cend(), result.begin(), MPSolverToXpressBasisStatus); return result; diff --git a/ortools/linear_solver/xpress_interface_test.cc b/ortools/linear_solver/xpress_interface_test.cc index 2c251824f6..e5c31d74ba 100644 --- a/ortools/linear_solver/xpress_interface_test.cc +++ b/ortools/linear_solver/xpress_interface_test.cc @@ -329,6 +329,31 @@ TEST(XpressInterface, LpStartingBasis) { EXPECT_LT(iterWithBasis, 10); } +TEST(XpressInterface, LpStartingBasisNoIterationsIfBasisIsProvided) { + UNITTEST_INIT_LP(); + buildLargeLp(solver, 1000); + // First, we record the number of iterations without an initial basis + solver.Solve(); + + // Then, we retrieve the final basis + std::vector varStatus, constrStatus; + for (auto* var : solver.variables()) { + varStatus.push_back(var->basis_status()); + } + for (auto* constr : solver.constraints()) { + constrStatus.push_back(constr->basis_status()); + } + + MPSolver solver_BasisProvided("XPRESS_LP", MPSolver::XPRESS_LINEAR_PROGRAMMING); + buildLargeLp(solver_BasisProvided, 1000); + solver_BasisProvided.SetStartingLpBasis(varStatus, constrStatus); + solver_BasisProvided.Solve(); + const auto iterWithBasis = solver_BasisProvided.iterations(); + // ...and finally check that no iteration has been performed + EXPECT_EQ(iterWithBasis, 0); +} + + TEST(XpressInterface, NumVariables) { UNITTEST_INIT_MIP(); MPVariable* x1 = solver.MakeNumVar(-1., 5.1, "x1");