What's Changed
This release brings a major change to the ProxDDP solver, which no longer uses proximal iteration the co-state (the dynamics' Lagrange multiplies). This choice is made to increase the solver's overall performance.
The ProxDDP solver now defaults to using a linear rollout for the state-control trajectory update.
Furthermore, on a temporary basis, implicit discrete dynamics are no longer supported in the API and solvers.
One major new addition is the ArenaMatrix template class, which is a allocator-aware class which manages an Eigen matrix-like object and is compatible with Eigen operations. The design is inspired from stan-dev/math's arena_matrix class.
Fixed
- gar : fix missing move assignment operator in
LqrProblemTpl - Fix C++20 support. Fix
constevalcompilation errors related to fmt - Fix
aligator::gar::ParallelRiccatiSolvermissing from docs - Fix missing set of Pinocchio-support (cost, dynamics, etc) classes
- solver-proxddp : fix return type of
LinesearchVariant::isValid() - memory : added template class
ArenaMatrix(#348)
Changed
- gar : allow setting number of refinement iterations for condensed KKT solver
- ProxDDP solver : change default rollout type to
RolloutType::LINEAR/ROLLOUT_LINEAR - solvers/proxddp : make
Workspacean allocator-aware class - add
[[nodiscard]]attribute to several functions in:- core/manifold-base
- gar/lqr-problem
- gar/utils
- modelling/spaces/cartesian-product
- solvers/proxddp/solver-proxddp
- readme/cmake : update actually expected minimum version of eigenpy to 3.9
- solvers : make proxddp algo's Results class copyable again (in C++ and Python) (#322)
- python/visitors : also set
__copy__method on exposed class withCopyableVisitor(#322) - python : make
Resultscopyable (usingCopyableVisitor) (#322) - ProxDDP solver : remove proximal iteration/ALM over co-states
- ProxDDP solver : throw when given invalid linesearch enum value
- core/linesearches : move
LinesearchOptionsstruct out of theLinesearchtemplate class, add CTAD - Change all tests to use Catch2 instead of Boost.Test
- The Riccati algorithms now run faster after the dual-regularisation on co-states and the QR for the implicit dynamics have been removed. The algos might be less numerically accurate.
- the base interface and derived solvers no longer take the scalar argument
mudyn(dual regularisation on the costate)
- the base interface and derived solvers no longer take the scalar argument
- Several classes are now allocator-aware:
- the Riccati-based solvers in gar (
ProximalRiccatiSolver,ParallelRiccatiSolver) WorkspaceTplinaligator/solvers/proxddp
- the Riccati-based solvers in gar (
- cmake/pixi: update maximum version for fmt library to v12 included (#355)
Changes to dynamics
- Remove explicit dynamics (incl. explicit integrators) from
DynamicsModelclass hierarchy - Make
ExplicitDynamicsModelused everywhere in API (e.g.StageModelnow takes/storespolymorphic<ExplicitDynamicsModel>) - Directly store state space repr dim and actual dim (
nxandndx) inManifoldAbstractclass
Added
- gar: add CTAD for the
ParallelRiccatiSolverandProximalRiccatiSolverclasses - testing: added a test_mpc.py script to test parallel and serial mpc implementations (#331)
- modelling : added wheeled inverted pendulum dynamics (#326)
- CMake option to
BUILD_STANDALONE_PYTHON_INTERFACE(#347) - utils: add free function
forwardDynamics()(replaces previous struct) inaligator/utils/forward-dyn.hpp
Removed
- fwd.hpp : remove deprecated typedef
ODEDataTpl - gar: remove Cholmod backend (#345)
- cmake / pixi : remove Cholmod dependency (#345)
- gar: remove support for implicit dynamics in LQ solver interface
- remove member
LqrKnotTpl::E - simplify Riccati kernel algorithm
- remove member
- memory : removed template class
ManagedMatrix(#348) - removed several
.txxtemplate instantiation declaration files - third-party : remove headers related to
boost::span:boost/core/data.hpp,boost/core/make_span.hpp,boost/core/span.hpp - removed header
aligator/tags.hpp
Full Changelog: v0.15.0...v0.16.0