Skip to contents

Version 0.90.x (development). The current line modernizes the interpolation pipeline, scenario storage, and analysis tools on the way to v1.0. The v0.50 release (“half-way-there”) is frozen and receives fixes only.

Status legend: [✓] done · [~] in progress · [ ] planned.


Current status (September 2026)

  • v0.50 — frozen reference release (fixes only)
  • v0.90.x — active development. A breaking release: the first under Apache-2.0 (earlier releases remain AGPL-3), and the one that removes the deprecation layer the 0.8x series had been warning about. See NEWS before upgrading.

What’s implemented

  • [✓] Four solver backends — GLPK/MathProg, Julia/JuMP, Python/Pyomo, GAMS — from one model object, plus remote execution: the NEOS server for GAMS and CPLEX without a local licence, and multimod_cloud for GPU solves of models too large for a laptop. solver_options carries presets for simplex, barrier, interior-point and first-order (PDLP, cuOpt) methods.
  • [✓] Refactored interpolation pipeline (interpolate_model(), spec-driven recipe engine)
  • [✓] Scenario storage (Arrow) and analysis (levcost(), report(), autoplot()), including recorded runs, variants and myopic sequences
  • [✓] Nested time. Calendars from a single annual slice to 8760 hours, from the shipped calendars catalog (generated with timescales) or newCalendar(). Commodities and processes declare the timeframe they balance on, so annual fuel accounting and hourly dispatch coexist in one model; sampled calendars solve a representative subset and annualise it. (see Time resolution)
  • [✓] Nested regions. Hierarchical regions via geoscales: a commodity balanced at a coarser level with newCommodity(geoframe = ) rolls up automatically, so point-to-point trade is no longer the only way to move a commodity between regions. (see Space resolution)
  • [✓] Dependency setup & checks (en_setup(), en_check_dependencies(), en_check_packages())
  • [✓] Testing system — ~150 test files on tiers (ENERGYRT_TEST_TIER), cross-backend golden benchmarks, @covers tags feeding a parameter-level coverage matrix, and verify_solution() identity checks on solved scenarios
  • [~] multimod-based equation rendering (GAMS → AST → LaTeX; proof of concept)

Roadmap / next steps

Model structure & scope

  • [~] Finish nested regions & time. The balance layer is in (above). Still open: declaring a process at a coarse level and resolving it DOWN to its commodities, rest-of-world import/export at a coarse level, and parallel (cross-cutting) groupings of the same regions.

Model API

  • [~] Refactor newConstraint(). User-defined constraints currently compile to GAMS-dialect text; move them to a language-neutral representation so every backend renders from a single definition (aligned with the multimod AST).

Validation

  • [~] Validate results against inputs. Input-side checks now refuse conflicting parameter rows at construction and stop an interpolation that would multiply a series. The output side is thinner: extend verify_solution() so declared bounds and values can be traced into the solution, and so variables can be checked against each other (capacity vs flows, new capacity vs EAC).

Base-code simplification

  • [~] Reduce duplication across the parallel technology / storage / trade entity systems (the triplicated capacity / EAC / fixed-O&M skeletons) toward a more unified, parameterized process form.
  • [~] Finish the interpolation recipe/registry engine — route the remaining inline mapping construction through the engine.

Renaming, cleaning & optimization

  • [✓] Retire the deprecation layer (v0.90) — the 0.8x aliases are gone and the names they forwarded to are the only spellings.

Quality & tooling

Integration with multimod

  • [~] Single-source model. Drive both the equation documentation and the executable model code (LaTeX / GLPK / JuMP / Pyomo) from one definition via multimod’s read → AST → write chain, replacing the manual cross-engine mirroring of the model templates.
  • [~] lang = "mm" backend (experimental). multimod reads energyRt’s own GAMS template into an AST and assembles the LP matrix from it, with no generated model text in between, writing MPS for the solver: solve_scenario(scen, solver = solver_options$mm_highs). Because there is no model-build step, it avoids the time and memory wall that dominates large models. Verified against GLPK on the cross-solver models, folded and unfolded.

v1.0 & CRAN


Milestones

  • v0.50 — frozen “half-way-there” reference release (fixes only)
  • v0.90.x — current development: Apache-2.0, deprecation layer removed, nested regions & time, remote and GPU solving
  • v1.0 — CRAN release; stabilized model, classes, and API
  • v1.0+ — multimod integration; completing nested regions & time (coarse-level processes, cross-cutting groupings)

Contributing & support

Contributions, issues, and ideas are welcome. energyRt is Apache-2.0 from v0.90; contributions are accepted under the same terms.