
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 (built from source with
the package), andipopt interior-point preset, whose
KKT systems are solved by MUMPS, reached at run time
through the rmumps
package.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 and HiGHS from source.
MUMPS comes from the rmumps dependency, so there is no
separate MUMPS installation.
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.
If you use this package, please cite both the R package and the paper
describing the Uno solver. Run citation("Uno") for the
up-to-date entries, or:
Narasimhan B, Vanaret C, Leyffer S (2026). Uno: R Interface to the Uno Nonlinear Optimization Solver. R package. https://github.com/bnaras/Uno.
Vanaret C, Leyffer S (2024). Implementing a unified solver for nonlinearly constrained optimization. arXiv:2406.13454. https://doi.org/10.48550/arXiv.2406.13454.
MIT. Uno is by Charlie Vanaret and Sven Leyffer.