# 3 Employing Linear Programming Solvers

## 3.1 The Module `LP`

The module `LP` is provided as contribution (being part of the Mozart Oz 3 distribution1) and can be accessed either by

> `declare [LP] = {Module.link ['x-oz://contrib/LP']}`

or by

> `import RI at 'x-oz://contrib/LP'`

as part of a functor definition.

`{LP.solve` `$RIs``` `+ObjFn``` `+Constrs``` `?OptSol``` `?RetVal``}`

  Invoke the LP solver. Use `LP.config` for configuring the solver.

  > VECTOR_OF(X) | ::= | tuple of X
  > | | | record of X
  > | | | list of X

  > RIs | ::= | VECTOR_OF(RI)

  > RI | ::= | float | real interval variable

  The first parameter is a vector of real-interval variables. The current bounds of the real-intervals are used as bound constraints by the LP solver. The second parameter determines the objective function:

  > ObjFn | ::= | `objfn(row:` <VECTOR_OF(float)>
  > |  | `opt: min | max)`

  The value at `opt` stands for minimize (`min`) resp. maximize (`max`). The third parameter introduces the constraints to the LP solver.

  > Constrs | ::= | VECTOR_OF(Constr)

  > Constr | ::= | `constr(row:` <VECTOR_OF(float)>
  > |  | `type: '=<' | '==' | '>="`
  > |  | `rhs:` float `)`

  The fourth parameter `OptSol` is constrained to the optimal solution. In case it is already constrained to a real-interval variable, the LP solver derives an additional constraint which makes sure that no greater (minimize) resp. smaller (maximize) solution is found. The last parameter indicates the success of the LP solvers.

  > RetVal | ::= | `optimal`
  > | | | `infeasable`
  > | | | `unbounded`
  > | | | `failure`

`{LP.config` `+put``` `+ConfigDirection``}`

  Set configuration of module `LP`. One can set `mode` and `solver`.

`{LP.config` `+get``` `?CurrentConfig``}`

  Read current configuration of module `LP`.

  > CurrentConfig | ::= | `config(avail:` <AVAIL_SOLVERS>
  > | | | `mode:` <MODES>
  > | | | `solver:` <SOLVER>`)`

  Note that <SOLVER> takes a value out of <AVAIL_SOLVERS>. The solvers available depend on your local installation. The solver LP_SOLVE (`lpsolve`) is the default solver.

  > AVAIL_SOLVERS | ::= | `lpsolve`
  > | | | `cplex_primopt`
  > | | | `cplex_dualopt`

  The solver may run in two modes:

  > MODES | ::= | `quiet`
  > | | | `verbose`

  The `verbose` mode is intended for debugging and outputs whether an optimal was found (resp. if not what was the problem) and if so the optimal solution.

1. The module `LP` is not provided on any Windows platform.