3. TutorialΒΆ

  1. Import the conv_opt package:

    import conv_opt
  2. Create a model and, optionally, name the model:

    model = conv_opt.Model(name='model')

    The default name is None.

  3. Create variables; optionally set their names, types, and upper and lower bounds; and add them to models:

    var_1 = conv_opt.Variable(name='var_1', type=conv_opt.VariableType.continuous, lower_bound=0, upper_bound=1)
    var_2 = conv_opt.Variable(name='var_2', type=conv_opt.VariableType.continuous, lower_bound=0, upper_bound=1)

    The default name is None.

    The type argument must be one of the following values. The default type is continuous.

    • conv_opt.VariableType.binary
    • conv_opt.VariableType.integer
    • conv_opt.VariableType.continuous
    • conv_opt.VariableType.semi_integer
    • conv_opt.VariableType.semi_continuous
    • conv_opt.VariableType.partially_integer

    The default upper and lower bounds are None.

  4. Set the objective expression and direction:

    model.objective_terms = [
        conv_opt.LinearTerm(var_1, 1.),
        conv_opt.QuadraticTerm(var_2, var_2, 1.),
    model.objective_direction = conv_opt.ObjectiveDirection.maximize

    objective_terms should be a list of linear (conv_opt.LinearTerm) and quadratic terms (conv_opt.QuadraticTerm). The arguments to the constructors of these class are the variables involved in the term and coefficient for the term.

    objective_direction can be either of following values. The default direction is minimize.

    • conv_opt.ObjectiveDirection.maximize
    • conv_opt.ObjectiveDirection.minimize
  5. Create constraints; optionally set their names and upper and lower bounds; and add them to models:

    contraint_1 = conv_opt.Constraint([
        conv_opt.LinearTerm(var_1, 1),
        conv_opt.LinearTerm(var_2, -1),
    ], name='contraint_1', upper_bound=0, lower_bound=0)

    The first argument should be a list of linear terms.

    The default name and upper and lower bounds are None.

  6. Configure the options for solving the model:

    options = conv_opt.SolveOptions(solver=conv_opt.Solver.cplex, presolve=Presolve.off, verbosity=False)

    The solver argument allows you to select a specific solver. The argument must be one of the following values. The default solver is GLPK.

    • conv_opt.Solver.cbc
    • conv_opt.Solver.cplex
    • conv_opt.Solver.cvxopt
    • conv_opt.Solver.glpk
    • conv_opt.Solver.gurobi
    • conv_opt.Solver.minos
    • conv_opt.Solver.mosek
    • conv_opt.Solver.quadprog
    • conv_opt.Solver.scipy
    • conv_opt.Solver.soplex
    • conv_opt.Solver.xpress

    The presolve aregument must be one of the following values. The default value is off.

    • conv_opt.Presolve.auto
    • conv_opt.Presolve.on
    • conv_opt.Presolve.off

    Please see the API documentation for information about additional options.

  7. Solve the model:

    result = model.solve(options)
    if result.status_code != conv_opt.StatusCode.optimal:
        raise Exception(result.status_message)
    value = result.value
    primals = result.primals

    The result will be an instance of conv_opt.Result. The attributes of this class include:

    • status_code
    • status_message
    • value
    • primals
    • reduced_costs
    • duals

    status_code will be an instance of the conv_opt.StatusCode enumerated type.

  8. Get diagnostic information about the model:

    stats = model.get_stats()
  9. Convert the model to the lower level API of one of the solvers:

    options = conv_opt.SolveOptions(solver=conv_opt.Solver.cplex)
    cplex_model = model.convert(options)
  10. Export the model to a file:


    conv_opt supports the following extensions:

    • alp
    • cbf
    • dpe: dual perturbed model
    • dua: dual
    • jtask: Jtask format
    • lp
    • mps
    • opf
    • ppe: perturbed model
    • rew: model with generic names in mps format
    • rlp: model with generic names in lp format
    • sav
    • task: Task format
    • xml: OSiL