All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.19.0 - 2026-04-17
- Support the new Pinocchio 4 release (#390)
- manifolds: add
PinocchioLieGroup::lieGroup()getter, expose to Python
- Deprecate
<aligator/modelling/dynamics/context.hpp>(#390) - pixi: require Pinocchio>=3.9.0 (#390)
- pixi: allow Eigen3>=5.0.0 (#390)
- CMake: require Eigen3 between 3.4.0 and major version 5 (#390)
- Update finite difference helper to support explicit dynamics, replacing the obsolete implicit-only implementation. (#392)
- Fix
SolverProxDDP::tryLinearStep()temporary control update buffer allocation to usenu_maxinstead ofndx_max. (#397)
0.18.0 - 2026-01-27
- Add Ubuntu 22.04 support with the
BUILD_WITH_UBUNTU_22_COMPATIBILITYcmake option (#383)
- Fixed the missing minus signs in the
LogResidualCost(#382) - Fix build without pinocchio dependency (#384)
- Change uses of future-deprecated macro
PINOCCHIO_STD_VECTOR_WITH_EIGEN_ALLOCATORtoPINOCCHIO_ALIGNED_STD_VECTOR(#386)
0.17.1 - 2025-12-01
0.17.0 - 2025-11-21
- pixi: add pixi-build (preview support) (#369)
- gar/blk-matrix : added
BlkMatrix::isApprox()(#366) - core : added mimalloc-based memory resource (#366)
- modelling/costs : add getter and setter for cost term weights (#359)
- Support for Pinocchio 4 (#361)
- Added a hash function
ExtendedStringHashfor string types (e.g.std::string) which supports transparent/heterogeneous lookup in compatible hash maps (e.g.boost::unordered_map) using types other than key type e.g.std::string_view(#364) - Added support in Python bindings for
std::string_view(converting to and from Python'sstrbuilt-in type) (#364) - Added TwoFrameEquality residual to enforce relative pose equality between two Pinocchio frames (#378)
- Change several classes (including solvers and contact-related modelling) to take
std::string_viewwhere possible (#364) - core : have
replaceStageCircular()return ejected knot (#376) - python : do not import utils.plotting automatically (#369)
- ci: display ccache statistics (#369)
- pixi: update environments (#369)
- Move header
<aligator/gar/blk-matrix.hpp>to<aligator/core/blk-matrix> - solver-proxddp : make new
mimallocmemory resource the allocator resource for ProxDDP solver (#367) - tests/gar/block-matrix.cpp : test against BunchKaufman factorization
- move headers
allocator.hppandarena-matrix.hpptoaligator/coredir (#362) - python: aligator now requires eigenpy version 3.10.3 at least
- python: remove eigenpy version checks
- python: improve
CostStack.getComponent()error message - tests/python: more comprehensive test for
aligator.CostStack(#359) - modelling/multibody : merge header
context.hppintofwd.hpp
- Fixed pixi build and Tracy integration issues: add ninja dependency and update configs (#375)
- Fixed
num_threadsarg missing in call toproblem.evaluate()inSolverProxDDP::tryLinearStep()(#373)
- modelling/multibody : remove txx files, remove
context.hpp - core : remove
callback-base.txx, removeconstraint.txx - core : remove deprecated class template
StageConstraintTpl, and its Python bindings
0.16.0 - 2025-10-15
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.
- 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)
- 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)
- 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
- 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
- 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
0.15.0 - 2025-05-23
0.14.1 - 2025-05-23
- Expose vs in ProxDDP result
0.14.0 - 2025-05-07
This release brings many major changes to aligator.
We officially drop support for Pinocchio 2. As we start looking forward to Pinocchio 4, aligator will require at least Pinocchio 3.4. If you need support for a lower version of Pinocchio 3, please contact us and suggest patches.
Furthermore, aligator will no longer depend on the proxsuite-nlp library, which will be archived in the near future - all functionality (manifolds, constraints) has been merged into aligator itself.
- Add allocator-aware class
ManagedMatrixto wrap Eigen::Map types along with allocator-managed memory. Updategarclasses to useManagedMatrix. (#313) - Add CMake macro
aligator_create_python_extension()to export (#298) - Add
LqrProblemTpl::isApprox()and helperlqrKnotsSameDim, check dimensions inLqrKnotTpl::isApprox()(#300) - Add class
aligator::polymorphic_allocatorleveraging C++17 memory resources (#243) - Add memory allocator support for
LqrKnotandLqrProblem(#243) - Add class
DenseKernelfor the stagewise-dense Riccati algo -- reworkDenseRiccatiSolverclass (#243) - Add
gar/fwd.hppheader (#301) - Add/transfer some headers from proxsuite-nlp (see #309):
- Merge parts of proxsuite-nlp (manifolds and constraints) into aligator (#309)
- Remove dependency on proxsuite-nlp.
- Make
aligator/math.hppindependent: copy code formath::check_value,math::check_scalar, structmath_types. - Change
VerboseLevelfrom a using-decl to its own enum in thealigatornamespace. - Copy
ManifoldAbstractTpland subclasses over to aligator. - Copy
ConstraintSetTpland subclasses over to aligator, change using-decl infwd.hppto a proper fwd-declaration in thealigatornamespace (#310)
control-box-function.hpp: update docstring, add deprecation dox tag (#310)- Rename
{ riccati-impl.hpp => riccati-kernel }(and associated files) (#301) - Move
HistoryCallbackTplfromaligator/helpers(subdirectory was removed) toaligator/core(#243) - Move headers
results-base,solver-util,value-function,workspace-basetoaligator/core(#243) fwd.hpp: do not include<pinocchio/config.hpp>header anymore (#243)blk-matrix.hpp: remove protected ctors, add conversion ops (#243)- Headers
aligator/gar/*.hppmerged into main library (#243) - CMake: rework declaration of examples & benchmarks (applying liberal use of
cmake_parse_arguments()) (#243) - CMake: add
bench/CMakeLists.txtto gersemi defs, apply formatting (#243) - CMake: apply compile definitions to
aligatortarget directly (reduce use of global compile definitions) (#243)
- Removed
garas a separate CMake target and shared library, merge into main library (#243) - Remove function
allocate_shared_eigen_aligned()(#243) - Officially remove support for Pinocchio 2, require Pinocchio >= 3.1 (#307)
- Remove the
ALIGATOR_PINOCCHIO_V3compile definition.
- Remove the
- Remove macro header
aligator/macros.hppand macrosALIGATOR_WITH_CPP_14,ALIGATOR_WITH_CPP_17, andALIGATOR_MAYBE_UNUSED(#309) - Remove deprecated typedef
aligator::context::CostBase(#310) - Remove header
aligator/core/linesearch.hpp(which using-decl linesearch classes from proxsuite-nlp) (#312) - Remove header
aligator/python/polymorphic-convertible.hpp(#309)
0.13.0 - 2025-04-26
- Add macro
ALIGATOR_OUT_OF_RANGE_ERRORto throwstd::out_of_rangeexceptions (#294)
- Rename
LQRKnotTpl(C++)/LqrKnot(Python) toLqrKnot(Tpl)(#283) - Rename
LQRProblemTpl(C++)/LQRProblem(Python) toLqrProblem(Tpl)(#283) - Reverse sign of StateErrorResidual (#292)
- Correct references to paper's equations (#284)
- Fix segfault in
FrameCollisionResidual, instead throwstd::runtime_error(C++,RuntimeErrorin Python) (#294)
0.12.0 - 2025-03-27
- Update for crocoddyl v3: boost -> std pointers (#278)
0.11.0 - 2025-03-17
- Only link against needed pinocchio libraries (#260)
- Use Pinocchio instantiated functions (#261)
- Link to pinocchio collision
- Some internal code now uses
TrajOptProblemTpl::initializeSolution()to initialize state-control trajectories (#274) - Fix
HistoryCallbackinit in examples (#277)
- Fixed copy of TrajOptProblem (#265)
LinesearchVariant::init()should not be called unless the step accpetance strategy is a linesearch- Fixed compilation issues with C++20 (resolving #246 and #254)
- Prevent duplication of log columns (#271)
- Add MPC test/example (#272)
- Allow customization of the initial solution, introduce initialization strategies (#274)
- Add a collision distance residual for collision pair
- Add a relaxed log-barrier cost function
- Add Nix support (#268)
0.10.0 - 2024-12-09
- Add a multibody friction cone cost (#234)
- Add a
GravityCompensationResidual, modelling$r(x,u) = Bu - G(q)$ (#235) - Add Pixi support (#240)
- Added a nonmonotone linesearch procedure (#244)
- Add enum value
StepAcceptanceStrategy::LINESEARCH_NONMONOTONE(#244)
- API BREAKING: Change enum value
StepAcceptanceStrategy::LINESEARCHtoLINESEARCH_NONMONOTONE(#244)- Add constructor argument
StepAcceptanceStrategy sa_strategy, defaults to nonmonotone
- Add constructor argument
- The minimum required version of proxsuite-nlp is now 0.10.0 (#244)
SolverProxDDP: add temporary vectors for linesearchSolverProxDDP: remove exceptions fromcomputeMultipliers(), return a bool flag- HistoryCallback: take solver instance as argument
gar: rework and move sparse matrix utilities togar/utils.hppSolverProxDDP: RenamemaxRefinementSteps_andrefinementThreshold_to snake-caseSolverProxDDP: makelinesearch_public- Change uses of
ConstraintSetBasetemplate class toConstraintSetTpl(following changes in proxsuite-nlp 0.9.0) (#223) - [gar] Throw an exception if trying to instantiate
ParallelRiccatiSolverwith num_threads smaller than 2. - [API BREAKING] Rename friction cone for centroidal into CentroidalFrictionCone (#234)
- Change the linear multibody friction cone to the true "ice cream" cone (#238)
- [gar] Rework
RiccatiSolverDenseto not use inner structFactorData - Various changes to
gartests andtest_util, addLQRKnot::isApprox()
- Default constructor for
LQRProblemTpl - Removed header
gar/fwd.hppwith forward-declarations
- Building aligator without Pinocchio support (including without Pinocchio support in the proxsuite-nlp dependency) is now supported. (#250)
0.9.0 - 2024-10-11
- [python] Added getter
getComponent()forCostStack, similar to C++ API - Templated getters
getCost<U>()andgetDynamics<U>()in the StageModel class, and anothergetDynamics<U>()for integrator classes, to get the concrete types (##205) - Add a templated getter
getConstraint<U>to ConstraintStack (#222) - python: Add helper
aligator.has_pinocchio_features()(#206) - Add a cycleProblem function that properly rotates the problem data for MPC applications (#215)
- Add a DCM cost function
- Add a cycleAppend function in Riccati solver headers to cycle the LQR solver
SolverProxDDP: add manually settable dual feasibility tolerancetarget_dual_tol_with a getter and setter (with side effects)
- All map types are now
boost::unordered_map(#203) - Separate CostFiniteDifference out of finite-difference.hpp (#212)
- Change the API of the wrench cost functions to allow 3D and 6D forces
- Separate centroidal wrench cone and multibody wrench cone costs
- Add a contact_name item to the CostMap structure
- Re-define ALM params struct internally to aligator (#219)
- SolverProxDDP: add dynamics AL parameter scaling
- Rename
has_dyn_model->hasDynModelandis_explicit->isExplicit - Add
cost(trajectory cost) column to logger TrajOptProblem: rename memberinit_condition_toinit_constraint_(fitting with ctor argument name)- python/utils: return axes instances from velocity/controls plotting helpers
- make
LinearFuntionTpl::evaluate()call more efficient (using.noalias()) HistoryCallbackTplnow stores stored data directly- Deprecate the
StageConstraintTpltemplate struct, deprecate the related typedefs - [python] Deprecate
aligator.StageConstraint, functions and methods (e.g.StageModel.addConstraint(cstr: StageConstraint)) which use it - Change formatting of exceptions, using variadic macro and type-erased implementation (#230)
The following API-BREAKING changes come from PR #229
- Separate
DynamicsModelTpland its subclasses from theStageFunctionTplclass hierarchy - Methods (
.evaluate(),.computeJacobians()) inStageFunctionTplare now binary (take only(x, u))
- Remove constraint scalers (including header
core/alm-weights.hpp) from ProxDDP algorithm (#214) - SolverProxDDP: remove solver parameter
rho_(#221) - Remove deprecated functions
ConstraintStackTpl::getDimsandStageModelTpl::dyn_model - Remove
CallbackBaseTpl::post_linesearch_call(boost::any) - Remove unused headers
clone.hppandversion.hpp
- Restore Pinocchio 3 Python tests (#206)
- Fix warnings in
multibody-constraint-fwd.{hpp, hxx}about deprecated Pinocchio types and functions (commit df04100c)
0.8.0 - 2024-09-18
- Getter
getResidual<Derived>()for composite cost functions (#198) - Getter
getComponent<Derived>()forCostStack(#199)
- Optimize a bunch of includes
- core: remove headers
proximal-penalty.hpp/proximal-penalty.hxx - Change storage of
CostStacktoboost::unordered::unordered_map, pointing to pair of cost function and weight (#199) - Change storage for
ConstraintStackto using twostd::vector<polymorphic<>>the structStageConstraintTplis now merely a convenient API shortcut for the end-user. - Remove
StageConstraintTpl::nr()(in C++ only) - Update minimum required version of eigenpy to 3.7.0
- Add tracy macros to
stage-model.hxx - Change minimum required version of proxsuite-nlp to 0.8.0
0.7.0 - 2024-09-12
- Use placement-new for
WorkspaceandResultsin solvers (FDDP and ProxDDP) - Deprecate typedef for
std::vector<T, Eigen::aligned_allocator<T>> - Deprecate function template
allocate_shared_eigen_aligned<T> - Use custom macro defined in
aligator/tracy.hppto call Tracy (#191) - Change default behaviour with regards to Tracy (
DOWNLOAD_TRACYis set toOFF) - Upgrade minimum required version of proxsuite-nlp to 0.7.0
- Add compatibility with jrl-cmakemodules workspace (#172)
0.6.1 - 2024-05-27
- Add force and wrench cone costs
- Add centroidal momentum cost
- Do not compile or use
gar::ParallelRiccatiSolver<>when OpenMP support is disabled (#160) - Allow to build with fmt 11 (#173)
0.6.0 - 2024-05-23
- Added constrained LQR example (#145)
- Adds tracy as a profiling tool
- Adds a new sublibrary called
garto represent and solve time-varying linear-quadratic subproblems - Adds a parallel, block-sparse factorization for the implicit/proximal Riccati algorithm
- Integrates the CHOLMOD solver from the SuiteSparse library into
gar - Add a C++ example and benchmark of Talos walking by @edantec
- Add a
BlkMatrix<>template class for dealing with block Eigen matrices effectively - Copy the headers from boost::core::span
- Add SE2 car benchmark
bench/se2-car.cpp - Split part of
macros.hppinto new headereigen-macros.hpp, addALIGATOR_NOMALLOC_SCOPEDmacro to disable Eigen's malloc per-scope and a caching system to restore the malloc status - Add
context.hppfile foraligator/modelling/dynamics
- Standardized CMake output directories (#147)
- Split derivative computation into first- and second-order functions per stage by @fabinsch
- Changed minimum version of C++ to C++17 (no longer use
boost::optionalorboost::filesystem) - SolverProxDDP now uses linear solvers provided by
gar(API breaking), addLQSolverChoiceenum - Minimum version of eigenpy upgraded to 3.4 (for supporting
std::unique_ptr) - Move cost functions to
aligator/modelling/costs - Deprecate
ControlBoxFunction - Remove
LDLTChoiceenum (API breaking) - Refactor computation of problem Lagrangian's gradient
- Remove
aligator/core/stage-data.hxx - StageModel/StageData now store dynamics model/data separate from other constraints, add
dynamics_datatoStageData - Rewrite the
Loggerclass (rename fromBaseLogger) using map data structures to store line formatting info + content - Merge struct ODEData into ContinousDynamicsData, rename continous-base.hpp header to continuous-dynamics-abstract
- Optimize a few includes for faster compilation:
aligator/modelling/dynamics/fwd.hppaligator/core/stage-model.hppno longer includesaligator/core/cost-abstract.hpp- Split
traj-opt-data.hppout oftraj-opt-problem.hpp
- Rename
ContinousDynamicsBasetoContinousDynamicsAbstract - Rename
CostBasetoCostAbstract - Expose
TrajOptData.init_data - Remove
LDLTChoiceenum andSolverProxDDP.ldlt_solver_choiceattribute
0.5.1 - 2024-04-24
- Fix finite difference function in python unittest (#128)
- Add kinodynamics forward scheme
- Add centroidal dynamics derivative cost to regularize the time derivative of centroidal dynamics
- Add Python example of Solo stepping in place
- Add wrench cone cost for 6D contact in centroidal dynamics
- Add a 6D contact formulation for every centroidal cost and dynamics, including kinodynamics
0.5.0 - 2024-02-13
- Add a pair filter strategy as an alternative to linesearch methods
- Add a python example of a locomotion OCP with the robot Talos
- Add two nonlinear centroidal dynamical models, where the control is respectively contact forces and their time derivative
- Add a set of cost functions to generate a centroidal problem with user-defined contacts
- Add unittests and example of typical centroidal problem
0.4.1 - 2024-01-25
- CMake: fetch submodule if not available in (#103)
- CMake: move benchmark dependency speecification in main file
- Document and simplify the LQR example
- Finish the se2-car.cpp example (#110)
- Add template instantiation for IntegratorAbstract, ExplicitIntegratorAbstract and IntegratorRK2 (#114)
- Don't output numpy matrices in
example-talos-arm
- Fix name of frame parent attribute in examples
- Export C++ definitions in CMake config file
- Fix Doxyfile python bindings directory (#110)
- Fix for eigenpy 3.3 (#121)
0.4.0 - 2023-12-22
- This is the first release of
aligator. This library is a joint effort between INRIA and LAAS-CNRS, and will be maintained and expanded in the future. Please provide constructive feedback and contribute!