 # Starting Point for IPOPT

## What is a Starting Point?

In general, given a point, an iteration of an optimisation algorithm will consist of two steps:

1. check if the current point is optimal, and, if not,
2. use the information provided by that point to generate a new one that is closer to the optimal solution.

Then, to start the algorithm it is necessary to provide an initial/starting point. Of course, the closer to an optimal solution the initial point is, the more likely it is that the algorithm will find an optimal point quickly. Therefore, the selection of the starting point plays an important role in the optimisation process.

## Putting this into Practice

In this section, we describe the different options that Octeract Engine uses to generate starting points when IPOPT is called to solve a problem.

Consider the optimisation problem:
\begin{equation} \begin{aligned} \min_{x \in \mathbb{R}^n} & f(x)\\ \text{s.t. } & g_j(x) = 0, \text{ } j=1,\dots,m \\ & l_i \leq x_i \leq u_i, \text{ } i = 1,\dots,n. \end{aligned} \end{equation}
IPOPT requires an initial point $$(x^0, \lambda^0, z_l^0, z_u^0) \in \mathbb{R}^{n \times m \times n\times n}$$, where $$x^0$$ is the initial guess for the (primal) variables in the problem above, and $$\lambda^0$$, $$z_l^0$$ and $$z_u^0$$ are the starting points corresponding to the dual variables for the constraints, lower and upper bounds respectively.

Currently, the strategy for the initial dual variables is unique: set the vector $$\lambda^0$$ equal to zero, and the vectors $$z_l^0$$ and $$z_u^0$$ equal to one. On the other hand, Octeract Engine offers 5 strategies to set the initial primal point $$x^0$$. We will assume that if a variable $$x_i$$ does not have a lower bound then $$l_i= -\infty$$ (similarly $$u_i = \infty$$ if $$x_i$$ is unbounded above).

1. CONSTANT_VALUE_ONE
Sets $$x_i^0$$ to the closest number to 1 in the range of the variable.

2. VARIABLE_MIN_POINT
Sets $$x_i^0$$ to $$l_i$$ or to the closest number to 1 in the range of the variable if $$l_i = -\infty$$.

3. VARIABLE_MAX_POINT
Sets $$x_i^0$$ to $$u_i$$ or to the closest number to 1 in the range of the variable if $$u_i = \infty$$.

4. VARIABLE_MID_POINT
Sets $$x_i^0$$ to $$\frac{l_i+u_i}{2}$$ if both $$l_i$$ and $$u_i$$ are finite, otherwise it sets $$x_i^0$$ according to the ‘Constant’ strategy.

5. CUSTOM_CONSTANT_VALUE
Sets $$x_i^0$$ to the closest number assigned to the optionIPOPT_INITIAL_VALUE in the range of the variable. Note that certain values of IPOPT_INITIAL_VALUE may be mathematically inappropriate (e.g., division by zero).