Version 2.7.0
Release date: 2026-08-11 · 188 commits since v2.6.0 (2fa3ba9b … 541a88b8)
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,energySystemModelRunFromExcelandreadOptimizationOutputFromExcelare gone fromfine.IOManagement.standardIO. Example04was removed and the remaining examples renumbered (11_Partload→10_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 parameterisStateOfChargeremoved (#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.gurobipyandhighspyare now regular runtime dependencies. Python>=3.10,<3.15. - Docs dependencies switched from Sphinx to the MkDocs stack in the
developextra.
Features
- Ramping constraints (#511). Inter-period ramp limits for
Conversioncomponents viarampUpMax/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). NewminimumDowntimeRequiredflag: each eligible component/location must be offline for at leastdownTimeMinhours per investment period, reusing the existing binary operation status. RequiresdownTimeMinand 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 fromfine/__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.pywith 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:
plotPieChartis 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=Truetogether 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
assertstatements removed from library code (#691); exception handling narrowed in the core modules (#720).- Wildcard imports reduced (#707);
printreplaced by theloggingmodule (#665). - Dynamic
getattr/setattr/hasattrwith 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
conversionPartLoadsubclass (#688) and an improvedbalanceLimitdocstring (#523). - Installation instructions now use the
fine_envconda environment. - Added the JuRSE Code of the Month badge.
Infrastructure
- Workflows migrated to
uvand 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