jump-dev / CPLEX.jl

A Julia interface to the CPLEX solver
https://www.ibm.com/products/ilog-cplex-optimization-studio
MIT License
134 stars 63 forks source link

QP sometimes detected as unbounded #364

Closed odow closed 3 years ago

odow commented 3 years ago

As reported on discourse: https://discourse.julialang.org/t/error-handling-jump-and-cplex/56360/19, the following MPS file sometimes leads to a return status of DUAL_INFEASIBLE another_bug.mps.txt.zip

On my computer, I can't reproduce

julia> optimize!(model)
Version identifier: 12.10.0.0 | 2019-11-26 | 843d4de
Number of nonzeros in lower triangle of Q = 305647
Using Nested Dissection ordering
Total time for automatic ordering = 0.19 sec. (229.12 ticks)
Summary statistics for factor of Q:
  Rows in Factor            = 2378
  Integer space required    = 35380
  Total non-zeros in factor = 846370
  Total FP ops to factor    = 442792770
Tried aggregator 1 time.
QP Presolve eliminated 8729 rows and 6045 columns.
QP Presolve added 0 rows and 2378 columns.
Reduced QP has 3753 rows, 5094 columns, and 812264 nonzeros.
Reduced QP objective Q matrix has 2145 nonzeros.
Presolve time = 0.35 sec. (444.14 ticks)
Parallel mode: using up to 8 threads for barrier.
Number of nonzeros in lower triangle of A*A' = 2280234
Using Nested Dissection ordering
Total time for automatic ordering = 3.37 sec. (6219.80 ticks)
Summary statistics for Cholesky factor:
  Threads                   = 8
  Rows in Factor            = 3753
  Integer space required    = 329016
  Total non-zeros in factor = 3206921
  Total FP ops to factor    = 3411521617
 Itn      Primal Obj        Dual Obj  Prim Inf Upper Inf  Dual Inf          
   0   2.4435860e+02   2.2068845e+02  0.00e+00  0.00e+00  2.42e+06
   1   2.8436515e+01   7.1281975e+00  9.54e-10  0.00e+00  1.21e+04
   2   2.8329481e+01   4.7712020e+00  8.37e-07  0.00e+00  6.22e+01
   3   1.7288859e+01   4.7413238e+00  6.47e-13  0.00e+00  2.45e-01
   4   5.1080725e+00   4.7476922e+00  3.52e-13  0.00e+00  2.57e-02
   5   4.7755915e+00   4.7693769e+00  2.46e-13  0.00e+00  8.85e-01
   6   4.7602983e+00   4.7621630e+00  2.09e-13  0.00e+00  2.97e-01
   7   4.7598154e+00   4.7599562e+00  2.10e-13  0.00e+00  8.63e-02
   8   4.7598015e+00   4.7597704e+00  2.13e-13  0.00e+00  3.89e-02
   9   4.7597995e+00   4.7597605e+00  2.17e-13  0.00e+00  2.67e-02
  10   4.7597958e+00   4.7597957e+00  1.21e-08  0.00e+00  1.36e-04
  11   4.7597958e+00   4.7597958e+00  8.56e-11  0.00e+00  6.81e-07
Barrier time = 6.28 sec. (11443.70 ticks)

Total time on 8 threads = 6.28 sec. (11443.70 ticks)

julia> versioninfo()
Julia Version 1.5.3
Commit 788b2c77c1 (2020-11-09 13:37 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin18.7.0)
  CPU: Intel(R) Core(TM) i5-8259U CPU @ 2.30GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-9.0.1 (ORCJIT, skylake)

However, @pmcvay reports (things deviate in iteration 1 onwards):

julia> m = read_from_file("model_fail.mof.json")
A JuMP Model
Minimization problem with:
Variables: 8761
Objective function type: GenericQuadExpr{Float64,VariableRef}
`GenericAffExpr{Float64,VariableRef}`-in-`MathOptInterface.GreaterThan{Float64}`: 10104 constraints
`VariableRef`-in-`MathOptInterface.GreaterThan{Float64}`: 5052 constraints
Model mode: AUTOMATIC
CachingOptimizer state: NO_OPTIMIZER
Solver name: No optimizer attached.

julia> set_optimizer(m, CPLEX.Optimizer)

julia> optimize!(m)
Version identifier: 12.10.0.0 | 2019-11-26 | 843d4de
Number of nonzeros in lower triangle of Q = 305647
Using Nested Dissection ordering
Total time for automatic ordering = 0.26 sec. (229.12 ticks)
Summary statistics for factor of Q:
  Rows in Factor            = 2378
  Integer space required    = 35380
  Total non-zeros in factor = 846370
  Total FP ops to factor    = 442792770
