Plasmo.jl - Platform for Scalable Modeling and Optimization
Plasmo.jl is a graph-based optimization framework written in Julia that builds upon the JuMP.jl modeling language to offer a modular style to construct and solve optimization problems. The package implements what is called an OptiGraph
abstraction to create graph-structured optimization models and facilitate graph-based processing functions. An OptiGraph
captures the underlying graph topology of an optimization problem using OptiNodes
(which represent stand-alone self-contained optimization models) that are coupled by means of OptiEdges
(which represent coupling constraints). The resulting topology can be used for tasks such as visualization, graph partitioning, and interfacing (and developing) decomposition-based solvers.
Installation
Plasmo.jl works for Julia versions 1.6 and later. From Julia, Plasmo.jl can be installed using the Pkg
module:
import Pkg
Pkg.add("Plasmo")
or alternatively from the Julia package manager by performing the following:
pkg> add Plasmo
Contents
- Quickstart
- Create an OptiGraph
- Add OptiNodes
- Create LinkConstraints
- Solve the OptiGraph and Query the Solution
- Visualize the Structure
- Modeling with OptiGraphs
- Creating an OptiGraph
- Adding OptiNodes
- Adding LinkConstraints
- Solving and Querying Solutions
- Plotting OptiGraphs
- Hierarchical Modeling using Subgraphs
- Query OptiGraph Attributes
- Managing Multiple OptiGraphs
- Graph Partitioning and Processing
- Example Partitioning Problem: Dynamic Optimization
- Partitioning OptiGraphs
- Aggregating OptiGraphs
- OptiGraph Projections
- Solvers
- API Documentation
Future Development
There are currently a few major development avenues for Plasmo.jl. Here is a list of some of the major features we intend to add for future releases:
- Parallel & Distributed modeling capabilities
- Nonlinear linking constraints
- Graph metrics and custom partitioning algorithms
- Better distributed solver support
We are also looking for help from new contributors. If you would like to contribute to Plasmo.jl, please create a new issue or pull request on the GitHub page
Index
Plasmo.HyperGraph
Plasmo.LinkConstraint
Plasmo.LinkConstraintRef
Plasmo.OptiEdge
Plasmo.OptiGraph
Plasmo.OptiNode
Plasmo.Partition
Base.getindex
Base.getindex
Base.getindex
Base.setindex
JuMP.NLPEvaluator
JuMP.add_constraint
JuMP.add_nonlinear_constraint
JuMP.add_variable
JuMP.all_constraints
JuMP.all_variables
JuMP.dual
JuMP.list_of_constraint_types
JuMP.num_constraints
JuMP.num_nonlinear_constraints
JuMP.num_variables
JuMP.object_dictionary
JuMP.objective_function
JuMP.objective_sense
JuMP.objective_value
JuMP.optimize!
JuMP.set_nonlinear_objective
JuMP.set_objective
JuMP.set_objective_function
JuMP.set_objective_sense
JuMP.set_optimizer
JuMP.termination_status
JuMP.value
LightGraphs.SimpleGraphs.clique_graph
LightGraphs.all_neighbors
LightGraphs.induced_subgraph
Plasmo.add_node!
Plasmo.add_optiedge!
Plasmo.add_subgraph!
Plasmo.aggregate
Plasmo.aggregate!
Plasmo.all_edges
Plasmo.all_linkconstraints
Plasmo.all_nodes
Plasmo.all_subgraphs
Plasmo.apply_partition!
Plasmo.attached_node
Plasmo.bipartite_graph
Plasmo.edge_graph
Plasmo.edge_hyper_graph
Plasmo.expand
Plasmo.graph_backend
Plasmo.has_nl_objective
Plasmo.has_objective
Plasmo.has_subgraphs
Plasmo.hierarchical_edges
Plasmo.hyper_graph
Plasmo.identify_edges
Plasmo.identify_nodes
Plasmo.incident_edges
Plasmo.induced_edges
Plasmo.is_node_variable
Plasmo.is_set_to_node
Plasmo.jump_model
Plasmo.label
Plasmo.linkconstraints
Plasmo.neighborhood
Plasmo.num_all_subgraphs
Plasmo.num_linkconstraints
Plasmo.num_linked_variables
Plasmo.num_subgraphs
Plasmo.optiedge
Plasmo.optiedge_by_index
Plasmo.optiedges
Plasmo.optigraph_reference
Plasmo.optinode
Plasmo.optinode_by_index
Plasmo.optinodes
Plasmo.set_attached_node
Plasmo.set_label
Plasmo.set_model
Plasmo.subgraph
Plasmo.subgraph_by_index
Plasmo.subgraphs
PlasmoPlots.layout_plot
PlasmoPlots.matrix_plot
Plasmo.@linkconstraint
Plasmo.@optinode
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