Releases: Net-Zero-Horizon/ESFEX
v0.2.0
Added
- User-defined optimization constraints — add custom linear constraints to
the operational and investment models, either declaratively in the config
(custom_constraints) or via plugin Julia overlays, editable from a GUI dialog. - French and Portuguese GUI translations —
frandptjoin English,
Spanish and Japanese, in exact key parity (placeholders and Qt mnemonics
preserved); the Preferences language list discovers them automatically. - GPU-accelerated demand inference — XGBoost demand/density prediction runs
on a CUDA GPU when one is available (auto-detected, large-batch only), with
CPU fallback and anESFEX_XGB_DEVICEoverride (~2.6× on realistic batches).
Changed
- Grid Builder is responsive on country-scale regions — the "Building
network" pipeline and the Step-1 fetch aggregation (polygon clip + dedup) now
run on worker threads with live per-stage status and per-phase timings, so the
Studio no longer freezes; the network build was also de-quadratized. - Availability profiles — weather-based capacity factors are now the default
for wind/solar. Queries are de-duplicated per ~11 km location and fetched
concurrently with retry/backoff, so cost scales with distinct locations, not
generator count (a full-Japan build dropped from >30 min to ~1 min). A failed
weather fetch leaves the unit without a profile rather than fabricating a flat
value; thermal/hydro keep synthetic profiles. - Project status promoted from alpha to beta.
Fixed
- Grid Builder simplification: O(n²) dead-end bus pruning made linear.
- "Create new system" dialog widened so its window title is no longer clipped.
ESFEX v0.1.13
Highlights
Added
- Imported GeoAssets as workflow domains — Grid Builder, Solar PV, Wind, Rooftop, EV and Demand can define their study area from an imported GeoAsset (Shapefile/GeoJSON/KML/GPKG), dissolved into one boundary. Fetched features are clipped to the exact polygon (no bbox contamination); GeoAssets persist self-contained in the project YAML /
.esfexp. - Standardized domain definition — one shared two-column control (draw a polygon or apply a GeoAsset) across all workflows, with equal-sized selector boxes and last-action-wins mutual exclusivity.
- Portable
.esfexpproject bundles — export/import a complete project (config + demand + availability profiles) as a single self-contained file, with a progress dialog for load/save/export.
Changed
- Consolidated workflow wizards — Solar PV, Wind, Rooftop and EV collapse from 8–9 single-column steps to 4 content-aware steps: related light panels side by side, wider panels (tables, charts) on full-width rows, vertical scroll only when needed — nothing squashed or overflowing.
- Toolbar: visible Layer / Base Map captions above their selectors, font scaling with the rest of the bar, and +20% headroom on the icon-scaling cap.
Fixed
- Wind workflow restored — reconciled the GUI wind config with the current
windrexAPI (the analyzer adapter now builds the slimwindrex.WindConfigit needs) and fixed turbine selection (specific_power); the Wind assessment runs end-to-end again. - Grid Builder:
NameErrorwhen applying a GeoAsset as the domain.
Full changelog: https://github.com/Net-Zero-Horizon/ESFEX/blob/main/CHANGELOG.md
ESFEX v0.1.12
ESFEX v0.1.12
Grid Builder
- Manual node definition in Build & Connect: place node centroids by clicking the map or editing a table, with each node's Voronoi territory drawn live (clipped to the domain).
- Voltage consistency (#18): voltage-less OSM lines now inherit a consistent voltage and only join same-voltage buses, with auto-transformers between co-located voltage levels.
Demand forecasting
- Non-linear SSP trajectory: per-year SSP GDP/population growth is now wired into the grid-step forecast (no more near-linear demand).
- Observed-demand validation: import per-node observed series, compare against the forecast (MAPE/RMSE/peak/energy/correlation + dashed overlay) and optionally apply a month×hour correction that preserves the SSP growth path.
- Per-node forecast from the node panel: a new "Forecast" button runs the full forecast + validation + bus distribution scoped to a single node, adapting to whether the node already has electrical infrastructure. The obsolete standalone "Demand Estimation" workflow has been retired.
- Step 3 layout now fits the default window.
Investment & technologies (consistency cleanup)
- Removed the non-functional per-node "Technologies" section from the node panel and the duplicate investment fields from the technology catalog — per-node × per-technology investment limits live solely in the Investment Portfolio (the values the optimizer uses).
- The node technology dropdown now tracks the live system technology catalog.
- Fixed the Investment Portfolio "Type" list to match the right-click menu (dropped the unsupported fuel_transport entry).
Preferences
- Behaviour options are now honoured: auto-open results after a successful run, and auto-save driven by an on/off switch.
- "Validate before run" is now the single default flow (toggle removed).
- New defaults for fresh installs: GitHub Light theme and auto-open results enabled.
ESFEX v0.1.11
Fix
- Splash screen and About dialog now show the actual released version.
esfex.__version__was a hardcoded literal that drifted from the release
(it read 0.1.7 while the package was newer). It is now derived from the
installed package metadata, so pyproject.toml is the single source of
truth and the splash/About track every release automatically.
Carries the v0.1.10 documentation-packaging fix as well.
`pip install -U esfex`; the Windows installer (attached once built) pulls
this version too.
ESFEX v0.1.10
Patch release fixing the in-app documentation that was still empty in v0.1.9.
Fix
- Documentation now renders in the installed package. v0.1.9 copied
docs into the package via setup.py, but only when building the wheel
directly from source. CI builds the wheel from the sdist, which did
not contain docs/, so the published wheel had none. A MANIFEST.in now
grafts docs/ into the sdist, so the wheel-from-sdist build ships them.
Verified end-to-end: a fresh install resolves the docs and the Studio
viewer is populated.
`pip install -U esfex`. The Windows installer (attached once built) pulls
this version too.
ESFEX v0.1.9
Patch release fixing four issues found in v0.1.8.
Fixes
- In-app documentation now renders. The docs are bundled into the
package at build time, so the Studio documentation viewer works in
pip-installed environments (it previously came up empty). - Toolbar icon upscaling is capped so the responsive toolbar grows
to fill wide windows without ever becoming oversized. - Windows installer is built on the
release: publishedevent (the
same trigger as the PyPI publish), so publishing a release always
builds and attaches the installer — no missed or duplicated builds. - Dropped the unused
pypowsybldependency. The PowSyBl-based SLD
engine was reverted in favour of the custom engine; its heavy
dependency and dead code are removed, so the package no longer pulls
in pypowsybl.
The Windows installer (ESFEX-0.1.9-Windows-x86_64.exe) is attached once
the build finishes. `pip install -U esfex` for the Python package.
ESFEX v0.1.8
Highlights
Single-line diagram (SLD)
- Faithful PowerFactory-style schematic: one busbar per bus, one edge per element (no aggregation), transformer-tree depth layout with every transformer drawn as a clean vertical between adjacent bars.
- Orthogonal obstacle-avoidance router: transmission lines now route around every busbar, transformer leg and equipment stub instead of crossing over them.
- Inline line labels that sit on the line (
----[Label]----) and avoid all other elements. - Navigation minimap (bottom-left) with a draggable viewport rectangle, so you don't get lost when zoomed into a large system. It scales with the window.
- Lines joining buses of different voltages are flagged (dashed red + warning).
Studio GUI
- Screen-proportional scaling of the chrome (base font, panel minimums) so the UI stays proportionate across displays.
- Responsive toolbar: compact enough to fit the default window, and it grows to fill wider windows; the label text scales with the icon.
- Auto-fit visual scaling of map markers/lines — no per-system calibration.
Windows installer
- Console-less ESFEX Studio launcher with Start-Menu and Desktop shortcuts.
- Bundles
qt6-webengineso the Studio map/SLD web views load; fixes a DLL-path crash and CRLF issues in the post-install step.
Modeling
- Capacitated transport demand-to-bus allocation (min-cost flow) replacing nearest-bus assignment.
The Windows installer (ESFEX-0.1.8-Windows-x86_64.exe) is attached once the build finishes. pip install -U esfex for the Python package.
v0.1.7
Spatially-explicit demand forecasting and faithful network builds.
Added
- Faithful OSM import as the only build mode — the Grid Builder always reconstructs the network from the source topology (substations, lines, transformers). Removed the skip-incomplete / faithful-import toggles, the GridFinder source, and dead snapping/interconnection parameters; no more spurious "isolated generation / no demand" warnings.
- Spatially-explicit demand forecasting — node demand from a trained hourly XGBoost density model evaluated per 0.25° grid cell (SSP population + GDP rasters and CMIP6 multi-year climate), cell density × area summed per node and anchored to a national total. Replaces the "national total ÷ node count" proxy.
- Capacitated-transport distribution of demand to buses — within a node, demand is split among load buses by a capacitated transportation problem (capacity = transformer MVA with a voltage-scaled fallback) instead of a Voronoi/nearest assignment; demand spills to the next substation once the nearest one saturates.
Changed
- Grid Builder Step 2 layout tidied; the demand step exposes an SSP-scenario selector instead of a fixed GDP growth rate.
Tested
- End-to-end solvability of the faithfully-built network, plus unit coverage for the per-cell density inference and the capacitated demand→bus allocation.
Full changelog: https://github.com/Net-Zero-Horizon/ESFEX/blob/main/CHANGELOG.md
ESFEX v0.1.6
Grid Builder reliability, completeness, and country-scale performance.
⚡ Performance
- "Building network" no longer hangs on country-scale regions. Four independent O(n²) hot paths in the build pipeline are now linear: bus snapping (over-wide candidate window), disconnected-component bridging and equipment chaining (linear nearest-bus scans → projected KD-tree), line removal (per-fix list rebuild → batched), and per-edge bridge detection in electrical-parameter inference (a BFS per edge → a single iterative Tarjan pass). A ~25k-feature import (e.g. Japan) that previously hung for 20+ minutes now completes in seconds.
✨ Added
- Demand visualizer — a reusable Plotly demand chart (Grid Builder and node panel) with a date x-axis that auto-scales on zoom, a red mean line, and a deep "Demand statistics" panel.
- Complete, functional built networks — generators are assigned a fuel and a technology from a powerplantmatching-style taxonomy (CCGT/OCGT, steam and combustion engines, run-of-river/reservoir/pumped hydro, PV, on/offshore wind), lines get capacities and impedances from a standard line-type catalog (PyPSA-style r/x/c per km with an N-1 derate), and nodes are filled with default operating reserves and transmission losses. No more orphan generators without a fuel or technology.
- Per-phase build timing — the Grid Builder result panel now reports a "Timing" breakdown (seconds per build phase).
🔧 Changed
- Fuel Entry Point and Fuel Source unified into a single "Fuel Source" concept across the model and the Studio GUI.
🐛 Fixed
- OSM fetch timeout on large regions — large Overpass queries (e.g. Japan) are tiled into sub-requests instead of failing on a single monolithic query, and wrapped longitudes are normalized so the WRI/GEM/GridFinder layers return data across the ±180° meridian.
- "Naming nodes" hang — the node-naming step is time-boxed and the subsequent rendering no longer freezes the UI after large-region builds.
- "Lines toward a centroid" after a rebuild — the node-assignment spatial index cached on the centroid count, so a rebuild with re-clustered centroids of the same count reused a stale tree and collapsed the network toward the wrong centroids. It is now keyed on centroid content with a projected metric and exact-haversine refinement.
- Map zoom-out and world wrapping — the Grid Builder map is constrained to a single copy of the world: no zooming out below 1× world size and no panning onto wrapped copies of the globe (which produced out-of-range longitudes).
- OTEC cycle diagrams across NumPy/SciPy versions — thermodynamic state values are coerced to plain floats so the T-s / P-h loop arrays stay homogeneous and
mass_flowis always a float, regardless of the installed NumPy/CoolProp build.
Full changelog: v0.1.5...v0.1.6
ESFEX v0.1.5
Fixed
- Grid Builder demand forecast not persisted (#7) — applying the step-3
demand forecast only stored per-node summary stats and never wrote the hourly
series to disk nor recorded a CSV path, so the saved config carried empty
demand_pathsand the runner had no per-node demand. The forecast is now
written to per-node CSV files (under ademand/folder next to the project)
and wired into each node, sodemand_pathsis emitted and the runner finds
the files.
Full changelog: v0.1.4...v0.1.5