
We provide R bindings to Uno (Unifying Nonlinear
Optimization), a C++ solver for nonlinearly constrained optimization,
via Uno’s C API. The interface allows you to describe a nonlinear
program with R callbacks for objective, gradient, constraints, Jacobian
and Lagrangian Hessian and Uno solves it. This is the R analog of the
unopy Python binding, intended as the nonlinear (DNLP)
solver backend for CVXR.
Two solver paths are provided:
filtersqp SQP preset, whose QP
subproblems are solved by HiGHS, reached at run time
through the highs
package, andipopt interior-point preset, whose
KKT systems are solved by MUMPS, reached at run time
through the rmumps package
(uno_mumps_version() tells which MUMPS that is).Install from CRAN as usual or from the repo via:
# install.packages("remotes")
remotes::install_github("bnaras/Uno")A C++17 compiler and CMake (>= 3.16) are required for source
builds as the package builds the underlying Uno from source. HiGHS comes
from the highs dependency (version 1.15.1-2 or later, which
exports HiGHS’ C API to other packages) and MUMPS from the
rmumps dependency, so there is no separate HiGHS or MUMPS
installation and nothing of either is compiled here. A source build
binds to the rmumps installed at the time:
rmumps 5.2.1-44 or later through its versioned C interface
(rmumps 5.9.1-1 brings MUMPS 5.9.1), rmumps
5.2.1-43 through the legacy dmumps_c entry point.
Hock–Schittkowski problem 15 (x* = (0.5, 2),
f* = 306.5), solved with the interior-point preset.
Derivatives are supplied in COO form (0-based indices); the Hessian is
the lower triangle of the Lagrangian.
library(Uno)
objective <- function(x) 100 * (x[2] - x[1]^2)^2 + (1 - x[1])^2
gradient <- function(x) c(400 * x[1]^3 - 400 * x[1] * x[2] + 2 * x[1] - 2,
200 * (x[2] - x[1]^2))
constraints <- function(x) c(x[1] * x[2], x[1] + x[2]^2)
jacobian <- function(x) c(x[2], 1, x[1], 2 * x[2])
hessian <- function(x, sigma, lambda)
c(sigma * (1200 * x[1]^2 - 400 * x[2] + 2),
-400 * sigma * x[1] - lambda[1],
200 * sigma - 2 * lambda[2])
res <- uno_solve(
n = 2L, lb = c(-Inf, -Inf), ub = c(0.5, Inf), sense = "minimize",
obj = objective, grad = gradient,
m = 2L, cl = c(1, 0), cu = c(Inf, Inf), cons = constraints,
jac_rows = c(0L, 1L, 0L, 1L), jac_cols = c(0L, 0L, 1L, 1L), jac = jacobian,
hess_rows = c(0L, 1L, 1L), hess_cols = c(0L, 0L, 1L), hess = hessian,
x0 = c(-2, 1), preset = "ipopt", base_indexing = 0L, verbose = FALSE,
options = list(logger = "SILENT")
)
res$objective # 306.5
res$primal # 0.5 2Any Uno solver option can be passed through options as a
named list (applied after the preset). See vignette("Uno")
for the full walk-through.
To cite the R package, run citation("Uno"), or:
Narasimhan B (2026). Uno: R Interface to the Uno Nonlinear Optimization Solver. R package. https://github.com/bnaras/Uno.
To cite the Uno solver itself, use the references its authors maintain under “Cite Uno”: the theory paper (Vanaret and Leyffer, 2026, Mathematical Programming Computation, https://doi.org/10.1007/s12532-026-00310-9) and the software paper (Vanaret and Montoison, 2026, Journal of Open Source Software, https://doi.org/10.21105/joss.10229).
MIT. The bundled Uno solver is Copyright Charlie Vanaret and
contributors, also MIT; see inst/COPYRIGHTS for every
copyright holder of bundled code. HiGHS and MUMPS are not bundled; they
come from the highs and rmumps packages.