flixopt 7.2.2__tar.gz → 8.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- flixopt-8.0.0/.release-please-manifest.json +3 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/CHANGELOG.md +14 -2
- {flixopt-7.2.2 → flixopt-8.0.0}/CITATION.cff +2 -2
- {flixopt-7.2.2 → flixopt-8.0.0}/PKG-INFO +4 -4
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/components.py +11 -2
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/elements.py +2 -2
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/features.py +7 -5
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/io.py +59 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/modeling.py +16 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/results.py +10 -1
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/statistics_accessor.py +10 -1
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/PKG-INFO +4 -4
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/requires.txt +3 -3
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/scm_file_list.json +211 -209
- flixopt-8.0.0/flixopt.egg-info/scm_version.json +8 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/pyproject.toml +3 -3
- flixopt-7.2.2/.release-please-manifest.json +0 -3
- flixopt-7.2.2/flixopt.egg-info/scm_version.json +0 -8
- {flixopt-7.2.2 → flixopt-8.0.0}/.release-please-config.json +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/CONTRIBUTING.md +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/LICENSE +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/MANIFEST.in +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/README.md +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/benchmarks/benchmark_io_performance.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/__init__.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/carrier.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/clustering/__init__.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/clustering/base.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/clustering/intercluster_helpers.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/color_processing.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/comparison.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/config.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/core.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/effects.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/flow_system.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/interface.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/linear_converters.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/network_app.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/optimization.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/optimize_accessor.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/plot_result.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/plotting.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/solvers.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/stats_accessor.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/structure.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/topology_accessor.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/transform_accessor.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/tutorials/__init__.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/tutorials/_examples.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/tutorials/_tutorial_data.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/types.py +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/SOURCES.txt +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/dependency_links.txt +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/top_level.txt +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/setup.cfg +0 -0
- {flixopt-7.2.2 → flixopt-8.0.0}/test_deprecations.py +0 -0
|
@@ -11,12 +11,24 @@ For more details regarding the individual PRs and contributors, please refer to
|
|
|
11
11
|
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
-
## [
|
|
14
|
+
## [8.0.0](https://github.com/flixOpt/flixopt/compare/v7.2.1...v8.0.0) (2026-07-27)
|
|
15
15
|
|
|
16
16
|
|
|
17
|
+
### ⚠ BREAKING CHANGES
|
|
18
|
+
|
|
19
|
+
* the serialized clustering format changed - slice dims are now stored as 'period' (was '_period') plus a new 'dim_names' key. Clustering artifacts saved to JSON/netCDF by an older flixopt no longer load for apply_clustering()/expand() in this version; re-run transform.cluster() to regenerate them. Fresh clustering and same-version round-trips are unaffected. Also raises the minimum tsam_xarray to 0.6.4.
|
|
20
|
+
|
|
17
21
|
### Bug Fixes
|
|
18
22
|
|
|
19
|
-
*
|
|
23
|
+
* dimension-aware effect-total consistency check ([#745](https://github.com/flixOpt/flixopt/issues/745)) ([2b2720c](https://github.com/flixOpt/flixopt/commit/2b2720c20b5d19f3935759904f2b9199e466493a))
|
|
24
|
+
* load clustered NetCDF files written before flixopt 7.0 ([#757](https://github.com/flixOpt/flixopt/issues/757)) ([f8e53bd](https://github.com/flixOpt/flixopt/commit/f8e53bddcc2c844178ee557ad19568f8886e22af))
|
|
25
|
+
* load pre-7.0 clustered NetCDF files with legacy original_data refs ([#742](https://github.com/flixOpt/flixopt/issues/742)) ([6962e5e](https://github.com/flixOpt/flixopt/commit/6962e5e066c2f251ed5768a4804b5fe5185aa689))
|
|
26
|
+
* support linopy 0.9.0 ([#758](https://github.com/flixOpt/flixopt/issues/758)) ([051480b](https://github.com/flixOpt/flixopt/commit/051480b9af70933edf6afb24bfeef8e0aa7e0c10))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
### Code Refactoring
|
|
30
|
+
|
|
31
|
+
* drop clustering dim-rename layer via tsam-xarray DimNames ([#739](https://github.com/flixOpt/flixopt/issues/739)) ([cc56774](https://github.com/flixOpt/flixopt/commit/cc56774d31e05d637ee40424ec64af276716cc2f))
|
|
20
32
|
|
|
21
33
|
## [7.2.1](https://github.com/flixOpt/flixopt/compare/v7.2.0...v7.2.1) (2026-07-21)
|
|
22
34
|
|
|
@@ -2,8 +2,8 @@ cff-version: 1.2.0
|
|
|
2
2
|
message: "If you use this software, please cite it as below and consider citing the related publication."
|
|
3
3
|
type: software
|
|
4
4
|
title: "flixopt"
|
|
5
|
-
version:
|
|
6
|
-
date-released: 2026-07-
|
|
5
|
+
version: 8.0.0 # x-release-please-version
|
|
6
|
+
date-released: 2026-07-21
|
|
7
7
|
url: "https://github.com/flixOpt/flixopt"
|
|
8
8
|
repository-code: "https://github.com/flixOpt/flixopt"
|
|
9
9
|
license: MIT
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flixopt
|
|
3
|
-
Version:
|
|
3
|
+
Version: 8.0.0
|
|
4
4
|
Summary: Progressive flow system optimization in Python - start simple, scale to complex.
|
|
5
5
|
Author-email: "Chair of Building Energy Systems and Heat Supply, TU Dresden" <peter.stange@tu-dresden.de>, Felix Bumann <felixbumann387@gmail.com>, Felix Panitz <baumbude@googlemail.com>, Peter Stange <peter.stange@tu-dresden.de>
|
|
6
6
|
Maintainer-email: Felix Bumann <felixbumann387@gmail.com>, Peter Stange <peter.stange@tu-dresden.de>
|
|
@@ -22,8 +22,8 @@ Description-Content-Type: text/markdown
|
|
|
22
22
|
License-File: LICENSE
|
|
23
23
|
Requires-Dist: numpy<3,>=1.21.5
|
|
24
24
|
Requires-Dist: pandas<3,>=2.0.0
|
|
25
|
-
Requires-Dist: xarray<2026.
|
|
26
|
-
Requires-Dist: linopy<0.
|
|
25
|
+
Requires-Dist: xarray<2026.8,>=2024.2.0
|
|
26
|
+
Requires-Dist: linopy<0.10,>=0.5.1
|
|
27
27
|
Requires-Dist: netcdf4<1.7.5,>=1.6.1
|
|
28
28
|
Requires-Dist: pyyaml<7,>=6.0.0
|
|
29
29
|
Requires-Dist: colorlog<7,>=6.8.0
|
|
@@ -55,7 +55,7 @@ Requires-Dist: werkzeug<4,>=3.0.0; extra == "full"
|
|
|
55
55
|
Requires-Dist: flask<4,>=3.0.0; extra == "full"
|
|
56
56
|
Requires-Dist: pooch<2,>=1.8.0; extra == "full"
|
|
57
57
|
Provides-Extra: dev
|
|
58
|
-
Requires-Dist: xarray<2026.
|
|
58
|
+
Requires-Dist: xarray<2026.8; extra == "dev"
|
|
59
59
|
Requires-Dist: tsam_xarray==0.6.1; extra == "dev"
|
|
60
60
|
Requires-Dist: tsam==3.4.0; extra == "dev"
|
|
61
61
|
Requires-Dist: pytest==9.1.1; extra == "dev"
|
|
@@ -17,7 +17,13 @@ from .core import PlausibilityError
|
|
|
17
17
|
from .elements import Component, ComponentModel, Flow
|
|
18
18
|
from .features import InvestmentModel, PiecewiseModel
|
|
19
19
|
from .interface import InvestParameters, PiecewiseConversion, StatusParameters
|
|
20
|
-
from .modeling import
|
|
20
|
+
from .modeling import (
|
|
21
|
+
BoundingPatterns,
|
|
22
|
+
_scalar_safe_isel,
|
|
23
|
+
_scalar_safe_isel_drop,
|
|
24
|
+
_scalar_safe_reduce,
|
|
25
|
+
_set_constraint_lhs,
|
|
26
|
+
)
|
|
21
27
|
from .structure import FlowSystemModel, VariableCategory, register_class_for_io
|
|
22
28
|
|
|
23
29
|
if TYPE_CHECKING:
|
|
@@ -849,7 +855,10 @@ class TransmissionModel(ComponentModel):
|
|
|
849
855
|
)
|
|
850
856
|
|
|
851
857
|
if (self.element.absolute_losses is not None) and np.any(self.element.absolute_losses != 0):
|
|
852
|
-
|
|
858
|
+
_set_constraint_lhs(
|
|
859
|
+
con_transmission,
|
|
860
|
+
con_transmission.lhs + in_flow.submodel.status.status * self.element.absolute_losses,
|
|
861
|
+
)
|
|
853
862
|
|
|
854
863
|
return con_transmission
|
|
855
864
|
|
|
@@ -16,7 +16,7 @@ from .config import CONFIG
|
|
|
16
16
|
from .core import PlausibilityError
|
|
17
17
|
from .features import InvestmentModel, StatusModel
|
|
18
18
|
from .interface import InvestParameters, StatusParameters
|
|
19
|
-
from .modeling import BoundingPatterns, ModelingPrimitives, ModelingUtilitiesAbstract
|
|
19
|
+
from .modeling import BoundingPatterns, ModelingPrimitives, ModelingUtilitiesAbstract, _set_constraint_lhs
|
|
20
20
|
from .structure import (
|
|
21
21
|
Element,
|
|
22
22
|
ElementModel,
|
|
@@ -1033,7 +1033,7 @@ class BusModel(ElementModel):
|
|
|
1033
1033
|
)
|
|
1034
1034
|
|
|
1035
1035
|
# Σ(inflows) + virtual_supply = Σ(outflows) + virtual_demand
|
|
1036
|
-
eq_bus_balance.lhs
|
|
1036
|
+
_set_constraint_lhs(eq_bus_balance, eq_bus_balance.lhs + self.virtual_supply - self.virtual_demand)
|
|
1037
1037
|
|
|
1038
1038
|
# Add penalty shares as temporal effects (time-dependent)
|
|
1039
1039
|
from .effects import PENALTY_EFFECT_LABEL
|
|
@@ -10,7 +10,7 @@ from typing import TYPE_CHECKING
|
|
|
10
10
|
import linopy
|
|
11
11
|
import numpy as np
|
|
12
12
|
|
|
13
|
-
from .modeling import BoundingPatterns, ModelingPrimitives, ModelingUtilities
|
|
13
|
+
from .modeling import BoundingPatterns, ModelingPrimitives, ModelingUtilities, _set_constraint_lhs
|
|
14
14
|
from .structure import FlowSystemModel, Submodel, VariableCategory
|
|
15
15
|
|
|
16
16
|
if TYPE_CHECKING:
|
|
@@ -664,7 +664,9 @@ class ShareAllocationModel(Submodel):
|
|
|
664
664
|
# Add it to the total (cluster_weight handles cluster representation, defaults to 1.0)
|
|
665
665
|
# Sum over all temporal dimensions (time, and cluster if present)
|
|
666
666
|
weighted_per_timestep = self.total_per_timestep * self._model.weights.get('cluster', 1.0)
|
|
667
|
-
|
|
667
|
+
_set_constraint_lhs(
|
|
668
|
+
self._eq_total, self._eq_total.lhs - weighted_per_timestep.sum(dim=self._model.temporal_dims)
|
|
669
|
+
)
|
|
668
670
|
|
|
669
671
|
def add_share(
|
|
670
672
|
self,
|
|
@@ -694,7 +696,7 @@ class ShareAllocationModel(Submodel):
|
|
|
694
696
|
raise ValueError('Cannot add share with scenario-dim to a model without scenario-dim')
|
|
695
697
|
|
|
696
698
|
if name in self.shares:
|
|
697
|
-
self.share_constraints[name].lhs
|
|
699
|
+
_set_constraint_lhs(self.share_constraints[name], self.share_constraints[name].lhs - expression)
|
|
698
700
|
else:
|
|
699
701
|
# Temporal shares (with 'time' dim) are segment totals that need division
|
|
700
702
|
category = VariableCategory.SHARE if 'time' in dims else None
|
|
@@ -710,6 +712,6 @@ class ShareAllocationModel(Submodel):
|
|
|
710
712
|
)
|
|
711
713
|
|
|
712
714
|
if 'time' not in dims:
|
|
713
|
-
self._eq_total.lhs
|
|
715
|
+
_set_constraint_lhs(self._eq_total, self._eq_total.lhs - self.shares[name])
|
|
714
716
|
else:
|
|
715
|
-
self._eq_total_per_timestep.lhs
|
|
717
|
+
_set_constraint_lhs(self._eq_total_per_timestep, self._eq_total_per_timestep.lhs - self.shares[name])
|
|
@@ -1846,6 +1846,7 @@ class FlowSystemDatasetIO:
|
|
|
1846
1846
|
# such files remain loadable.
|
|
1847
1847
|
clustering_structure.pop('_original_data_refs', None)
|
|
1848
1848
|
clustering_structure.pop('_metrics_refs', None)
|
|
1849
|
+
clustering_structure = cls._migrate_legacy_clustering_result(clustering_structure, flow_system)
|
|
1849
1850
|
clustering = fs_cls._resolve_reference_structure(clustering_structure, {})
|
|
1850
1851
|
flow_system.clustering = clustering
|
|
1851
1852
|
|
|
@@ -1853,6 +1854,64 @@ class FlowSystemDatasetIO:
|
|
|
1853
1854
|
if hasattr(clustering, 'cluster_occurrences'):
|
|
1854
1855
|
flow_system.cluster_weight = clustering.cluster_occurrences.rename('cluster_weight')
|
|
1855
1856
|
|
|
1857
|
+
LEGACY_SLICE_DIM_RENAMES = {'period': '_period', 'cluster': '_cluster'}
|
|
1858
|
+
LEGACY_KEY_SEPARATOR = '|'
|
|
1859
|
+
|
|
1860
|
+
@classmethod
|
|
1861
|
+
def _migrate_legacy_clustering_result(
|
|
1862
|
+
cls,
|
|
1863
|
+
clustering_structure: dict[str, Any],
|
|
1864
|
+
flow_system: FlowSystem,
|
|
1865
|
+
) -> dict[str, Any]:
|
|
1866
|
+
"""Convert a pre-7.0 ``clustering.results`` blob to the current schema.
|
|
1867
|
+
|
|
1868
|
+
Files written before flixopt 7.0 stored the clustering as
|
|
1869
|
+
``{'dim_names': [...], 'results': {key: tsam_blob}}``, keyed by the slice
|
|
1870
|
+
coordinates joined into a string (``'2030|low'``, or ``'__single__'`` when
|
|
1871
|
+
undivided). ``Clustering`` now expects a ``clustering_result`` matching
|
|
1872
|
+
``tsam_xarray.ClusteringResult.from_dict``, which takes a list of
|
|
1873
|
+
``{'key': [...], 'clustering': tsam_blob}`` entries and indexes them by the
|
|
1874
|
+
coordinate values themselves -- so ``'2030'`` has to become the integer 2030
|
|
1875
|
+
or every lookup silently misses. The values are recovered by matching against
|
|
1876
|
+
the coordinates already restored on ``flow_system``, rather than by guessing a
|
|
1877
|
+
type, so labels that merely look numeric survive unchanged.
|
|
1878
|
+
|
|
1879
|
+
The per-slice tsam blobs are identical between the two layouts; only the
|
|
1880
|
+
structure around them is rewritten.
|
|
1881
|
+
"""
|
|
1882
|
+
if 'clustering_result' in clustering_structure or 'results' not in clustering_structure:
|
|
1883
|
+
return clustering_structure
|
|
1884
|
+
|
|
1885
|
+
legacy = clustering_structure.pop('results')
|
|
1886
|
+
dims = list(legacy.get('dim_names') or [])
|
|
1887
|
+
|
|
1888
|
+
lookups = []
|
|
1889
|
+
for dim in dims:
|
|
1890
|
+
index = getattr(flow_system, f'{dim}s', None)
|
|
1891
|
+
values = [] if index is None else list(index)
|
|
1892
|
+
# .item() unwraps numpy scalars so the keys stay plain Python values
|
|
1893
|
+
lookups.append({str(value): value.item() if hasattr(value, 'item') else value for value in values})
|
|
1894
|
+
|
|
1895
|
+
clusterings = []
|
|
1896
|
+
for key, blob in legacy.get('results', {}).items():
|
|
1897
|
+
# Split only when several dims share the key, so single-dim labels
|
|
1898
|
+
# containing the separator stay intact.
|
|
1899
|
+
parts = key.split(cls.LEGACY_KEY_SEPARATOR) if len(dims) > 1 else [key]
|
|
1900
|
+
clusterings.append(
|
|
1901
|
+
{
|
|
1902
|
+
'key': [lookup.get(part, part) for lookup, part in zip(lookups, parts, strict=False)],
|
|
1903
|
+
'clustering': blob,
|
|
1904
|
+
}
|
|
1905
|
+
)
|
|
1906
|
+
|
|
1907
|
+
clustering_structure['clustering_result'] = {
|
|
1908
|
+
'time_dim': 'time',
|
|
1909
|
+
'cluster_dim': ['variable'],
|
|
1910
|
+
'slice_dims': [cls.LEGACY_SLICE_DIM_RENAMES.get(dim, dim) for dim in dims],
|
|
1911
|
+
'clusterings': clusterings,
|
|
1912
|
+
}
|
|
1913
|
+
return clustering_structure
|
|
1914
|
+
|
|
1856
1915
|
@staticmethod
|
|
1857
1916
|
def _restore_metadata(
|
|
1858
1917
|
flow_system: FlowSystem,
|
|
@@ -76,6 +76,22 @@ def _scalar_safe_reduce(data: xr.DataArray | Any, dim: str, method: str = 'mean'
|
|
|
76
76
|
return data
|
|
77
77
|
|
|
78
78
|
|
|
79
|
+
def _set_constraint_lhs(constraint: linopy.Constraint, lhs) -> None:
|
|
80
|
+
"""Replace a constraint's LHS, compatibly across linopy versions.
|
|
81
|
+
|
|
82
|
+
Incremental accumulators (e.g. share totals) must mutate a constraint after
|
|
83
|
+
it is created. linopy >= 0.8 exposes ``Constraint.update(lhs=...)`` and
|
|
84
|
+
deprecates the ``.lhs`` setter (flixopt escalates that deprecation to an
|
|
85
|
+
error); linopy < 0.8 has only the setter, which is not deprecated there.
|
|
86
|
+
Dispatch on whichever API the installed linopy provides so the same call
|
|
87
|
+
works — and warns on neither — under both.
|
|
88
|
+
"""
|
|
89
|
+
if hasattr(constraint, 'update'):
|
|
90
|
+
constraint.update(lhs=lhs)
|
|
91
|
+
else:
|
|
92
|
+
constraint.lhs = lhs
|
|
93
|
+
|
|
94
|
+
|
|
79
95
|
def _xr_allclose(a: xr.DataArray, b: xr.DataArray, rtol: float = 1e-5, atol: float = 1e-8) -> bool:
|
|
80
96
|
"""Check if two DataArrays are element-wise equal within tolerance.
|
|
81
97
|
|
|
@@ -966,7 +966,16 @@ class Results(CompositeContainerMixin['ComponentResults | BusResults | EffectRes
|
|
|
966
966
|
label = f'{effect}{suffix[mode]}'
|
|
967
967
|
computed = ds[effect].sum('component')
|
|
968
968
|
found = self.solution[label]
|
|
969
|
-
if
|
|
969
|
+
if set(computed.dims) != set(found.dims):
|
|
970
|
+
logger.critical(
|
|
971
|
+
f'Results for {effect}({mode}) in effects_dataset doesnt match {label}: '
|
|
972
|
+
f'dimension mismatch {computed.dims=} vs {found.dims=}'
|
|
973
|
+
)
|
|
974
|
+
elif not np.allclose(
|
|
975
|
+
computed.fillna(0).values,
|
|
976
|
+
found.transpose(*computed.dims).fillna(0).values,
|
|
977
|
+
equal_nan=True,
|
|
978
|
+
):
|
|
970
979
|
logger.critical(
|
|
971
980
|
f'Results for {effect}({mode}) in effects_dataset doesnt match {label}\n{computed=}\n, {found=}'
|
|
972
981
|
)
|
|
@@ -935,7 +935,16 @@ class StatisticsAccessor:
|
|
|
935
935
|
if label in solution:
|
|
936
936
|
computed = ds[effect].sum('contributor')
|
|
937
937
|
found = solution[label]
|
|
938
|
-
if
|
|
938
|
+
if set(computed.dims) != set(found.dims):
|
|
939
|
+
logger.critical(
|
|
940
|
+
f'Results for {effect}({mode}) in effects_dataset doesnt match {label}: '
|
|
941
|
+
f'dimension mismatch {computed.dims=} vs {found.dims=}'
|
|
942
|
+
)
|
|
943
|
+
elif not np.allclose(
|
|
944
|
+
computed.fillna(0).values,
|
|
945
|
+
found.transpose(*computed.dims).fillna(0).values,
|
|
946
|
+
equal_nan=True,
|
|
947
|
+
):
|
|
939
948
|
logger.critical(
|
|
940
949
|
f'Results for {effect}({mode}) in effects_dataset doesnt match {label}\n{computed=}\n, {found=}'
|
|
941
950
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flixopt
|
|
3
|
-
Version:
|
|
3
|
+
Version: 8.0.0
|
|
4
4
|
Summary: Progressive flow system optimization in Python - start simple, scale to complex.
|
|
5
5
|
Author-email: "Chair of Building Energy Systems and Heat Supply, TU Dresden" <peter.stange@tu-dresden.de>, Felix Bumann <felixbumann387@gmail.com>, Felix Panitz <baumbude@googlemail.com>, Peter Stange <peter.stange@tu-dresden.de>
|
|
6
6
|
Maintainer-email: Felix Bumann <felixbumann387@gmail.com>, Peter Stange <peter.stange@tu-dresden.de>
|
|
@@ -22,8 +22,8 @@ Description-Content-Type: text/markdown
|
|
|
22
22
|
License-File: LICENSE
|
|
23
23
|
Requires-Dist: numpy<3,>=1.21.5
|
|
24
24
|
Requires-Dist: pandas<3,>=2.0.0
|
|
25
|
-
Requires-Dist: xarray<2026.
|
|
26
|
-
Requires-Dist: linopy<0.
|
|
25
|
+
Requires-Dist: xarray<2026.8,>=2024.2.0
|
|
26
|
+
Requires-Dist: linopy<0.10,>=0.5.1
|
|
27
27
|
Requires-Dist: netcdf4<1.7.5,>=1.6.1
|
|
28
28
|
Requires-Dist: pyyaml<7,>=6.0.0
|
|
29
29
|
Requires-Dist: colorlog<7,>=6.8.0
|
|
@@ -55,7 +55,7 @@ Requires-Dist: werkzeug<4,>=3.0.0; extra == "full"
|
|
|
55
55
|
Requires-Dist: flask<4,>=3.0.0; extra == "full"
|
|
56
56
|
Requires-Dist: pooch<2,>=1.8.0; extra == "full"
|
|
57
57
|
Provides-Extra: dev
|
|
58
|
-
Requires-Dist: xarray<2026.
|
|
58
|
+
Requires-Dist: xarray<2026.8; extra == "dev"
|
|
59
59
|
Requires-Dist: tsam_xarray==0.6.1; extra == "dev"
|
|
60
60
|
Requires-Dist: tsam==3.4.0; extra == "dev"
|
|
61
61
|
Requires-Dist: pytest==9.1.1; extra == "dev"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
numpy<3,>=1.21.5
|
|
2
2
|
pandas<3,>=2.0.0
|
|
3
|
-
xarray<2026.
|
|
4
|
-
linopy<0.
|
|
3
|
+
xarray<2026.8,>=2024.2.0
|
|
4
|
+
linopy<0.10,>=0.5.1
|
|
5
5
|
netcdf4<1.7.5,>=1.6.1
|
|
6
6
|
pyyaml<7,>=6.0.0
|
|
7
7
|
colorlog<7,>=6.8.0
|
|
@@ -12,7 +12,7 @@ plotly<7,>=5.15.0
|
|
|
12
12
|
xarray_plotly<1,>=0.0.13
|
|
13
13
|
|
|
14
14
|
[dev]
|
|
15
|
-
xarray<2026.
|
|
15
|
+
xarray<2026.8
|
|
16
16
|
tsam_xarray==0.6.1
|
|
17
17
|
tsam==3.4.0
|
|
18
18
|
pytest==9.1.1
|
|
@@ -1,275 +1,277 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": [
|
|
3
|
-
".
|
|
4
|
-
"
|
|
3
|
+
".release-please-manifest.json",
|
|
4
|
+
"mkdocs.yml",
|
|
5
5
|
"CHANGELOG.md",
|
|
6
|
-
"
|
|
6
|
+
".pre-commit-config.yaml",
|
|
7
|
+
"MANIFEST.in",
|
|
7
8
|
"test_deprecations.py",
|
|
8
|
-
"
|
|
9
|
-
".release-please-manifest.json",
|
|
9
|
+
"CONTRIBUTING.md",
|
|
10
10
|
"pyproject.toml",
|
|
11
|
-
"MANIFEST.in",
|
|
12
11
|
".release-please-config.json",
|
|
13
|
-
".pre-commit-config.yaml",
|
|
14
12
|
"LICENSE",
|
|
15
|
-
"
|
|
16
|
-
"
|
|
13
|
+
"CITATION.cff",
|
|
14
|
+
"README.md",
|
|
15
|
+
".gitignore",
|
|
17
16
|
".github/pull_request_template.md",
|
|
18
17
|
".github/dependabot.yml",
|
|
18
|
+
".github/ISSUE_TEMPLATE/bug_report.yml",
|
|
19
|
+
".github/ISSUE_TEMPLATE/config.yml",
|
|
20
|
+
".github/ISSUE_TEMPLATE/task.yml",
|
|
21
|
+
".github/ISSUE_TEMPLATE/feature_request.yml",
|
|
22
|
+
".github/workflows/pr-title.yaml",
|
|
23
|
+
".github/workflows/release.yaml",
|
|
24
|
+
".github/workflows/dependabot-auto-merge.yaml",
|
|
19
25
|
".github/workflows/tutorial-data.yaml",
|
|
20
26
|
".github/workflows/docs.yaml",
|
|
21
|
-
".github/workflows/pr-title.yaml",
|
|
22
27
|
".github/workflows/publish.yaml",
|
|
23
|
-
".github/workflows/dependabot-auto-merge.yaml",
|
|
24
|
-
".github/workflows/release.yaml",
|
|
25
28
|
".github/workflows/tests.yaml",
|
|
26
|
-
".github/ISSUE_TEMPLATE/task.yml",
|
|
27
|
-
".github/ISSUE_TEMPLATE/feature_request.yml",
|
|
28
|
-
".github/ISSUE_TEMPLATE/config.yml",
|
|
29
|
-
".github/ISSUE_TEMPLATE/bug_report.yml",
|
|
30
|
-
"flixopt/network_app.py",
|
|
31
|
-
"flixopt/plotting.py",
|
|
32
|
-
"flixopt/structure.py",
|
|
33
|
-
"flixopt/statistics_accessor.py",
|
|
34
|
-
"flixopt/topology_accessor.py",
|
|
35
|
-
"flixopt/optimization.py",
|
|
36
|
-
"flixopt/types.py",
|
|
37
|
-
"flixopt/interface.py",
|
|
38
|
-
"flixopt/components.py",
|
|
39
|
-
"flixopt/flow_system.py",
|
|
40
|
-
"flixopt/elements.py",
|
|
41
|
-
"flixopt/config.py",
|
|
42
|
-
"flixopt/carrier.py",
|
|
43
|
-
"flixopt/transform_accessor.py",
|
|
44
|
-
"flixopt/core.py",
|
|
45
|
-
"flixopt/effects.py",
|
|
46
|
-
"flixopt/color_processing.py",
|
|
47
|
-
"flixopt/results.py",
|
|
48
|
-
"flixopt/solvers.py",
|
|
49
|
-
"flixopt/modeling.py",
|
|
50
|
-
"flixopt/stats_accessor.py",
|
|
51
|
-
"flixopt/features.py",
|
|
52
|
-
"flixopt/linear_converters.py",
|
|
53
|
-
"flixopt/optimize_accessor.py",
|
|
54
|
-
"flixopt/plot_result.py",
|
|
55
|
-
"flixopt/comparison.py",
|
|
56
|
-
"flixopt/io.py",
|
|
57
|
-
"flixopt/__init__.py",
|
|
58
|
-
"flixopt/clustering/base.py",
|
|
59
|
-
"flixopt/clustering/intercluster_helpers.py",
|
|
60
|
-
"flixopt/clustering/__init__.py",
|
|
61
|
-
"flixopt/tutorials/_examples.py",
|
|
62
|
-
"flixopt/tutorials/_tutorial_data.py",
|
|
63
|
-
"flixopt/tutorials/__init__.py",
|
|
64
|
-
"pics/architecture_flixOpt-pre2.0.0.png",
|
|
65
|
-
"pics/architecture_flixOpt.png",
|
|
66
|
-
"pics/pics.pptx",
|
|
67
29
|
"pics/flixopt-icon.svg",
|
|
30
|
+
"pics/architecture_flixOpt-pre2.0.0.png",
|
|
68
31
|
"pics/flixOpt_plotting.jpg",
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"tests/conftest.py",
|
|
73
|
-
"tests/test_scenarios.py",
|
|
32
|
+
"pics/pics.pptx",
|
|
33
|
+
"pics/architecture_flixOpt.png",
|
|
34
|
+
"tests/__init__.py",
|
|
74
35
|
"tests/test_timeseries.py",
|
|
75
36
|
"tests/test_comparison.py",
|
|
37
|
+
"tests/test_scenarios.py",
|
|
38
|
+
"tests/test_effects_dataset_validation.py",
|
|
39
|
+
"tests/conftest.py",
|
|
76
40
|
"tests/test_tutorials.py",
|
|
77
|
-
"tests/
|
|
78
|
-
"tests/
|
|
79
|
-
"tests/test_clustering/test_integration.py",
|
|
80
|
-
"tests/test_clustering/test_cluster_reduce_expand.py",
|
|
81
|
-
"tests/test_clustering/test_clustering_io.py",
|
|
82
|
-
"tests/test_clustering/test_expansion_regression.py",
|
|
83
|
-
"tests/test_clustering/test_base.py",
|
|
84
|
-
"tests/test_clustering/__init__.py",
|
|
85
|
-
"tests/utilities/test_on_hours_computation.py",
|
|
86
|
-
"tests/utilities/test_cycle_detection.py",
|
|
87
|
-
"tests/utilities/test_config.py",
|
|
88
|
-
"tests/utilities/test_dataconverter.py",
|
|
89
|
-
"tests/utilities/test_effects_shares_summation.py",
|
|
90
|
-
"tests/utilities/__init__.py",
|
|
91
|
-
"tests/plotting/test_topology_accessor.py",
|
|
92
|
-
"tests/plotting/test_plotting_api.py",
|
|
93
|
-
"tests/plotting/test_heatmap_reshape.py",
|
|
94
|
-
"tests/plotting/test_network_app.py",
|
|
95
|
-
"tests/plotting/test_solution_and_plotting.py",
|
|
96
|
-
"tests/plotting/__init__.py",
|
|
97
|
-
"tests/io/test_io.py",
|
|
98
|
-
"tests/io/test_io_conversion.py",
|
|
99
|
-
"tests/io/__init__.py",
|
|
100
|
-
"tests/deprecated/test_flow.py",
|
|
101
|
-
"tests/deprecated/test_results_overwrite.py",
|
|
102
|
-
"tests/deprecated/test_resample_equivalence.py",
|
|
103
|
-
"tests/deprecated/test_integration.py",
|
|
104
|
-
"tests/deprecated/conftest.py",
|
|
105
|
-
"tests/deprecated/test_on_hours_computation.py",
|
|
106
|
-
"tests/deprecated/test_plotting_api.py",
|
|
107
|
-
"tests/deprecated/test_flow_system_resample.py",
|
|
108
|
-
"tests/deprecated/test_io.py",
|
|
109
|
-
"tests/deprecated/test_component.py",
|
|
110
|
-
"tests/deprecated/test_scenarios.py",
|
|
111
|
-
"tests/deprecated/test_heatmap_reshape.py",
|
|
112
|
-
"tests/deprecated/test_effect.py",
|
|
113
|
-
"tests/deprecated/test_network_app.py",
|
|
114
|
-
"tests/deprecated/test_timeseries.py",
|
|
115
|
-
"tests/deprecated/test_functional.py",
|
|
116
|
-
"tests/deprecated/test_linear_converter.py",
|
|
117
|
-
"tests/deprecated/test_cycle_detection.py",
|
|
118
|
-
"tests/deprecated/test_storage.py",
|
|
119
|
-
"tests/deprecated/test_config.py",
|
|
120
|
-
"tests/deprecated/test_bus.py",
|
|
121
|
-
"tests/deprecated/test_effects_shares_summation.py",
|
|
122
|
-
"tests/deprecated/test_examples.py",
|
|
123
|
-
"tests/deprecated/test_results_plots.py",
|
|
124
|
-
"tests/deprecated/test_results_io.py",
|
|
125
|
-
"tests/deprecated/__init__.py",
|
|
126
|
-
"tests/deprecated/examples/01_Simple/simple_example.py",
|
|
127
|
-
"tests/deprecated/examples/03_Optimization_modes/example_optimization_modes.py",
|
|
128
|
-
"tests/deprecated/examples/00_Minmal/minimal_example.py",
|
|
129
|
-
"tests/deprecated/examples/02_Complex/complex_example.py",
|
|
130
|
-
"tests/deprecated/examples/02_Complex/complex_example_results.py",
|
|
131
|
-
"tests/deprecated/examples/04_Scenarios/scenario_example.py",
|
|
132
|
-
"tests/deprecated/examples/05_Two-stage-optimization/two_stage_optimization.py",
|
|
41
|
+
"tests/ressources/Sim1--flow_system.nc4",
|
|
42
|
+
"tests/ressources/Zeitreihen2020.csv",
|
|
133
43
|
"tests/ressources/Sim1--solution.nc4",
|
|
134
44
|
"tests/ressources/Sim1--summary.yaml",
|
|
135
|
-
"tests/ressources/
|
|
136
|
-
"tests/ressources/Sim1--flow_system.nc4",
|
|
137
|
-
"tests/ressources/v4-api/01_simple--summary.yaml",
|
|
138
|
-
"tests/ressources/v4-api/01_simple--solution.nc4",
|
|
45
|
+
"tests/ressources/v4-api/01_simple--model_documentation.yaml",
|
|
139
46
|
"tests/ressources/v4-api/io_flow_system_segments--summary.yaml",
|
|
140
|
-
"tests/ressources/v4-api/
|
|
141
|
-
"tests/ressources/v4-api/
|
|
142
|
-
"tests/ressources/v4-api/
|
|
47
|
+
"tests/ressources/v4-api/02_complex--summary.yaml",
|
|
48
|
+
"tests/ressources/v4-api/04_scenarios--solution.nc4",
|
|
49
|
+
"tests/ressources/v4-api/01_simple--solution.nc4",
|
|
143
50
|
"tests/ressources/v4-api/02_complex--flow_system.nc4",
|
|
51
|
+
"tests/ressources/v4-api/io_simple_flow_system_scenarios--model_documentation.yaml",
|
|
52
|
+
"tests/ressources/v4-api/00_minimal--flow_system.nc4",
|
|
53
|
+
"tests/ressources/v4-api/io_flow_system_long--solution.nc4",
|
|
54
|
+
"tests/ressources/v4-api/01_simple--summary.yaml",
|
|
55
|
+
"tests/ressources/v4-api/io_flow_system_base--summary.yaml",
|
|
56
|
+
"tests/ressources/v4-api/02_complex--model_documentation.yaml",
|
|
57
|
+
"tests/ressources/v4-api/io_simple_flow_system--solution.nc4",
|
|
58
|
+
"tests/ressources/v4-api/00_minimal--summary.yaml",
|
|
144
59
|
"tests/ressources/v4-api/io_flow_system_long--flow_system.nc4",
|
|
145
|
-
"tests/ressources/v4-api/io_flow_system_long--model_documentation.yaml",
|
|
146
60
|
"tests/ressources/v4-api/io_simple_flow_system--model_documentation.yaml",
|
|
147
|
-
"tests/ressources/v4-api/io_flow_system_segments--solution.nc4",
|
|
148
|
-
"tests/ressources/v4-api/io_flow_system_base--solution.nc4",
|
|
149
|
-
"tests/ressources/v4-api/io_simple_flow_system--summary.yaml",
|
|
150
|
-
"tests/ressources/v4-api/io_simple_flow_system--flow_system.nc4",
|
|
151
61
|
"tests/ressources/v4-api/00_minimal--model_documentation.yaml",
|
|
152
|
-
"tests/ressources/v4-api/
|
|
62
|
+
"tests/ressources/v4-api/04_scenarios--flow_system.nc4",
|
|
153
63
|
"tests/ressources/v4-api/01_simple--flow_system.nc4",
|
|
154
|
-
"tests/ressources/v4-api/io_simple_flow_system--
|
|
64
|
+
"tests/ressources/v4-api/io_simple_flow_system--summary.yaml",
|
|
65
|
+
"tests/ressources/v4-api/io_flow_system_long--model_documentation.yaml",
|
|
155
66
|
"tests/ressources/v4-api/io_flow_system_base--model_documentation.yaml",
|
|
156
|
-
"tests/ressources/v4-api/02_complex--summary.yaml",
|
|
157
|
-
"tests/ressources/v4-api/io_flow_system_base--flow_system.nc4",
|
|
158
|
-
"tests/ressources/v4-api/02_complex--model_documentation.yaml",
|
|
159
|
-
"tests/ressources/v4-api/io_flow_system_base--summary.yaml",
|
|
160
|
-
"tests/ressources/v4-api/04_scenarios--model_documentation.yaml",
|
|
161
|
-
"tests/ressources/v4-api/04_scenarios--solution.nc4",
|
|
162
67
|
"tests/ressources/v4-api/io_simple_flow_system_scenarios--solution.nc4",
|
|
68
|
+
"tests/ressources/v4-api/00_minimal--solution.nc4",
|
|
69
|
+
"tests/ressources/v4-api/io_flow_system_base--flow_system.nc4",
|
|
70
|
+
"tests/ressources/v4-api/io_flow_system_base--solution.nc4",
|
|
163
71
|
"tests/ressources/v4-api/io_simple_flow_system_scenarios--flow_system.nc4",
|
|
164
|
-
"tests/ressources/v4-api/
|
|
165
|
-
"tests/ressources/v4-api/io_flow_system_segments--model_documentation.yaml",
|
|
166
|
-
"tests/ressources/v4-api/io_simple_flow_system_scenarios--model_documentation.yaml",
|
|
72
|
+
"tests/ressources/v4-api/io_flow_system_long--summary.yaml",
|
|
167
73
|
"tests/ressources/v4-api/io_flow_system_segments--flow_system.nc4",
|
|
168
|
-
"tests/ressources/v4-api/
|
|
169
|
-
"tests/ressources/v4-api/04_scenarios--flow_system.nc4",
|
|
170
|
-
"tests/ressources/v4-api/00_minimal--flow_system.nc4",
|
|
171
|
-
"tests/ressources/v4-api/00_minimal--summary.yaml",
|
|
74
|
+
"tests/ressources/v4-api/io_simple_flow_system--flow_system.nc4",
|
|
172
75
|
"tests/ressources/v4-api/io_simple_flow_system_scenarios--summary.yaml",
|
|
173
|
-
"tests/
|
|
174
|
-
"tests/
|
|
76
|
+
"tests/ressources/v4-api/04_scenarios--summary.yaml",
|
|
77
|
+
"tests/ressources/v4-api/04_scenarios--model_documentation.yaml",
|
|
78
|
+
"tests/ressources/v4-api/io_flow_system_segments--model_documentation.yaml",
|
|
79
|
+
"tests/ressources/v4-api/02_complex--solution.nc4",
|
|
80
|
+
"tests/ressources/v4-api/io_flow_system_segments--solution.nc4",
|
|
81
|
+
"tests/io/test_io.py",
|
|
82
|
+
"tests/io/__init__.py",
|
|
83
|
+
"tests/io/test_io_conversion.py",
|
|
84
|
+
"tests/flow_system/test_sel_isel_single_selection.py",
|
|
85
|
+
"tests/flow_system/test_flow_system_locking.py",
|
|
86
|
+
"tests/flow_system/test_flow_system_resample.py",
|
|
87
|
+
"tests/flow_system/__init__.py",
|
|
88
|
+
"tests/flow_system/test_resample_equivalence.py",
|
|
89
|
+
"tests/utilities/test_dataconverter.py",
|
|
90
|
+
"tests/utilities/test_on_hours_computation.py",
|
|
91
|
+
"tests/utilities/__init__.py",
|
|
92
|
+
"tests/utilities/test_effects_shares_summation.py",
|
|
93
|
+
"tests/utilities/test_cycle_detection.py",
|
|
94
|
+
"tests/utilities/test_config.py",
|
|
175
95
|
"tests/superseded/test_solution_persistence.py",
|
|
176
96
|
"tests/superseded/__init__.py",
|
|
97
|
+
"tests/superseded/test_integration.py",
|
|
98
|
+
"tests/superseded/test_functional.py",
|
|
99
|
+
"tests/superseded/math/test_linear_converter.py",
|
|
177
100
|
"tests/superseded/math/test_flow.py",
|
|
178
101
|
"tests/superseded/math/test_component.py",
|
|
102
|
+
"tests/superseded/math/__init__.py",
|
|
179
103
|
"tests/superseded/math/test_effect.py",
|
|
180
|
-
"tests/superseded/math/test_linear_converter.py",
|
|
181
|
-
"tests/superseded/math/test_storage.py",
|
|
182
104
|
"tests/superseded/math/test_bus.py",
|
|
183
|
-
"tests/superseded/math/
|
|
184
|
-
"tests/
|
|
105
|
+
"tests/superseded/math/test_storage.py",
|
|
106
|
+
"tests/test_clustering/test_clustered_roundtrip.py",
|
|
107
|
+
"tests/test_clustering/test_cluster_reduce_expand.py",
|
|
108
|
+
"tests/test_clustering/test_multiperiod_extremes.py",
|
|
109
|
+
"tests/test_clustering/test_base.py",
|
|
110
|
+
"tests/test_clustering/test_clustering_io.py",
|
|
111
|
+
"tests/test_clustering/__init__.py",
|
|
112
|
+
"tests/test_clustering/test_integration.py",
|
|
113
|
+
"tests/test_clustering/test_expansion_regression.py",
|
|
114
|
+
"tests/plotting/test_topology_accessor.py",
|
|
115
|
+
"tests/plotting/__init__.py",
|
|
116
|
+
"tests/plotting/test_plotting_api.py",
|
|
117
|
+
"tests/plotting/test_solution_and_plotting.py",
|
|
118
|
+
"tests/plotting/test_heatmap_reshape.py",
|
|
119
|
+
"tests/plotting/test_network_app.py",
|
|
185
120
|
"tests/test_math/test_multi_period.py",
|
|
186
|
-
"tests/test_math/test_conversion.py",
|
|
187
121
|
"tests/test_math/test_flow.py",
|
|
188
|
-
"tests/test_math/conftest.py",
|
|
189
122
|
"tests/test_math/test_effects.py",
|
|
190
|
-
"tests/test_math/test_flow_invest.py",
|
|
191
|
-
"tests/test_math/test_components.py",
|
|
192
|
-
"tests/test_math/PLAN.md",
|
|
193
|
-
"tests/test_math/test_piecewise.py",
|
|
194
|
-
"tests/test_math/test_scenarios.py",
|
|
195
|
-
"tests/test_math/test_flow_status.py",
|
|
196
123
|
"tests/test_math/test_combinations.py",
|
|
197
|
-
"tests/test_math/test_storage.py",
|
|
198
|
-
"tests/test_math/test_bus.py",
|
|
199
124
|
"tests/test_math/test_validation.py",
|
|
125
|
+
"tests/test_math/test_clustering.py",
|
|
126
|
+
"tests/test_math/test_piecewise.py",
|
|
127
|
+
"tests/test_math/test_flow_status.py",
|
|
200
128
|
"tests/test_math/__init__.py",
|
|
201
|
-
"tests/
|
|
202
|
-
"tests/
|
|
203
|
-
"tests/
|
|
204
|
-
"tests/
|
|
205
|
-
"tests/
|
|
129
|
+
"tests/test_math/test_conversion.py",
|
|
130
|
+
"tests/test_math/test_scenarios.py",
|
|
131
|
+
"tests/test_math/test_flow_invest.py",
|
|
132
|
+
"tests/test_math/test_bus.py",
|
|
133
|
+
"tests/test_math/PLAN.md",
|
|
134
|
+
"tests/test_math/test_components.py",
|
|
135
|
+
"tests/test_math/conftest.py",
|
|
136
|
+
"tests/test_math/test_storage.py",
|
|
137
|
+
"tests/deprecated/test_linear_converter.py",
|
|
138
|
+
"tests/deprecated/test_flow.py",
|
|
139
|
+
"tests/deprecated/test_results_overwrite.py",
|
|
140
|
+
"tests/deprecated/test_on_hours_computation.py",
|
|
141
|
+
"tests/deprecated/test_component.py",
|
|
142
|
+
"tests/deprecated/test_results_io.py",
|
|
143
|
+
"tests/deprecated/test_flow_system_resample.py",
|
|
144
|
+
"tests/deprecated/test_io.py",
|
|
145
|
+
"tests/deprecated/__init__.py",
|
|
146
|
+
"tests/deprecated/test_examples.py",
|
|
147
|
+
"tests/deprecated/test_integration.py",
|
|
148
|
+
"tests/deprecated/test_results_plots.py",
|
|
149
|
+
"tests/deprecated/test_timeseries.py",
|
|
150
|
+
"tests/deprecated/test_effects_shares_summation.py",
|
|
151
|
+
"tests/deprecated/test_plotting_api.py",
|
|
152
|
+
"tests/deprecated/test_effect.py",
|
|
153
|
+
"tests/deprecated/test_cycle_detection.py",
|
|
154
|
+
"tests/deprecated/test_scenarios.py",
|
|
155
|
+
"tests/deprecated/test_heatmap_reshape.py",
|
|
156
|
+
"tests/deprecated/test_resample_equivalence.py",
|
|
157
|
+
"tests/deprecated/test_bus.py",
|
|
158
|
+
"tests/deprecated/conftest.py",
|
|
159
|
+
"tests/deprecated/test_storage.py",
|
|
160
|
+
"tests/deprecated/test_config.py",
|
|
161
|
+
"tests/deprecated/test_network_app.py",
|
|
162
|
+
"tests/deprecated/test_functional.py",
|
|
163
|
+
"tests/deprecated/examples/00_Minmal/minimal_example.py",
|
|
164
|
+
"tests/deprecated/examples/05_Two-stage-optimization/two_stage_optimization.py",
|
|
165
|
+
"tests/deprecated/examples/02_Complex/complex_example.py",
|
|
166
|
+
"tests/deprecated/examples/02_Complex/complex_example_results.py",
|
|
167
|
+
"tests/deprecated/examples/01_Simple/simple_example.py",
|
|
168
|
+
"tests/deprecated/examples/03_Optimization_modes/example_optimization_modes.py",
|
|
169
|
+
"tests/deprecated/examples/04_Scenarios/scenario_example.py",
|
|
170
|
+
"scripts/gen_ref_pages.py",
|
|
171
|
+
"scripts/format_changelog.py",
|
|
172
|
+
"scripts/build_tutorial_datasets.py",
|
|
173
|
+
"flixopt/linear_converters.py",
|
|
174
|
+
"flixopt/types.py",
|
|
175
|
+
"flixopt/carrier.py",
|
|
176
|
+
"flixopt/elements.py",
|
|
177
|
+
"flixopt/comparison.py",
|
|
178
|
+
"flixopt/config.py",
|
|
179
|
+
"flixopt/features.py",
|
|
180
|
+
"flixopt/structure.py",
|
|
181
|
+
"flixopt/__init__.py",
|
|
182
|
+
"flixopt/optimize_accessor.py",
|
|
183
|
+
"flixopt/network_app.py",
|
|
184
|
+
"flixopt/solvers.py",
|
|
185
|
+
"flixopt/interface.py",
|
|
186
|
+
"flixopt/statistics_accessor.py",
|
|
187
|
+
"flixopt/plot_result.py",
|
|
188
|
+
"flixopt/flow_system.py",
|
|
189
|
+
"flixopt/results.py",
|
|
190
|
+
"flixopt/core.py",
|
|
191
|
+
"flixopt/plotting.py",
|
|
192
|
+
"flixopt/stats_accessor.py",
|
|
193
|
+
"flixopt/effects.py",
|
|
194
|
+
"flixopt/topology_accessor.py",
|
|
195
|
+
"flixopt/color_processing.py",
|
|
196
|
+
"flixopt/io.py",
|
|
197
|
+
"flixopt/components.py",
|
|
198
|
+
"flixopt/transform_accessor.py",
|
|
199
|
+
"flixopt/optimization.py",
|
|
200
|
+
"flixopt/modeling.py",
|
|
201
|
+
"flixopt/tutorials/__init__.py",
|
|
202
|
+
"flixopt/tutorials/_examples.py",
|
|
203
|
+
"flixopt/tutorials/_tutorial_data.py",
|
|
204
|
+
"flixopt/clustering/__init__.py",
|
|
205
|
+
"flixopt/clustering/intercluster_helpers.py",
|
|
206
|
+
"flixopt/clustering/base.py",
|
|
206
207
|
"docs/roadmap.md",
|
|
207
208
|
"docs/contribute.md",
|
|
208
209
|
"docs/index.md",
|
|
209
210
|
"docs/overrides/main.html",
|
|
210
|
-
"docs/
|
|
211
|
-
"docs/
|
|
212
|
-
"docs/
|
|
213
|
-
"docs/notebooks/07-scenarios-and-periods.ipynb",
|
|
214
|
-
"docs/notebooks/06b-piecewise-conversion.ipynb",
|
|
215
|
-
"docs/notebooks/04-operational-constraints.ipynb",
|
|
216
|
-
"docs/notebooks/08c-clustering.ipynb",
|
|
217
|
-
"docs/notebooks/06a-time-varying-parameters.ipynb",
|
|
218
|
-
"docs/notebooks/10-transmission.ipynb",
|
|
219
|
-
"docs/notebooks/06c-piecewise-effects.ipynb",
|
|
220
|
-
"docs/notebooks/05-multi-carrier-system.ipynb",
|
|
221
|
-
"docs/notebooks/02-heat-system.ipynb",
|
|
222
|
-
"docs/notebooks/09-plotting-and-data-access.ipynb",
|
|
223
|
-
"docs/notebooks/08a-aggregation.ipynb",
|
|
224
|
-
"docs/notebooks/index.md",
|
|
225
|
-
"docs/notebooks/01-quickstart.ipynb",
|
|
226
|
-
"docs/notebooks/08b-rolling-horizon.ipynb",
|
|
227
|
-
"docs/notebooks/slow_notebooks.txt",
|
|
228
|
-
"docs/notebooks/03-investment-optimization.ipynb",
|
|
229
|
-
"docs/notebooks/08c2-clustering-storage-modes.ipynb",
|
|
230
|
-
"docs/notebooks/data/generate_realistic_profiles.py",
|
|
231
|
-
"docs/notebooks/data/Zeitreihen2020.csv",
|
|
232
|
-
"docs/notebooks/data/generate_example_systems.py",
|
|
233
|
-
"docs/notebooks/data/__init__.py",
|
|
234
|
-
"docs/notebooks/data/raw/README.md",
|
|
235
|
-
"docs/notebooks/data/raw/electricity_prices_de_2020.csv",
|
|
236
|
-
"docs/notebooks/data/raw/tmy_dresden.csv",
|
|
237
|
-
"docs/user-guide/support.md",
|
|
238
|
-
"docs/user-guide/migration-guide-v5.md",
|
|
211
|
+
"docs/images/flixopt-icon.svg",
|
|
212
|
+
"docs/images/architecture_flixOpt-pre2.0.0.png",
|
|
213
|
+
"docs/images/architecture_flixOpt.png",
|
|
239
214
|
"docs/user-guide/glossary.md",
|
|
240
|
-
"docs/user-guide/
|
|
215
|
+
"docs/user-guide/migration-guide-v5.md",
|
|
216
|
+
"docs/user-guide/support.md",
|
|
217
|
+
"docs/user-guide/migration-guide-v3.md",
|
|
241
218
|
"docs/user-guide/plotly-customization.md",
|
|
242
|
-
"docs/user-guide/migration-guide-v6.md",
|
|
243
|
-
"docs/user-guide/index.md",
|
|
244
219
|
"docs/user-guide/migration-guide-v7.md",
|
|
245
|
-
"docs/user-guide/migration-guide-
|
|
246
|
-
"docs/user-guide/
|
|
220
|
+
"docs/user-guide/migration-guide-v6.md",
|
|
221
|
+
"docs/user-guide/results-plotting.md",
|
|
247
222
|
"docs/user-guide/troubleshooting.md",
|
|
248
|
-
"docs/user-guide/
|
|
223
|
+
"docs/user-guide/faq.md",
|
|
249
224
|
"docs/user-guide/core-concepts.md",
|
|
225
|
+
"docs/user-guide/colors.md",
|
|
226
|
+
"docs/user-guide/index.md",
|
|
250
227
|
"docs/user-guide/recipes/plotting-custom-data.md",
|
|
251
228
|
"docs/user-guide/recipes/index.md",
|
|
252
|
-
"docs/user-guide/
|
|
253
|
-
"docs/user-guide/building-models/index.md",
|
|
229
|
+
"docs/user-guide/results/index.md",
|
|
254
230
|
"docs/user-guide/mathematical-notation/effects-and-dimensions.md",
|
|
255
231
|
"docs/user-guide/mathematical-notation/index.md",
|
|
256
|
-
"docs/user-guide/mathematical-notation/elements/LinearConverter.md",
|
|
257
|
-
"docs/user-guide/mathematical-notation/elements/Bus.md",
|
|
258
232
|
"docs/user-guide/mathematical-notation/elements/Flow.md",
|
|
233
|
+
"docs/user-guide/mathematical-notation/elements/Bus.md",
|
|
259
234
|
"docs/user-guide/mathematical-notation/elements/Storage.md",
|
|
260
|
-
"docs/user-guide/mathematical-notation/
|
|
235
|
+
"docs/user-guide/mathematical-notation/elements/LinearConverter.md",
|
|
261
236
|
"docs/user-guide/mathematical-notation/features/StatusParameters.md",
|
|
262
237
|
"docs/user-guide/mathematical-notation/features/InvestParameters.md",
|
|
238
|
+
"docs/user-guide/mathematical-notation/features/Piecewise.md",
|
|
239
|
+
"docs/user-guide/building-models/choosing-components.md",
|
|
240
|
+
"docs/user-guide/building-models/index.md",
|
|
263
241
|
"docs/user-guide/optimization/clustering.md",
|
|
264
242
|
"docs/user-guide/optimization/index.md",
|
|
265
|
-
"docs/
|
|
266
|
-
"docs/images/architecture_flixOpt-pre2.0.0.png",
|
|
267
|
-
"docs/images/architecture_flixOpt.png",
|
|
268
|
-
"docs/images/flixopt-icon.svg",
|
|
269
|
-
"docs/home/citing.md",
|
|
243
|
+
"docs/stylesheets/extra.css",
|
|
270
244
|
"docs/home/quick-start.md",
|
|
271
|
-
"docs/home/
|
|
245
|
+
"docs/home/license.md",
|
|
246
|
+
"docs/home/citing.md",
|
|
272
247
|
"docs/home/installation.md",
|
|
273
|
-
"docs/home/
|
|
248
|
+
"docs/home/users.md",
|
|
249
|
+
"docs/notebooks/08c2-clustering-storage-modes.ipynb",
|
|
250
|
+
"docs/notebooks/07-scenarios-and-periods.ipynb",
|
|
251
|
+
"docs/notebooks/06b-piecewise-conversion.ipynb",
|
|
252
|
+
"docs/notebooks/05-multi-carrier-system.ipynb",
|
|
253
|
+
"docs/notebooks/01-quickstart.ipynb",
|
|
254
|
+
"docs/notebooks/02-heat-system.ipynb",
|
|
255
|
+
"docs/notebooks/08c-clustering.ipynb",
|
|
256
|
+
"docs/notebooks/04-operational-constraints.ipynb",
|
|
257
|
+
"docs/notebooks/06c-piecewise-effects.ipynb",
|
|
258
|
+
"docs/notebooks/08a-aggregation.ipynb",
|
|
259
|
+
"docs/notebooks/03-investment-optimization.ipynb",
|
|
260
|
+
"docs/notebooks/06a-time-varying-parameters.ipynb",
|
|
261
|
+
"docs/notebooks/10-transmission.ipynb",
|
|
262
|
+
"docs/notebooks/08b-rolling-horizon.ipynb",
|
|
263
|
+
"docs/notebooks/slow_notebooks.txt",
|
|
264
|
+
"docs/notebooks/09-plotting-and-data-access.ipynb",
|
|
265
|
+
"docs/notebooks/index.md",
|
|
266
|
+
"docs/notebooks/data/__init__.py",
|
|
267
|
+
"docs/notebooks/data/generate_example_systems.py",
|
|
268
|
+
"docs/notebooks/data/generate_realistic_profiles.py",
|
|
269
|
+
"docs/notebooks/data/Zeitreihen2020.csv",
|
|
270
|
+
"docs/notebooks/data/raw/electricity_prices_de_2020.csv",
|
|
271
|
+
"docs/notebooks/data/raw/tmy_dresden.csv",
|
|
272
|
+
"docs/notebooks/data/raw/README.md",
|
|
273
|
+
"docs/javascripts/plotly-instant.js",
|
|
274
|
+
"docs/javascripts/mathjax.js",
|
|
275
|
+
"benchmarks/benchmark_io_performance.py"
|
|
274
276
|
]
|
|
275
277
|
}
|
|
@@ -34,9 +34,9 @@ dependencies = [
|
|
|
34
34
|
# Core scientific computing
|
|
35
35
|
"numpy >= 1.21.5, < 3",
|
|
36
36
|
"pandas >= 2.0.0, < 3",
|
|
37
|
-
"xarray >=2024.2.0, <2026.
|
|
37
|
+
"xarray >=2024.2.0, <2026.8", # CalVer: allow through next calendar year
|
|
38
38
|
# Optimization and data handling
|
|
39
|
-
"linopy >=0.5.1, <0.
|
|
39
|
+
"linopy >=0.5.1, <0.10", # Widened from patch pin to minor range
|
|
40
40
|
"netcdf4 >=1.6.1, <1.7.5", # 1.7.4 missing wheels, revert to < 2 later
|
|
41
41
|
# Utilities
|
|
42
42
|
"pyyaml >= 6.0.0, < 7",
|
|
@@ -86,7 +86,7 @@ full = [
|
|
|
86
86
|
|
|
87
87
|
# Development tools and testing
|
|
88
88
|
dev = [
|
|
89
|
-
"xarray<2026.
|
|
89
|
+
"xarray<2026.8", # TODO: drop once linopy ships xarray 2026.3+ compat fix
|
|
90
90
|
"tsam_xarray==0.6.1", # Time series aggregation for clustering (wraps tsam)
|
|
91
91
|
"tsam==3.4.0", # Directly imported for ClusterConfig, ExtremeConfig, SegmentConfig
|
|
92
92
|
"pytest==9.1.1",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|