Tried aggregator 1 time.
QP Presolve eliminated 8729 rows and 6045 columns.
QP Presolve added 0 rows and 2378 columns.
Reduced QP has 3753 rows, 5094 columns, and 812264 nonzeros.
Reduced QP objective Q matrix has 2145 nonzeros.
Presolve time = 0.43 sec. (444.14 ticks)
Parallel mode: using up to 20 threads for barrier.
Number of nonzeros in lower triangle of A*A' = 2280234
Using Nested Dissection ordering
Total time for automatic ordering = 3.78 sec. (6219.80 ticks)
Summary statistics for Cholesky factor:
  Threads                   = 20
  Rows in Factor            = 3753
  Integer space required    = 329016
  Total non-zeros in factor = 3206921
  Total FP ops to factor    = 3411521617
 Itn      Primal Obj        Dual Obj  Prim Inf Upper Inf  Dual Inf
   0   2.4435860e+02   2.2068845e+02  0.00e+00  0.00e+00  2.42e+06
   1   2.8436518e+01   7.1285879e+00  9.36e-10  0.00e+00  1.21e+04
   2   2.8329506e+01   4.7714215e+00  8.45e-07  0.00e+00  6.33e+01
   3   1.7403077e+01   4.7412113e+00  6.50e-13  0.00e+00  2.46e-01
   4   5.2928646e+00   4.7464611e+00  2.87e-13  0.00e+00  1.59e-02
   5   4.8240506e+00   4.7671989e+00  1.81e-13  0.00e+00  7.62e-01
   6   4.7651333e+00   4.7641820e+00  1.51e-13  0.00e+00  4.56e-01
   7   4.7599375e+00   4.7605438e+00  1.41e-13  0.00e+00  1.47e-01
   8   4.7598052e+00   4.7598371e+00  1.44e-13  0.00e+00  5.21e-02
   9   4.7598001e+00   4.7597857e+00  1.45e-13  0.00e+00  2.96e-02
  10   4.7597993e+00   4.7597809e+00  1.48e-13  0.00e+00  2.46e-02
  *    4.7598001e+00   4.7597857e+00  1.45e-13  0.00e+00  2.96e-02
Barrier time = 6.42 sec. (9577.86 ticks)

Total time on 20 threads = 6.42 sec. (9577.86 ticks)
CPLEX Error  1292: Invalid choice of optimization method.
ERROR: CPLEX Error  1292: Invalid choice of optimization method.

Stacktrace:
 [1] _check_ret(::CPLEX.Env, ::Int32) at /home/pmcvay/.julia/packages/CPLEX/uUjlQ/src/MOI/MOI_wrapper.jl:126
 [2] _check_ret at /home/pmcvay/.julia/packages/CPLEX/uUjlQ/src/MOI/MOI_wrapper.jl:243 [inlined]
 [3] optimize!(::CPLEX.Optimizer) at /home/pmcvay/.julia/packages/CPLEX/uUjlQ/src/MOI/MOI_wrapper.jl:2499
 [4] optimize!(::MathOptInterface.Bridges.LazyBridgeOptimizer{CPLEX.Optimizer}) at /home/pmcvay/.julia/packages/MathOptInterface/ZJFKw/src/Bridges/bridge_optimizer.jl:264
 [5] optimize!(::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.AbstractOptimizer,MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}) at /home/pmcvay/.julia/packages/MathOptInterface/ZJFKw/src/Utilities/cachingoptimizer.jl:215
 [6] optimize!(::Model, ::Nothing; bridge_constraints::Bool, ignore_optimize_hook::Bool, kwargs::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /home/pmcvay/.julia/packages/JuMP/y5vgk/src/optimizer_interface.jl:139
 [7] optimize! at /home/pmcvay/.julia/packages/JuMP/y5vgk/src/optimizer_interface.jl:115 [inlined] (repeats 2 times)
 [8] top-level scope at REPL[6]:1
 [9] run_repl(::REPL.AbstractREPL, ::Any) at /build/julia/src/julia-1.5.3/usr/share/julia/stdlib/v1.5/REPL/src/REPL.jl:288

julia> versioninfo()
Julia Version 1.5.3
Commit 788b2c77c1* (2020-11-09 13:37 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-10.0.1 (ORCJIT, broadwell)
odow commented 3 years ago

Closing because this isn't an issue with CPLEX.jl. The CPLEX developers have been notified about it.