Plasmo.jl (which stands for Platform for Scalable Modeling and Optimization) is a graph-based algebraic modeling framework. It adopts a modular style to
create optimization problems and facilitates the management of distributed and hierarchical structures. Plasmo.jl has been developed with the key notion that it aligns with the
behavior of JuMP as much as possible. Consequently, almost every function that works on a JuMP Model
object will also work on a Plasmo.jl OptiGraph
object.
The core object in Plasmo.jl is the OptiGraph
wherein a user can add OptiNodes
which represent individual optimization problems. The optinodes in an optigraph can be linked together
using LinkConstraint
s which induces an underlying hypergraph structure. Furthermore, optigraphs be embedded within other optigraphs to induce nested hierarchical structures.
The graph structures obtained using Plasmo.jl can be used for model and data management, specialized graph partitioning, and for communicating structured problems to distributed optimization solvers (e.g. such as with PipsNLP.jl).
The latest documentation is available through GitHub Pages. Additional examples can be found in the examples folder.
pkg> add Plasmo
using Plasmo
using Ipopt
#create an optigraph
graph = OptiGraph()
#add nodes to an optigraph
@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)
@NLconstraint(n2,exp(x) >= 2)
#add a linkconstraint to couple nodes
@linkconstraint(graph,n1[:x] == n2[:x])
#optimize with Ipopt
set_optimizer(graph,Ipopt.Optimizer)
optimize!(graph)
#Print solution values
println("n1[:x] = ",value(n1[:x]))
println("n2[:x] = ",value(n2[:x]))
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)
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