1
$\begingroup$

or-tools-discuss cross post here.

As a disclaimer -- I am very aware that OR-Tools' Python code are just wrappers around their C++ source code. I'm just getting an odd discrepancy between a model setup in Python and one setup in C++ and am wracking my brain to figure out what I've messed up (because its most likely me not implementing something correctly or missing a "hidden-to-me" difference between the two).

Setup Context

OS

  • Pop!OS 22.04 (basically Ubuntu)
  • x86_64

Python Environment

  • Python 3.10.5
  • ortools 9.6.2534

C++ Environment

  • CMake 3.26.4
  • gcc 11.3.0
  • or-tools FetchContent'd from stable Git branch

Problem Context

I've got two scripts, one in Python and the other in C++, that are setup to do (what I believe) is the same thing: read in an MPS file and solve the contained MIP using the SCIP solver.

The MPS file being fed into both scripts is the same, so I would have expected them to produce similar results. I might have even expected the C++ program to run faster than its Python counterpart. But what I'm seeing is that the Python script finished in ~20 seconds or so, while the C++ script errors out during the solve process after 5+ minutes.

The C++ error produced was (effectively): ERROR: (node 1) unresolved numerical troubles in LP 2 cannot be dealt with, which is mentioned in this question.

Upon inspecting the logs from both solvers, I see they are both coming to the same primal / dual bounds. But whereas the Python script reaches those bounds and exits with an Optimal solution, the C++ script continues to iterate until error-ing out with the above issue.

I'm wondering if it could be related to the way I've read in the MPS file and loaded it into a model? The process for each is laid out below:

Python

  • use ortools.linear_solver.python.model_builder.ModelBuilderand ModelSolver
  • instantiate objects model = ModelBuilder() and solver = ModelSolver("SCIP")
  • model.import_from_mps_file to read MPS
  • solver.solve(model) to optimize MIP

C++

  • #include <ortools/lp_data/mps_reader.h> and #include <ortools/linear_solver/linear_solver.h>
  • instantiate solver `solver = MPSolver::CreateSolver("SCIP")
  • read MPS file to proto model_proto = glop::MpsFileToMPModelProto(mps_file)
  • load model from proto solver->LoadModelFromProto(*model_proto, ...)
  • solver->Solve()

So, in Python, I'm using the ModelHelpers and in C++ I'm interfacing directly with the MPSolver class. Perhaps this is where the difference lies?

Any thoughts / suggestions as to why I'm seeing this difference would be much appreciated!

$\endgroup$

1 Answer 1

1
$\begingroup$

As explained on or-tools-discuss, model_builer and MPSolver use 2 different sets of parameter s. In particular the tolerances ans the gaps.

I recommend using settings the same solver specific parameters as strings on both front ends.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.