Software

A numerical ecosystem,
from models to methods.

Open-source C++ libraries connecting convex optimization, numerical linear algebra, control, estimation, and dynamics. Convex is the optimization core; Linalg supplies the shared numerical foundation.

Libraries and support

v0.1.0

akreon-linalg

Matrices, mathematical spaces, affine transformations, factorizations, and spectral methods for modern C++ systems.

Fixed-size dense matrices and vectors, mathematical spaces, factorizations, and spectral methods on host CPUs.

Support boundary. Sparse algorithms, CUDA device execution, and FPGA/HLS synthesis are not supported. Support and roadmap ↗

v0.1.0

akreon-control

State-space modeling, optimal and robust controller synthesis, observer design, and executable MPC, MHE, and CLF-CBF-QP examples.

State-space models, ZOH discretization, H2/H-infinity feedback and observers, polytopic formulations, optional Python bindings, and research notebooks.

Support boundary. MPC, MHE, and CLF-CBF-QP are concrete examples; general horizon assembly, constrained estimation, and barrier synthesis remain planned work. Support and roadmap ↗

Experimental / Research Preview

akreon-dynamics

Experimental numerical methods for dynamical systems, including discrete variational integration.

Discrete Euler–Lagrange methods with regression tests for pendulums and a spring-mass-damper model.

Support boundary. APIs and methods may change. Convergence and numerical failure reporting remain incomplete; no stable release is implied. Support and roadmap ↗

A model, made executable

From DCP to a numerical solution.

DCP frontend → Conic canonicalization → Primal-dual interior-point solver

The Convex consumer example minimizes x₀ + 2x₁ subject to x₀ ≥ 1, x₁ ≥ 2, and x₀ + x₁ ≤ 6. Its analytical optimum is x = [1, 2], with objective value 5.

C++ · excerpt from examples/consumer/main.cpp
// Minimize x0 + 2*x1 subject to x0 >= 1, x1 >= 2, x0 + x1 <= 6.
// The unique optimum is x = [1, 2], with objective value 5.
using Space = linalg::Matrix<double, 1, 2>;
constexpr auto x = convex::Variable<convex::VarMeta<Space>>();
constexpr auto A =
    linalg::Matrix<double, 3, 2>{linalg::Vector<double, 2>{-1.0, 0.0},
                                 linalg::Vector<double, 2>{0.0, -1.0},
                                 linalg::Vector<double, 2>{1.0, 1.0}};
constexpr auto b = linalg::Vector<double, 3>{-1.0, -2.0, 6.0};
constexpr auto constraints = convex::Polyhedron(A, b, x);
constexpr auto cost =
    convex::WeightedSum<Space>()(linalg::Vector<double, 2>{1.0, 2.0}, x);
constexpr auto problem =
    convex::make_problem(x).in_set(constraints).minimize(cost);

The model is canonicalized at compile time. The full example constructs convex::PrimalDualIPM solver(problem) at runtime, checks solver status and numerical events, then verifies feasibility and the solution against a tolerance.

Full consumer example and CMake project ↗

Architecture

One numerical foundation.

Software dependencies Arrows point to a dependency.
Akreon library dependencies Control depends on Convex and Linalg. Convex depends on Linalg. Dynamics depends on Linalg. akreon-controlakreon-convexakreon-linalgakreon-dynamics

From models to evaluation

Conceptual workflow · not dependency edges

  1. Mathematical Models
  2. Objectives & Constraints
  3. Convex Optimization
  4. Controller / Estimator Design
  5. Simulation & Evaluation

Optimization is the central thread connecting the Akreon libraries. Models describe system behavior. Objectives and constraints define what is possible and desirable. Numerical optimization determines solutions. Feedback and estimation connect those solutions to evolving systems and imperfect measurements.

Getting started

Start with a reproducible example.

  1. Choose a library above and review its documentation, compiler requirements, and support roadmap. The v0.1.0 libraries are early versions; check the repository for current compatibility and numerical limitations.
  2. Follow its repository build instructions, then build the supplied consumer example using its CMake project. Use the repository’s dependency versions and test configuration.
  3. For control experiments, explore the MPC, MHE, and CLF-CBF-QP examples. Optional Python bindings connect the implementation to research notebooks.
  4. Compare assumptions, solver diagnostics, and numerical results before adapting a model. Report reproducibility issues or propose improvements in the relevant GitHub repository.
Explore the accompanying research →