I'm coding an iterative algorithm of constrained continuous optimisation. An augmented Lagrangian algorithm (outer) calls a bound-constrained L-BFGS-B algorithm (inner), which calls a line search algorithm. Optimisation problems have between 1 and 10,000 bound-constrained variables and 100–200 nonlinear constraints.
The program outputs a solution vector (if found), Lagrangian multipliers and termination reasons. Also, the output is a list of iterates, objective values and possibly Lagrangian multipliers per each inner and outer iteration.
For problematic cases, I'd like to provide diagnostics info: warnings, numerical issues (matrix ill-conditioning,
NaNs, etc.) and so on.
I'm using Scala to adapt some algorithms from the Breeze library, and also add a Lagrangian algorithm. Some algorithms in that library have logging statements everywhere, whereas others have very little logging.
- What information is normally logged and what is output in numerical optimisation algorithms?
- How do I decide between logging vs outputting? Obviously, there's a trade-off between outputs complexity and the "intrusiveness" of logging.
- Will it make sense creating lean algorithm classes with diagnostics sub-classes containing logging?
Other advice, e.g., design tips, references and open-source code examples, are very welcome too.