C package performing operator splitting for control
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.


OSC: Operator Splitting for Control

A C package for solving optimal control problems quickly.

based on:
A Splitting Method for Optimal Control
by Brendan O'Donoghue, George Stathopoulos and Stephen Boyd

=========================================================== Solves:

minimize \sum_{t=0}^T \phi_t(x_t,u_t) + \psi_t(x_t,u_t) 
subject to  x_{t+1} = A_t x_t + B_t u_t +c_t, t=0, ... , T-1

over x_t, u_t t = 0, ... , T

where phi_t terms are quadratic
and psi_t terms are arbitrary, supplied by the user in the form of a proximal operator

Quickstart: to compile all the simulations, in this directory type:


then to run a particular (e.g. box) example type:

cd box


cd box

osc.out runs the algorithm from a cold-start just once
warm_start.out performs NUM_WARM warm-start simulations

to remove compiled objects and binaries type
in oper_splt_code/ directory:

make clean

========================================================== the code fore examples presented in the paper are in
the following directories:

box/ : box constrained quadratic optimal control
finance/ : multi-period portfolio optimization
rob_est/ : robust state estimation
sup_ch/ : supply chain management

========================================================== the binaries can take additional arguments, e.g.:

./osc.out data_KKT data_prox

the first argument must be the main data file (see below)
the second argument must be the prox data file

if no arguments are supplied the binaries use the default
data files: data_KKT data_prox

========================================================== This directory consists of the following files:

osc.c, osc.h:  
		code to perform cold start OSC  
cholesky.c, cholesky.h:  
		code required to perform the factorization and  
		solve steps	    
        code that performs the warm-start sumulations  

========================================================== This directory consists of the following subdirectories:


These contain routines written by Tim Davis et al., these are required to factorize the KKT matrix and solve the linear system.
NOTE: these directories have been reduced to save space. You can obtain the full versions here


These are the directories that contain the examples as described in the paper.

========================================================== The example subdirectories consist of the following files:

prox.c, prox.h
		these files describe how the prox step for that
		particular example is carried out
		a MATLAB script that generates data for the example
		and solves the instance using both CVX and a MATLAB
		implementation of OSC (for verification purposes)
		the main data file as generated by gen_data.m
		the data required for the prox step, as generated
		by gen_data.m
osc.c, warm_start.c
		exact copies of the same files in the oper_splt_code/ directory

additionally the oper_splt_code/box/ directory contains directories

		contains the cvxgen code, for comparison purposes
		contains the fast MPC code, for comparison purposes

========================================================== main data file : (default name: data_KKT)

The main data file must be in a particular format, see any gen_data.m for an example. This file contains information like the problem dimensions, horizon length etc. Most importantly the full KKT matrix must be supplied in column compressed format.

prox data file (defualt name: data_prox) is problem specific it should contain all data required to perform the prox step

========================================================== prox.c and prox.h are problem specific but they must conform to the following requirements:

  • prox.h:

    • contain definition of prox_data struct, used in main file
    • this should contain all fixed data that the prox function requires to perform the prox step
  • prox.c:

    • functions to read in the prox data into prox_data struct
    • functions to perform the prox step
    • functions to perturb the data (for warm-start)
    • functions to free memory associated with prox data