(Translated by https://www.hiragana.jp/)
GitHub - odow/Plasmo.jl: A Platform for Scalable Modeling and Optimization
Skip to content

A Platform for Scalable Modeling and Optimization

License

Notifications You must be signed in to change notification settings

odow/Plasmo.jl

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Logo

CI codecov DOI

Plasmo.jl

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.

Overview

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 LinkConstraints 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).

Documentation

The latest documentation is available through GitHub Pages. Additional examples can be found in the examples folder.

Installation

pkg> add Plasmo

Simple Example

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]))

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

About

A Platform for Scalable Modeling and Optimization

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Julia 100.0%