{"id":19940,"name":"energyRt","description":"Making Energy Systems Modeling as simple as a linear regression in R.","url":"https://github.com/optimal2050/energyRt","last_synced_at":"2026-08-11T18:31:06.270Z","repository":{"id":43021135,"uuid":"54132414","full_name":"optimal2050/energyRt","owner":"optimal2050","description":"Making Energy Systems Modeling as simple as a linear regression in R","archived":false,"fork":false,"pushed_at":"2026-08-06T00:25:07.000Z","size":48955,"stargazers_count":26,"open_issues_count":0,"forks_count":10,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-08-06T01:57:52.077Z","etag":null,"topics":["energy-models","gams","glpk","julia","pyomo"],"latest_commit_sha":null,"homepage":"http://www.energyRt.org","language":"R","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/optimal2050.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2016-03-17T16:08:29.000Z","updated_at":"2026-07-29T08:35:24.000Z","dependencies_parsed_at":"2026-08-06T00:44:59.743Z","dependency_job_id":null,"html_url":"https://github.com/optimal2050/energyRt","commit_stats":{"total_commits":1323,"total_committers":7,"mean_commits":189.0,"dds":0.2675736961451247,"last_synced_commit":"a1ee168140f19a484b96e9c69d1111fcc608781c"},"previous_names":["optimal2050/energyrt","energyrt/energyrt","olugovoy/energyrt"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/optimal2050/energyRt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimal2050%2FenergyRt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimal2050%2FenergyRt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimal2050%2FenergyRt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimal2050%2FenergyRt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/optimal2050","download_url":"https://codeload.github.com/optimal2050/energyRt/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimal2050%2FenergyRt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36495906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-08-06T04:43:03.162Z","status":"online","status_checked_at":"2026-08-10T02:00:05.122Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"owner":{"login":"optimal2050","name":null,"uuid":"55292402","kind":"user","description":null,"email":"","website":null,"location":null,"twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/55292402?u=6ffc4218861e53ccc9a4108804c47aba03d2dc99\u0026v=4","repositories_count":3,"last_synced_at":"2025-04-16T07:20:34.691Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/optimal2050","funding_links":[],"total_stars":null,"followers":10,"following":0,"created_at":"2023-05-06T04:35:12.024Z","updated_at":"2025-04-16T07:20:34.691Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/optimal2050","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/optimal2050/repositories"},"packages":[],"commits":{"id":9743081,"full_name":"optimal2050/energyRt","default_branch":"master","total_commits":1337,"total_committers":7,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":191.0,"dds":0.275243081525804,"past_year_total_commits":10,"past_year_total_committers":1,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":10.0,"past_year_dds":0.0,"last_synced_at":"2026-08-06T00:06:19.212Z","last_synced_commit":"2722ffb36f7f0481fdc62decee1a5cdd28ef55fb","created_at":"2025-04-16T07:03:13.111Z","updated_at":"2026-08-04T13:41:56.691Z","committers":[{"name":"vpotashnikov","email":"potashnikov.vu@gmail.com","login":"vpotashnikov","count":969},{"name":"olugovoy","email":"olugovoy@gmail.com","login":"olugovoy","count":329},{"name":"“olugovoy”","email":"“olugovoy@gmail.com”","login":null,"count":22},{"name":"ideea-model","email":"olugovoy@edf.org","login":"ideea-model","count":8},{"name":"energyRt","email":"55292402+energyRt","login":"energyRt","count":7},{"name":"Michaja Pehl","email":"pehl@pik-potsdam.de","login":"0UmfHxcvx5J7JoaOhFSs5mncnisTJJ6q","count":1},{"name":"VZhikhareva","email":"vitaliya.zhikhareva@gmail.com","login":null,"count":1}],"past_year_committers":[{"name":"olugovoy","email":"olugovoy@optimalsolution.dev","login":"olugovoy","count":10}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimal2050%2FenergyRt/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-10T00:00:10.517Z","repositories_count":6626496,"commits_count":918497696,"contributors_count":39008142,"owners_count":1330549,"committers_count":3291456,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"optimal2050/energyRt","html_url":"https://github.com/optimal2050/energyRt","last_synced_at":"2026-08-10T17:31:39.762Z","status":"active","issues_count":6,"pull_requests_count":43,"avg_time_to_close_issue":39734134.833333336,"avg_time_to_close_pull_request":533726.9069767442,"issues_closed_count":6,"pull_requests_closed_count":43,"pull_request_authors_count":4,"issue_authors_count":5,"avg_comments_per_issue":0.8333333333333334,"avg_comments_per_pull_request":0.18604651162790697,"merged_pull_requests_count":41,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":0,"past_year_pull_requests_count":4,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":19.25,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":4,"past_year_pull_request_authors_count":2,"past_year_issue_authors_count":0,"past_year_avg_comments_per_issue":null,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":4,"created_at":"2025-04-16T07:03:13.497Z","updated_at":"2026-08-10T17:31:39.763Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimal2050%2FenergyRt","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/optimal2050%2FenergyRt/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":4,"COLLABORATOR":2},"pull_request_author_associations_count":{"COLLABORATOR":34,"OWNER":8,"NONE":1},"issue_authors":{"olugovoy":2,"BjoernLaemmerzahl":1,"AboodaA":1,"awanyulianto":1,"infsum":1},"pull_request_authors":{"olugovoy":29,"optimal2050":8,"vpotashnikov":5,"michaja":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-08-11T00:00:06.821Z","repositories_count":14791824,"issues_count":28363793,"pull_requests_count":93479797,"authors_count":11434203,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{},"past_year_pull_request_author_associations_count":{"OWNER":3,"COLLABORATOR":1},"past_year_issue_authors":{},"past_year_pull_request_authors":{"optimal2050":3,"olugovoy":1},"maintainers":[{"login":"olugovoy","count":31,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/olugovoy"},{"login":"optimal2050","count":8,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/optimal2050"},{"login":"vpotashnikov","count":5,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/vpotashnikov"}],"active_maintainers":[{"login":"optimal2050","count":3,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/optimal2050"},{"login":"olugovoy","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/olugovoy"}]},"events":{"total":{"ForkEvent":1,"WatchEvent":1,"PushEvent":5},"last_year":{"ForkEvent":1,"PushEvent":4}},"keywords":["energy-models","gams","glpk","julia","pyomo"],"dependencies":[{"ecosystem":"cran","filepath":"DESCRIPTION","sha":null,"kind":"manifest","created_at":"2022-09-09T13:51:17.721Z","updated_at":"2022-09-09T13:51:17.721Z","repository_link":"https://github.com/optimal2050/energyRt/blob/master/DESCRIPTION","dependencies":[{"id":4289409461,"package_name":"R","ecosystem":"cran","requirements":"\u003e= 3.6","direct":true,"kind":"depends","optional":false},{"id":4289409462,"package_name":"parallel","ecosystem":"cran","requirements":"*","direct":true,"kind":"depends","optional":false},{"id":4289409463,"package_name":"rpivotTable","ecosystem":"cran","requirements":"*","direct":true,"kind":"imports","optional":false},{"id":4289409464,"package_name":"data.table","ecosystem":"cran","requirements":"*","direct":true,"kind":"imports","optional":false},{"id":4289409465,"package_name":"DBI","ecosystem":"cran","requirements":"*","direct":true,"kind":"imports","optional":false},{"id":4289409466,"package_name":"RSQLite","ecosystem":"cran","requirements":"*","direct":true,"kind":"imports","optional":false},{"id":4289409467,"package_name":"tidyverse","ecosystem":"cran","requirements":"*","direct":true,"kind":"imports","optional":false},{"id":4289409468,"package_name":"knitr","ecosystem":"cran","requirements":"*","direct":true,"kind":"suggests","optional":false},{"id":4289409469,"package_name":"rmarkdown","ecosystem":"cran","requirements":"*","direct":true,"kind":"suggests","optional":false},{"id":4289409470,"package_name":"sp","ecosystem":"cran","requirements":"*","direct":true,"kind":"suggests","optional":false}]}],"score":5.204006687076795,"created_at":"2023-09-11T14:52:08.310Z","updated_at":"2026-08-11T18:31:06.272Z","avatar_url":"https://github.com/optimal2050.png","language":"R","category":"Energy Systems","sub_category":"Energy System Modeling Frameworks","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"## energyRt \u003cimg src=\"man/figures/logo.png\" align=\"right\" height=\"120\" alt=\"energyRt hex logo\" /\u003e\u003c/a\u003e\n\n[![Lifecycle: maturing](https://img.shields.io/badge/lifecycle-maturing-blue.svg)](https://lifecycle.r-lib.org/articles/stages.html)\n[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)\n\n\u003e 📣 **Energy System Modeling with R** — a post-conference online series following useR! 2026 · four live sessions, Fridays 7–28 Aug 2026, 12:00 UTC. [Details \u0026 registration »](https://energyRt.org/use-R-2026)\n\n**energyRt** (*energy* system modeling *R-t*oolbox /ˈɛnərdʒi ɑrt/) is a\nmacro-language for energy system modeling in R. You describe an energy system —\nits fuels, technologies, resources and demands — as R objects; **energyRt**\ncompiles them into a full capacity-expansion \u0026 dispatch optimization model,\nsolves it, and returns tidy results ready for `dplyr`/`ggplot2` analysis. The\ntechnical layer (sets, equations, solver files, results parsing) is generated\nfor you, so you concentrate on the system you are modeling, not on the code\nthat optimizes it.\n\n### One model, four backends\n\nThe energyRt optimization model (~100 predefined equations, extendable with\n`newConstraint()`) is implemented in four mathematical-programming languages.\nThe *same* model object solves on any of them, with consistent results:\n\n| Backend | Language | License |\n|---|---|---|\n| [GLPK / MathProg](https://www.gnu.org/software/glpk/) | (bundled with Rtools on Windows) | open source |\n| [Julia / JuMP](https://jump.dev/) | Julia + HiGHS | open source |\n| [Python / Pyomo](http://www.pyomo.org/) | Python + CBC/HiGHS | open source |\n| [GAMS](http://www.gams.com/) | GAMS | commercial |\n\nStart on zero-setup GLPK; switch backends later without touching your model.\n\n### Quickstart\n\nA complete model — one fuel, one power plant, one demand — built, solved and\nread in ~20 lines (GLPK, no external setup needed on Windows with Rtools):\n\n``` r\nlibrary(energyRt)\n\nGAS \u003c- newCommodity(\"GAS\", timeframe = \"ANNUAL\")\nELC \u003c- newCommodity(\"ELC\", timeframe = \"ANNUAL\")\n\nSUP_GAS \u003c- newSupply(\"SUP_GAS\", commodity = \"GAS\",\n                     availability = data.frame(cost = 6.0))   # fuel price, MEUR/PJ\n\nEGAS \u003c- newTechnology(\"EGAS\",\n  input   = list(comm = \"GAS\"), output = list(comm = \"ELC\"),\n  ceff    = data.frame(comm = \"GAS\", cinp2use = 0.55),        # 55% efficient\n  invcost = list(invcost = 900),                              # MEUR/GW\n  fixom   = 25, cap2act = 31.536, olife = 25L)\n\nDEM_ELC \u003c- newDemand(\"DEM_ELC\", commodity = \"ELC\",\n                     dem = data.frame(dem = 50))               # 50 PJ a year\n\nmod \u003c- newModel(\"HELLO\",\n  data    = newRepository(\"parts\", GAS, ELC, SUP_GAS, EGAS, DEM_ELC),\n  region  = \"R1\", discount = 0.05,\n  horizon = newHorizon(period = 2025:2040, intervals = c(1, 5, 10),\n                       mid_is_end = TRUE))\n\nscen \u003c- solve_scenario(interpolate_model(mod, name = \"BASE\"),\n                       solver = solver_options$glpk)\n\ngetData(scen, \"vObjective\", merge = TRUE)   # total discounted system cost\ngetData(scen, \"vTechCap\",   merge = TRUE)   # capacity the model built, GW\n```\n\nThe [Get started](https://energyrt.org/articles/energyRt.html) vignette walks\nthrough this example and the ideas behind it.\n\n### What's in the box\n\n- **Model bricks** — commodities, technologies (with efficiencies, fuel blends\n  \u0026 shares, auxiliary flows like emissions or cooling water), supply, demand,\n  storage, weather, trade; `draw()` sketches any technology as a diagram.\n  → [Model bricks](https://energyrt.org/articles/model-bricks.html)\n- **UTOPIA teaching model** — a complete multi-region electricity model built\n  step by step, shipped as the `utopia_modules` data kit with ready scenario\n  levers (CO₂ cap, carbon tax, renewable share, nuclear moratorium).\n  → [UTOPIA I: building the model](https://energyrt.org/articles/utopia-build.html)\n  · [UTOPIA II: running scenarios](https://energyrt.org/articles/utopia-use.html)\n- **Levelized cost** — `levcost()` prices a technology *a-priori* (screening,\n  textbook LCOE) or *ex-post* from a solved scenario, with `autoplot()` cost\n  breakdowns.\n- **Reports** — `report()` renders an HTML/PDF datasheet for a technology or a\n  solved process, `levcost` included.\n- **Scenario workflow** — tidy result extraction with `getData()`, scenario\n  editing \u0026 re-solving, Arrow-backed `save_scenario()`/`load_scenario()` for\n  larger-than-memory results.\n  → [Workflow](https://energyrt.org/articles/workflow.html)\n  · [Plotting](https://energyrt.org/articles/autoplot.html)\n\n### Learn more\n\n- [Get started](https://energyrt.org/articles/energyRt.html) — the core idea in\n  ten minutes.\n- [Tutorials](https://energyrt.org/articles/) — installation, solver backends,\n  model bricks, UTOPIA, workflow, plotting.\n- **useR! workshop** — a hands-on training course built on energyRt and the\n  UTOPIA model (Quarto book, in preparation).\n- [IDEEA](https://ideea-model.github.io/IDEEA/) — an open multi-region model of\n  India's power system, built with energyRt: a production-scale application.\n\n## Installation\n\n``` r\npak::pkg_install(\"optimal2050/energyRt\")\n# or\nremotes::install_github(\"optimal2050/energyRt\")\n```\n\nTo reproduce **pre-2026 models**, install the frozen legacy release instead:\n`pak::pkg_install(\"optimal2050/energyRt@v0.50\")`.\n\nYou will need at least one solver backend. On Windows, **GLPK ships with\nRtools** — no extra setup. For Julia/JuMP, Python/Pyomo, or GAMS see the\n[installation article](https://energyrt.org/articles/install.html) and the\n[solver backends article](https://energyrt.org/articles/backends.html).\n\n### Development status\n\nThe current development line (**v0.60.x**) modernizes the interpolation\npipeline, scenario storage, and analysis tools (`levcost`, `report`,\n`autoplot`) on the way to **v1.0**. The **v0.50** release (*\"half-way-there\"*)\nis frozen and remains available for pre-2026 modeling projects; its model\ncode, classes and methods will receive fixes only.\n\nThe package website: \u003chttps://energyrt.org\u003e\n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/19940","html_url":"https://ost.ecosyste.ms/projects/19940"}