Skip to content

Version 2.7.0

Choose a tag to compare

@JohannesBehrens JohannesBehrens released this 11 Aug 11:24
· 2 commits to master since this release
541a88b

Release date: 2026-08-11 · 188 commits since v2.6.0 (2fa3ba9b541a88b8)

This release adds ramping and downtime modelling, location-specific conversion factors and shadow-price output, removes the Excel-based input path, and moves the documentation from Sphinx to MkDocs.

Changes

  • Excel-based input removed (#706). readEnergySystemModelFromExcel, energySystemModelRunFromExcel and readOptimizationOutputFromExcel are gone from fine.IOManagement.standardIO. Example 04 was removed and the remaining examples renumbered (11_Partload10_Partload). Use the xarray/netCDF IO instead. Excel output is unaffected.
  • Deprecated methods removed: exploitOutput / getSimultaneosChargeDischarge, Storage.intraSOCstart, utils.checkParamInput, utils.checkTimeUnit, utils.equalStrings, utils.setFormattedTimeSeries, utils.checkInvestmentPeriodsCommodityConversion.
  • Component: unused parameter isStateOfCharge removed (#650).
  • Dependency floors raised: pandas>=2.2.0,<3.0.0, tsam==3.4.2 (pinned because of a tsam bug), pyomo>=6.8.1, scikit-learn>=1.3.0, xarray>=2023.4.1, pwlf>=2.5.0, gurobi-logtools>=3.2.0. gurobipy and highspy are now regular runtime dependencies. Python >=3.10,<3.15.
  • Docs dependencies switched from Sphinx to the MkDocs stack in the develop extra.

Features

  • Ramping constraints (#511). Inter-period ramp limits for Conversion components via rampUpMax / rampDownMax, including support for time series aggregation.
  • Location-specific commodity conversion factors (#619). Conversion factors can now be given per location, optionally as time series and per investment period; they need only be defined for eligible locations.
  • Minimum downtime for ConversionDynamic (#804). New minimumDowntimeRequired flag: each eligible component/location must be offline for at least downTimeMin hours per investment period, reusing the existing binary operation status. Requires downTimeMin and cyclic temporal constraints; time series aggregation and segmentation are rejected for now.
  • Shadow prices in the xarray/netCDF output (#545). Shadow-price time series for a user-defined constraint can be written to the xarray result and via writeEnergySystemModelToNetCDF. Multi-investment-period models emit a warning.
  • Centralized solver selection with fallback (#627, #651#657). Solver detection lives in fine.utils (set_standard_solver) and is applied from fine/__init__.py, so models and tests fall back to an available solver instead of failing on a hardcoded one.
  • Enums for string options (#747). New fine/enums.py with string-backed enums for component abbreviations, dimensions, variable/cost/function types and ramping types. Legacy string values are preserved, so saved models and IO stay compatible.
  • Plotting: plotPieChart is exposed at package level (#753) and no longer duplicated in __init__; plot functions gained test coverage (#708).
  • Validation: shared-potential check raises when fixed shared potentials exceed the maximum capacity (#705); a warning is issued when hasCapacityVariable=True together with an operation rate > 1 (#717).

Bug fixes

  • Cyclic lifetime constraint is now enforced per commissioning year in multi-period storage models (#685).
  • Fixed the binaryOperation2_ constraint (#522).
  • Fixed the piecewise-linear cost function module with multiple components (#516).
  • Fixed wrong coordinates in the xarray output of transmission components (#543) and further xarray output issues (#542).
  • Time series of regions with zero capacity or no eligibility are no longer passed to tsam (#541).
  • Missing solutions from GLPK are caught instead of failing opaquely (#689).
  • Fixed concurrent-write failure in the netCDF round-trip test (#621) and resolved test infeasibilities (#692, #667).
  • Fixed Renovate prefix collisions in the custom regex manager (#687) and the conda-forge routing for gurobi-logtools (#646).
  • Fixed the Read the Docs build (#537).

Code quality

  • assert statements removed from library code (#691); exception handling narrowed in the core modules (#720).
  • Wildcard imports reduced (#707); print replaced by the logging module (#665).
  • Dynamic getattr/setattr/hasattr with fixed names replaced by direct attribute access (#767).
  • xarray output functions simplified (#719); time series creation extracted from aggregateTemporally (#746).
  • Extended ruff coverage plus missing docstrings (#527), general codebase cleanup (#553), spelling fixes (#662), and fewer warnings in the test suite (#666).

Documentation

  • Migrated from Sphinx to MkDocs Material (#612), with branding and link cleanup (#793) and a new FINE logo (#637).
  • API documentation for the conversionPartLoad subclass (#688) and an improved balanceLimit docstring (#523).
  • Installation instructions now use the fine_env conda environment.
  • Added the JuRSE Code of the Month badge.

Infrastructure

  • Workflows migrated to uv and to the v1 workflow set (#651); Gurobi is used in CI for speed (#632).
  • Pytest markers allow long optimization tests to run in parallel (#641).
  • Dependency ranges are tested from a single source of truth with Renovate driving automatic range updates (#563), plus a dedicated scheduled workflow for dependency-version testing (#669).
  • GitLab/JuGit mirroring workflows consolidated; codecov configuration added.

Dependency updates

Notable bumps: numpy<=2.5.0, pandas>=2.2,<3, xarray<=2026.7.0, pyomo<=6.10.1, scikit-learn<=1.9.0, geopandas<=1.1.4, matplotlib<=3.11.1, scipy<=1.17.1, rasterio<=1.5.0, netcdf4<=1.7.4, tsam==3.4.2, pwlf<=2.6.0, gurobipy<=13.0.2, highspy<=1.15.1, gurobi-logtools<=4.0.1, psutil<=7.2.2, pytest<=9.1.1, pytest-cov<=7.1.0, pytest-xdist<=3.8.0, ipykernel<=7.2.0, ruff<=0.13.1.

Full Changelog: v2.6.0...v2.7.0