Unofficial Torch ECOS bindings to solve linear programs (LPs) and second-order cone programs (SOCPs).
C Lua CMake
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
ecos @ 4ae77db

ecos.torch • [ ![Build Status] travis-image ] travis [ License license-image ] license

Unofficial ECOS bindings to solve linear programs (LPs) and second-order cone programs (SOCPs) in Torch.

You may also be interested in:

Introduction to ECOS

Visit for detailed information on ECOS.

ECOS is a numerical software for solving convex second-order cone programs (SOCPs) of type

min  c'*x
s.t. A*x = b
G*x <=_K h

where the last inequality is generalized, i.e. h - G*x belongs to the cone K. ECOS supports the positive orthant R_+, second-order cones Q_n defined as

Q_n = { (t,x) | t >= || x ||_2 }

with t a scalar and x in R_{n-1}, and the exponential cone K_e defined as

K_e = closure{(x,y,z) | exp(x/z) <= y/z, z>0}

where (x,y,z) is in R_3. The cone K is therefore a direct product of the positive orthant, second-order, and exponential cones:

K = R_+ x Q_n1 x ... x Q_nN x K_e x ... x K_e

This Library

This repository provides unofficial Torch bindings to the ECOS C API.


After setting up Torch, this library can be installed with:

luarocks install

or equivalently:

git clone --recursive
cd ecos.torch
luarocks make


Linear Program

local ecos = require 'ecos'

local G = torch.Tensor{{-1, 1}, {-1, -1}, {0, -1}, {1, -2}}
local h = torch.Tensor{1.0, -2.0, 0.0, 4.0}
local c = torch.Tensor{2.0, 1.0}

local status, x = ecos.solve{c=c, G=G, h=h}
print(x) -- Optimal x is [0.5, 1.5]


After installing the library with luarocks, our tests in test.lua can be run with th test.lua.

Issues and Roadmap

  1. While this is working well for linear programs, I am not using and have not tested the second-order or exponential cones. Please comment in Issue 1 if you are interested in using these.
  2. ECOS uses a sparse matrix format and the code current converts a dense Torch tensor to a sparse array in C in every call. This could potentially be optimized by using sparse Torch tensors and doing the conversion in Torch. Then the user could then optionally maintain sparse Tensors in Torch. Please comment in Issue 2 if you are interested in this.


  • ECOS is under the GPL and remains unmodified.
  • The original code in this repository (the ECOS bindings) is Apache-licensed.