High-level interfaces

While the internal structure of a manifold, an objective wrapped in a problem and a state allows for modular access, one should have an “easy access” that handles several things (semi-) automatically.

These are referred to as the high-level interfaces throughout this documentation. For example gradient_descent(M, f, grad_f; kwargs...) builds the just-mentioned internal structures based on providing a manifold M, a cost function f and a gradient grad_f.

By default these return the computed minimizer of the objective.

These interfaces are also unified to accept

  • a callbacks= keyword to attach callback functions at specific points during a solver run
  • a debug= keyword to add debug output
  • an evaluation= keyword to specify whether, for example, the gradient can be computed in-place, see the function section.
  • a record= keyword to record elements
  • a return_objective= keyword to return the objective in addition to the minimizer or state – for example to access function call statistics.
  • a return_state= keyword to return the full solver state instead of just the minimizer, for example to access its fields afterwards
  • an objective_type= keyword to specify gradients or Hessians to be :Euclidean and automatically convert them to Riemannian ones

Additionally there are several keyword arguments, for example for solvers with sub solvers sub_problem= and sub_state= to specify which solvers to use in these. These are then passed to the solver state upon construction.