Plasmo.jl

A Platform for Scalable Modeling and Optimization
Author zavalab
Popularity
56 Stars
Updated Last
2 Years Ago
Started In
July 2017

Logo

Build Status codecov coveralls

Plasmo.jl

Plasmo.jl (Platform for Scalable Modeling and Optimization) is a graph-based algebraic modeling framework. It builds upon JuMP and adopts a modular style to model optimization problems in a hierarchical fashion. The defining notion of the package is that it uses graph-based concepts to both construct and partition optimization problems which provides a natural interface to implement distributed optimization algorithms.

Overview

The core object in Plasmo.jl is the OptiGraph wherein a user can add OptiNodes which represent individual optimization problems. OptiNodes can be linked to each-other using linking constraints, which induces the underlying graph structure. An OptiGraph can also be embedded in another OptiGraph to induce hierarchical structures. These hierarchical structures provide a natural framework to harness distributed optimization solvers such as PIPS-NLP.

Documentation

Documentation is available through GitHub Pages. Additional examples can be found in the examples folder.

Installation

using Pkg
Pkg.add("Plasmo")

Simple Example

using Plasmo
using Ipopt

graph = OptiGraph()

#Add nodes to a ModelGraph
@optinode(graph,n1)
@optinode(graph,n2)

#Add variables, constraints, and objective functions to nodes
@variable(n1,0 <= x <= 2)
@variable(n1,0 <= y <= 3)
@constraint(n1,x+y <= 4)
@objective(n1,Min,x)

@variable(n2,x)
@NLnodeconstraint(n2,exp(x) >= 2)

#Add a linkconstraint to couple modelnodes
@linkconstraint(graph,n1[:x] == n2[:x])

#Optimize with Ipopt
ipopt = Ipopt.Optimizer
optimize!(graph,ipopt)

#Print solution values
println("n1[:x]= ",value(n1,n1[:x]))
println("n2[:x]= ",value(n2,n2[:x]))

Acknowledgments

This code is based on work supported by the following funding agencies:

  • U.S. Department of Energy (DOE), Office of Science, under Contract No. DE-AC02-06CH11357
  • DOE Office of Electricity Delivery and Energy Reliability’s Advanced Grid Research and Development program at Argonne National Laboratory
  • National Science Foundation under award NSF-EECS-1609183 and under award CBET-1748516

The primary developer is Jordan Jalving (@jalving) with support from the following contributors.

  • Victor Zavala (University of Wisconsin-Madison)
  • Yankai Cao (University of British Columbia)
  • Kibaek Kim (Argonne National Laboratory)
  • Sungho Shin (University of Wisconsin-Madison)

Citing Plasmo.jl

If you find Plasmo.jl useful for your work, you may cite the current pre-print:

@misc{JalvingShinZavala2020,
title = {A Graph-Based Modeling Abstraction for Optimization: Concepts and Implementation in Plasmo.jl},
author = {Jordan Jalving and Sungho Shin and Victor M. Zavala},
year = {2020},
eprint = {2006.05378},
archivePrefix = {arXiv},
primaryClass = {math.OC}
}

There is also an earlier manuscript where we presented the initial ideas behind Plasmo.jl which you can find here:

@article{JalvingCaoZavala2019,
author = {Jalving, Jordan and Cao, Yankai and Zavala, Victor M},
journal = {Computers {\&} Chemical Engineering},
pages = {134--154},
title = {Graph-based modeling and simulation of complex systems},
volume = {125},
year = {2019},
doi = {https://doi.org/10.1016/j.compchemeng.2019.03.009}
}

A pre-print of this paper can also be found here