flixopt 7.2.0__tar.gz → 7.2.2__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-7.2.2/.release-please-manifest.json +3 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/CHANGELOG.md +14 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/CITATION.cff +2 -2
- {flixopt-7.2.0 → flixopt-7.2.2}/PKG-INFO +4 -4
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/io.py +7 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/statistics_accessor.py +45 -16
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/PKG-INFO +4 -4
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/requires.txt +3 -3
- flixopt-7.2.2/flixopt.egg-info/scm_version.json +8 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/pyproject.toml +3 -3
- flixopt-7.2.0/.release-please-manifest.json +0 -3
- flixopt-7.2.0/flixopt.egg-info/scm_version.json +0 -8
- {flixopt-7.2.0 → flixopt-7.2.2}/.release-please-config.json +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/CONTRIBUTING.md +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/LICENSE +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/MANIFEST.in +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/README.md +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/benchmarks/benchmark_io_performance.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/__init__.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/carrier.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/clustering/__init__.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/clustering/base.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/clustering/intercluster_helpers.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/color_processing.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/comparison.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/components.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/config.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/core.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/effects.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/elements.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/features.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/flow_system.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/interface.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/linear_converters.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/modeling.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/network_app.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/optimization.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/optimize_accessor.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/plot_result.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/plotting.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/results.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/solvers.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/stats_accessor.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/structure.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/topology_accessor.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/transform_accessor.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/tutorials/__init__.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/tutorials/_examples.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/tutorials/_tutorial_data.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/types.py +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/SOURCES.txt +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/dependency_links.txt +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/scm_file_list.json +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/top_level.txt +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/setup.cfg +0 -0
- {flixopt-7.2.0 → flixopt-7.2.2}/test_deprecations.py +0 -0
|
@@ -11,6 +11,20 @@ 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)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### Bug Fixes
|
|
18
|
+
|
|
19
|
+
* **io:** load pre-7.0 clustered NetCDF files with legacy `original_data`/`metrics` references ([339f3a0](https://github.com/flixOpt/flixopt/commit/339f3a07))
|
|
20
|
+
|
|
21
|
+
## [7.2.1](https://github.com/flixOpt/flixopt/compare/v7.2.0...v7.2.1) (2026-07-21)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### Bug Fixes
|
|
25
|
+
|
|
26
|
+
* **stats:** threshold not applied along breakdown dimension in plot.effects ([#719](https://github.com/flixOpt/flixopt/issues/719)) ([#720](https://github.com/flixOpt/flixopt/issues/720)) ([49ed538](https://github.com/flixOpt/flixopt/commit/49ed5385d988c6b5e6c11a5550f84fabd9efd3f5))
|
|
27
|
+
|
|
14
28
|
## [7.2.0](https://github.com/flixOpt/flixopt/compare/v7.1.0...v7.2.0) (2026-07-21)
|
|
15
29
|
|
|
16
30
|
|
|
@@ -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.
|
|
6
|
-
date-released: 2026-07-
|
|
5
|
+
version: 7.2.2 # x-release-please-version
|
|
6
|
+
date-released: 2026-07-23
|
|
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.
|
|
3
|
+
Version: 7.2.2
|
|
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>
|
|
@@ -33,7 +33,7 @@ Requires-Dist: matplotlib<4,>=3.5.2
|
|
|
33
33
|
Requires-Dist: plotly<7,>=5.15.0
|
|
34
34
|
Requires-Dist: xarray_plotly<1,>=0.0.13
|
|
35
35
|
Provides-Extra: network-viz
|
|
36
|
-
Requires-Dist: dash<
|
|
36
|
+
Requires-Dist: dash<5,>=3.0.0; extra == "network-viz"
|
|
37
37
|
Requires-Dist: dash-cytoscape<2,>=1.0.0; extra == "network-viz"
|
|
38
38
|
Requires-Dist: dash-daq<1,>=0.6.0; extra == "network-viz"
|
|
39
39
|
Requires-Dist: networkx<4,>=3.0.0; extra == "network-viz"
|
|
@@ -47,7 +47,7 @@ Requires-Dist: tsam<4,>=3.4.0; extra == "full"
|
|
|
47
47
|
Requires-Dist: pyvis==0.3.2; extra == "full"
|
|
48
48
|
Requires-Dist: scipy<2,>=1.15.1; extra == "full"
|
|
49
49
|
Requires-Dist: gurobipy<14,>=10.0.0; python_version < "3.14" and extra == "full"
|
|
50
|
-
Requires-Dist: dash<
|
|
50
|
+
Requires-Dist: dash<5,>=3.0.0; extra == "full"
|
|
51
51
|
Requires-Dist: dash-cytoscape<2,>=1.0.0; extra == "full"
|
|
52
52
|
Requires-Dist: dash-daq<1,>=0.6.0; extra == "full"
|
|
53
53
|
Requires-Dist: networkx<4,>=3.0.0; extra == "full"
|
|
@@ -67,7 +67,7 @@ Requires-Dist: pyvis==0.3.2; extra == "dev"
|
|
|
67
67
|
Requires-Dist: scipy==1.16.3; extra == "dev"
|
|
68
68
|
Requires-Dist: highspy==1.13.1; extra == "dev"
|
|
69
69
|
Requires-Dist: gurobipy==12.0.3; python_version < "3.14" and extra == "dev"
|
|
70
|
-
Requires-Dist: dash==
|
|
70
|
+
Requires-Dist: dash==4.4.0; extra == "dev"
|
|
71
71
|
Requires-Dist: dash-cytoscape==1.0.2; extra == "dev"
|
|
72
72
|
Requires-Dist: dash-daq==0.6.0; extra == "dev"
|
|
73
73
|
Requires-Dist: networkx==3.0.0; extra == "dev"
|
|
@@ -1839,6 +1839,13 @@ class FlowSystemDatasetIO:
|
|
|
1839
1839
|
return
|
|
1840
1840
|
|
|
1841
1841
|
clustering_structure = json.loads(reference_structure['clustering'])
|
|
1842
|
+
# Backward-compat: files written before flixopt 7.0 stored clustering.original_data
|
|
1843
|
+
# and clustering._metrics as ':::original_data|...' / ':::metrics|...' references whose
|
|
1844
|
+
# target arrays are no longer serialized (they only fed the removed plot.compare()).
|
|
1845
|
+
# These keys are also not accepted by the current Clustering.__init__. Drop them so
|
|
1846
|
+
# such files remain loadable.
|
|
1847
|
+
clustering_structure.pop('_original_data_refs', None)
|
|
1848
|
+
clustering_structure.pop('_metrics_refs', None)
|
|
1842
1849
|
clustering = fs_cls._resolve_reference_structure(clustering_structure, {})
|
|
1843
1850
|
flow_system.clustering = clustering
|
|
1844
1851
|
|
|
@@ -280,23 +280,51 @@ def _sort_dataset(ds: xr.Dataset) -> xr.Dataset:
|
|
|
280
280
|
return ds[sorted_vars]
|
|
281
281
|
|
|
282
282
|
|
|
283
|
-
def
|
|
284
|
-
"""
|
|
283
|
+
def _drop_small_data_vars(ds: xr.Dataset, threshold: float) -> xr.Dataset:
|
|
284
|
+
"""Drop data variables whose max absolute value is below threshold."""
|
|
285
|
+
max_vals = abs(ds).max()
|
|
286
|
+
keep = [v for v in ds.data_vars if float(max_vals.variables[v].values) >= threshold]
|
|
287
|
+
return ds[keep] if keep else ds
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def _drop_small_along_dim(ds: xr.Dataset, dim: str, threshold: float) -> xr.Dataset:
|
|
291
|
+
"""Drop entries along ``dim`` whose max absolute value (over all other axes) is below threshold.
|
|
292
|
+
|
|
293
|
+
Needed when a breakdown such as ``by='component'`` lays entities out along a coordinate
|
|
294
|
+
of a single variable rather than as separate variables, e.g. non-invested components
|
|
295
|
+
with a near-zero contribution (see #719).
|
|
296
|
+
"""
|
|
297
|
+
if dim not in ds.dims or not ds.data_vars:
|
|
298
|
+
return ds
|
|
299
|
+
arr = abs(ds.to_dataarray())
|
|
300
|
+
max_along = arr.max(dim=[x for x in arr.dims if x != dim])
|
|
301
|
+
keep_idx = ds[dim].values[(max_along >= threshold).values]
|
|
302
|
+
return ds.sel({dim: keep_idx})
|
|
285
303
|
|
|
286
|
-
|
|
304
|
+
|
|
305
|
+
def _drop_small(ds: xr.Dataset, threshold: float | None, dim: str | list[str] | None = None) -> xr.Dataset:
|
|
306
|
+
"""Remove entries whose max absolute value is below threshold.
|
|
307
|
+
|
|
308
|
+
Useful for filtering out solver noise or non-invested components. Always drops whole
|
|
309
|
+
data variables that are entirely below threshold; when ``dim`` is given, also drops
|
|
310
|
+
individual entries along those coordinate dimension(s).
|
|
287
311
|
|
|
288
312
|
Args:
|
|
289
313
|
ds: Dataset to filter.
|
|
290
314
|
threshold: Minimum max absolute value to keep. If None, no filtering.
|
|
315
|
+
dim: Optional coordinate dimension(s) to filter along (e.g. 'component',
|
|
316
|
+
'contributor'). A single name or a list of names.
|
|
291
317
|
|
|
292
318
|
Returns:
|
|
293
319
|
Filtered dataset.
|
|
294
320
|
"""
|
|
295
321
|
if threshold is None or not ds.data_vars:
|
|
296
322
|
return ds
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
323
|
+
ds = _drop_small_data_vars(ds, threshold)
|
|
324
|
+
dims = [dim] if isinstance(dim, str) else (dim or [])
|
|
325
|
+
for d in dims:
|
|
326
|
+
ds = _drop_small_along_dim(ds, d, threshold)
|
|
327
|
+
return ds
|
|
300
328
|
|
|
301
329
|
|
|
302
330
|
def _filter_by_carrier(ds: xr.Dataset, carrier: str | list[str] | None) -> xr.Dataset:
|
|
@@ -1557,7 +1585,7 @@ class StatisticsPlotAccessor:
|
|
|
1557
1585
|
ds = ds.round(round_decimals)
|
|
1558
1586
|
|
|
1559
1587
|
# Filter out variables below threshold
|
|
1560
|
-
ds =
|
|
1588
|
+
ds = _drop_small(ds, threshold)
|
|
1561
1589
|
|
|
1562
1590
|
# Build color kwargs: bus balance → component colors, component balance → carrier colors
|
|
1563
1591
|
color_by: Literal['component', 'carrier'] = 'component' if is_bus else 'carrier'
|
|
@@ -1713,7 +1741,7 @@ class StatisticsPlotAccessor:
|
|
|
1713
1741
|
ds = ds.round(round_decimals)
|
|
1714
1742
|
|
|
1715
1743
|
# Filter out variables below threshold
|
|
1716
|
-
ds =
|
|
1744
|
+
ds = _drop_small(ds, threshold)
|
|
1717
1745
|
|
|
1718
1746
|
# Build color kwargs with component colors (flows colored by their parent component)
|
|
1719
1747
|
color_kwargs = self._build_color_kwargs(colors, list(ds.data_vars), color_by='component')
|
|
@@ -1793,7 +1821,7 @@ class StatisticsPlotAccessor:
|
|
|
1793
1821
|
# Resolve, select, and stack into single DataArray
|
|
1794
1822
|
resolved = self._resolve_variable_names(variables, solution)
|
|
1795
1823
|
ds = _apply_selection(solution[resolved], select)
|
|
1796
|
-
ds =
|
|
1824
|
+
ds = _drop_small(ds, threshold)
|
|
1797
1825
|
ds = _sort_dataset(ds) # Sort for consistent plotting order
|
|
1798
1826
|
da = xr.concat([ds[v] for v in ds.data_vars], dim=pd.Index(list(ds.data_vars), name='variable'))
|
|
1799
1827
|
|
|
@@ -1888,7 +1916,7 @@ class StatisticsPlotAccessor:
|
|
|
1888
1916
|
ds = _apply_selection(ds, select)
|
|
1889
1917
|
|
|
1890
1918
|
# Filter out variables below threshold
|
|
1891
|
-
ds =
|
|
1919
|
+
ds = _drop_small(ds, threshold)
|
|
1892
1920
|
|
|
1893
1921
|
# Early return for data_only mode (skip figure creation for performance)
|
|
1894
1922
|
if data_only:
|
|
@@ -1957,7 +1985,7 @@ class StatisticsPlotAccessor:
|
|
|
1957
1985
|
ds = ds[valid_labels]
|
|
1958
1986
|
|
|
1959
1987
|
# Filter out variables below threshold
|
|
1960
|
-
ds =
|
|
1988
|
+
ds = _drop_small(ds, threshold)
|
|
1961
1989
|
|
|
1962
1990
|
# Early return for data_only mode (skip figure creation for performance)
|
|
1963
1991
|
if data_only:
|
|
@@ -2052,7 +2080,7 @@ class StatisticsPlotAccessor:
|
|
|
2052
2080
|
result_ds = ds.fxstats.to_duration_curve(normalize=normalize)
|
|
2053
2081
|
|
|
2054
2082
|
# Filter out variables below threshold
|
|
2055
|
-
result_ds =
|
|
2083
|
+
result_ds = _drop_small(result_ds, threshold)
|
|
2056
2084
|
|
|
2057
2085
|
# Early return for data_only mode (skip figure creation for performance)
|
|
2058
2086
|
if data_only:
|
|
@@ -2180,8 +2208,9 @@ class StatisticsPlotAccessor:
|
|
|
2180
2208
|
else:
|
|
2181
2209
|
raise ValueError(f"'by' must be one of 'component', 'contributor', 'time', or None, got {by!r}")
|
|
2182
2210
|
|
|
2183
|
-
# Filter out
|
|
2184
|
-
|
|
2211
|
+
# Filter out entries below threshold, including along the breakdown dimension
|
|
2212
|
+
breakdown_dim = by if by in ('component', 'contributor') else None
|
|
2213
|
+
ds = _drop_small(ds, threshold, dim=breakdown_dim)
|
|
2185
2214
|
|
|
2186
2215
|
# Early return for data_only mode (skip figure creation for performance)
|
|
2187
2216
|
if data_only:
|
|
@@ -2263,7 +2292,7 @@ class StatisticsPlotAccessor:
|
|
|
2263
2292
|
ds = _apply_selection(ds, select)
|
|
2264
2293
|
|
|
2265
2294
|
# Filter out variables below threshold
|
|
2266
|
-
ds =
|
|
2295
|
+
ds = _drop_small(ds, threshold)
|
|
2267
2296
|
|
|
2268
2297
|
# Early return for data_only mode (skip figure creation for performance)
|
|
2269
2298
|
if data_only:
|
|
@@ -2377,7 +2406,7 @@ class StatisticsPlotAccessor:
|
|
|
2377
2406
|
flow_ds = flow_ds.round(round_decimals)
|
|
2378
2407
|
|
|
2379
2408
|
# Filter out flow variables below threshold
|
|
2380
|
-
flow_ds =
|
|
2409
|
+
flow_ds = _drop_small(flow_ds, threshold)
|
|
2381
2410
|
|
|
2382
2411
|
# Early return for data_only mode (skip figure creation for performance)
|
|
2383
2412
|
if data_only:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flixopt
|
|
3
|
-
Version: 7.2.
|
|
3
|
+
Version: 7.2.2
|
|
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>
|
|
@@ -33,7 +33,7 @@ Requires-Dist: matplotlib<4,>=3.5.2
|
|
|
33
33
|
Requires-Dist: plotly<7,>=5.15.0
|
|
34
34
|
Requires-Dist: xarray_plotly<1,>=0.0.13
|
|
35
35
|
Provides-Extra: network-viz
|
|
36
|
-
Requires-Dist: dash<
|
|
36
|
+
Requires-Dist: dash<5,>=3.0.0; extra == "network-viz"
|
|
37
37
|
Requires-Dist: dash-cytoscape<2,>=1.0.0; extra == "network-viz"
|
|
38
38
|
Requires-Dist: dash-daq<1,>=0.6.0; extra == "network-viz"
|
|
39
39
|
Requires-Dist: networkx<4,>=3.0.0; extra == "network-viz"
|
|
@@ -47,7 +47,7 @@ Requires-Dist: tsam<4,>=3.4.0; extra == "full"
|
|
|
47
47
|
Requires-Dist: pyvis==0.3.2; extra == "full"
|
|
48
48
|
Requires-Dist: scipy<2,>=1.15.1; extra == "full"
|
|
49
49
|
Requires-Dist: gurobipy<14,>=10.0.0; python_version < "3.14" and extra == "full"
|
|
50
|
-
Requires-Dist: dash<
|
|
50
|
+
Requires-Dist: dash<5,>=3.0.0; extra == "full"
|
|
51
51
|
Requires-Dist: dash-cytoscape<2,>=1.0.0; extra == "full"
|
|
52
52
|
Requires-Dist: dash-daq<1,>=0.6.0; extra == "full"
|
|
53
53
|
Requires-Dist: networkx<4,>=3.0.0; extra == "full"
|
|
@@ -67,7 +67,7 @@ Requires-Dist: pyvis==0.3.2; extra == "dev"
|
|
|
67
67
|
Requires-Dist: scipy==1.16.3; extra == "dev"
|
|
68
68
|
Requires-Dist: highspy==1.13.1; extra == "dev"
|
|
69
69
|
Requires-Dist: gurobipy==12.0.3; python_version < "3.14" and extra == "dev"
|
|
70
|
-
Requires-Dist: dash==
|
|
70
|
+
Requires-Dist: dash==4.4.0; extra == "dev"
|
|
71
71
|
Requires-Dist: dash-cytoscape==1.0.2; extra == "dev"
|
|
72
72
|
Requires-Dist: dash-daq==0.6.0; extra == "dev"
|
|
73
73
|
Requires-Dist: networkx==3.0.0; extra == "dev"
|
|
@@ -23,7 +23,7 @@ pre-commit==4.6.0
|
|
|
23
23
|
pyvis==0.3.2
|
|
24
24
|
scipy==1.16.3
|
|
25
25
|
highspy==1.13.1
|
|
26
|
-
dash==
|
|
26
|
+
dash==4.4.0
|
|
27
27
|
dash-cytoscape==1.0.2
|
|
28
28
|
dash-daq==0.6.0
|
|
29
29
|
networkx==3.0.0
|
|
@@ -59,7 +59,7 @@ tsam_xarray<1,>=0.6.1
|
|
|
59
59
|
tsam<4,>=3.4.0
|
|
60
60
|
pyvis==0.3.2
|
|
61
61
|
scipy<2,>=1.15.1
|
|
62
|
-
dash<
|
|
62
|
+
dash<5,>=3.0.0
|
|
63
63
|
dash-cytoscape<2,>=1.0.0
|
|
64
64
|
dash-daq<1,>=0.6.0
|
|
65
65
|
networkx<4,>=3.0.0
|
|
@@ -71,7 +71,7 @@ pooch<2,>=1.8.0
|
|
|
71
71
|
gurobipy<14,>=10.0.0
|
|
72
72
|
|
|
73
73
|
[network_viz]
|
|
74
|
-
dash<
|
|
74
|
+
dash<5,>=3.0.0
|
|
75
75
|
dash-cytoscape<2,>=1.0.0
|
|
76
76
|
dash-daq<1,>=0.6.0
|
|
77
77
|
networkx<4,>=3.0.0
|
|
@@ -55,7 +55,7 @@ dependencies = [
|
|
|
55
55
|
[project.optional-dependencies]
|
|
56
56
|
# Interactive network visualization with enhanced color picker
|
|
57
57
|
network_viz = [
|
|
58
|
-
"dash >= 3.0.0, <
|
|
58
|
+
"dash >= 3.0.0, < 5",
|
|
59
59
|
"dash-cytoscape >= 1.0.0, < 2",
|
|
60
60
|
"dash-daq >= 0.6.0, < 1",
|
|
61
61
|
"networkx >= 3.0.0, < 4",
|
|
@@ -75,7 +75,7 @@ full = [
|
|
|
75
75
|
"pyvis==0.3.2", # Visualizing FlowSystem Network
|
|
76
76
|
"scipy >= 1.15.1, < 2", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257
|
|
77
77
|
"gurobipy >= 10.0.0, < 14; python_version < '3.14'", # No Python 3.14 wheels yet (expected Q1 2026)
|
|
78
|
-
"dash >= 3.0.0, <
|
|
78
|
+
"dash >= 3.0.0, < 5", # Visualizing FlowSystem Network as app
|
|
79
79
|
"dash-cytoscape >= 1.0.0, < 2", # Visualizing FlowSystem Network as app
|
|
80
80
|
"dash-daq >= 0.6.0, < 1", # Visualizing FlowSystem Network as app
|
|
81
81
|
"networkx >= 3.0.0, < 4", # Visualizing FlowSystem Network as app
|
|
@@ -98,7 +98,7 @@ dev = [
|
|
|
98
98
|
"scipy==1.16.3", # 1.16.1+ required for Python 3.14 wheels
|
|
99
99
|
"highspy==1.13.1", # Latest known-good. Bump once HiGHS#2975 fix ships in 1.14.1+
|
|
100
100
|
"gurobipy==12.0.3; python_version < '3.14'", # No Python 3.14 wheels yet
|
|
101
|
-
"dash==
|
|
101
|
+
"dash==4.4.0",
|
|
102
102
|
"dash-cytoscape==1.0.2",
|
|
103
103
|
"dash-daq==0.6.0",
|
|
104
104
|
"networkx==3.0.0",
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|