Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
127 commits
Select commit Hold shift + click to select a range
ec5a93b
Allow overwriting docs URL; select correct default config in test (#2…
brynpickering Feb 20, 2026
a1b452f
Link release badge to documentation (#2089)
lindnemi Feb 20, 2026
7b97305
fix: don't mutate config in cluster_network (#2091)
lkstrp Feb 24, 2026
e250075
build: use /workspace as dev-env container workdir (#2095)
lkstrp Feb 24, 2026
abb2068
fix: lower the lower bound for power grouping years (#2097)
tgilon Feb 24, 2026
90b464d
chore: remove duplicated OCGT in test config files (#2094)
tgilon Feb 24, 2026
025c72f
chore: remove duplicated OCGT in test config files (#2094)
tgilon Feb 24, 2026
18f8c81
build: install pixi env persistent with auto-symlink entrypoint (#2098)
lkstrp Feb 24, 2026
b012517
refactor: use scripts path provider consistently (#2093)
tgilon Feb 25, 2026
4a3906e
feat: setup pypsa-bot github app (#2099)
lkstrp Feb 25, 2026
34204dd
fix: validator config (#2102)
lkstrp Feb 26, 2026
5f62639
Update industry reference year to 2023 (#2103)
lindnemi Feb 27, 2026
ad10771
[github-actions.ci] Update locked envs (#2110)
github-actions[bot] Mar 2, 2026
21bc4fa
chore(deps): bump actions/upload-artifact in the github-actions group…
dependabot[bot] Mar 2, 2026
4fe739d
chore(deps): bump docker/login-action in the github-actions group (#2…
dependabot[bot] Mar 6, 2026
40c8954
Update installation.rst (#2116)
jack-gregory Mar 6, 2026
4d83a9b
chore(deps): bump dorny/paths-filter in the github-actions group (#2119)
dependabot[bot] Mar 16, 2026
960ff53
doc: update the PR template (#2118)
tgilon Mar 16, 2026
3f76942
Update solve_network.py (#2107)
toniseibold Mar 16, 2026
f85d295
[github-actions.ci] Update locked envs (#2120)
github-actions[bot] Mar 16, 2026
db2e5a0
chore(deps): bump actions/create-github-app-token (#2122)
dependabot[bot] Mar 18, 2026
7ab303c
feat: improve load shedding with carrier specific options and load si…
daniel-rdt Mar 18, 2026
25f8ee4
ci: validation runs via pypsa-app (#2123)
lkstrp Mar 19, 2026
c5b534d
test: trusted user (#2125)
daniel-rdt Mar 23, 2026
192857b
fix: clamp s/p_nom_max in brownfield to prevent floating-point infeas…
thogin Mar 25, 2026
e8b2730
ci: exclude packages newer than 7 days in lockfile update workflow (#…
lkstrp Mar 30, 2026
e2620cf
fix: remove Dask client.shutdown() in build_renewable_profiles (#2131)
thogin Mar 30, 2026
cb9ebde
chore(deps): bump prefix-dev/setup-pixi in the github-actions group (…
dependabot[bot] Apr 1, 2026
c8fd89c
perf: use chunks="auto" in a single thread (#2137)
coroa Apr 8, 2026
22c92a8
[pre-commit.ci] pre-commit autoupdate (#2134)
pre-commit-ci[bot] Apr 13, 2026
abea573
fix: remove asynchronous model for distributed client (#2149)
coroa Apr 14, 2026
f5ec6e6
fix: blacklist atlite 0.5.0 (#2150)
coroa Apr 14, 2026
d03edca
paste scenarios file from last report
lindnemi Apr 15, 2026
0ce157c
remove old scenarios
lindnemi Apr 15, 2026
4587e16
oriente towards new scenario definitions
lindnemi Apr 15, 2026
91e3371
define new scenario and get it running
lindnemi Apr 15, 2026
227d3a6
rename
lindnemi Apr 15, 2026
f6d5fee
[github-actions.ci] Update locked envs (#2133)
github-actions[bot] Apr 16, 2026
e44b3f3
avoid accidental mutations of input data
lindnemi Apr 20, 2026
617b410
update to new naming
lindnemi Apr 20, 2026
0b67d1c
clean-up scenarios automated
lindnemi Apr 20, 2026
5e77f75
define a 85 percent iin 2040 scenario
lindnemi Apr 20, 2026
918debe
feat: improve config validator for scenario management (#2155)
daniel-rdt Apr 23, 2026
fda902c
Merge branch 'main' into scenarios-2026
lindnemi Apr 27, 2026
afcec04
Heuristically split existing solar capacities 50:50 between rootop an…
lindnemi Apr 28, 2026
401b07e
take the improved defaults from config
lindnemi Apr 28, 2026
3be745a
update szenario config
lindnemi Apr 29, 2026
c6c30a7
adm clustering with post discretization
lindnemi Apr 29, 2026
ea07410
Merge remote-tracking branch 'upstream/master' into merge-master-apri…
lindnemi Apr 29, 2026
2c55375
update lockfile
lindnemi Apr 29, 2026
51dece2
fix pydantic errors
lindnemi Apr 29, 2026
91bc024
Merge branch 'merge-master-april-26' into scenarios-2026
lindnemi Apr 29, 2026
025214a
revert back to focus weight clusters
lindnemi Apr 30, 2026
9053558
more generous line threshold during post discretization
lindnemi Apr 30, 2026
59a1352
onwind & offwind:
lindnemi May 11, 2026
ee262f8
adjust onwind progression
lindnemi May 12, 2026
a0c325d
remove solar_correction factors (which were adjusted to wy 2019 not 2…
lindnemi May 12, 2026
5ce2bfe
2035 EU co2 target oriented towards upper range of NDC
lindnemi May 12, 2026
bca91ea
apply 0.7 as discount rate for decentral assets as well
lindnemi May 12, 2026
94b0657
add grid reinforcement costs to solar rooftop as well
lindnemi May 12, 2026
9d601e3
new prefix
lindnemi May 12, 2026
2efb929
losses for retrotfitted H2 pipelines
lindnemi May 12, 2026
f368341
remove grid reinforcement costs again for solar rooftop
lindnemi May 12, 2026
d23d831
further downscale wind
lindnemi May 13, 2026
0e04bea
use a capacity limit to limit existing solar hsat in DE
lindnemi May 20, 2026
a0419ab
use a budget for consumption of decentral heat pumps
lindnemi May 20, 2026
5ee6dde
do not use UBA data for 2025, but only ariadne data
lindnemi May 20, 2026
4436c07
fix missing efficiency when overwriting FE demand for EVs
lindnemi May 20, 2026
c4cc57b
bump prefix
lindnemi May 20, 2026
889924e
2023 data is much closer to 2025, so the industry progression should …
lindnemi May 20, 2026
396305b
HVC primary fraction was inconsistent with pypsa-eur, causing slight …
lindnemi May 20, 2026
2e6d5f1
scale electricity load towards 2025 AGEB values
lindnemi May 20, 2026
926d50f
update mock_snakemake arguments
lindnemi Jun 8, 2026
3c91f3c
improve naming
lindnemi Jun 8, 2026
de97851
fix: check if array empty
lindnemi Jun 9, 2026
aa35a45
roll back and pin powerplantmatching to 0.6.1
lindnemi Jun 9, 2026
e985fae
fine-tuning wind config
lindnemi Jun 9, 2026
651df8f
tighten co2 budget by two percent to account for LULUCF
lindnemi Jun 9, 2026
fb78824
less ambitious lower limits for wind capacity
lindnemi Jun 10, 2026
f2505b3
still recalibrating wind FLH
lindnemi Jun 11, 2026
6830ed6
account conncetion investment separately
lindnemi Jun 11, 2026
335818e
account biomethane
lindnemi Jun 11, 2026
e27ed78
correct for excess elec demand in industry in 2025
lindnemi Jun 11, 2026
a989be2
higher costs for offshore wind from ISE
lindnemi Jun 12, 2026
d922eaa
prefix
lindnemi Jun 12, 2026
1bee705
fix cost csvs
lindnemi Jun 13, 2026
613dcc8
fix: activate electrolysis minimum cap
lindnemi Jun 15, 2026
70b2955
Account for non-CO2 GHG and Land Sink in EU co2_budget
lindnemi Jun 15, 2026
43ee51f
fix: rename nice_names as well when clustering heat buses
lindnemi Jun 15, 2026
89b5250
reduce space with relative factor for 2013 -> 2019/2024
lindnemi Jun 25, 2026
12bde77
all required ref scenarios are now available
lindnemi Jun 25, 2026
cc64b69
improve computation of EU co2 budget
lindnemi Jun 26, 2026
47527a1
consistency: net biomass imports always positive
lindnemi Jul 7, 2026
91f0e33
improve consdtraint pathways for Elec and H2 scenarios
lindnemi Jul 7, 2026
5ae6b6a
define a plausible trajectory for hydrogen ramp up in H2 scenario
lindnemi Jul 8, 2026
f96b671
imrpove some exports
lindnemi Jul 8, 2026
8bedebd
introduce lignite and coal limits, harmonize production limits constr…
lindnemi Jul 13, 2026
32b6048
add biogas CHP; partially re-align add_existing_baseyear with upstream
lindnemi Jul 16, 2026
d8c68d0
eliminate redundancies with base scenario
lindnemi Jul 16, 2026
1b2503d
deactivate ban on new gas boilers
lindnemi Jul 16, 2026
d4f2965
improve scenario definition and correct keys
lindnemi Jul 17, 2026
ad54878
account biomethan and biogas separately
lindnemi Jul 17, 2026
4d25fe3
add biogas CHP
lindnemi Jul 23, 2026
f8f8a2a
increase sequestration potential in Elec_plus (according to Szenarien…
lindnemi Jul 23, 2026
74b9f46
more biomass in Elek+
lindnemi Aug 3, 2026
a57b5e7
scale existing gas capa
lindnemi Aug 3, 2026
2d69bbe
biogas must run
lindnemi Aug 3, 2026
fa6b223
more carriers for eleba plot
lindnemi Aug 3, 2026
3ccf0a9
add a basic exporter for electricity timeseries
lindnemi Aug 4, 2026
ea69344
protoype for exporting NUTS runs regionally
lindnemi Aug 4, 2026
7b6b057
define scenario without transmission expansion
lindnemi Aug 5, 2026
3c2137a
plot 2025 and 2030 as well
lindnemi Aug 7, 2026
9c50b67
use historical transport data for 2025
lindnemi Aug 10, 2026
c46edcd
reduce GCS potential
lindnemi Aug 10, 2026
8888f10
constraint allowable solid biomass in building heating to roughly tod…
lindnemi Aug 10, 2026
ea210c1
typo
lindnemi Aug 10, 2026
27d0944
use UBA data for 2030 transport
lindnemi Aug 10, 2026
0f843d7
more robust constraint building
lindnemi Aug 11, 2026
b996c07
only scale DE elec load, instead of all of EU
lindnemi Aug 11, 2026
cd966d8
slightly smaller 2025 co2 budget
lindnemi Aug 11, 2026
efd9268
slow down district heat progression, because 2025 model results alrea…
lindnemi Aug 11, 2026
c5c8c0a
allow less elec imports in 2025, because weather 2012 allowed for mo…
lindnemi Aug 11, 2026
d2a2454
Restrict nuclear capacity factors to 0.9
lindnemi Aug 11, 2026
f8bc0b8
fine_tuning
lindnemi Aug 11, 2026
38ec12b
only scale DE heat load, not EU
lindnemi Aug 12, 2026
73f635e
increment prefix
lindnemi Aug 12, 2026
9ca34c1
no retrofit in CurPol
lindnemi Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
Before asking for a review for this PR make sure to complete the following checklist:

- [ ] Workflow with target rule `ariadne_all` completes without errors
- [ ] The logic of `export_ariadne_variables` has been adapted to the changes
- [ ] One or several figures that validate the changes in the PR have been posted as a comment
- [ ] A brief description of the changes has been added to `Changelog.md`
- [ ] The latest `main` has been merged into the PR
- [ ] The config has a new prefix of the format `YYYYMMDDdescriptive_title`
## Changes proposed in this Pull Request


## Checklist

**Required:**
- [ ] Changes are tested locally and behave as expected.
- [ ] Code and workflow changes are documented.
- [ ] A brief description of the changes has been added to `Changelog.md`.

**If applicable:**
- [ ] Changes in configuration options are reflected in `scripts/lib/validation`.
- [ ] For new data sources or versions, [these instructions](https://pypsa-eur.readthedocs.io/en/latest/data_sources.html) have been followed.
- [ ] New rules are documented in the appropriate `doc/*.rst` files.
30 changes: 30 additions & 0 deletions .github/pypsa-bot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
tasks:
sync-locks:
triggers:
- "pixi.toml"
- "pixi.lock"
stage:
- "pixi.lock"
- "envs/"

generate-config:
triggers:
- "scripts/lib/validation/config/**"
stage:
- "config/"
- "doc/"
- "*.yaml"
- "*.yml"

app:
trusted_users:
- daniel-rdt
runs:
- name: "config.validator.yaml"
configfile: "config/test/config.validator.yaml"
triggers: [main, pr]
cache:
key: "validator-{YYYY}-{MM}"
dirs: ["data"]
import_networks:
- "results/validation/networks/base_s_50___2050.nc"
4 changes: 2 additions & 2 deletions .github/workflows/push-images.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ jobs:
with:
fetch-depth: 0

- name: 'Get last commit that changed pixi env'
- name: 'Get last commit that changed pixi env or Dockerfile'
run: |
hash_last_changed=$(git log -1 --pretty=format:%H -- pixi.toml pixi.lock)
hash_last_changed=$(git log -1 --pretty=format:%H -- pixi.toml pixi.lock docker/dev-env/Dockerfile)
echo "hash_last_changed=$hash_last_changed" >> $GITHUB_ENV

- name: 'Login to GitHub Container Registry'
Expand Down
43 changes: 11 additions & 32 deletions .github/workflows/update-lockfile.yaml
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
name: Update locked envs
on:
push:
paths:
- pixi.toml
schedule:
- cron: "0 8 1,16 * *" # Bi-weekly
workflow_dispatch:

jobs:
update-locked-environment:
update-lockfiles:
if: ${{ github.ref == 'refs/heads/master' }}
name: Update lockfiles
runs-on: ubuntu-latest
Expand All @@ -23,37 +20,19 @@ jobs:
with:
pixi-version: v0.59.0

- name: Update lockfile
- name: Full resolve (exclude packages newer than 7 days)
# Exclude recently published packages to avoid pulling in broken or
# yanked releases before upstream has had time to react
run: |
EXCLUDE_DATE=$(date -u -d '7 days ago' +%Y-%m-%dT00:00:00Z)
sed -i "/^\[workspace\]/a exclude-newer = \"$EXCLUDE_DATE\"" pixi.toml
rm pixi.lock
pixi install --all
git checkout pixi.toml

- name: Create new conda lock files
run: |
pixi workspace export conda-explicit-spec -e default envs
for f in envs/*_conda_spec*; do mv "$f" "${f/_conda_spec/.pin}"; done

- name: Create new conda environment file
run: |
pixi workspace export conda-environment -e default envs/environment.yaml -n pypsa-eur

- name: Upload artifacts
uses: actions/upload-artifact@v7
with:
name: lockfiles
path: |
pixi.lock
envs/

create-pull-request:
needs: update-locked-environment
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Download all artifacts
uses: actions/download-artifact@v8
with:
name: lockfiles
- name: Export conda environment files
if: ${{ !vars.PYPSA_BOT_ID }}
run: pixi run sync-locks

- name: Create Pull Request
uses: peter-evans/create-pull-request@v8
Expand All @@ -64,5 +43,5 @@ jobs:
body: |
Automatically generated PR to update the pixi lockfile.

**Note: Do not merge without manual test execution. Either update the branch to trigger tests, or use `workflow_dispatch` to run tests manually. Unlike standard PRs, tests will not run automatically.**
**Note: Do not merge without manual test execution, unless pypsa-bot has already exported the environment files and triggered tests.**
commit-message: "Update locked environment files for all platforms"
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# SPDX-FileCopyrightText: Contributors to PyPSA-Eur <https://github.com/pypsa/pypsa-eur>
#
# SPDX-License-Identifier: CC0-1.0
exclude: "^LICENSES|^config/schema\\.json$|^config/config\\.default\\.yaml$"
exclude: "^LICENSES|^config/schema\\.default[\\.]*.*\\.json$|^config/config\\.default[\\.]*.*\\.yaml$"

ci:
autoupdate_schedule: quarterly
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,9 +114,9 @@ SPDX-FileCopyrightText: Contributors to PyPSA-Eur <https://github.com/pypsa/pyps
SPDX-License-Identifier: CC-BY-4.0
-->

![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/pypsa/pypsa-eur?include_prereleases)
[![Test workflows](https://github.com/pypsa/pypsa-eur/actions/workflows/test.yaml/badge.svg)](https://github.com/pypsa/pypsa-eur/actions/workflows/test.yaml)
[![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/pypsa/pypsa-eur?include_prereleases)](https://github.com/PyPSA/pypsa-eur/releases)
[![Documentation](https://readthedocs.org/projects/pypsa-eur/badge/?version=latest)](https://pypsa-eur.readthedocs.io/en/latest/?badge=latest)
[![Test workflows](https://github.com/pypsa/pypsa-eur/actions/workflows/test.yaml/badge.svg)](https://github.com/pypsa/pypsa-eur/actions/workflows/test.yaml)
![Size](https://img.shields.io/github/repo-size/pypsa/pypsa-eur)
[![Zenodo PyPSA-Eur](https://zenodo.org/badge/DOI/10.5281/zenodo.3520874.svg)](https://doi.org/10.5281/zenodo.3520874)
[![Zenodo PyPSA-Eur-Sec](https://zenodo.org/badge/DOI/10.5281/zenodo.3938042.svg)](https://doi.org/10.5281/zenodo.3938042)
Expand Down
14 changes: 13 additions & 1 deletion Snakefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@
#
# SPDX-License-Identifier: MIT

import copy
from pathlib import Path
import yaml
import sys
from os.path import normpath, exists, join
from shutil import copyfile, move, rmtree, unpack_archive
from dotenv import load_dotenv
from snakemake.utils import min_version
from snakemake.utils import min_version, update_config

load_dotenv()

Expand All @@ -33,6 +34,17 @@ validate_config(config)

run = config["run"]
scenarios = get_scenarios(run)

for scenario_name, scenario_overrides in scenarios.items():
merged = copy.deepcopy(config)
update_config(merged, scenario_overrides)
try:
validate_config(merged)
except Exception as e:
raise ValueError(
f"Scenario '{scenario_name}' failed config validation: {e}"
) from e

RDIR = get_rdir(run)
shadow_config = get_shadow(run)

Expand Down
Loading