SOS constraints in Gurobi with Julia
AnsweredI have successfully used Gurobi in some code written in Julia to solve an optimization problem (MILP and MIQP). The code works perfectly on my laptop. When I port the identical code to Linus and run it inside the Linux shell, I get an Exception:
Exception has occurred: ErrorException
Unable to use SOS1ToMILPBridge because element 1 in the function has a non-finite domain: 0.0 + 1.0 MOI.VariableIndex(730)
.... and yet the same code works in Julia compiled inside VSCode on my laptop.
My Gurobi license and my Julia installation are both brand new so I am pretty sure that I have the latest versions.
Any thoughts?
-
Hi John,
For reproducibility it is can be important to make sure the Julia environments are the same.
I know you said you are pretty sure you have the latest versions, but I think we should make this 100% sure.
Can I suggest you run the Pkg.status() function to print out the installed packages and their versions, in each of your environments? In particular the versions for JuMP-dev packages will be relevant.
Can you also check the version of Julia on each machine, with either the VERSION constant, or the versioninfo command?
- Riley
0 -
From where do I run Pkg.status()? When I run it from the Julia prompt, I get Pkg not defined.
If I do versioninfo(), I get (on my laptop)
Julia Version 1.9.3
Commit bed2cd540a (2023-08-24 14:43 UTC)
Build Info:
Official https://julialang.org/ release
Platform Info:
OS: Windows (x86_64-w64-mingw32)
CPU: 8 × 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-14.0.6 (ORCJIT, tigerlake)
Threads: 4 on 8 virtual cores
Environment:
JULIA_EDITOR = code
JULIA_NUM_THREADS = 4From the university High Performance Computing Center Linus shell, I get
Julia Version 1.9.4
Commit 8e5136fa297 (2023-11-14 08:46 UTC)
Build Info:
Official https://julialang.org/ release
Platform Info:
OS: Linux (x86_64-linux-gnu)
CPU: 40 Ã Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-14.0.6 (ORCJIT, skylake-avx512)
Threads: 40 on 40 virtual cores
Environment:
LD_LIBRARY_PATH = /opt/conda/lib/libfabric:/usr/local/lib:/cm/shared/applications/slurm/23.02.2/lib:/cm/shared/applications/slurm/23.02.2/lib/slurm:/.singularity.d/libs
JULIA_EDITOR = codeThere is a slight mismatch in Julia versions: 1.9.3 v 1.9.4.
0 -
Hi John,
You will need to run
using(Pkg)
- Riley
0 -
On my laptop:
Pkg.status()
Project FactorModels v0.1.0
Status `C:\Users\ajcrosby\Documents\GitHub\FactorModels\Project.toml`
[336ed68f] CSV v0.10.11
[a93c6f00] DataFrames v1.6.1
[8bb1440f] DelimitedFiles v1.9.1
[aaf54ef3] DistributedArrays v0.6.7
⌃ [2e9cd046] Gurobi v1.0.3
⌃ [87dc4568] HiGHS v1.5.2
⌃ [4076af6c] JuMP v1.11.1
[1fd47b50] QuadGK v2.9.1
⌃ [2913bbd2] StatsBase v0.34.0
[fdbf4ff8] XLSX v0.10.0
[37e2e46d] LinearAlgebra
[9a3f8284] Random
[10745b16] Statistics v1.9.0
Info Packages marked with ⌃ have new versions available and may be upgradable.On Linux:
Status `~/.julia/environments/v1.9/Project.toml`
[336ed68f] CSV v0.10.11
[a93c6f00] DataFrames v1.6.1
[8bb1440f] DelimitedFiles v1.9.1
[2e9cd046] Gurobi v1.2.0
[87dc4568] HiGHS v1.7.5
[4076af6c] JuMP v1.17.0
[1fd47b50] QuadGK v2.9.1
[2913bbd2] StatsBase v0.34.2
â [d1185830] SymbolicUtils v1.4.0
[fdbf4ff8] XLSX v0.10.0
[8ba89e20] Distributed
[37e2e46d] LinearAlgebra
[de0858da] Printf
[9a3f8284] Random
[10745b16] Statistics v1.9.0
Info Packages marked with â have new versions available and may be upgradable.I notice there is quite a difference in JuMP versions ---- and the error may connect to the way JuMP sets up constraints.
0 -
The JuMP package is the latest available, and this is where the error is coming from, so if it's not running on the linux machine I would guess there are at least two possible explanations:
* There is a bug in JuMP 1.17.0 causing your issue
* There was a bug in JuMP v1.11.1 and you should have got the same error on your laptopJuMP uses semantic versioning so we should be able to rule out a breaking change in the API since the major version hasn't changed. You could try forcing the installation of JuMP 1.11.1 (or a version earlier than 1.17) and see what affect that has.
Perhaps the JuMP forum could also be of help.
- Riley
0 -
One further point: I can make the code run more robustly by inserting the variable declaration (the "beta" β is the name of one of the variables):
@variable(model, -1.0e200 <= β[1:nfac] <= 1.0e200).Before I just had the variable declaration @variable(model, β[1:nfac])It is clear from heuristics that the optimal value is between, say, -10 and +10, so the constraint -1.0e200 <= β[1:nfac] <= 1.0e200 will never bind but it has stopped the code (using SOS1) crashing immediately.0 -
Bounding the variable seems like a valid fix given the original error message.
It looks like the difference you see may lie in versions 1.22+ of MathOptInterface.jl
When you run Pkg.status() it displays the top level packages installed, but using Pkg.status(; mode=PKGMODE_MANIFEST) will show dependencies of dependencies and that's where MathOptInterface version will be shown.
The MathOptInterface changelog makes reference to adding SOS1ToMILPBridge in version 1.22.
Perhaps SOS1 constraints were just not translated to linear constraints prior to version 1.22 - but ideally adding this option wouldn't cause an error that crashes execution. Perhaps it is worth opening a Github issue for MathOptInterface to address this problem?
0 -
I'm late to the party on this one. I stumbled upon this looking for something else. I've opened the GitHub issue: https://github.com/jump-dev/MathOptInterface.jl/issues/2722
The underlying cause is that Gurobi supports VectorOfVariables in SOS1, but not VectorAffineFunction-in-SOS1.
The user has written Ax + b in SOS1. MathOptInterface has the choice between trying to reformulate Ax + b in SOS1 into a MIP, or adding `Ax - y = b`, `y in SOS1`.
The bug is that we should to the latter, but we currently opt for the former.
1
Please sign in to leave a comment.
Comments
8 comments