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
Flagship numerical optimization framework
v0.1.0
akreon-convex
A unified disciplined convex programming frontend, conic canonicalization framework, and primal-dual interior-point solver.
DCP frontend
Conic canonicalization
Primal-dual IPM
LP, SOCP, and SDP solve paths; convex QP and QCQP through available conic reformulations.
Support boundary. Exponential and power cones have partial modeling and canonicalization; end-to-end solver support is in progress. Mixed-integer solving is not implemented. Support and roadmap ↗
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 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 ↗
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.
Software dependencies Arrows point to a dependency.
From models to evaluation
Conceptual workflow · not dependency edges
Mathematical Models
Objectives & Constraints
Convex Optimization
Controller / Estimator Design
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.
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.
Follow its repository build instructions, then build the supplied consumer example using its CMake project. Use the repository’s dependency versions and test configuration.
For control experiments, explore the MPC, MHE, and CLF-CBF-QP examples. Optional Python bindings connect the implementation to research notebooks.
Compare assumptions, solver diagnostics, and numerical results before adapting a model. Report reproducibility issues or propose improvements in the relevant GitHub repository.