## optimization_engine

A pure Rust framework for embedded nonconvex optimization. Ideal for robotics!

### 11 releases(5 breaking)

✓ Uses Rust 2018 edition

 0.6.2 Oct 29, 2019 Sep 27, 2019 Jun 22, 2019 Mar 22, 2019

MIT/Apache

280KB
5K SLoC

Optimization Engine (OpEn) is a solver for embedded nonconvex optimization.

Documentation available at alphaville.github.io/optimization-engine

## Features

OpEn is the counterpart of CVXGen for nonconvex problems.

• Fast nonconvex parametric optimization
• Numerical algorithm written in Rust
• Provably safe memory management
• Ideal for nonlinear MPC applications (e.g., autonomous navigation)

## Demos

### Code generation

Code generation? Piece of cake!

OpEn generates parametric optimizer modules in Rust - it's blazingly fast - it's safe - it can run on embedded devices.

You can use the MATLAB or Python interface of OpEn to generate Rust code for your parametric optimizer.

This can then be called directly, using Rust, or, it can be consumed as a service over a socket.

You can generate a parametric optimizer in just very few lines of code and in no time.

OpEn allows application developers and researchers to focus on the challenges of the application, rather than the tedious task of solving the associated parametric optimization problems (as in nonlinear model predictive control).

### Embedded applications

OpEn can run on embedded devices; here we see it running on an intel Atom for the autonomous navigation of a lab-scale micro aerial vehicle - the controller runs at 20Hz using only 15% CPU!

## Parametric Problems

OpEn can solve nonconvex parametric optimization problems of the general form

\large\begin{align*}\operatorname*{Minimize}_{u\in U}&f(u,p)\\\text{subject to: }&F_1(u, p) \in C\\&F_2(u,p)=0\end{align*}

where f is a smooth cost, U is a simple - possibly nonconvex - set, F1 and F2 are nonlinear smooth mappings and C is a convex set.

## Code Generation Example

Code generation in Python in just a few lines of code (read the docs for details)

import opengen as og

# Define variables
# ------------------------------------
u = cs.SX.sym("u", 5)
p = cs.SX.sym("p", 2)

# Define cost function and constraints
# ------------------------------------
phi = og.functions.rosenbrock(u, p)
f2 = cs.vertcat(1.5 * u[0] - u[1],
cs.fmax(0.0, u[2] - u[3] + 0.1))
bounds = og.constraints.Ball2(None, 1.5)
problem = og.builder.Problem(u, p, phi) \
.with_penalty_constraints(f2)       \
.with_constraints(bounds)

# Configuration and code generation
# ------------------------------------
build_config = og.config.BuildConfiguration()  \
.with_build_directory("python_test_build") \
.with_tcp_interface_config()
meta = og.config.OptimizerMeta()
solver_config = og.config.SolverConfiguration()    \
.with_tolerance(1e-5)                          \
.with_constraints_tolerance(1e-4)
builder = og.builder.OpEnOptimizerBuilder(problem, meta,
build_config, solver_config)
builder.build()


Code generation in a few lines of MATLAB code (read the docs for details)

% Define variables
% ------------------------------------

% Define cost function and constraints
% ------------------------------------
phi = rosenbrock(u, p);
f2 = [1.5*u(1) - u(2);
max(0, u(3)-u(4)+0.1)];

bounds = OpEnConstraints.make_ball_at_origin(5.0);

opEnBuilder = OpEnOptimizerBuilder()...
.with_problem(u, p, phi, bounds)...
.with_build_name('penalty_new')...
.with_fpr_tolerance(1e-5)...
.with_constraints_as_penalties(f2);

opEnOptimizer = opEnBuilder.build();


## Do you like OpEn?

Show us with a star on github...

OpEn is a free open source project. You can use it under the terms of either Apache license v2.0 or MIT license.

## Contributions

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.