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 PlasmoContents
- 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.HyperGraphPlasmo.LinkConstraintPlasmo.LinkConstraintRefPlasmo.OptiEdgePlasmo.OptiGraphPlasmo.OptiNodePlasmo.PartitionBase.getindexBase.getindexBase.getindexBase.setindexJuMP.NLPEvaluatorJuMP.add_constraintJuMP.add_nonlinear_constraintJuMP.add_variableJuMP.all_constraintsJuMP.all_variablesJuMP.dualJuMP.list_of_constraint_typesJuMP.num_constraintsJuMP.num_nonlinear_constraintsJuMP.num_variablesJuMP.object_dictionaryJuMP.objective_functionJuMP.objective_senseJuMP.objective_valueJuMP.optimize!JuMP.set_nonlinear_objectiveJuMP.set_objectiveJuMP.set_objective_functionJuMP.set_objective_senseJuMP.set_optimizerJuMP.termination_statusJuMP.valueLightGraphs.SimpleGraphs.clique_graphLightGraphs.all_neighborsLightGraphs.induced_subgraphPlasmo.add_node!Plasmo.add_optiedge!Plasmo.add_subgraph!Plasmo.aggregatePlasmo.aggregate!Plasmo.all_edgesPlasmo.all_linkconstraintsPlasmo.all_nodesPlasmo.all_subgraphsPlasmo.apply_partition!Plasmo.attached_nodePlasmo.bipartite_graphPlasmo.edge_graphPlasmo.edge_hyper_graphPlasmo.expandPlasmo.graph_backendPlasmo.has_nl_objectivePlasmo.has_objectivePlasmo.has_subgraphsPlasmo.hierarchical_edgesPlasmo.hyper_graphPlasmo.identify_edgesPlasmo.identify_nodesPlasmo.incident_edgesPlasmo.induced_edgesPlasmo.is_node_variablePlasmo.is_set_to_nodePlasmo.jump_modelPlasmo.labelPlasmo.linkconstraintsPlasmo.neighborhoodPlasmo.num_all_subgraphsPlasmo.num_linkconstraintsPlasmo.num_linked_variablesPlasmo.num_subgraphsPlasmo.optiedgePlasmo.optiedge_by_indexPlasmo.optiedgesPlasmo.optigraph_referencePlasmo.optinodePlasmo.optinode_by_indexPlasmo.optinodesPlasmo.set_attached_nodePlasmo.set_labelPlasmo.set_modelPlasmo.subgraphPlasmo.subgraph_by_indexPlasmo.subgraphsPlasmoPlots.layout_plotPlasmoPlots.matrix_plotPlasmo.@linkconstraintPlasmo.@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