Gurobi Mex: A MATLAB interface for Gurobi

From Wikimization

(Difference between revisions)
Jump to: navigation, search
(Input Description)
Line 1: Line 1:
-
[[Image:Gurobi_matlab_logos.jpg|right]] Gurobi Mex is a MATLAB interface for Gurobi 2 and 3 written by [http://www.caam.rice.edu/ Wotao Yin]. It calls [http://www.gurobi.com/ Gurobi] to solve linear/mixed-integer optimization problems. Gurobi is one of the leading linear and mixed integer programming solvers. Gurobi offers [http://www.gurobi.com/html/freetrial.html free trial], and its full version is [http://www.gurobi.com/html/academic.html free for academic usage].
+
[[Image:Gurobi_matlab_logos.jpg|right]] Gurobi Mex is a MATLAB interface for Gurobi 2 and 3 written by [http://www.caam.rice.edu/ Wotao Yin] and voluntary contributors. It calls [http://www.gurobi.com/ Gurobi] to solve linear/mixed-integer optimization problems. Gurobi is one of the leading linear and mixed integer programming solvers. Gurobi offers [http://www.gurobi.com/html/freetrial.html free trial], and its full version is [http://www.gurobi.com/html/academic.html free for academic usage].
The interface is open source and subject to [http://creativecommons.org/licenses/by-sa/3.0/us/ Creative Commons Attribution-Share Alike 3.0 United States License]. It is a tool for MATLAB users to quickly call Gurobi, and its source code serves as a start point for those who want to develop a customized MATLAB interface for Gurobi.
The interface is open source and subject to [http://creativecommons.org/licenses/by-sa/3.0/us/ Creative Commons Attribution-Share Alike 3.0 United States License]. It is a tool for MATLAB users to quickly call Gurobi, and its source code serves as a start point for those who want to develop a customized MATLAB interface for Gurobi.
-
Its current version is 1.20 published on April 25, 2010. It supports both Gurobi versions 2 and 3.
+
Its current version is 1.30 published on September 28, 2010. It supports both Gurobi versions 2 and 3.
----
----
Line 9: Line 9:
== Download, Installation, and Limitations ==
== Download, Installation, and Limitations ==
-
[http://www.caam.rice.edu/~wy1/gurobi_mex/download_request.html Download C source code and MATLAB examples, the latest version 1.20]
+
[http://www.caam.rice.edu/~wy1/gurobi_mex/download_request.html Download C source code and MATLAB examples, the latest version 1.30]
-
[http://www.caam.rice.edu/~wy1/gurobi_mex/download_request.html v1.20] New features: [http://www.caam.rice.edu/~wy1/links/mex_ctrl_c_trick/ Ctrl-C detection], Gurobi 3 support, back compatible with Gurobi 2. Improved error and exception handling. Empty array [] is returned when an output argument is not available (due to optimization failures or errors). Fixed the display interval option.
+
[http://www.caam.rice.edu/~wy1/gurobi_mex/download_request.html v1.30] New features: support of [http://www.google.com/search?q=special+ordered+set+SOS Special Ordered Sets (SOS)] constraints of types 1 and 2; new options PrePasses and TrapCtrlC; detection of unrecognized options. Fixed minor display issues.
=== History ===
=== History ===
 +
[http://www.caam.rice.edu/~wy1/gurobi_mex/gurobi_mex_v1.10.zip v1.20] New features: [http://www.caam.rice.edu/~wy1/links/mex_ctrl_c_trick/ Ctrl-C detection], Gurobi 3 support. Improved error and exception handling. Empty array [] is returned if an output argument is not available. Fixed the display interval option.
 +
[http://www.caam.rice.edu/~wy1/gurobi_mex/gurobi_mex_v1.10.zip v1.10] New features: callback, runtime progress output, flexible log file, flexible input types, more options. Part of the code was contributed by ''Tomáš Strnad''.
[http://www.caam.rice.edu/~wy1/gurobi_mex/gurobi_mex_v1.10.zip v1.10] New features: callback, runtime progress output, flexible log file, flexible input types, more options. Part of the code was contributed by ''Tomáš Strnad''.
Known bug: print an empty line even if options '''DisplayInterval''' and '''Display''' are both set to <font face="Times">0</font>. Fix: remove Line 736 of ''gurobi_mex.c'': mexPrintf("\n");
Known bug: print an empty line even if options '''DisplayInterval''' and '''Display''' are both set to <font face="Times">0</font>. Fix: remove Line 736 of ''gurobi_mex.c'': mexPrintf("\n");
Line 37: Line 39:
Refer to [http://www.gurobi.com/doc/30/quickstart/node1.html Gurobi's installation guide]. Please make sure that (i) proper environment variables are set, (ii) your copy of Gurobi has a license, and (iii) the license has been successfully validated.
Refer to [http://www.gurobi.com/doc/30/quickstart/node1.html Gurobi's installation guide]. Please make sure that (i) proper environment variables are set, (ii) your copy of Gurobi has a license, and (iii) the license has been successfully validated.
-
==== Step 2. Code Change Required for ''Gurobi 2'' Only ====
+
Make sure that your MATLAB has been set up to use a supported external C compiler such as GCC and MS Visual C++. Run ''mex -setup'' if necessary. We found trouble with MATLAB's built-in ''lcc'' to link with Gurobi's library.
-
Uncomment Line 19 of gurobi_mex.c because GRB_SUBOPTIMAL is not part of Gurobi 2. It is introduced in Gurobi 3.
+
 
 +
If you use Gurobi 2, please uncomment Line 20 of gurobi_mex.c because GRB_SUBOPTIMAL was introduced in Gurobi 3.
-
==== Step 3. Compiling Gurobi Mex ====
+
==== Step 2. Compiling Gurobi Mex ====
-
===== Step 3a. Windows =====
+
===== Step 2a. Windows =====
mex -O -I"<gurobi include path>" gurobi_mex.c "<gurobi C library file>" "<MATLAB libut.lib>"
mex -O -I"<gurobi include path>" gurobi_mex.c "<gurobi C library file>" "<MATLAB libut.lib>"
Line 53: Line 56:
===== Missing libut.lib? =====
===== Missing libut.lib? =====
-
Ctrl-C detection requires libut.lib. If libut.lib is not found under your copy of MATLAB, you can download one for [http://www.caam.rice.edu/~wy1/gurobi_mex/libut_32bit/libut.lib 32-bit Windows] and [http://www.caam.rice.edu/~wy1/gurobi_mex/libut_64bit/libut.lib 64-bit Windows] (courtesy of Imre Polik).
+
Ctrl-C detection requires libut.lib. If it is not found under your copy of MATLAB, you can download one for [http://www.caam.rice.edu/~wy1/gurobi_mex/libut_32bit/libut.lib 32-bit Windows] and [http://www.caam.rice.edu/~wy1/gurobi_mex/libut_64bit/libut.lib 64-bit Windows] (courtesy of Imre Polik).
-
Alternatively, it can be manually generated by creating a .def text file including the following five lines
+
Alternatively, libut.lib can be manually generated by creating a .def text file including the following five lines
LIBRARY libut.dll
LIBRARY libut.dll
EXPORTS
EXPORTS
Line 65: Line 68:
where /machine:x86 should be replaced by /machine:x64 for 64-bit Windows.
where /machine:x86 should be replaced by /machine:x64 for 64-bit Windows.
-
===== Step 3b. Linux/Unix =====
+
===== Step 2b. Linux/Unix =====
mex -O -I"<gurobi include path>" gurobi_mex.c -L"<gurobi lib path>" -l<gurobi C library file> -lut
mex -O -I"<gurobi include path>" gurobi_mex.c -L"<gurobi lib path>" -l<gurobi C library file> -lut
Line 82: Line 85:
* 64-bit Windows, 64-bit MATLAB, and MSVC 2008 SP1 (the express Edition is free). Courtesy of ''Imre Polik''.
* 64-bit Windows, 64-bit MATLAB, and MSVC 2008 SP1 (the express Edition is free). Courtesy of ''Imre Polik''.
-
We found trouble with MATLAB's built-in ''lcc'' to link with Gurobi's library.
+
For 64-bit MATLAB, Jon Dattorro suggests [http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en#filelist Microsoft Platform SDK] and a [http://www.mathworks.com/support/solutions/en/data/1-8FJXQE/index.html?solution=1-8FJXQE bug fix] for the linker.
== Model ==
== Model ==
Line 91: Line 94:
Ax [>= / <= / =] b,
Ax [>= / <= / =] b,
lb <= x <= ub,
lb <= x <= ub,
 +
SOS constraints,
x(i) is [continuous / binary / integer / semi-continuous / semi-integer].
x(i) is [continuous / binary / integer / semi-continuous / semi-integer].
</pre>
</pre>
Line 124: Line 128:
:If a single character is specified, all variables will be signed to the corresponding type uniformly.
:If a single character is specified, all variables will be signed to the corresponding type uniformly.
* '''options''': ''optional'' structure that may contain one or more of the following fields: <br>(see [http://www.gurobi.com/doc/30/refman/node489.html Gurobi's parameter help] for their allowed values. Also, see [[Gurobi_Mex:_A_MATLAB_interface_for_Gurobi#Three_Examples|examples]] below.)
* '''options''': ''optional'' structure that may contain one or more of the following fields: <br>(see [http://www.gurobi.com/doc/30/refman/node489.html Gurobi's parameter help] for their allowed values. Also, see [[Gurobi_Mex:_A_MATLAB_interface_for_Gurobi#Three_Examples|examples]] below.)
 +
** '''opts.SOS.weights''' and '''opts.SOS.types''': See here.
** '''options.IterationLimit''':
** '''options.IterationLimit''':
** '''options.FeasibilityTol''':
** '''options.FeasibilityTol''':
Line 131: Line 136:
** '''options.LPMethod''':
** '''options.LPMethod''':
** '''options.Presolve''':
** '''options.Presolve''':
 +
** '''options.PrePasses''':
** '''options.TimeLimit''':
** '''options.TimeLimit''':
** '''options.Threads''':
** '''options.Threads''':
 +
** '''options.TrapCtrlC''': true (trap Ctrl-C) or false (not trap Ctrl-C).
** '''options.DisplayInterval''': [http://www.gurobi.com/doc/30/refman/node494.html Gurobi's Callback screen output interval.] &nbsp; <font face="Times">0</font> means no Gurobi message.
** '''options.DisplayInterval''': [http://www.gurobi.com/doc/30/refman/node494.html Gurobi's Callback screen output interval.] &nbsp; <font face="Times">0</font> means no Gurobi message.
** '''options.Display''': Gurobi Mex's screen output level. <font face="Times">0</font> for no output; 1 for error only; 2 (default) for normal output. For complete silence, both '''DisplayInterval''' and '''Display''' need to be set to <font face="Times">0</font>.
** '''options.Display''': Gurobi Mex's screen output level. <font face="Times">0</font> for no output; 1 for error only; 2 (default) for normal output. For complete silence, both '''DisplayInterval''' and '''Display''' need to be set to <font face="Times">0</font>.
Line 160: Line 167:
** '''output.ErrorMsg''': contains Gurobi error message, if any
** '''output.ErrorMsg''': contains Gurobi error message, if any
* '''lambda''': Lagrange multipliers. Because solving MIPs gives no such output, ''do not'' ask for this output for MIPs.
* '''lambda''': Lagrange multipliers. Because solving MIPs gives no such output, ''do not'' ask for this output for MIPs.
 +
 +
 +
----
 +
=== SOS Constraints ===
 +
SOS stands for [http://www.google.com/search?q=special+ordered+set+SOS Special Ordered Sets]. '''opts.SOS.weights''' is a ''sparse'' matrix describing the constraint weights, and '''opts.SOS.types''' a 1D array of type int32 or int64 (depending on your system) specifying the constraint types. In the following example, there are 4 variables and 3 SOS constraints:
 +
 +
SOS1: x1 = 0 or x2 = 0
 +
SOS1: x1 = 0 or x3 = 0
 +
SOS2: (x1, x3, x2, x4)
 +
 +
The corresponding code is
 +
opts.SOS.weights = sparse([
 +
1 1 1;
 +
2 0 3;
 +
0 2 2;
 +
0 0 4]);
 +
opts.SOS.types = int32([1 1 2]);
 +
The ''i''th column of '''opts.SOS.weights''' specifies the weights (i.e., orders) of the variables in the ''i''th SOS constraint.
 +
 +
----
 +
=== How to pass a parameter from MATLAB to Gurobi? ===
 +
If this mex program does not support a parameter you want to pass from MATLAB to Gurobi, you can DIY very easily. Suppose that you want to set the Gurobi parameter '''Heuristics''' in MATLAB. From [http://gurobi.com/doc/30/refman/node489.html#sec:Parameters the parameter list], we find the type of Heuristics is double. Because the parameter '''TimeLimit''' has the same type and it is supported by this mex program, we can copy the code for '''TimeLimit''' (Lines 356 - 368), replace TimeLimit by Heuristics, and paste it at Line 510, right before the check of unrecognized input option fields. We compare the copied and inserted lines below where the differences are italicized:
 +
 +
/* Option ''TimeLimit'' */
 +
field_n = mxGetFieldNumber(IN_OPTS, "''TimeLimit''");
 +
if (field_n != -1) {
 +
field = mxGetFieldByNumber(IN_OPTS,0,field_n);
 +
bOpts[field_n] = true;
 +
if (!mxIsDouble(field) || mxIsComplex(field) || mxIsEmpty(field)) {
 +
mexPrintf("''Option TimeLimit must be real positive double (0 to inf).''");
 +
goto QUIT;
 +
}
 +
error = GRBsetdblparam(env, "''TimeLimit''", mxGetScalar(field));
 +
if (error) goto QUIT;
 +
}
 +
 +
/* Option ''Heuristics'' */
 +
field_n = mxGetFieldNumber(IN_OPTS, "''Heuristics''");
 +
if (field_n != -1) {
 +
field = mxGetFieldByNumber(IN_OPTS,0,field_n);
 +
bOpts[field_n] = true;
 +
if (!mxIsDouble(field) || mxIsComplex(field) || mxIsEmpty(field)) {
 +
mexPrintf("''Option Heuristics must real double (0 through 1).''");
 +
goto QUIT;
 +
}
 +
error = GRBsetdblparam(env, "''Heuristics''", mxGetScalar(field));
 +
if (error) goto QUIT;
 +
}
 +
Note that you find an existing parameter of the ''same'' type.
 +
 +
After compiling, the modified mex will support '''opts.Heuristics'''.
== Callbacks ==
== Callbacks ==
Line 335: Line 393:
Log file: ''test_gurobi_mex_Feasibility.log''. MPS file: ''test_gurobi_mex_Feasibility.mps''.
Log file: ''test_gurobi_mex_Feasibility.log''. MPS file: ''test_gurobi_mex_Feasibility.mps''.
-
=== Example 4. Compressive sensing ===
+
=== Example 4. SOS constraint test ===
 +
Problem:
 +
<pre>
 +
min –3 x1 – 1 x2 – 1 x3,
 +
 
 +
subject to
 +
x1 + x2 + x3 <= 2,
 +
0 <= x1 <= 1, 0 <= x2 <= 1, 0 <= x3 <= 2,
 +
SOS type 1: x1 = 0 or x2 = 0,
 +
SOS type 1: x1 = 0 or x3 = 0.
 +
</pre>
 +
MATLAB code:
 +
<pre>
 +
c = [-3; -1; -1];
 +
objtype = 1;
 +
A = sparse([1 1 1]);
 +
b = 2;
 +
lb = []; % means 0 lower bound
 +
ub = [1 1 2];
 +
contypes = '<';
 +
vtypes = []; % same as vtypes = 'CCC'
 +
sos.weights = sparse([1 1; 2 0; 0 2]);
 +
sos.types = int32([1 1]); % Both the SOS constraints are of type 1
 +
 
 +
clear opts
 +
opts.FeasibilityTol = 1e-6;
 +
opts.Presolve = -1; % -1 - auto, 0 - no, 1 - conserv, 2 - aggressive
 +
opts.Display = 1;
 +
opts.LogFile = 'test_gurobi_mex_Feasibility.log';
 +
opts.WriteToFile = 'test_gurobi_mex_Feasibility.mps';
 +
 
 +
[x,val,exitflag,output] = gurobi_mex(c,objtype,A,b,contypes,lb,ub,vtypes,opts);
 +
</pre>
 +
 
 +
Results:
 +
<pre>
 +
Optimal solution found (tolerance 1.00e-04)
 +
Best objective -3.0000000000e+00, best bound -3.0000000000e+00, gap 0.0%
 +
 +
Solution:
 +
1 0 0
 +
</pre>
 +
Log file: ''test_gurobi_mex_SOS.log''. MPS file: ''test_gurobi_mex_SOS.mps''.
 +
 
 +
 
 +
=== Example 5. Compressive sensing ===
See example m-file ''test_gurobi_mex_CS.m''.
See example m-file ''test_gurobi_mex_CS.m''.

Revision as of 23:16, 28 September 2010

Gurobi Mex is a MATLAB interface for Gurobi 2 and 3 written by Wotao Yin and voluntary contributors. It calls Gurobi to solve linear/mixed-integer optimization problems. Gurobi is one of the leading linear and mixed integer programming solvers. Gurobi offers free trial, and its full version is free for academic usage.

The interface is open source and subject to Creative Commons Attribution-Share Alike 3.0 United States License. It is a tool for MATLAB users to quickly call Gurobi, and its source code serves as a start point for those who want to develop a customized MATLAB interface for Gurobi.

Its current version is 1.30 published on September 28, 2010. It supports both Gurobi versions 2 and 3.


Contents

Download, Installation, and Limitations

Download C source code and MATLAB examples, the latest version 1.30

v1.30 New features: support of Special Ordered Sets (SOS) constraints of types 1 and 2; new options PrePasses and TrapCtrlC; detection of unrecognized options. Fixed minor display issues.

History

v1.20 New features: Ctrl-C detection, Gurobi 3 support. Improved error and exception handling. Empty array [] is returned if an output argument is not available. Fixed the display interval option.

v1.10 New features: callback, runtime progress output, flexible log file, flexible input types, more options. Part of the code was contributed by Tomáš Strnad. Known bug: print an empty line even if options DisplayInterval and Display are both set to 0. Fix: remove Line 736 of gurobi_mex.c: mexPrintf("\n");

v1.05 Major bug fix: char array of constraint sense has been fixed

v1.04 support writing model to files in various formats such as MPS, REW, LP, ...

v1.03 support log file

v1.02 fixed a memory leak issue

v1.01 update: support output dual solution lambda; allow vartypes to be empty (for all continuous variables).

v1.00 initial version.

Future Release

Please send your suggested features to Wotao Yin (wotao.yin AT rice.edu).

Install Gurobi Mex in MATLAB

Step 1. Preparation

Refer to Gurobi's installation guide. Please make sure that (i) proper environment variables are set, (ii) your copy of Gurobi has a license, and (iii) the license has been successfully validated.

Make sure that your MATLAB has been set up to use a supported external C compiler such as GCC and MS Visual C++. Run mex -setup if necessary. We found trouble with MATLAB's built-in lcc to link with Gurobi's library.

If you use Gurobi 2, please uncomment Line 20 of gurobi_mex.c because GRB_SUBOPTIMAL was introduced in Gurobi 3.

Step 2. Compiling Gurobi Mex

Step 2a. Windows
mex -O -I"<gurobi include path>" gurobi_mex.c "<gurobi C library file>" "<MATLAB libut.lib>"

For 64-bit MATLAB, please add option "-largeArrayDims".

Example with Gurobi 3.00, MSVC2008, MATLAB 2009B, and 32-bit Windows

mex -O -I"C:\Gurobi300\win32\include" gurobi_mex.c "C:\Gurobi300\win32\lib\gurobi30.lib" "C:\Program Files\MATLAB\R2009b\extern\lib\win32\microsoft\libut.lib"
Missing libut.lib?

Ctrl-C detection requires libut.lib. If it is not found under your copy of MATLAB, you can download one for 32-bit Windows and 64-bit Windows (courtesy of Imre Polik).

Alternatively, libut.lib can be manually generated by creating a .def text file including the following five lines

LIBRARY libut.dll
EXPORTS
utIsInterruptPending
utSetInterruptPending
[empty line]

and then calling lib.exe (included in MSVC) like

"C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\lib" /def:libut.def /out:libut.lib /machine:x86

where /machine:x86 should be replaced by /machine:x64 for 64-bit Windows.

Step 2b. Linux/Unix
mex -O -I"<gurobi include path>" gurobi_mex.c -L"<gurobi lib path>" -l<gurobi C library file> -lut

For 64-bit MATLAB, please add option "-largeArrayDims".

Example with Gurobi 3.00, GCC, MATLAB 2009B, and 64-bit Linux

mex -O -I"/opt/gurobi300/linux64/include" gurobi_mex.c -L"/opt/gurobi300/linux64/lib" -lgurobi30 -lut -largeArrayDims

Tested platforms

  • 64-bit Ubuntu Linux 9.10, 64-bit MATLAB, and gcc.
  • 32-bit Windows, 32-bit MATLAB, and gcc (part of free Mingw/GnuMex).
  • 32-bit Windows, 32-bit MATLAB, and MSVC 2008 SP1 (the express Edition is free).
  • 64-bit Windows, 64-bit MATLAB, and MSVC 2008 SP1 (the express Edition is free). Courtesy of Imre Polik.

For 64-bit MATLAB, Jon Dattorro suggests Microsoft Platform SDK and a bug fix for the linker.

Model

 min/max  c'x

 subject to  
  Ax  [>= / <= / =]  b,  
  lb <= x <= ub,
  SOS constraints,
  x(i) is [continuous / binary / integer / semi-continuous / semi-integer].

Syntax

x = gurobi_mex(c, objtype, A, b, contypes, lb, ub, vartypes);
x = gurobi_mex(c, objtype, A, b, contypes, lb, ub, vartypes, options);
[x,val] = gurobi_mex(...);
[x,val,flag] = gurobi_mex(...);
[x,val,flag,output] = gurobi_mex(...);
[x,val,flag,output,lambda] = gurobi_mex(...);

Input Description

  • c: objective coefficient vector, double type.
[] (empty array) means uniformly 0 coefficients, and scalar means all coefficients equal to scalar.
  • objtype: 1 (minimization) or -1 (maximization).
  • A: constraint coefficient matrix, double type, sparse.
  • b: constraint right-hand side vector, double type.
Gurobi takes a dense vector for this input. If a sparse vector is specified, it will be converted to full by Gurobi Mex.
  • contypes: constraint types. Char array of '>', '<', '='.
Warning: '>=' specifies two constraints, not one.
Example: '>><=' specifies four constraints. The first two constraints have greater or equal to signs, the third has less than or equal to sign, and the last is an equality constraint.
If a single character is specified, all constraints have the corresponding type uniformly.
  • lb: variable lower bound, double type, either scalar or vector.
[] (empty array) means 0 lower bound. -inf means no lower bound. If a scalar is specified, it will be the uniform lower bound for all variables.
  • ub: variable upper bound, double type, either scalar or vector.
[] (empty array) means no (or infinity) upper bound. If a scalar is specified, it will be the uniform upper bound for all variables.
  • vartypes: variable types, char array of 'C', 'B', 'I', 'S', 'N'. 'C' for continuous; 'B' for binary; 'I' for integer; 'S' for semi-continuous; 'N' for semi-integer. [] (empty array) means all variables are continuous.
Example: 'CCCCC' specifies five continuous variables.
Note that semi-continuous variables are variables that must take a value between their minimum and maximum or zero. Semi-integer variables are similarly defined.
If a single character is specified, all variables will be signed to the corresponding type uniformly.
  • options: optional structure that may contain one or more of the following fields:
    (see Gurobi's parameter help for their allowed values. Also, see examples below.)
    • opts.SOS.weights and opts.SOS.types: See here.
    • options.IterationLimit:
    • options.FeasibilityTol:
    • options.IntFeasTol:
    • options.OptimalityTol:
    • options.MIPGap:
    • options.LPMethod:
    • options.Presolve:
    • options.PrePasses:
    • options.TimeLimit:
    • options.Threads:
    • options.TrapCtrlC: true (trap Ctrl-C) or false (not trap Ctrl-C).
    • options.DisplayInterval: Gurobi's Callback screen output interval.   0 means no Gurobi message.
    • options.Display: Gurobi Mex's screen output level. 0 for no output; 1 for error only; 2 (default) for normal output. For complete silence, both DisplayInterval and Display need to be set to 0.
    • options.LogFile: char array of the name of log file.  options.UseLogfile is no longer used.
    • options.WriteToFile: char array of the name of the file to which optimization data is written. See Gurobi C-Reference entry GRBwrite for supported formats. This option helps one verify whether the model is correctly passed to Gurobi.

Output Description

  • x: primal solution vector; empty if Gurobi encounters errors or stops early (in this case, check output flag).
  • val: optimal objective value; empty if Gurobi encounters errors or stops early.
  • flag: value meanings:
    • 1 for not started
    • 2 for optimal
    • 3 for infeasible
    • 4 for infeasible or unbounded
    • 5 for unbounded
    • 6 for objective worse than user-specified cutoff
    • 7 for reaching iteration limit
    • 8 for reaching node limit
    • 9 for reaching time limit
    • 10 for reaching solution limit
    • 11 for user interruption
    • 12 for numerical difficulties
    • 13 for suboptimal solution (Gurobi 3 and later)
  • output: structure contains the following fields
    • output.IterCount: number of Simplex iterations
    • output.Runtime: running time in seconds
    • output.ErrorMsg: contains Gurobi error message, if any
  • lambda: Lagrange multipliers. Because solving MIPs gives no such output, do not ask for this output for MIPs.



SOS Constraints

SOS stands for Special Ordered Sets. opts.SOS.weights is a sparse matrix describing the constraint weights, and opts.SOS.types a 1D array of type int32 or int64 (depending on your system) specifying the constraint types. In the following example, there are 4 variables and 3 SOS constraints:

SOS1: x1 = 0 or x2 = 0
SOS1: x1 = 0 or x3 = 0
SOS2: (x1, x3, x2, x4)

The corresponding code is

 opts.SOS.weights = sparse([
  1 1 1; 
  2 0 3; 
  0 2 2; 
  0 0 4]);
 opts.SOS.types = int32([1 1 2]);

The ith column of opts.SOS.weights specifies the weights (i.e., orders) of the variables in the ith SOS constraint.


How to pass a parameter from MATLAB to Gurobi?

If this mex program does not support a parameter you want to pass from MATLAB to Gurobi, you can DIY very easily. Suppose that you want to set the Gurobi parameter Heuristics in MATLAB. From the parameter list, we find the type of Heuristics is double. Because the parameter TimeLimit has the same type and it is supported by this mex program, we can copy the code for TimeLimit (Lines 356 - 368), replace TimeLimit by Heuristics, and paste it at Line 510, right before the check of unrecognized input option fields. We compare the copied and inserted lines below where the differences are italicized:

       /* Option TimeLimit */
       field_n = mxGetFieldNumber(IN_OPTS, "TimeLimit");
       if (field_n != -1) {
           field = mxGetFieldByNumber(IN_OPTS,0,field_n);
           bOpts[field_n] = true;
           if (!mxIsDouble(field) || mxIsComplex(field) || mxIsEmpty(field)) {
                mexPrintf("Option TimeLimit must be real positive double (0 to inf).");
                goto QUIT;
           }
           error = GRBsetdblparam(env, "TimeLimit", mxGetScalar(field));
           if (error) goto QUIT;
       }
       /* Option Heuristics */
       field_n = mxGetFieldNumber(IN_OPTS, "Heuristics");
       if (field_n != -1) {
           field = mxGetFieldByNumber(IN_OPTS,0,field_n);
           bOpts[field_n] = true;
           if (!mxIsDouble(field) || mxIsComplex(field) || mxIsEmpty(field)) {
                mexPrintf("Option Heuristics must real double (0 through 1).");
                goto QUIT;
           }
           error = GRBsetdblparam(env, "Heuristics", mxGetScalar(field));
           if (error) goto QUIT;
       }

Note that you find an existing parameter of the same type.

After compiling, the modified mex will support opts.Heuristics.

Callbacks

Callbacks are useful to obtain the progress of Gurobi (e.g., by calling GRBcbget) and to modify its behavior during runtime (e.g., by calling GRBcbcut and GRBcbsolution).

Gurobi Mex implements a callback function mycallback to obtain Gurobi's progress messages and print them on the MATLAB screen. The print frequency is set in options.DisplayInterval (in seconds). The same function is also used to detect user input Ctrl-C.

Information for Gurobi callbacks can be found here in Gurobi's help. An example can be found here.

Four Examples

Example 1. Linear programming

This example is borrowed from MATLAB's linprog help.

Problem:

 min –5 x1 – 4 x2 –6 x3,

 subject to
  x1 – x2 + x3 ≤ 20
  3 x1 + 2 x2 + 4 x3 ≤ 42
  3 x1 + 2 x2 ≤ 30
  0 ≤ x1, 0 ≤ x2, 0 ≤ x3.

MATLAB code:

 c = [-5; -4; -6];
 objtype = 1;
 A =  sparse([1 -1  1; 3  2  4; 3  2  0]);
 b = [20; 42; 30];
 lb = zeros(3,1);           % same as lb = [];
 ub = [];
 contypes = '<<<';
 vtypes = [];               % same as vtypes = 'CCC'; [] means 'C...C'

 clear opts
 opts.IterationLimit = 20;
 opts.FeasibilityTol = 1e-6;
 opts.IntFeasTol = 1e-5;
 opts.OptimalityTol = 1e-6;
 opts.LPMethod = 1;         % 0 - primal, 1 - dual
 opts.Presolve = -1;        % -1 - auto, 0 - no, 1 - conserv, 2 - aggressive
 opts.Display = 1;
 opts.LogFile = 'test_gurobi_mex_LP.log';     % optional
 opts.WriteToFile = 'test_gurobi_mex_LP.mps'; % optional; it can cause a long delay if problem is large

 [x,val,exitflag,output,lambda] = gurobi_mex(c,objtype,A,b,contypes,lb,ub,vtypes,opts);

Results:

 x' = 
    0 15 3

 val = 
    -78

 exitflag =
    2

 output =
    IterCount: 2
      Runtime: 0
     ErrorMsg: []

 lambda' =
    0   -1.5000   -0.5000

Log file: test_gurobi_mex_LP.log. MPS file: test_gurobi_mex_LP.mps.

Example 2. Integer programming

This example is borrowed from mip1_c.c of Gurobi 2.0.

Problem:

 max  x + y + 2z,

 subject to
  x + 2 y + 3 z <= 4
  x +   y       >= 1
  x, y, z binary.

MATLAB code:

 c = [1; 1; 2];
 objtype = -1;              % 1 for minimize, -1 for maximize
 A =  sparse([1 2 3; 1 1 0]);
 b = [4; 1];
 lb = [];
 ub = [];
 contypes = '<>';
 vtypes = 'BBB';

 clear opts
 opts.IterationLimit = 20;
 opts.FeasibilityTol = 1e-6;
 opts.IntFeasTol = 1e-5;
 opts.OptimalityTol = 1e-6;
 opts.LPMethod = 1;         % 0 - primal, 1 - dual
 opts.Presolve = -1;        % -1 - auto, 0 - no, 1 - conserv, 2 - aggressive
 opts.Display = 1;
 opts.LogFile = 'test_gurobi_mex_MIP.log';
 opts.WriteToFile = 'test_gurobi_mex_MIP.mps';  % this option can cause a long delay if problem is large

 [x,val,exitflag,output] = gurobi_mex(c,objtype,A,b,contypes,lb,ub,vtypes,opts);

Gurobi does not give lambda (Pi, or Lagrange multipliers) for MIPs, unless model fix is called.

Results:

 disp('Solution:');disp(x')
 disp('Optimal obj value:');disp(val)
 disp('Exit flag:');disp(exitflag)
 disp('Optimization info:');disp(output)

 Solution:
     1     0     1

 Optimal obj value:
     3

 Exit flag:
     2

 Optimization info:
    IterCount: 0
      Runtime: 0
     ErrorMsg: []

Log file: test_gurobi_mex_MIP.log. MPS file: test_gurobi_mex_MIP.mps.

Example 3. Feasibility test

Problem:

Find a solution or report infeasibility of

  5 x1 + 4 x2        + 5 x4 >= -21
  5 x1 + 3 x2 + 1 x3 + 4 x4  = -14
  3 x1 + 5 x2 + 2 x3 - 5 x4  =  11
  x1,x2,x3,x4 >= 0.

MATLAB code:

 c = [];                    % use [] or 0 for null objective
 objtype = -1;              % 1 for minimize, -1 for maximize
 A =  sparse([5 4 0 5; 5 3 1 4; 3 5 2 -5]);
 b = [-21; -14; 11];        
 lb = [];                   % stands for 0 lower bound uniformly 
 ub = [];                   % stands for inf upper bound uniformly 
 contypes = '>==';
 vtypes = [];               % same as vtypes = 'CCCC'

 clear opts
 opts.FeasibilityTol = 1e-6;
 opts.Presolve = -1;        % -1 - auto, 0 - no, 1 - conserv, 2 - aggressive
 opts.Display = 1;
 opts.LogFile = 'test_gurobi_mex_Feasibility.log';
 opts.WriteToFile = 'test_gurobi_mex_Feasibility.mps';  % this option can cause a long delay if problem is large

 [x,val,exitflag,output] = gurobi_mex(c,objtype,A,b,contypes,lb,ub,vtypes,opts);

Results:

 disp('Solution:');disp(x')
 disp('Optimal obj value:');disp(val)
 disp('Exit flag:');disp(exitflag)

 Model is infeasible. No solution will be returned.

 Solution:
 Optimal obj value:
 Exit flag:
     3

Log file: test_gurobi_mex_Feasibility.log. MPS file: test_gurobi_mex_Feasibility.mps.

Example 4. SOS constraint test

Problem:

min –3 x1 – 1 x2 – 1 x3,

subject to
  x1 + x2 + x3 <= 2,
  0 <= x1 <= 1, 0 <= x2 <= 1, 0 <= x3 <= 2,
  SOS type 1: x1 = 0 or x2 = 0,
  SOS type 1: x1 = 0 or x3 = 0.

MATLAB code:

 c = [-3; -1; -1];
 objtype = 1;
 A =  sparse([1 1 1]);
 b = 2;
 lb = []; % means 0 lower bound
 ub = [1 1 2];
 contypes = '<';
 vtypes = []; % same as vtypes = 'CCC'
 sos.weights = sparse([1 1; 2 0; 0 2]);
 sos.types = int32([1 1]);   % Both the SOS constraints are of type 1

 clear opts
 opts.FeasibilityTol = 1e-6;
 opts.Presolve = -1;        % -1 - auto, 0 - no, 1 - conserv, 2 - aggressive
 opts.Display = 1;
 opts.LogFile = 'test_gurobi_mex_Feasibility.log';
 opts.WriteToFile = 'test_gurobi_mex_Feasibility.mps';

 [x,val,exitflag,output] = gurobi_mex(c,objtype,A,b,contypes,lb,ub,vtypes,opts);

Results:

 Optimal solution found (tolerance 1.00e-04)
 Best objective -3.0000000000e+00, best bound -3.0000000000e+00, gap 0.0%
 
 Solution:
     1     0     0

Log file: test_gurobi_mex_SOS.log. MPS file: test_gurobi_mex_SOS.mps.


Example 5. Compressive sensing

See example m-file test_gurobi_mex_CS.m.

Feedback

I would be delighted to hear from you if you find Gurobi Mex useful, or if you have any suggestions, contributions, or bug reports. Please send these to Wotao Yin (wotao.yin AT rice.edu)

How to cite

Wotao Yin. Gurobi Mex: A MATLAB interface for Gurobi, URL: http://www.caam.rice.edu/~wy1/gurobi_mex, 2009-2010.

License

Creative Commons Attribution-Share Alike 3.0 United States License. Allow commercial use of this work. Permit others to copy, distribute, display, and perform the work, including for commercial purposes. Allow modification, as long as others share alike. Permit others to distribute derivative works only under the same license or one compatible with the one that governs the licensor's work.

Personal tools