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_cloudfor GPU solves of models too large for a laptop.solver_optionscarries 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
calendarscatalog (generated with timescales) ornewCalendar(). 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-pointtradeis 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,@coverstags feeding a parameter-level coverage matrix, andverify_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.
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.
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.
- GitHub: https://github.com/optimal2050/energyRt
- Issues: https://github.com/optimal2050/energyRt/issues
- Website: https://energyRt.org
