flixopt 3.6.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.
@@ -0,0 +1,841 @@
1
+ # Changelog
2
+
3
+ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
4
+ Formatting is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) & [Gitmoji](https://gitmoji.dev).
5
+ For more details regarding the individual PRs and contributors, please refer to our [GitHub releases](https://github.com/flixOpt/flixopt/releases).
6
+
7
+ !!! tip
8
+
9
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
10
+
11
+ ---
12
+
13
+ <!-- This text won't be rendered
14
+ Note: The CI will automatically append a "What's Changed" section to the changelog for github releases.
15
+ This contains all commits, PRs, and contributors.
16
+ Therefore, the Changelog should focus on the user-facing changes.
17
+
18
+ Please remove all irrelevant sections before releasing.
19
+ Please keep the format of the changelog consistent with the other releases, so the extraction for mkdocs works.
20
+ ---
21
+
22
+ ## [Template] - ????-??-??
23
+
24
+ **Summary**:
25
+
26
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
27
+
28
+ ### ✨ Added
29
+
30
+ ### 💥 Breaking Changes
31
+
32
+ ### ♻️ Changed
33
+
34
+ ### 🗑️ Deprecated
35
+
36
+ ### 🔥 Removed
37
+
38
+ ### 🐛 Fixed
39
+
40
+ ### 🔒 Security
41
+
42
+ ### 📦 Dependencies
43
+
44
+ ### 📝 Docs
45
+
46
+ ### 👷 Development
47
+
48
+ ### 🚧 Known Issues
49
+
50
+ ---
51
+
52
+ ## [Unreleased] - ????-??-??
53
+
54
+ **Summary**: Type system overhaul and migration to loguru for logging
55
+
56
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
57
+
58
+ ### ✨ Added
59
+ - **New type system** (`flixopt/types.py`):
60
+ - Introduced dimension-aware type aliases using suffix notation (`_TPS`, `_PS`, `_S`) to clearly indicate which dimensions data can have
61
+ - Added `Numeric_TPS`, `Numeric_PS`, `Numeric_S` for numeric data with Time/Period/Scenario dimensions
62
+ - Added `Bool_TPS`, `Bool_PS`, `Bool_S` for boolean data with dimension support
63
+ - Added `Effect_TPS`, `Effect_PS`, `Effect_S` for effect dictionaries with dimension support
64
+ - Added `Scalar` type for scalar-only numeric values
65
+ - Added `NumericOrBool` utility type for internal use
66
+ - Type system supports scalars, numpy arrays, pandas Series/DataFrames, and xarray DataArrays
67
+ - Lazy logging evaluation - expensive log operations only execute when log level is active
68
+ - `CONFIG.Logging.verbose_tracebacks` option for detailed debugging with variable values
69
+
70
+ ### 💥 Breaking Changes
71
+ - **Logging framework**: Migrated to [loguru](https://loguru.readthedocs.io/)
72
+ - Removed `CONFIG.Logging` parameters: `rich`, `Colors`, `date_format`, `format`, `console_width`, `show_path`, `show_logger_name`
73
+ - For advanced formatting, use loguru's API directly after `CONFIG.apply()`
74
+
75
+ ### ♻️ Changed
76
+ - **Code structure**: Removed `commons.py` module and moved all imports directly to `__init__.py` for cleaner code organization (no public API changes)
77
+ - **Type handling improvements**: Updated internal data handling to work seamlessly with the new type system
78
+
79
+ ### 🗑️ Deprecated
80
+
81
+ ### 🔥 Removed
82
+
83
+ ### 🐛 Fixed
84
+ - Fixed `ShareAllocationModel` inconsistency where None/inf conversion happened in `__init__` instead of during modeling, which could cause issues with parameter validation
85
+ - Fixed numerous type hint inconsistencies across the codebase
86
+
87
+ ### 🔒 Security
88
+
89
+ ### 📦 Dependencies
90
+ - Updated `mkdocs-material` to v9.6.23
91
+ - Replaced `rich >= 13.0.0` with `loguru >= 0.7.0` for logging
92
+
93
+ ### 📝 Docs
94
+ - Enhanced documentation in `flixopt/types.py` with comprehensive examples and dimension explanation table
95
+ - Clarified Effect type docstrings - Effect types are dicts, but single numeric values work through union types
96
+ - Added clarifying comments in `effects.py` explaining parameter handling and transformation
97
+ - Improved OnOffParameters attribute documentation
98
+ - Updated getting-started guide with loguru examples
99
+ - Updated `config.py` docstrings for loguru integration
100
+
101
+ ### 👷 Development
102
+ - Added test for FlowSystem resampling
103
+
104
+ ### 🚧 Known Issues
105
+
106
+ ---
107
+
108
+ Until here -->
109
+
110
+ ## [3.6.0] - 2025-11-15
111
+
112
+ **Summary**: Type system overhaul and migration to loguru for logging. If you are heavily using our logs, this might be breaking!
113
+
114
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
115
+
116
+ ### ✨ Added
117
+ - **New type system** (`flixopt/types.py`):
118
+ - Introduced dimension-aware type aliases using suffix notation (`_TPS`, `_PS`, `_S`) to clearly indicate which dimensions data can have
119
+ - Added `Numeric_TPS`, `Numeric_PS`, `Numeric_S` for numeric data with Time/Period/Scenario dimensions
120
+ - Added `Bool_TPS`, `Bool_PS`, `Bool_S` for boolean data with dimension support
121
+ - Added `Effect_TPS`, `Effect_PS`, `Effect_S` for effect dictionaries with dimension support
122
+ - Added `Scalar` type for scalar-only numeric values
123
+ - Added `NumericOrBool` utility type for internal use
124
+ - Type system supports scalars, numpy arrays, pandas Series/DataFrames, and xarray DataArrays
125
+ - Lazy logging evaluation - expensive log operations only execute when log level is active
126
+ - `CONFIG.Logging.verbose_tracebacks` option for detailed debugging with variable values
127
+
128
+ ### 💥 Breaking Changes
129
+ - **Logging framework**: Migrated to [loguru](https://loguru.readthedocs.io/)
130
+ - Removed `CONFIG.Logging` parameters: `rich`, `Colors`, `date_format`, `format`, `console_width`, `show_path`, `show_logger_name`
131
+ - For advanced formatting, use loguru's API directly after `CONFIG.apply()`
132
+
133
+ ### ♻️ Changed
134
+ - **Code structure**: Removed `commons.py` module and moved all imports directly to `__init__.py` for cleaner code organization (no public API changes)
135
+ - **Type handling improvements**: Updated internal data handling to work seamlessly with the new type system
136
+
137
+ ### 🐛 Fixed
138
+ - Fixed `ShareAllocationModel` inconsistency where None/inf conversion happened in `__init__` instead of during modeling, which could cause issues with parameter validation
139
+ - Fixed numerous type hint inconsistencies across the codebase
140
+
141
+ ### 📦 Dependencies
142
+ - Updated `mkdocs-material` to v9.6.23
143
+ - Replaced `rich >= 13.0.0` with `loguru >= 0.7.0` for logging
144
+
145
+ ### 📝 Docs
146
+ - Enhanced documentation in `flixopt/types.py` with comprehensive examples and dimension explanation table
147
+ - Clarified Effect type docstrings - Effect types are dicts, but single numeric values work through union types
148
+ - Added clarifying comments in `effects.py` explaining parameter handling and transformation
149
+ - Improved OnOffParameters attribute documentation
150
+ - Updated getting-started guide with loguru examples
151
+ - Updated `config.py` docstrings for loguru integration
152
+
153
+ ### 👷 Development
154
+ - Added test for FlowSystem resampling
155
+
156
+ ---
157
+
158
+ ## [3.5.0] - 2025-11-06
159
+
160
+ **Summary**: Improve representations and improve resampling
161
+
162
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
163
+
164
+ ### ✨ Added
165
+ - Added options to resample and select subsets of flowsystems without converting to and from Dataset each time. Use the new methods `FlowSystem.__dataset_resample()`, `FlowSystem.__dataset_sel()` and `FlowSystem.__dataset_isel()`. All of them expect and return a dataset.
166
+
167
+ ### 💥 Breaking Changes
168
+
169
+ ### ♻️ Changed
170
+ - Truncate repr of FlowSystem and CalculationResults to only show the first 10 items of each category
171
+ - Greatly sped up the resampling of a FlowSystem again
172
+
173
+ ---
174
+
175
+ ## [3.4.1] - 2025-11-04
176
+
177
+ **Summary**: Speed up resampling by 20-40 times.
178
+
179
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
180
+
181
+ ### ♻️ Changed
182
+ - Greatly sped up the resampling of a FlowSystem (x20 - x40) by converting to dataarray internally
183
+
184
+ ---
185
+
186
+ ## [3.4.0] - 2025-11-01
187
+
188
+ **Summary**: Enhanced solver configuration with new CONFIG.Solving section for centralized solver parameter management.
189
+
190
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
191
+
192
+ ### ✨ Added
193
+
194
+ **Solver configuration:**
195
+ - **New `CONFIG.Solving` configuration section** for centralized solver parameter management:
196
+ - `mip_gap`: Default MIP gap tolerance for solver convergence (default: 0.01)
197
+ - `time_limit_seconds`: Default time limit in seconds for solver runs (default: 300)
198
+ - `log_to_console`: Whether solver should output to console (default: True)
199
+ - `log_main_results`: Whether to log main results after solving (default: True)
200
+ - Solvers (`HighsSolver`, `GurobiSolver`) now use `CONFIG.Solving` defaults for parameters, allowing global configuration
201
+ - Solver parameters can still be explicitly overridden when creating solver instances
202
+ - New `log_to_console` parameter in all Solver classes
203
+
204
+ ### ♻️ Changed
205
+ - Individual solver output is now hidden in **SegmentedCalculation**. To return to the prior behaviour, set `show_individual_solves=True` in `do_modeling_and_solve()`.
206
+
207
+ ### 🐛 Fixed
208
+ - New compacted list representation for periods and scenarios also in results log and console print
209
+
210
+ ### 📝 Docs
211
+ - Unified contributing guides in docs and on github
212
+
213
+ ### 👷 Development
214
+ - Added type hints for submodel in all Interface classes
215
+
216
+ ---
217
+
218
+ ## [3.3.1] - 2025-10-30
219
+
220
+ **Summary**: Small Bugfix and improving readability
221
+
222
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
223
+
224
+ ### ♻️ Changed
225
+ - Improved `summary.yaml` to use a compacted list representation for periods and scenarios
226
+
227
+ ### 🐛 Fixed
228
+ - Using `switch_on_total_max` with periods or scenarios failed
229
+
230
+ ### 📝 Docs
231
+ - Add more comprehensive `CONTRIBUTE.md`
232
+ - Improve logical structure in User Guide
233
+
234
+ ---
235
+
236
+ ## [3.3.0] - 2025-10-30
237
+
238
+ **Summary**: Better access to Elements stored in the FLowSystem and better representations (repr)
239
+
240
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
241
+
242
+ ### ♻️ Changed
243
+ **Improved repr methods:**
244
+ - **Results classes** (`ComponentResults`, `BusResults`, `FlowResults`, `EffectResults`) now show concise header with key metadata followed by xarray Dataset repr
245
+ - **Element classes** (`Component`, `Bus`, `Flow`, `Effect`, `Storage`) now show one-line summaries with essential information (connections, sizes, capacities, constraints)
246
+
247
+ **Container-based access:**
248
+ - **FlowSystem** now provides dict-like access patterns for all elements
249
+ - Use `flow_system['element_label']`, `flow_system.keys()`, `flow_system.values()`, and `flow_system.items()` for unified element access
250
+ - Specialized containers (`components`, `buses`, `effects`, `flows`) offer type-specific access with helpful error messages
251
+
252
+ ### 🗑️ Deprecated
253
+ - **`FlowSystem.all_elements`** property is deprecated in favor of dict-like interface (`flow_system['label']`, `.keys()`, `.values()`, `.items()`). Will be removed in v4.0.0.
254
+
255
+ ---
256
+
257
+ ## [3.2.1] - 2025-10-29
258
+
259
+ **Summary**:
260
+
261
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
262
+
263
+ ### 🐛 Fixed
264
+ - Fixed resampling of FlowSystem to reset `hours_of_last_timestep` and `hours_of_previous_timesteps` properly
265
+
266
+ ### 👷 Development
267
+ - Improved issue templates
268
+
269
+ ---
270
+
271
+ ## [3.2.0] - 2025-10-26
272
+
273
+ **Summary**: Enhanced plotting capabilities with consistent color management, custom plotting kwargs support, and centralized I/O handling.
274
+
275
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
276
+
277
+ ### ✨ Added
278
+
279
+ **Color management:**
280
+ - **`setup_colors()` method** for `CalculationResults` and `SegmentedCalculationResults` to configure consistent colors across all plots
281
+ - Group components by colorscales: `results.setup_colors({'CHP': 'reds', 'Storage': 'blues', 'Greys': ['Grid', 'Demand']})`
282
+ - Automatically propagates to all segments in segmented calculations
283
+ - Colors persist across all plot calls unless explicitly overridden
284
+ - **Flexible color inputs**: Supports colorscale names (e.g., 'turbo', 'plasma'), color lists, or label-to-color dictionaries
285
+ - **Cross-backend compatibility**: Seamless color handling for both Plotly and Matplotlib
286
+
287
+ **Plotting customization:**
288
+ - **Plotting kwargs support**: Pass additional arguments to plotting backends via `px_kwargs`, `plot_kwargs`, and `backend_kwargs` parameters
289
+ - **New `CONFIG.Plotting` configuration section**:
290
+ - `default_show`: Control default plot visibility
291
+ - `default_engine`: Choose 'plotly' or 'matplotlib'
292
+ - `default_dpi`: Set resolution for saved plots
293
+ - `default_facet_cols`: Configure default faceting columns
294
+ - `default_sequential_colorscale`: Default for heatmaps (now 'turbo')
295
+ - `default_qualitative_colorscale`: Default for categorical plots (now 'plotly')
296
+
297
+ **I/O improvements:**
298
+ - Centralized JSON/YAML I/O with auto-format detection
299
+ - Enhanced NetCDF handling with consistent engine usage
300
+ - Better numeric formatting in YAML exports
301
+
302
+ ### ♻️ Changed
303
+ - **Default colorscale**: Changed from 'viridis' to 'turbo' for better perceptual uniformity
304
+ - **Color terminology**: Standardized from "colormap" to "colorscale" throughout for Plotly consistency
305
+ - **Plotting internals**: Now use `xr.Dataset` as primary data type (DataFrames automatically converted)
306
+ - **NetCDF engine**: Switched back to netcdf4 engine following xarray updates and performance benchmarks
307
+
308
+ ### 🔥 Removed
309
+ - Removed unused `plotting.pie_with_plotly()` method
310
+
311
+ ### 🐛 Fixed
312
+ - Improved error messages when using `engine='matplotlib'` with multidimensional data
313
+ - Better dimension validation in `results.plot_heatmap()`
314
+
315
+ ### 📝 Docs
316
+ - Enhanced examples demonstrating `setup_colors()` usage
317
+ - Updated terminology from "colormap" to "colorscale" in docstrings
318
+
319
+ ### 👷 Development
320
+ - Fixed concurrency issue in CI
321
+ - Centralized color processing logic into dedicated module
322
+ - Refactored to function-based color handling for simpler API
323
+
324
+ ---
325
+
326
+ ## [3.1.1] - 2025-10-20
327
+ **Summary**: Fixed a bug when acessing the `effects_per_component` dataset in results without periodic effects.
328
+
329
+ If upgrading from v2.x, see the [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0) and [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/).
330
+
331
+ ### 🐛 Fixed
332
+ - Fixed ValueError in effects_per_component when all periodic effects are scalars/NaN by explicitly creating mode-specific templates (via _create_template_for_mode) with correct dimensions
333
+
334
+ ### 👷 Development
335
+ - Converted all remaining numpy style docstrings to google style
336
+
337
+ ---
338
+
339
+ ## [3.1.0] - 2025-10-19
340
+
341
+ **Summary**: This release adds faceting and animation support for multidimensional plots and redesigns the documentation website. Plotting results across scenarios or periods is now significantly simpler (Plotly only).
342
+
343
+ If upgrading from v2.x, see the [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/) and [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0).
344
+
345
+ ### ✨ Added
346
+ - **Faceting and animation for multidimensional plots**: All plotting methods now support `facet_by` and `animate_by` parameters to create subplot grids and animations from multidimensional data (scenarios, periods, etc.). *Plotly only.*
347
+ - **Flexible data selection with `select` parameter**: Select data using single values, lists, slices, or index arrays for precise control over what gets plotted
348
+ - **Heatmap fill control**: New `fill` parameter in heatmap methods controls how missing values are filled after reshaping (`'ffill'` or `'bfill'`)
349
+ - **Smart line styling for mixed variables**: Area plots now automatically style variables containing both positive and negative values with dashed lines, while stacking purely positive or negative variables
350
+
351
+ ### ♻️ Changed
352
+ - **Breaking: Selection behavior**: Plotting methods no longer automatically select the first value for non-time dimensions. Use the `select` parameter for explicit selection of scenarios, periods, or other dimensions
353
+ - **Better error messages**: Enhanced error messages when using Matplotlib with multidimensional data, with clearer guidance on dimension requirements and suggestions to use Plotly
354
+ - **Improved examples**: Enhanced `scenario_example.py` with better demonstration of new features
355
+ - **Robust validation**: Improved dimension validation in `plot_heatmap()` with clearer error messages
356
+
357
+ ### 🗑️ Deprecated
358
+ - **`indexer` parameter**: Use the new `select` parameter instead. The `indexer` parameter will be removed in v4.0.0
359
+ - **`heatmap_timeframes` and `heatmap_timesteps_per_frame` parameters**: Use the new `reshape_time=(timeframes, timesteps_per_frame)` parameter instead in heatmap plotting methods
360
+ - **`color_map` parameter**: Use the new `colors` parameter instead in heatmap plotting methods
361
+
362
+ ### 🐛 Fixed
363
+ - Fixed cryptic errors when working with empty buses by adding proper validation
364
+ - Added early validation for non-existent periods when using linked periods with tuples
365
+
366
+ ### 📝 Documentation
367
+ - **Redesigned documentation website** with custom css
368
+
369
+ ### 👷 Development
370
+ - Renamed internal `_apply_indexer_to_data()` to `_apply_selection_to_data()` for consistency with new API naming
371
+
372
+ ---
373
+
374
+ ## [3.0.3] - 2025-10-16
375
+ **Summary**: Hotfixing new plotting parameter `style`. Continue to use `mode`.
376
+
377
+ **Note**: If upgrading from v2.x, see the [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/) and [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0).
378
+
379
+ ### 🐛 Fixed
380
+ - Reverted breaking change from v3.0.0: continue to use `mode parameter in plotting instead of new `style`
381
+ - Renamed new `mode` parameter in plotting methods to `unit_type`
382
+
383
+ ### 📝 Docs
384
+ - Updated Migration Guide and added missing entries.
385
+ - Improved Changelog of v3.0.0
386
+
387
+ ---
388
+
389
+ ## [3.0.2] - 2025-10-15
390
+ **Summary**: This is a follow-up release to **[v3.0.0](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0)**, improving the documentation.
391
+
392
+ **Note**: If upgrading from v2.x, see the [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/) and [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0).
393
+
394
+ ### 📝 Docs
395
+ - Update the Readme
396
+ - Add a project roadmap to the docs
397
+ - Change Development status to "Production/Stable"
398
+ - Regroup parts in docs
399
+
400
+ ---
401
+
402
+ ## [3.0.1] - 2025-10-14
403
+ **Summary**: This is a follow-up release to **[v3.0.0](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0)**, adding a Migration Guide and bugfixing the docs.
404
+
405
+ **Note**: If upgrading from v2.x, see the [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/) and [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0).
406
+
407
+ ### 📝 Docs
408
+ - Fixed deployed docs
409
+ - Added Migration Guide for flixopt 3
410
+
411
+ ### 👷 Development
412
+ - Added missing type hints
413
+
414
+ ---
415
+
416
+ ## [3.0.0] - 2025-10-13
417
+ **Summary**: This release introduces new model dimensions (periods and scenarios) for multi-period investments and stochastic modeling, along with a redesigned effect sharing system and enhanced I/O capabilities.
418
+
419
+ **Note**: If upgrading from v2.x, see the [Migration Guide](https://flixopt.github.io/flixopt/latest/user-guide/migration-guide-v3/) and [v3.0.0 release notes](https://github.com/flixOpt/flixOpt/releases/tag/v3.0.0).
420
+
421
+ ### ✨ Added
422
+
423
+ **New model dimensions:**
424
+
425
+ - **Period dimension**: Enables multi-period investment modeling with distinct decisions in each period for transformation pathway optimization
426
+ - **Scenario dimension**: Supports stochastic modeling with weighted scenarios for robust decision-making under uncertainty (demand, prices, weather)
427
+ - Control variable independence across scenarios via `scenario_independent_sizes` and `scenario_independent_flow_rates` parameters
428
+ - By default, investment sizes are shared across scenarios while flow rates vary per scenario
429
+
430
+ **Redesigned effect sharing system:**
431
+
432
+ Effects now use intuitive `share_from_*` syntax that clearly shows contribution sources:
433
+
434
+ ```python
435
+ costs = fx.Effect('costs', '€', 'Total costs',
436
+ share_from_temporal={'CO2': 0.2}, # From temporal effects
437
+ share_from_periodic={'land': 100}) # From periodic effects
438
+ ```
439
+
440
+ This replaces `specific_share_to_other_effects_*` parameters and inverts the direction for clearer relationships.
441
+
442
+ **Enhanced I/O and data handling:**
443
+
444
+ - NetCDF/JSON serialization for all Interface objects and FlowSystem with round-trip support
445
+ - FlowSystem manipulation: `sel()`, `isel()`, `resample()`, `copy()`, `__eq__()` methods
446
+ - Direct access to FlowSystem from results without manual restoring (lazily loaded)
447
+ - New `FlowResults` class and precomputed DataArrays for sizes/flow_rates/flow_hours
448
+ - `effects_per_component` dataset for component impact evaluation, including all indirect effects through effect shares
449
+
450
+ **Other additions:**
451
+
452
+ - Balanced storage - charging and discharging sizes can be forced equal via `balanced` parameter
453
+ - New Storage parameters: `relative_minimum_final_charge_state` and `relative_maximum_final_charge_state` for final state control
454
+ - Improved filter methods in results
455
+ - Example for 2-stage investment decisions leveraging FlowSystem resampling
456
+
457
+ ### 💥 Breaking Changes
458
+
459
+ **API and Behavior Changes:**
460
+
461
+ - **Effect system redesigned** (no deprecation):
462
+ - **Terminology changes**: Effect domains renamed for clarity: `operation` → `temporal`, `invest`/`investment` → `periodic`
463
+ - **Sharing system**: The old `specific_share_to_other_effects_*` parameters were completely replaced with the new `share_from_temporal` and `share_from_periodic` syntax (see 🔥 Removed section)
464
+ - **FlowSystem independence**: FlowSystems cannot be shared across multiple Calculations anymore. A copy of the FlowSystem is created instead, making every Calculation independent. Each Subcalculation in `SegmentedCalculation` now has its own distinct `FlowSystem` object
465
+ - **Bus and Effect object assignment**: Direct assignment of Bus/Effect objects is no longer supported. Use labels (strings) instead:
466
+ - `Flow.bus` must receive a string label, not a Bus object
467
+ - Effect shares must use effect labels (strings) in dictionaries, not Effect objects
468
+ - **Logging defaults** (from v2.2.0): Console and file logging are now disabled by default. Enable explicitly with `CONFIG.Logging.console = True` and `CONFIG.apply()`
469
+
470
+ **Class and Method Renaming:**
471
+
472
+ - Renamed class `SystemModel` to `FlowSystemModel`
473
+ - Renamed class `Model` to `Submodel`
474
+ - Renamed `mode` parameter in plotting methods to `style`
475
+ - `Calculation.do_modeling()` now returns the `Calculation` object instead of its `linopy.Model`. Callers that previously accessed the linopy model directly should now use `calculation.do_modeling().model` instead of `calculation.do_modeling()`
476
+
477
+ **Variable Renaming in Results:**
478
+
479
+ - Investment binary variable: `is_invested` → `invested` in `InvestmentModel`
480
+ - Switch tracking variables in `OnOffModel`:
481
+ - `switch_on` → `switch|on`
482
+ - `switch_off` → `switch|off`
483
+ - `switch_on_nr` → `switch|count`
484
+ - Effect submodel variables (following terminology changes):
485
+ - `Effect(invest)|total` → `Effect(periodic)`
486
+ - `Effect(operation)|total` → `Effect(temporal)`
487
+ - `Effect(operation)|total_per_timestep` → `Effect(temporal)|per_timestep`
488
+ - `Effect|total` → `Effect`
489
+
490
+ **Data Structure Changes:**
491
+
492
+ - `relative_minimum_charge_state` and `relative_maximum_charge_state` don't have an extra timestep anymore. Use the new `relative_minimum_final_charge_state` and `relative_maximum_final_charge_state` parameters for final state control
493
+
494
+ ### ♻️ Changed
495
+
496
+ - Type system overhaul - added clear separation between temporal and non-temporal data throughout codebase for better clarity
497
+ - Enhanced FlowSystem interface with improved `__repr__()` and `__str__()` methods
498
+ - Improved Model Structure - Views and organisation is now divided into:
499
+ - Model: The main Model (linopy.Model) that is used to create and store the variables and constraints for the FlowSystem.
500
+ - Submodel: The base class for all submodels. Each is a subset of the Model, for simpler access and clearer code.
501
+ - Made docstrings in `config.py` more compact and easier to read
502
+ - Improved format handling in configuration module
503
+ - Enhanced console output to support both `stdout` and `stderr` stream selection
504
+ - Added `show_logger_name` parameter to `CONFIG.Logging` for displaying logger names in messages
505
+
506
+ ### 🗑️ Deprecated
507
+
508
+ - The `agg_group` and `agg_weight` parameters of `TimeSeriesData` are deprecated and will be removed in a future version. Use `aggregation_group` and `aggregation_weight` instead.
509
+ - The `active_timesteps` parameter of `Calculation` is deprecated and will be removed in a future version. Use the new `sel(time=...)` method on the FlowSystem instead.
510
+ - **InvestParameters** parameters renamed for improved clarity around investment and retirement effects:
511
+ - `fix_effects` → `effects_of_investment`
512
+ - `specific_effects` → `effects_of_investment_per_size`
513
+ - `divest_effects` → `effects_of_retirement`
514
+ - `piecewise_effects` → `piecewise_effects_of_investment`
515
+ - **Effect** parameters renamed:
516
+ - `minimum_investment` → `minimum_periodic`
517
+ - `maximum_investment` → `maximum_periodic`
518
+ - `minimum_operation` → `minimum_temporal`
519
+ - `maximum_operation` → `maximum_temporal`
520
+ - `minimum_operation_per_hour` → `minimum_per_hour`
521
+ - `maximum_operation_per_hour` → `maximum_per_hour`
522
+ - **Component** parameters renamed:
523
+ - `Source.source` → `Source.outputs`
524
+ - `Sink.sink` → `Sink.inputs`
525
+ - `SourceAndSink.source` → `SourceAndSink.outputs`
526
+ - `SourceAndSink.sink` → `SourceAndSink.inputs`
527
+ - `SourceAndSink.prevent_simultaneous_sink_and_source` → `SourceAndSink.prevent_simultaneous_flow_rates`
528
+
529
+ ### 🔥 Removed
530
+
531
+ - **Effect share parameters**: The old `specific_share_to_other_effects_*` parameters were replaced WITHOUT DEPRECATION
532
+ - `specific_share_to_other_effects_operation` → `share_from_temporal` (with inverted direction)
533
+ - `specific_share_to_other_effects_invest` → `share_from_periodic` (with inverted direction)
534
+
535
+ ### 🐛 Fixed
536
+
537
+ - Enhanced NetCDF I/O with proper attribute preservation for DataArrays
538
+ - Improved error handling and validation in serialization processes
539
+ - Better type consistency across all framework components
540
+ - Added extra validation in `config.py` to improve error handling
541
+
542
+ ### 📝 Docs
543
+
544
+ - Reorganized mathematical notation docs: moved to lowercase `mathematical-notation/` with subdirectories (`elements/`, `features/`, `modeling-patterns/`)
545
+ - Added comprehensive documentation pages: `dimensions.md` (time/period/scenario), `effects-penalty-objective.md`, modeling patterns
546
+ - Enhanced all element pages with implementation details, cross-references, and "See Also" sections
547
+ - Rewrote README and landing page with clearer vision, roadmap, and universal applicability emphasis
548
+ - Removed deprecated `docs/SUMMARY.md`, updated `mkdocs.yml` for new structure
549
+ - Tightened docstrings in core modules with better cross-referencing
550
+ - Added recipes section to docs
551
+
552
+ ### 🚧 Known Issues
553
+
554
+ - IO for single Interfaces/Elements to Datasets might not work properly if the Interface/Element is not part of a fully transformed and connected FlowSystem. This arises from Numeric Data not being stored as xr.DataArray by the user. To avoid this, always use the `to_dataset()` on Elements inside a FlowSystem that's connected and transformed.
555
+
556
+ ### 👷 Development
557
+
558
+ - **Centralized deprecation pattern**: Added `_handle_deprecated_kwarg()` helper method to `Interface` base class that provides reusable deprecation handling with consistent warnings, conflict detection, and optional value transformation. Applied across 5 classes (InvestParameters, Source, Sink, SourceAndSink, Effect) reducing deprecation boilerplate by 72%.
559
+ - FlowSystem data management simplified - removed `time_series_collection` pattern in favor of direct timestep properties
560
+ - Change modeling hierarchy to allow for more flexibility in future development. This leads to minimal changes in the access and creation of Submodels and their variables.
561
+ - Added new module `.modeling` that contains modeling primitives and utilities
562
+ - Clearer separation between the main Model and "Submodels"
563
+ - Improved access to the Submodels and their variables, constraints and submodels
564
+ - Added `__repr__()` for Submodels to easily inspect its content
565
+ - Enhanced data handling methods
566
+ - `fit_to_model_coords()` method for data alignment
567
+ - `fit_effects_to_model_coords()` method for effect data processing
568
+ - `connect_and_transform()` method replacing several operations
569
+ - **Testing improvements**: Eliminated warnings during test execution
570
+ - Updated deprecated code patterns in tests and examples (e.g., `sink`/`source` → `inputs`/`outputs`, `'H'` → `'h'` frequency)
571
+ - Refactored plotting logic to handle test environments explicitly with non-interactive backends
572
+ - Added comprehensive warning filters in `__init__.py` and `pyproject.toml` to suppress third-party library warnings
573
+ - Improved test fixtures with proper figure cleanup to prevent memory leaks
574
+ - Enhanced backend detection and handling in `plotting.py` for both Matplotlib and Plotly
575
+ - Always run dependent tests in order
576
+
577
+ ---
578
+
579
+ ## [2.2.0] - 2025-10-11
580
+ **Summary:** This release is a Configuration and Logging management release.
581
+
582
+ ### ✨ Added
583
+ - Added `CONFIG.reset()` method to restore configuration to default values
584
+ - Added configurable log file rotation settings: `CONFIG.Logging.max_file_size` and `CONFIG.Logging.backup_count`
585
+ - Added configurable log format settings: `CONFIG.Logging.date_format` and `CONFIG.Logging.format`
586
+ - Added configurable console settings: `CONFIG.Logging.console_width` and `CONFIG.Logging.show_path`
587
+ - Added `CONFIG.Logging.Colors` nested class for customizable log level colors using ANSI escape codes (works with both standard and Rich handlers)
588
+ - All examples now enable console logging to demonstrate proper logging usage
589
+ - Console logging now outputs to `sys.stdout` instead of `sys.stderr` for better compatibility with output redirection
590
+
591
+ ### 💥 Breaking Changes
592
+ - Console logging is now disabled by default (`CONFIG.Logging.console = False`). Enable it explicitly in your scripts with `CONFIG.Logging.console = True` and `CONFIG.apply()`
593
+ - File logging is now disabled by default (`CONFIG.Logging.file = None`). Set a file path to enable file logging
594
+
595
+ ### ♻️ Changed
596
+ - Logging and Configuration management changed
597
+ - Improved default logging colors: DEBUG is now gray (`\033[90m`) for de-emphasized messages, INFO uses terminal default color (`\033[0m`) for clean output
598
+
599
+ ### 🗑️ Deprecated
600
+ - `change_logging_level()` function is now deprecated in favor of `CONFIG.Logging.level` and `CONFIG.apply()`. Will be removed in version 3.0.0.
601
+
602
+ ### 🔥 Removed
603
+ - Removed unused `config.merge_configs` function from configuration module
604
+
605
+ ### 👷 Development
606
+ - Greatly expanded test coverage for `config.py` module
607
+ - Added `@pytest.mark.xdist_group` to `TestConfigModule` tests to prevent global config interference
608
+
609
+ ---
610
+
611
+ ## [2.1.11] - 2025-10-05
612
+ **Summary:** Important bugfix in `Storage` leading to wrong results due to incorrect discharge losses.
613
+
614
+ ### ♻️ Changed
615
+ - Using `h5netcdf` instead of `netCDF4` for dataset I/O operations. This follows the update in `xarray==2025.09.01`
616
+
617
+ ### 🐛 Fixed
618
+ - Fix `charge_state` Constraint in `Storage` leading to incorrect losses in discharge and therefore incorrect charge states and discharge values.
619
+
620
+ ### 📦 Dependencies
621
+ - Updated `renovate.config` to treat CalVer packages (xarray and dask) with more care
622
+ - Updated packaging configuration
623
+
624
+ ---
625
+
626
+ ## [2.1.10] - 2025-09-29
627
+ **Summary:** This release is a Documentation and Development release.
628
+
629
+ ### 📝 Docs
630
+ - Improved CHANGELOG.md formatting by adding better categories and formating by Gitmoji.
631
+ - Added a script to extract the release notes from the CHANGELOG.md file for better organized documentation.
632
+
633
+ ### 👷 Development
634
+ - Improved `renovate.config`
635
+ - Sped up CI by not running examples in every run and using `pytest-xdist`
636
+
637
+ ---
638
+
639
+ ## [2.1.9] - 2025-09-23
640
+
641
+ **Summary:** Small bugfix release addressing network visualization error handling.
642
+
643
+ ### 🐛 Fixed
644
+ - Fix error handling in network visualization if `networkx` is not installed
645
+
646
+ ---
647
+
648
+ ## [2.1.8] - 2025-09-22
649
+
650
+ **Summary:** Code quality improvements, enhanced documentation, and bug fixes for heat pump components and visualization features.
651
+
652
+ ### ✨ Added
653
+ - Extra Check for HeatPumpWithSource.COP to be strictly > 1 to avoid division by zero
654
+ - Apply deterministic color assignment by using sorted() in `plotting.py`
655
+ - Add missing args in docstrings in `plotting.py`, `solvers.py`, and `core.py`.
656
+
657
+ ### ♻️ Changed
658
+ - Greatly improved docstrings and documentation of all public classes
659
+ - Make path handling to be gentle about missing .html suffix in `plotting.py`
660
+ - Default for `relative_losses` in `Transmission` is now 0 instead of None
661
+ - Setter of COP in `HeatPumpWithSource` now completely overwrites the conversion factors, which is safer.
662
+ - Fix some docstrings in plotting.py
663
+ - Change assertions to raise Exceptions in `plotting.py`
664
+
665
+ ### 🐛 Fixed
666
+
667
+ **Core Components:**
668
+ - Fix COP getter and setter of `HeatPumpWithSource` returning and setting wrong conversion factors
669
+ - Fix custom compression levels in `io.save_dataset_to_netcdf`
670
+ - Fix `total_max` did not work when total min was not used
671
+
672
+ **Visualization:**
673
+ - Fix color scheme selection in network_app; color pickers now update when a scheme is selected
674
+
675
+ ### 📝 Docs
676
+ - Fix broken links in docs
677
+ - Fix some docstrings in plotting.py
678
+
679
+ ### 👷 Development
680
+ - Pin dev dependencies to specific versions
681
+ - Improve CI workflows to run faster and smarter
682
+
683
+ ---
684
+
685
+ ## [2.1.7] - 2025-09-13
686
+
687
+ **Summary:** Maintenance release to improve Code Quality, CI and update the dependencies. There are no changes or new features.
688
+
689
+ ### ✨ Added
690
+ - Added `__version__` to flixopt
691
+
692
+ ### 👷 Development
693
+ - ruff format the whole Codebase
694
+ - Added renovate config
695
+ - Added pre-commit
696
+ - lint and format in CI
697
+ - improved CI
698
+ - Updated Dependencies
699
+ - Updated Issue Templates
700
+
701
+ ---
702
+
703
+ ## [2.1.6] - 2025-09-02
704
+
705
+ **Summary:** Enhanced Sink/Source components with multi-flow support and new interactive network visualization.
706
+
707
+ ### ✨ Added
708
+ - **Network Visualization**: Added `FlowSystem.start_network_app()` and `FlowSystem.stop_network_app()` to easily visualize the network structure of a flow system in an interactive Dash web app
709
+ - *Note: This is still experimental and might change in the future*
710
+
711
+ ### ♻️ Changed
712
+ - **Multi-Flow Support**: `Sink`, `Source`, and `SourceAndSink` now accept multiple `flows` as `inputs` and `outputs` instead of just one. This enables modeling more use cases with these classes
713
+ - **Flow Control**: Both `Sink` and `Source` now have a `prevent_simultaneous_flow_rates` argument to prevent simultaneous flow rates of more than one of their flows
714
+
715
+ ### 🗑️ Deprecated
716
+ - For the classes `Sink`, `Source` and `SourceAndSink`: `.sink`, `.source` and `.prevent_simultaneous_sink_and_source` are deprecated in favor of the new arguments `inputs`, `outputs` and `prevent_simultaneous_flow_rates`
717
+
718
+ ### 🐛 Fixed
719
+ - Fixed testing issue with new `linopy` version 0.5.6
720
+
721
+ ### 👷 Development
722
+ - Added dependency "nbformat>=4.2.0" to dev dependencies to resolve issue with plotly CI
723
+
724
+ ---
725
+
726
+ ## [2.1.5] - 2025-07-08
727
+
728
+ ### 🐛 Fixed
729
+ - Fixed Docs deployment
730
+
731
+ ---
732
+
733
+ ## [2.1.4] - 2025-07-08
734
+
735
+ ### 🐛 Fixed
736
+ - Fixing release notes of 2.1.3, as well as documentation build.
737
+
738
+ ---
739
+
740
+ ## [2.1.3] - 2025-07-08
741
+
742
+ ### 🐛 Fixed
743
+ - Using `Effect.maximum_operation_per_hour` raised an error, needing an extra timestep. This has been fixed thanks to @PRse4.
744
+
745
+ ---
746
+
747
+ ## [2.1.2] - 2025-06-14
748
+
749
+ ### 🐛 Fixed
750
+ - Storage losses per hour were not calculated correctly, as mentioned by @brokenwings01. This might have led to issues when modeling large losses and long timesteps.
751
+ - Old implementation: $c(\text{t}_{i}) \cdot (1-\dot{\text{c}}_\text{rel,loss}(\text{t}_i)) \cdot \Delta \text{t}_{i}$
752
+ - Correct implementation: $c(\text{t}_{i}) \cdot (1-\dot{\text{c}}_\text{rel,loss}(\text{t}_i)) ^{\Delta \text{t}_{i}}$
753
+
754
+ ### 🚧 Known Issues
755
+ - Just to mention: Plotly >= 6 may raise errors if "nbformat" is not installed. We pinned plotly to <6, but this may be fixed in the future.
756
+
757
+ ---
758
+
759
+ ## [2.1.1] - 2025-05-08
760
+
761
+ ### ♻️ Changed
762
+ - Improved docstring and tests
763
+
764
+ ### 🐛 Fixed
765
+ - Fixed bug in the `_ElementResults.constraints` not returning the constraints but rather the variables
766
+
767
+ ---
768
+ ## [2.1.0] - 2025-04-11
769
+
770
+ ### ✨ Added
771
+ - Python 3.13 support added
772
+ - Logger warning if relative_minimum is used without on_off_parameters in Flow
773
+ - Greatly improved internal testing infrastructure by leveraging linopy's testing framework
774
+
775
+ ### 💥 Breaking Changes
776
+ - Restructured the modeling of the On/Off state of Flows or Components
777
+ - Variable renaming: `...|consecutive_on_hours` → `...|ConsecutiveOn|hours`
778
+ - Variable renaming: `...|consecutive_off_hours` → `...|ConsecutiveOff|hours`
779
+ - Constraint renaming: `...|consecutive_on_hours_con1` → `...|ConsecutiveOn|con1`
780
+ - Similar pattern for all consecutive on/off constraints
781
+
782
+ ### 🐛 Fixed
783
+ - Fixed the lower bound of `flow_rate` when using optional investments without OnOffParameters
784
+ - Fixed bug that prevented divest effects from working
785
+ - Added lower bounds of 0 to two unbounded vars (numerical improvement)
786
+
787
+ ---
788
+
789
+ ## [2.0.1] - 2025-04-10
790
+
791
+ ### ✨ Added
792
+ - Logger warning if relative_minimum is used without on_off_parameters in Flow
793
+
794
+ ### 🐛 Fixed
795
+ - Replace "|" with "__" in filenames when saving figures (Windows compatibility)
796
+ - Fixed bug that prevented the load factor from working without InvestmentParameters
797
+
798
+ ## [2.0.0] - 2025-03-29
799
+
800
+ **Summary:** 💥 **MAJOR RELEASE** - Complete framework migration from Pyomo to Linopy with redesigned architecture.
801
+
802
+ ### ✨ Added
803
+
804
+ **Model Capabilities:**
805
+ - Full model serialization support - save and restore unsolved Models
806
+ - Enhanced model documentation with YAML export containing human-readable mathematical formulations
807
+ - Extend flixopt models with native linopy language support
808
+ - Full Model Export/Import capabilities via linopy.Model
809
+
810
+ **Results & Data:**
811
+ - Unified solution exploration through `Calculation.results` attribute
812
+ - Compression support for result files
813
+ - `to_netcdf/from_netcdf` methods for FlowSystem and core components
814
+ - xarray integration for TimeSeries with improved datatypes support
815
+
816
+ ### 💥 Breaking Changes
817
+
818
+ **Framework Migration:**
819
+ - **Optimization Engine**: Complete migration from Pyomo to Linopy optimization framework
820
+ - **Package Import**: Framework renamed from flixOpt to flixopt (`import flixopt as fx`)
821
+ - **Data Architecture**: Redesigned data handling to rely on xarray.Dataset throughout the package
822
+ - **Results System**: Results handling completely redesigned with new `CalculationResults` class
823
+
824
+ **Variable Structure:**
825
+ - Restructured the modeling of the On/Off state of Flows or Components
826
+ - Variable renaming: `...|consecutive_on_hours` → `...|ConsecutiveOn|hours`
827
+ - Variable renaming: `...|consecutive_off_hours` → `...|ConsecutiveOff|hours`
828
+ - Constraint renaming: `...|consecutive_on_hours_con1` → `...|ConsecutiveOn|con1`
829
+ - Similar pattern for all consecutive on/off constraints
830
+
831
+ ### 🔥 Removed
832
+ - **Pyomo dependency** (replaced by linopy)
833
+ - **Period concepts** in time management (simplified to timesteps)
834
+
835
+ ### 🐛 Fixed
836
+ - Improved infeasible model detection and reporting
837
+ - Enhanced time series management and serialization
838
+ - Reduced file size through improved compression
839
+
840
+ ### 📝 Docs
841
+ - Google Style Docstrings throughout the codebase