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.
Files changed (56) hide show
  1. flixopt-8.0.0/.release-please-manifest.json +3 -0
  2. {flixopt-7.2.2 → flixopt-8.0.0}/CHANGELOG.md +14 -2
  3. {flixopt-7.2.2 → flixopt-8.0.0}/CITATION.cff +2 -2
  4. {flixopt-7.2.2 → flixopt-8.0.0}/PKG-INFO +4 -4
  5. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/components.py +11 -2
  6. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/elements.py +2 -2
  7. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/features.py +7 -5
  8. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/io.py +59 -0
  9. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/modeling.py +16 -0
  10. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/results.py +10 -1
  11. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/statistics_accessor.py +10 -1
  12. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/PKG-INFO +4 -4
  13. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/requires.txt +3 -3
  14. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/scm_file_list.json +211 -209
  15. flixopt-8.0.0/flixopt.egg-info/scm_version.json +8 -0
  16. {flixopt-7.2.2 → flixopt-8.0.0}/pyproject.toml +3 -3
  17. flixopt-7.2.2/.release-please-manifest.json +0 -3
  18. flixopt-7.2.2/flixopt.egg-info/scm_version.json +0 -8
  19. {flixopt-7.2.2 → flixopt-8.0.0}/.release-please-config.json +0 -0
  20. {flixopt-7.2.2 → flixopt-8.0.0}/CONTRIBUTING.md +0 -0
  21. {flixopt-7.2.2 → flixopt-8.0.0}/LICENSE +0 -0
  22. {flixopt-7.2.2 → flixopt-8.0.0}/MANIFEST.in +0 -0
  23. {flixopt-7.2.2 → flixopt-8.0.0}/README.md +0 -0
  24. {flixopt-7.2.2 → flixopt-8.0.0}/benchmarks/benchmark_io_performance.py +0 -0
  25. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/__init__.py +0 -0
  26. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/carrier.py +0 -0
  27. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/clustering/__init__.py +0 -0
  28. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/clustering/base.py +0 -0
  29. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/clustering/intercluster_helpers.py +0 -0
  30. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/color_processing.py +0 -0
  31. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/comparison.py +0 -0
  32. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/config.py +0 -0
  33. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/core.py +0 -0
  34. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/effects.py +0 -0
  35. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/flow_system.py +0 -0
  36. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/interface.py +0 -0
  37. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/linear_converters.py +0 -0
  38. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/network_app.py +0 -0
  39. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/optimization.py +0 -0
  40. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/optimize_accessor.py +0 -0
  41. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/plot_result.py +0 -0
  42. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/plotting.py +0 -0
  43. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/solvers.py +0 -0
  44. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/stats_accessor.py +0 -0
  45. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/structure.py +0 -0
  46. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/topology_accessor.py +0 -0
  47. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/transform_accessor.py +0 -0
  48. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/tutorials/__init__.py +0 -0
  49. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/tutorials/_examples.py +0 -0
  50. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/tutorials/_tutorial_data.py +0 -0
  51. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt/types.py +0 -0
  52. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/SOURCES.txt +0 -0
  53. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/dependency_links.txt +0 -0
  54. {flixopt-7.2.2 → flixopt-8.0.0}/flixopt.egg-info/top_level.txt +0 -0
  55. {flixopt-7.2.2 → flixopt-8.0.0}/setup.cfg +0 -0
  56. {flixopt-7.2.2 → flixopt-8.0.0}/test_deprecations.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "8.0.0"
3
+ }
@@ -11,12 +11,24 @@ For more details regarding the individual PRs and contributors, please refer to
11
11
 
12
12
  ---
13
13
 
