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.
Files changed (56) hide show
  1. flixopt-7.2.2/.release-please-manifest.json +3 -0
  2. {flixopt-7.2.0 → flixopt-7.2.2}/CHANGELOG.md +14 -0
  3. {flixopt-7.2.0 → flixopt-7.2.2}/CITATION.cff +2 -2
  4. {flixopt-7.2.0 → flixopt-7.2.2}/PKG-INFO +4 -4
  5. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/io.py +7 -0
  6. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/statistics_accessor.py +45 -16
  7. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/PKG-INFO +4 -4
  8. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/requires.txt +3 -3
  9. flixopt-7.2.2/flixopt.egg-info/scm_version.json +8 -0
  10. {flixopt-7.2.0 → flixopt-7.2.2}/pyproject.toml +3 -3
  11. flixopt-7.2.0/.release-please-manifest.json +0 -3
  12. flixopt-7.2.0/flixopt.egg-info/scm_version.json +0 -8
  13. {flixopt-7.2.0 → flixopt-7.2.2}/.release-please-config.json +0 -0
  14. {flixopt-7.2.0 → flixopt-7.2.2}/CONTRIBUTING.md +0 -0
  15. {flixopt-7.2.0 → flixopt-7.2.2}/LICENSE +0 -0
  16. {flixopt-7.2.0 → flixopt-7.2.2}/MANIFEST.in +0 -0
  17. {flixopt-7.2.0 → flixopt-7.2.2}/README.md +0 -0
  18. {flixopt-7.2.0 → flixopt-7.2.2}/benchmarks/benchmark_io_performance.py +0 -0
  19. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/__init__.py +0 -0
  20. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/carrier.py +0 -0
  21. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/clustering/__init__.py +0 -0
  22. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/clustering/base.py +0 -0
  23. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/clustering/intercluster_helpers.py +0 -0
  24. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/color_processing.py +0 -0
  25. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/comparison.py +0 -0
  26. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/components.py +0 -0
  27. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/config.py +0 -0
  28. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/core.py +0 -0
  29. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/effects.py +0 -0
  30. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/elements.py +0 -0
  31. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/features.py +0 -0
  32. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/flow_system.py +0 -0
  33. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/interface.py +0 -0
  34. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/linear_converters.py +0 -0
  35. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/modeling.py +0 -0
  36. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/network_app.py +0 -0
  37. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/optimization.py +0 -0
  38. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/optimize_accessor.py +0 -0
  39. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/plot_result.py +0 -0
  40. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/plotting.py +0 -0
  41. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/results.py +0 -0
  42. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/solvers.py +0 -0
  43. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/stats_accessor.py +0 -0
  44. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/structure.py +0 -0
  45. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/topology_accessor.py +0 -0
  46. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/transform_accessor.py +0 -0
  47. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/tutorials/__init__.py +0 -0
  48. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/tutorials/_examples.py +0 -0
  49. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/tutorials/_tutorial_data.py +0 -0
  50. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt/types.py +0 -0
  51. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/SOURCES.txt +0 -0
  52. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/dependency_links.txt +0 -0
  53. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/scm_file_list.json +0 -0
  54. {flixopt-7.2.0 → flixopt-7.2.2}/flixopt.egg-info/top_level.txt +0 -0
  55. {flixopt-7.2.0 → flixopt-7.2.2}/setup.cfg +0 -0
  56. {flixopt-7.2.0 → flixopt-7.2.2}/test_deprecations.py +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "7.2.2"
3
+ }
@@ -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.0 # x-release-please-version
6
- date-released: 2026-07-13
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.0
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<4,>=3.0.0; extra == "network-viz"
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<4,>=3.0.0; extra == "full"
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==3.3.0; extra == "dev"
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 _filter_small_variables(ds: xr.Dataset, threshold: float | None) -> xr.Dataset:
284
- """Remove variables where max absolute value is below threshold.
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
- Useful for filtering out solver noise or non-invested components.
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
- max_vals = abs(ds).max() # Single computation for all variables
298
- keep = [v for v in ds.data_vars if float(max_vals.variables[v].values) >= threshold]
299
- return ds[keep] if keep else ds
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 = _filter_small_variables(ds, threshold)
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 = _filter_small_variables(ds, threshold)
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 = _filter_small_variables(ds, threshold)
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 = _filter_small_variables(ds, threshold)
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 = _filter_small_variables(ds, threshold)
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 = _filter_small_variables(result_ds, threshold)
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 variables below threshold
2184
- ds = _filter_small_variables(ds, threshold)
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 = _filter_small_variables(ds, threshold)
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 = _filter_small_variables(flow_ds, threshold)
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.0
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<4,>=3.0.0; extra == "network-viz"
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<4,>=3.0.0; extra == "full"
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==3.3.0; extra == "dev"
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==3.3.0
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<4,>=3.0.0
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<4,>=3.0.0
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
@@ -0,0 +1,8 @@
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
+ }
@@ -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, < 4",
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, < 4", # Visualizing FlowSystem Network as app
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==3.3.0",
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",
@@ -1,3 +0,0 @@
1
- {
2
- ".": "7.2.0"
3
- }
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "7.2.0",
3
- "distance": 0,
4
- "node": "gcec4e364d68e5048c832987c832f6e2987e0dec5",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-07-21"
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
File without changes
File without changes
File without changes
File without changes
File without changes