$ show cvanaret/Uno
Uno is a modular C++ solver for nonlinearly constrained optimization (NLP, QP, LP). It implements a unification framework that combines interchangeable algorithmic ingredientsβconstraint relaxation strategies, inequality handling methods, Hessian models (exact, quasi-Newton, identity, zero), inertia correction, subproblem solvers (QP/LP), and globalization mechanisms (line search, trust region, filter, funnel). The solver supports both sequential quadratic programming (SQP) and interior-point methods, and can be configured via presets that mimic established solvers like filterSQP and IPOPT. The architecture is a library with a main orchestration loop in `Uno.cpp`. The user defines the optimization problem through callback functions (objective, gradient, Jacobian, Hessian) via a C API, which is then wrapped by interfaces for AMPL, Fortran, Julia, and Python. Internally, the solver builds a regularized KKT system, delegates subproblem solves to external libraries (HiGHS, BQPD, HSL MA27/57/86, MUMPS, SPRAL), and applies globalization to ensure convergence. The codebase is heavily templated and uses expression templates for linear algebra, factory patterns for component selection, and runtime dynamic loading for optional dependencies. Key entry points include `uno_optimize()` (C API), `UnoSolverWrapper::optimize()` (Python), and the AMPL executable `uno_ampl`. The solver is used in research and production environments via JuMP.jl, CasADi, pyOptSparse, and OpenMDAO. External dependencies include BLAS/LAPACK, HSL (proprietary), MUMPS, SPRAL, HiGHS, BQPD, and AMPL ASL. The project is actively maintained with extensive CI, cross-platform builds, and a growing ecosystem of language bindings.
The LLM identified 4 files worth highlighting for reuse:
Implements a compile-time expression template for vector addition. Allows writing arithmetic expressions on Vector objects that are lazily evaluated and optimized into efficient BLAS calls. The pattern is self-contained, header-only, and can be extracted for any project needing high-performance vector operations with minimal overhead.
Provides a generic, typed option system with support for integer, double, bool, and string options, along with presets and file loading. The design is decoupled from the solver logic and can be reused in any application requiring a flexible configuration interface. Demonstrates clean separation of concerns and extensibility.
Encapsulates platform-specific dynamic library loading (dlopen/LoadLibrary) with a simple RAII interface. Used to load HSL solvers at runtime, avoiding compile-time coupling. The pattern is reusable for any project that needs optional or plugin-based dependencies, and handles error reporting cleanly.
Defines a uniform sparse matrix representation in coordinate (COO) format, used as the input for all direct linear solvers (MA27, MA57, MA86, MUMPS, SSIDS). The abstraction is self-contained and can be extracted for any project needing a portable sparse matrix structure with conversion utilities. Demonstrates good data structure design for numerical software.