# Pareto curve

The Pareto curve plays a central role in SPGL1. It is given as the lowest residual norm, as a function of $\tau$, which bounds the maximum allowable primal norm of the iterate $x$, i.e., $\|x\|_p\le\tau$.

Solving the Lasso problem for a given value of $\tau$ amounts to evaluating a point on the curve. The basis-pursuit denoise problem is more difficult: we are given $\sigma$ and need to find the value of $\tau$ where the values of the Pareto curve attains the desired value.

## Root finding

SPGL1 solves the basis-pursuit problem by solving a sequence of Lasso problems with different values of $\tau$. Given the solution of a Lasso problem, it determines the gradient of the Pareto curve at that point, which allows us to do root-finding. As an illustration, suppose we start at $\tau=0$ and solve the Lasso problem for this value (this always gives $x=0$). We then evaluate the gradient, which leaves us at the situation shown in the left plot below. We then update $\tau$ to the point where thelinear approximation to the Pareto curve intersect with the desired value of $\sigma$, indicated by the red dot. In this case this gives, say $\tau= 1.2$.

We then solve the Lasso problem with the new value of $\tau$, as shown in the right plot, and repeate the procedure until the solution has a residual norm that is sufficiently close to $\sigma$.

## Implementation

SPGL1 provides options that control the root-finding process. The most important option, options.rootfindMode, specified whether root finding is done using the primal or the dual mode, with parameter values 0 and 1 respectively.

### Primal mode

When using the primal objective, SPGL1 uses relaxed conditions to determine whether the Lasso subproblem is solved and approximates the gradient based on the primal objective. This root-finding mode can be very fast, but may result in value of $\tau$ that exceeds the minimum. As a result, this mode is useful when a quick solution is needed, or for large-scale problems where highly accurate solves of the subproblem are prohibitive. An exaggerated illustration of root-finding on the Pareto curve in the primal mode is given in the image below. The subproblem is solved approximately for $\tau=1.2$. The solution (indicated by the gray point) may be slighly above the Pareto curve, or the gradient may be too flat. This makes it possible to 'overshoot' the target and obtain a solution with a value $\tau$ that exceeds the minimum possible value.

### Dual mode

In the dual root-finding mode we apply root finding based on linear under-approximation of the Pareto curve. Provided that the initial $\tau$ is below the final value (a value of zero is always highly recommended), there is never any overestimation. As illustrated below, we use the dual objective value (indicated by the gray dot) along with a gradient to determine the next value of $\tau$. A new value for the intersection with the desired misfit level $\sigma$ is computed at every iteration and the maximum value is maintained for the next root-finding step. Root finding is initiated when the duality gap is a fraction (options.rootfindTol) of the difference between $\sigma$ and the primal objective. As the overall gap shrinks towards the solution, increasingly accurate solves are automatically enforced.