Octeract Engine is a D(MI)NLP solver that gives the global optimum in the most difficult of problems. But, as with all heroes, the Engine doesn’t pull the whole heroic stunt by itself. Other solvers are recruited to solve the different types of problems generated from breaking down a general D(MI)NLP problem. These solvers are shown in the table below along with the types of problems they solve when Octeract Engine calls for their help:

Solver | Types of problems Octeract Engine uses solver for |

OSICLP | LP |

OSICBC | LP, MILP |

CPLEX* | LP, MILP |

Gurobi* | LP, MILP |

Xpress* | LP, MILP |

IPOPT | NLP |

The user has the freedom to choose which solver the Engine will use to solve the LP and MILP problems resulting from trying to solve the original MINLP problem. Commercial solvers (marked with an asterisk above) require that the user has a valid licence for them in order for Octeract Engine to use them as subsolvers for LP and MILP problems.

To change the solver with which MILP and LP problems are handled, the user needs to write an options text file. By default, the solver will attempt to locate and read an options file octeract.opt in the current directory, but this can be overridden using the -o flag. To change the solvers used, the syntax is the following:

`LP_SOLVER`

**Type:** string**Default:** OSICLP**Available Options:** IPOPT, OSICLP, OSICBC, CPLEX, GUROBI, XPRESS

Sets the solver which will be used to solve linear problems.

```
MILP_SOLVER
```

**Type: **string**Default Value:** OSICBC**Available Options:** OSICBC, CPLEX, GUROBI, XPRESS

Sets the solver which will be used to solve mixed-integer linear problems.

Below, a brief summary for each solver is given. Scroll further if you want to learn more about them.

**OSICLP**

CLP stands for **C**oin-or** L**inear **P**rogramming and it is an open-source linear programming solver. It solves mathematical optimisation problems of the following form:

min \(c^tx\)

such that:

row_{lower_bound} \(\leq Ax \leq\) row_{upper_bound}

column_{lower_bound} \(\leq x \leq\) column_{upper_bound}

CLP is the default solver used by the Engine to solve the LP subproblems

**OSICBC**

CBC stands for **C**oin-or **B**ranch and **C**ut and it is also an open-source solver written in C++. CBC solves linear and mixed-integer linear problems and requires an LP solver to do so. Most commonly, the LP solver used for this purpose is CLP. CBC is the default MILP solver Octeract Engine uses for the MILP problems resulting from the process of solving a MINLP to global optimality. There is a twist here, however. The version of CBC the Engine uses is a customised version of CBC that is only accessible to Octeract Engine users. CBC has been fine-tuned to work in parallel, just like Octeract Engine does.

**CPLEX**

CPLEX by IBM is one of the most well known, commercial MILP solvers. Apart from MILPs, CPLEX can handle convex (MI)QCQPs and non convex QPs, too. CPLEX can be used as the MILP solver of choice by Octeract Engine users, provided they own a licence for it.

**Gurobi**

Gurobi by Gurobi optimization is another very well known commercial MILP solver that can tackle even non-convex (MI)QCQPs. As with CPLEX, Gurobi can also be used as the MILP solver of choice by the Engine as long as the user has a licence for Gurobi.

**Xpress**

Xpress by Fico is the last of the “Big Three” commercial MILP solvers and can also handle convex MIQCQP problems. Xpress can be set to solve the MILP problems resulting from solving the MINLPs with Octeract Engine provided the user has a licence for the Xpress solver.

**Ipopt**

Ipopt stands for **I**nterior **P**oint **OPT**imizer and is an open source software package written in C++. It solves large scale nonlinear optimisation problems by finding local solutions to problems of the following form:

min \(f(x)\)

\(x ∈ R^n\)

s.t. \(g_L \leq g(x) \leq g_U\)

\(x_L \leq x \leq x_U\)

where \(f(x): R^n \) –> \(R\) is the objective function, and \(g(x): R^n\) –> \(R^m\) are the constraint functions. Both \(f(x)\) and \(g(x)\) can be nonlinear and nonconvex but have to be twice continuously differentiable. The constraints have as lower bound the vector \(g_L\) and as upper bound the vector \(g_U\). Vectors \(x_L\) and \(x_U\) denote the bounds for variables \(x\). Ipopt is currently the only solver available in Octeract Engine to find local solutions to the NLP sub-problems resulting from the Engine’s attempts to solve a non-linear optimisation problem.