14
- ## [7.2.2](https://github.com/flixOpt/flixopt/compare/v7.2.1...v7.2.2) (2026-07-23)
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
- * **io:** load pre-7.0 clustered NetCDF files with legacy `original_data`/`metrics` references ([339f3a0](https://github.com/flixOpt/flixopt/commit/339f3a07))
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: 7.2.2 # x-release-please-version
6
- date-released: 2026-07-23
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: 7.2.2
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.5,>=2024.2.0
26
- Requires-Dist: linopy<0.8,>=0.5.1
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.5; extra == "dev"
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 BoundingPatterns, _scalar_safe_isel, _scalar_safe_isel_drop, _scalar_safe_reduce
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
- con_transmission.lhs += in_flow.submodel.status.status * self.element.absolute_losses
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 += self.virtual_supply - self.virtual_demand
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
- self._eq_total.lhs -= weighted_per_timestep.sum(dim=self._model.temporal_dims)
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 -= expression
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 -= self.shares[name]
715
+ _set_constraint_lhs(self._eq_total, self._eq_total.lhs - self.shares[name])
714
716
  else:
715
- self._eq_total_per_timestep.lhs -= self.shares[name]
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 not np.allclose(computed.values, found.fillna(0).values):
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 not np.allclose(computed.fillna(0).values, found.fillna(0).values, equal_nan=True):
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: 7.2.2
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.5,>=2024.2.0
26
- Requires-Dist: linopy<0.8,>=0.5.1
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.5; extra == "dev"
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.5,>=2024.2.0
4
- linopy<0.8,>=0.5.1
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.5
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
- ".gitignore",
4
- "README.md",
3
+ ".release-please-manifest.json",
4
+ "mkdocs.yml",
5
5
  "CHANGELOG.md",
6
- "CONTRIBUTING.md",
6
+ ".pre-commit-config.yaml",
7
+ "MANIFEST.in",
7
8
  "test_deprecations.py",
8
- "CITATION.cff",
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
- "mkdocs.yml",
16
- "benchmarks/benchmark_io_performance.py",
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
- "scripts/gen_ref_pages.py",
70
- "scripts/build_tutorial_datasets.py",
71
- "scripts/format_changelog.py",
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/__init__.py",
78
- "tests/test_clustering/test_multiperiod_extremes.py",
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/Zeitreihen2020.csv",
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/04_scenarios--summary.yaml",
141
- "tests/ressources/v4-api/00_minimal--solution.nc4",
142
- "tests/ressources/v4-api/io_flow_system_long--summary.yaml",
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/io_flow_system_long--solution.nc4",
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--solution.nc4",
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/02_complex--solution.nc4",
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/01_simple--model_documentation.yaml",
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/superseded/test_integration.py",
174
- "tests/superseded/test_functional.py",
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/__init__.py",
184
- "tests/test_math/test_clustering.py",
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/flow_system/test_resample_equivalence.py",
202
- "tests/flow_system/test_flow_system_locking.py",
203
- "tests/flow_system/test_flow_system_resample.py",
204
- "tests/flow_system/test_sel_isel_single_selection.py",
205
- "tests/flow_system/__init__.py",
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/stylesheets/extra.css",
211
- "docs/javascripts/mathjax.js",
212
- "docs/javascripts/plotly-instant.js",
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/results-plotting.md",
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-v3.md",
246
- "docs/user-guide/faq.md",
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/colors.md",
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/building-models/choosing-components.md",
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/features/Piecewise.md",
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/user-guide/results/index.md",
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/users.md",
245
+ "docs/home/license.md",
246
+ "docs/home/citing.md",
272
247
  "docs/home/installation.md",
273
- "docs/home/license.md"
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
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "8.0.0",
3
+ "distance": 0,
4
+ "node": "g125e03c6c2fafe474fb497354a37f2db8c6fda55",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-07-27"
8
+ }
@@ -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.5", # CalVer: allow through next calendar year
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.8", # Widened from patch pin to minor range
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.5", # TODO: drop once linopy ships xarray 2026.3+ compat fix
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",
@@ -1,3 +0,0 @@
1
- {
2
- ".": "7.2.2"
3
- }
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "7.2.2",
3
- "distance": 0,
4
- "node": "g618394507bf4485d7f07371a0290bb9819805025",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-07-23"
8
- }
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