miqps_gurobi

miqps_gurobi(H, c, A, l, u, xmin, xmax, x0, vtype, opt)

miqps_gurobi() - Mixed Integer Quadratic Program Solver based on GUROBI.

[X, F, EXITFLAG, OUTPUT, LAMBDA] = ...
    MIQPS_GUROBI(H, C, A, L, U, XMIN, XMAX, X0, VTYPE, OPT)
[X, F, EXITFLAG, OUTPUT, LAMBDA] = MIQPS_GUROBI(PROBLEM)
A wrapper function providing a standardized interface for using
GUROBI to solve the following MILP/MIQP (mixed integer linear
programming/mixed integer quadratic programming) problem:

    min 1/2 X'*H*X + C'*X
     X

subject to

    L <= A*X <= U       (linear constraints)
    XMIN <= X <= XMAX   (variable bounds)

Inputs (all optional except H, C, A and L):
    H : matrix (possibly sparse) of quadratic cost coefficients
    C : vector of linear cost coefficients
    A, L, U : define the optional linear constraints. Default
        values for the elements of L and U are -Inf and Inf,
        respectively.
    XMIN, XMAX : optional lower and upper bounds on the
        X variables, defaults are -Inf and Inf, respectively.
    X0 : optional starting value of optimization vector X
    VTYPE : character string of length NX (number of elements in X),
            or 1 (value applies to all variables in x),
            allowed values are 'C' (continuous), 'B' (binary),
            'I' (integer), 'S' (semi-continuous), or 'N' (semi-integer).
    OPT : optional options structure with the following fields,
        all of which are also optional (default values shown in
        parentheses)
        verbose (0) - controls level of progress output displayed
            0 = no progress output
            1 = some progress output
            2 = verbose progress output
            3 = even more verbose progress output
        skip_prices (0) - flag that specifies whether or not to
            skip the price computation stage, in which the problem
            is re-solved for only the continuous variables, with all
            others being constrained to their solved values
        price_stage_warn_tol (1e-7) - tolerance on the objective fcn
            value and primal variable relative match required to avoid
            mis-match warning message
        grb_opt - options struct for GUROBI, value in verbose
                overrides these options
    PROBLEM : The inputs can alternatively be supplied in a single
        PROBLEM struct with fields corresponding to the input arguments
        described above: H, c, A, l, u, xmin, xmax, x0, vtype, opt

Outputs:
    X : solution vector
    F : final objective function value
    EXITFLAG : GUROBI exit flag
        1 = converged
        0 or negative values = negative of GUROBI exit flag
        (see GUROBI documentation for details)
    OUTPUT : GUROBI output struct
        (see GUROBI documentation for details)
    LAMBDA : struct containing the Langrange and Kuhn-Tucker
        multipliers on the constraints, with fields:
        mu_l - lower (left-hand) limit on linear constraints
        mu_u - upper (right-hand) limit on linear constraints
        lower - lower bound on optimization variables
        upper - upper bound on optimization variables

Note the calling syntax is almost identical to that of QUADPROG
from MathWorks' Optimization Toolbox. The main difference is that
the linear constraints are specified with A, L, U instead of
A, B, Aeq, Beq.

Calling syntax options:
    [x, f, exitflag, output, lambda] = ...
        miqps_gurobi(H, c, A, l, u, xmin, xmax, x0, vtype, opt)

    x = miqps_gurobi(H, c, A, l, u)
    x = miqps_gurobi(H, c, A, l, u, xmin, xmax)
    x = miqps_gurobi(H, c, A, l, u, xmin, xmax, x0)
    x = miqps_gurobi(H, c, A, l, u, xmin, xmax, x0, vtype)
    x = miqps_gurobi(H, c, A, l, u, xmin, xmax, x0, vtype, opt)
    x = miqps_gurobi(problem), where problem is a struct with fields:
                    H, c, A, l, u, xmin, xmax, x0, vtype, opt
                    all fields except 'c', 'A' and 'l' or 'u' are optional
    x = miqps_gurobi(...)
    [x, f] = miqps_gurobi(...)
    [x, f, exitflag] = miqps_gurobi(...)
    [x, f, exitflag, output] = miqps_gurobi(...)
    [x, f, exitflag, output, lambda] = miqps_gurobi(...)


Example: (problem from from https://v8doc.sas.com/sashtml/iml/chap8/sect12.htm)
    H = [   1003.1  4.3     6.3     5.9;
            4.3     2.2     2.1     3.9;
            6.3     2.1     3.5     4.8;
            5.9     3.9     4.8     10  ];
    c = zeros(4,1);
    A = [   1       1       1       1;
            0.17    0.11    0.10    0.18    ];
    l = [1; 0.10];
    u = [1; Inf];
    xmin = zeros(4,1);
    x0 = [1; 0; 0; 1];
    opt = struct('verbose', 2);
    [x, f, s, out, lambda] = miqps_gurobi(H, c, A, l, u, xmin, [], x0, vtype, opt);

See also miqps_master(), gurobi.