Skip to content

Prior art and credit

Calliope (Apache-2.0) is where this surface comes from. Declaring solver-ready math as a reviewable YAML file, a block per component, foreach: for the dim list, a where: string over AND/OR/NOT, bounds:, active: — their design, down to parsing the strings with pyparsing rather than eval. Our expressions is their global_expressions, our piecewise their piecewise_constraints. What is ours is the semantics underneath: one expression per block, macros that take arguments, a schema closed at every level, and the absence and degree-1 laws (SPEC §0). Their math is also the corpus we score coverage against, which is a different thing from a specification we match (SPEC §11).

linopy (MIT) is the vocabulary, the oracle and the denominator. Where a concept is already theirs we copy the spelling rather than invent a second one; every language feature is differentially tested against a linopy build; every ratio on the benchmarks page is lpspec ÷ linopy. The three relationships are one page. The ported models in the gallery and their reference optima are PyPSA's.

No code from any of them is vendored, so none of this is a licence obligation — it is stated because a debt only the author knows about is one the next reader has to rediscover. Neither project has reviewed this one; mistakes in the comparisons above are ours.

If you cite this project, cite the two it is built on:

@article{Pfenninger2018,
  doi = {10.21105/joss.00825}, year = {2018}, publisher = {The Open Journal},
  volume = {3}, number = {29}, pages = {825},
  author = {Stefan Pfenninger and Bryn Pickering},
  title = {Calliope: a multi-scale energy systems modelling framework},
  journal = {Journal of Open Source Software}
}

@article{Hofmann2023,
  doi = {10.21105/joss.04823}, year = {2023}, publisher = {The Open Journal},
  volume = {8}, number = {84}, pages = {4823},
  author = {Fabian Hofmann},
  title = {Linopy: Linear optimization with n-dimensional labeled variables},
  journal = {Journal of Open Source Software}
}