MultiConvex.jl is a Julia package for disciplined multi-convex programming. MultiConvex.jl can detect and (heuristically) solve multi-convex problems using alternating minimization. It solves the subproblems it encounters using Convex.jl and so can use any solver supported by Convex.jl, including Mosek, Gurobi, ECOS, SCS, GLPK, through the MathProgBase interface.
More resources:
- our paper on disciplined multi-convex programming
- slides on disciplined multi-convex programming
- a CVXPY extension for multi-convex programming in Python.
Installation: Clone the MultiConvex repository, and install Convex.
julia> Pkg.clone("https://github.com/madeleineudell/MultiConvex.jl.git")
julia> Pkg.add("Convex")
- If you're running into bugs or have feature requests, please use the Github Issue Tracker.
- For usage questions, please contact us via the JuliaOpt mailing list
Here's a quick example of code that solves a nonnegative matrix factorization problem
# Let us first make the Convex and MultiConvex modules available
using Convex, MultiConvex
# initialize nonconvex problem
n, k = 10, 1
A = rand(n, k) * rand(k, n)
x = Variable(n, k)
y = Variable(k, n)
problem = minimize(sum_squares(A - x*y), x>=0, y>=0)
# perform alternating minimization on the problem by calling altmin!
altmin!(problem)
# Check the status of the last subproblem solved
problem.status # :Optimal, :Infeasible, :Unbounded etc.
# Get the objective value
problem.optval
If you use MultiConvex.jl for published work, we encourage you to cite the software using the following BibTeX citation:
@article{shen2016disciplined,
title={Disciplined Multi-Convex Programming},
author={Shen, Xinyue and Diamond, Steven and Udell, Madeleine and Gu, Yuantao and Boyd, Stephen},
journal={arXiv preprint arXiv:1609.03285},
year={2016}
}