flixopt 2.1.1__tar.gz → 2.1.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.
Potentially problematic release.
This version of flixopt might be problematic. Click here for more details.
- {flixopt-2.1.1 → flixopt-2.1.2}/.github/workflows/deploy-docs.yaml +5 -1
- {flixopt-2.1.1 → flixopt-2.1.2}/.github/workflows/python-app.yaml +43 -6
- flixopt-2.1.2/CHANGELOG.md +82 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/PKG-INFO +29 -29
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/SUMMARY.md +1 -1
- {flixopt-2.1.1 → flixopt-2.1.2}/examples/02_Complex/complex_example_results.py +5 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/components.py +1 -1
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt.egg-info/PKG-INFO +29 -29
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt.egg-info/SOURCES.txt +2 -7
- flixopt-2.1.2/flixopt.egg-info/requires.txt +39 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt.egg-info/top_level.txt +0 -1
- {flixopt-2.1.1 → flixopt-2.1.2}/mkdocs.yml +3 -2
- {flixopt-2.1.1 → flixopt-2.1.2}/pyproject.toml +40 -31
- flixopt-2.1.2/scripts/extract_release_notes.py +45 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_storage.py +1 -1
- flixopt-2.1.1/docs/release-notes/_template.txt +0 -32
- flixopt-2.1.1/docs/release-notes/index.md +0 -7
- flixopt-2.1.1/docs/release-notes/v2.0.0.md +0 -93
- flixopt-2.1.1/docs/release-notes/v2.0.1.md +0 -12
- flixopt-2.1.1/docs/release-notes/v2.1.0.md +0 -31
- flixopt-2.1.1/docs/release-notes/v2.1.1.md +0 -11
- flixopt-2.1.1/flixopt.egg-info/requires.txt +0 -37
- flixopt-2.1.1/site/release-notes/_template.txt +0 -32
- {flixopt-2.1.1 → flixopt-2.1.2}/.gitignore +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/LICENSE +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/README.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/contribute.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/examples/00-Minimal Example.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/examples/01-Basic Example.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/examples/02-Complex Example.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/examples/03-Calculation Modes.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/examples/index.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/faq/contribute.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/faq/index.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/getting-started.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/images/architecture_flixOpt-pre2.0.0.png +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/images/architecture_flixOpt.png +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/images/flixopt-icon.svg +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/index.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/javascripts/mathjax.js +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/user-guide/Mathematical Notation/Bus.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/user-guide/Mathematical Notation/Effects, Penalty & Objective.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/user-guide/Mathematical Notation/Flow.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/user-guide/Mathematical Notation/LinearConverter.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/user-guide/Mathematical Notation/Piecewise.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/user-guide/Mathematical Notation/Storage.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/user-guide/Mathematical Notation/index.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/user-guide/Mathematical Notation/others.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/docs/user-guide/index.md +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/examples/00_Minmal/minimal_example.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/examples/01_Simple/simple_example.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/examples/02_Complex/complex_example.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/examples/03_Calculation_types/Zeitreihen2020.csv +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/examples/03_Calculation_types/example_calculation_types.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/__init__.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/aggregation.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/calculation.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/commons.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/config.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/config.yaml +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/core.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/effects.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/elements.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/features.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/flow_system.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/interface.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/io.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/linear_converters.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/plotting.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/results.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/solvers.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/structure.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt/utils.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/flixopt.egg-info/dependency_links.txt +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/pics/architecture_flixOpt-pre2.0.0.png +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/pics/architecture_flixOpt.png +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/pics/flixOpt_plotting.jpg +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/pics/flixopt-icon.svg +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/pics/pics.pptx +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/scripts/gen_ref_pages.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/setup.cfg +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/__init__.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/conftest.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/ressources/Zeitreihen2020.csv +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/run_all_tests.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_bus.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_component.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_dataconverter.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_effect.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_examples.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_flow.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_functional.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_integration.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_io.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_linear_converter.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_on_hours_computation.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_plots.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_results_plots.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/test_timeseries.py +0 -0
- {flixopt-2.1.1 → flixopt-2.1.2}/tests/todos.txt +0 -0
|
@@ -8,6 +8,8 @@ on:
|
|
|
8
8
|
jobs:
|
|
9
9
|
deploy-docs:
|
|
10
10
|
runs-on: ubuntu-latest
|
|
11
|
+
# Only deploy docs for stable releases (not pre-releases)
|
|
12
|
+
if: github.event.release.prerelease == false
|
|
11
13
|
steps:
|
|
12
14
|
- uses: actions/checkout@v4
|
|
13
15
|
with:
|
|
@@ -30,4 +32,6 @@ jobs:
|
|
|
30
32
|
- name: Deploy docs
|
|
31
33
|
run: |
|
|
32
34
|
VERSION=${GITHUB_REF#refs/tags/v}
|
|
33
|
-
|
|
35
|
+
echo "Deploying docs for stable release: $VERSION"
|
|
36
|
+
mike deploy --push --update-aliases $VERSION latest
|
|
37
|
+
mike set-default --push latest
|
|
@@ -56,12 +56,49 @@ jobs:
|
|
|
56
56
|
- name: Run tests
|
|
57
57
|
run: pytest -v -p no:warnings
|
|
58
58
|
|
|
59
|
+
create-release:
|
|
60
|
+
name: Create Release with Changelog
|
|
61
|
+
runs-on: ubuntu-22.04
|
|
62
|
+
needs: [test]
|
|
63
|
+
if: startsWith(github.ref, 'refs/tags/v')
|
|
64
|
+
|
|
65
|
+
steps:
|
|
66
|
+
- name: Checkout repository
|
|
67
|
+
uses: actions/checkout@v4
|
|
68
|
+
with:
|
|
69
|
+
fetch-depth: 0
|
|
70
|
+
|
|
71
|
+
- name: Set up Python
|
|
72
|
+
uses: actions/setup-python@v4
|
|
73
|
+
with:
|
|
74
|
+
python-version: "3.11"
|
|
75
|
+
|
|
76
|
+
- name: Sync changelog to docs
|
|
77
|
+
run: |
|
|
78
|
+
cp CHANGELOG.md docs/changelog.md
|
|
79
|
+
echo "✅ Synced changelog to docs"
|
|
80
|
+
|
|
81
|
+
- name: Extract release notes
|
|
82
|
+
run: |
|
|
83
|
+
VERSION=${GITHUB_REF#refs/tags/v}
|
|
84
|
+
echo "Extracting release notes for version: $VERSION"
|
|
85
|
+
python scripts/extract_release_notes.py $VERSION > current_release_notes.md
|
|
86
|
+
|
|
87
|
+
- name: Create GitHub Release
|
|
88
|
+
uses: softprops/action-gh-release@v1
|
|
89
|
+
with:
|
|
90
|
+
body_path: current_release_notes.md
|
|
91
|
+
draft: false
|
|
92
|
+
prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') || contains(github.ref, 'rc') }}
|
|
93
|
+
env:
|
|
94
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
95
|
+
|
|
59
96
|
publish-testpypi:
|
|
60
97
|
name: Publish to TestPyPI
|
|
61
98
|
runs-on: ubuntu-22.04
|
|
62
|
-
needs: [test] #
|
|
63
|
-
if: github.event_name == '
|
|
64
|
-
|
|
99
|
+
needs: [test, create-release] # Run after tests and release creation
|
|
100
|
+
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') # Only on tag push
|
|
101
|
+
|
|
65
102
|
steps:
|
|
66
103
|
- name: Checkout repository
|
|
67
104
|
uses: actions/checkout@v4
|
|
@@ -86,7 +123,7 @@ jobs:
|
|
|
86
123
|
env:
|
|
87
124
|
TWINE_USERNAME: __token__
|
|
88
125
|
TWINE_PASSWORD: ${{ secrets.TEST_PYPI_API_TOKEN }}
|
|
89
|
-
|
|
126
|
+
|
|
90
127
|
- name: Test install from TestPyPI
|
|
91
128
|
run: |
|
|
92
129
|
# Create a temporary environment to test installation
|
|
@@ -104,8 +141,8 @@ jobs:
|
|
|
104
141
|
publish-pypi:
|
|
105
142
|
name: Publish to PyPI
|
|
106
143
|
runs-on: ubuntu-22.04
|
|
107
|
-
needs: [
|
|
108
|
-
if: github.event_name == '
|
|
144
|
+
needs: [publish-testpypi] # Only run after TestPyPI publish succeeds
|
|
145
|
+
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') # Only on tag push
|
|
109
146
|
|
|
110
147
|
steps:
|
|
111
148
|
- name: Checkout repository
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [2.1.2] - 2025-06-14
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
- Storage losses per hour where not calculated correctly, as mentioned by @brokenwings01. This might have lead to issues with modeling large losses and long timesteps.
|
|
14
|
+
- Old implementation: $c(\text{t}_{i}) \cdot (1-\dot{\text{c}}_\text{rel,loss}(\text{t}_i)) \cdot \Delta \text{t}_{i}$
|
|
15
|
+
- Correct implementation: $c(\text{t}_{i}) \cdot (1-\dot{\text{c}}_\text{rel,loss}(\text{t}_i)) ^{\Delta \text{t}_{i}}$
|
|
16
|
+
|
|
17
|
+
### Known issues
|
|
18
|
+
- 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.
|
|
19
|
+
|
|
20
|
+
## [2.1.1] - 2025-05-08
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- Fixed bug in the `_ElementResults.constraints` not returning the constraints but rather the variables
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
- Improved docstring and tests
|
|
27
|
+
|
|
28
|
+
## [2.1.0] - 2025-04-11
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
- Python 3.13 support added
|
|
32
|
+
- Logger warning if relative_minimum is used without on_off_parameters in Flow
|
|
33
|
+
- Greatly improved internal testing infrastructure by leveraging linopy's testing framework
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
- Fixed the lower bound of `flow_rate` when using optional investments without OnOffParameters
|
|
37
|
+
- Fixed bug that prevented divest effects from working
|
|
38
|
+
- Added lower bounds of 0 to two unbounded vars (numerical improvement)
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
- **BREAKING**: Restructured the modeling of the On/Off state of Flows or Components
|
|
42
|
+
- Variable renaming: `...|consecutive_on_hours` → `...|ConsecutiveOn|hours`
|
|
43
|
+
- Variable renaming: `...|consecutive_off_hours` → `...|ConsecutiveOff|hours`
|
|
44
|
+
- Constraint renaming: `...|consecutive_on_hours_con1` → `...|ConsecutiveOn|con1`
|
|
45
|
+
- Similar pattern for all consecutive on/off constraints
|
|
46
|
+
|
|
47
|
+
## [2.0.1] - 2025-04-10
|
|
48
|
+
|
|
49
|
+
### Added
|
|
50
|
+
- Logger warning if relative_minimum is used without on_off_parameters in Flow
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
- Replace "|" with "__" in filenames when saving figures (Windows compatibility)
|
|
54
|
+
- Fixed bug that prevented the load factor from working without InvestmentParameters
|
|
55
|
+
|
|
56
|
+
## [2.0.0] - 2025-03-29
|
|
57
|
+
|
|
58
|
+
### Changed
|
|
59
|
+
- **BREAKING**: Complete migration from Pyomo to Linopy optimization framework
|
|
60
|
+
- **BREAKING**: Redesigned data handling to rely on xarray.Dataset throughout the package
|
|
61
|
+
- **BREAKING**: Framework renamed from flixOpt to flixopt (`import flixopt as fx`)
|
|
62
|
+
- **BREAKING**: Results handling completely redesigned with new `CalculationResults` class
|
|
63
|
+
|
|
64
|
+
### Added
|
|
65
|
+
- Full model serialization support - save and restore unsolved Models
|
|
66
|
+
- Enhanced model documentation with YAML export containing human-readable mathematical formulations
|
|
67
|
+
- Extend flixopt models with native linopy language support
|
|
68
|
+
- Full Model Export/Import capabilities via linopy.Model
|
|
69
|
+
- Unified solution exploration through `Calculation.results` attribute
|
|
70
|
+
- Compression support for result files
|
|
71
|
+
- `to_netcdf/from_netcdf` methods for FlowSystem and core components
|
|
72
|
+
- xarray integration for TimeSeries with improved datatypes support
|
|
73
|
+
- Google Style Docstrings throughout the codebase
|
|
74
|
+
|
|
75
|
+
### Fixed
|
|
76
|
+
- Improved infeasible model detection and reporting
|
|
77
|
+
- Enhanced time series management and serialization
|
|
78
|
+
- Reduced file size through improved compression
|
|
79
|
+
|
|
80
|
+
### Removed
|
|
81
|
+
- **BREAKING**: Pyomo dependency (replaced by linopy)
|
|
82
|
+
- Period concepts in time management (simplified to timesteps)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flixopt
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.2
|
|
4
4
|
Summary: Vector based energy and material flow optimization framework in Python.
|
|
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,40 +22,40 @@ Classifier: License :: OSI Approved :: MIT License
|
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
License-File: LICENSE
|
|
25
|
-
Requires-Dist: numpy
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist: linopy
|
|
28
|
-
Requires-Dist: netcdf4
|
|
29
|
-
Requires-Dist:
|
|
25
|
+
Requires-Dist: numpy<3,>=1.21.5
|
|
26
|
+
Requires-Dist: pandas<3,>=2.0.0
|
|
27
|
+
Requires-Dist: linopy<0.6.0,>=0.5.1
|
|
28
|
+
Requires-Dist: netcdf4<2,>=1.6.1
|
|
29
|
+
Requires-Dist: PyYAML<7,>=6.0.0
|
|
30
|
+
Requires-Dist: rich>=13.0.0
|
|
31
|
+
Requires-Dist: tomli>=2.0.1; python_version < "3.11"
|
|
30
32
|
Requires-Dist: highspy>=1.5.3
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist: plotly>=5.15
|
|
34
|
-
Requires-Dist: tomli>=2.0.1
|
|
33
|
+
Requires-Dist: matplotlib<4.0.0,>=3.5.2
|
|
34
|
+
Requires-Dist: plotly<6.0.0,>=5.15.0
|
|
35
35
|
Provides-Extra: dev
|
|
36
|
-
Requires-Dist: pytest; extra == "dev"
|
|
37
|
-
Requires-Dist: ruff; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
37
|
+
Requires-Dist: ruff>=0.9.0; extra == "dev"
|
|
38
38
|
Requires-Dist: pyvis==0.3.1; extra == "dev"
|
|
39
|
-
Requires-Dist: tsam
|
|
40
|
-
Requires-Dist: scipy
|
|
41
|
-
Requires-Dist: gurobipy>=10.0; extra == "dev"
|
|
39
|
+
Requires-Dist: tsam<3.0.0,>=2.3.1; extra == "dev"
|
|
40
|
+
Requires-Dist: scipy<2.0.0,>=1.15.1; extra == "dev"
|
|
41
|
+
Requires-Dist: gurobipy>=10.0.0; extra == "dev"
|
|
42
42
|
Provides-Extra: full
|
|
43
43
|
Requires-Dist: pyvis==0.3.1; extra == "full"
|
|
44
|
-
Requires-Dist: tsam
|
|
45
|
-
Requires-Dist: scipy
|
|
46
|
-
Requires-Dist: streamlit
|
|
47
|
-
Requires-Dist: gurobipy>=10.0; extra == "full"
|
|
44
|
+
Requires-Dist: tsam<3.0.0,>=2.3.1; extra == "full"
|
|
45
|
+
Requires-Dist: scipy<2.0.0,>=1.15.1; extra == "full"
|
|
46
|
+
Requires-Dist: streamlit<2.0.0,>=1.44.0; extra == "full"
|
|
47
|
+
Requires-Dist: gurobipy>=10.0.0; extra == "full"
|
|
48
48
|
Provides-Extra: docs
|
|
49
|
-
Requires-Dist: mkdocs-material
|
|
50
|
-
Requires-Dist: mkdocstrings-python; extra == "docs"
|
|
51
|
-
Requires-Dist: mkdocs-table-reader-plugin; extra == "docs"
|
|
52
|
-
Requires-Dist: mkdocs-gen-files; extra == "docs"
|
|
53
|
-
Requires-Dist: mkdocs-include-markdown-plugin; extra == "docs"
|
|
54
|
-
Requires-Dist: mkdocs-literate-nav; extra == "docs"
|
|
55
|
-
Requires-Dist: markdown-include; extra == "docs"
|
|
56
|
-
Requires-Dist: pymdown-extensions; extra == "docs"
|
|
57
|
-
Requires-Dist: pygments; extra == "docs"
|
|
58
|
-
Requires-Dist: mike; extra == "docs"
|
|
49
|
+
Requires-Dist: mkdocs-material<10,>=9.0.0; extra == "docs"
|
|
50
|
+
Requires-Dist: mkdocstrings-python>=1.0.0; extra == "docs"
|
|
51
|
+
Requires-Dist: mkdocs-table-reader-plugin>=2.0.0; extra == "docs"
|
|
52
|
+
Requires-Dist: mkdocs-gen-files>=0.4.0; extra == "docs"
|
|
53
|
+
Requires-Dist: mkdocs-include-markdown-plugin>=6.0.0; extra == "docs"
|
|
54
|
+
Requires-Dist: mkdocs-literate-nav>=0.6.0; extra == "docs"
|
|
55
|
+
Requires-Dist: markdown-include>=0.8.0; extra == "docs"
|
|
56
|
+
Requires-Dist: pymdown-extensions>=10.0.0; extra == "docs"
|
|
57
|
+
Requires-Dist: pygments>=2.14.0; extra == "docs"
|
|
58
|
+
Requires-Dist: mike<2,>=1.1.0; extra == "docs"
|
|
59
59
|
Dynamic: license-file
|
|
60
60
|
|
|
61
61
|
# FlixOpt: Energy and Material Flow Optimization Framework
|
|
@@ -31,3 +31,8 @@ if __name__ == '__main__':
|
|
|
31
31
|
# --- Plotting internal variables manually ---
|
|
32
32
|
results.plot_heatmap('BHKW2(Q_th)|on')
|
|
33
33
|
results.plot_heatmap('Kessel(Q_th)|on')
|
|
34
|
+
|
|
35
|
+
# Dataframes from results:
|
|
36
|
+
fw_bus = results['Fernwärme'].node_balance().to_dataframe()
|
|
37
|
+
all = results.solution.to_dataframe()
|
|
38
|
+
|
|
@@ -491,7 +491,7 @@ class StorageModel(ComponentModel):
|
|
|
491
491
|
self.add(
|
|
492
492
|
self._model.add_constraints(
|
|
493
493
|
charge_state.isel(time=slice(1, None))
|
|
494
|
-
== charge_state.isel(time=slice(None, -1)) * (1 - rel_loss
|
|
494
|
+
== charge_state.isel(time=slice(None, -1)) * ((1 - rel_loss) ** hours_per_step)
|
|
495
495
|
+ charge_rate * eff_charge * hours_per_step
|
|
496
496
|
- discharge_rate * eff_discharge * hours_per_step,
|
|
497
497
|
name=f'{self.label_full}|charge_state',
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: flixopt
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.2
|
|
4
4
|
Summary: Vector based energy and material flow optimization framework in Python.
|
|
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,40 +22,40 @@ Classifier: License :: OSI Approved :: MIT License
|
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
24
|
License-File: LICENSE
|
|
25
|
-
Requires-Dist: numpy
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist: linopy
|
|
28
|
-
Requires-Dist: netcdf4
|
|
29
|
-
Requires-Dist:
|
|
25
|
+
Requires-Dist: numpy<3,>=1.21.5
|
|
26
|
+
Requires-Dist: pandas<3,>=2.0.0
|
|
27
|
+
Requires-Dist: linopy<0.6.0,>=0.5.1
|
|
28
|
+
Requires-Dist: netcdf4<2,>=1.6.1
|
|
29
|
+
Requires-Dist: PyYAML<7,>=6.0.0
|
|
30
|
+
Requires-Dist: rich>=13.0.0
|
|
31
|
+
Requires-Dist: tomli>=2.0.1; python_version < "3.11"
|
|
30
32
|
Requires-Dist: highspy>=1.5.3
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist: plotly>=5.15
|
|
34
|
-
Requires-Dist: tomli>=2.0.1
|
|
33
|
+
Requires-Dist: matplotlib<4.0.0,>=3.5.2
|
|
34
|
+
Requires-Dist: plotly<6.0.0,>=5.15.0
|
|
35
35
|
Provides-Extra: dev
|
|
36
|
-
Requires-Dist: pytest; extra == "dev"
|
|
37
|
-
Requires-Dist: ruff; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
|
37
|
+
Requires-Dist: ruff>=0.9.0; extra == "dev"
|
|
38
38
|
Requires-Dist: pyvis==0.3.1; extra == "dev"
|
|
39
|
-
Requires-Dist: tsam
|
|
40
|
-
Requires-Dist: scipy
|
|
41
|
-
Requires-Dist: gurobipy>=10.0; extra == "dev"
|
|
39
|
+
Requires-Dist: tsam<3.0.0,>=2.3.1; extra == "dev"
|
|
40
|
+
Requires-Dist: scipy<2.0.0,>=1.15.1; extra == "dev"
|
|
41
|
+
Requires-Dist: gurobipy>=10.0.0; extra == "dev"
|
|
42
42
|
Provides-Extra: full
|
|
43
43
|
Requires-Dist: pyvis==0.3.1; extra == "full"
|
|
44
|
-
Requires-Dist: tsam
|
|
45
|
-
Requires-Dist: scipy
|
|
46
|
-
Requires-Dist: streamlit
|
|
47
|
-
Requires-Dist: gurobipy>=10.0; extra == "full"
|
|
44
|
+
Requires-Dist: tsam<3.0.0,>=2.3.1; extra == "full"
|
|
45
|
+
Requires-Dist: scipy<2.0.0,>=1.15.1; extra == "full"
|
|
46
|
+
Requires-Dist: streamlit<2.0.0,>=1.44.0; extra == "full"
|
|
47
|
+
Requires-Dist: gurobipy>=10.0.0; extra == "full"
|
|
48
48
|
Provides-Extra: docs
|
|
49
|
-
Requires-Dist: mkdocs-material
|
|
50
|
-
Requires-Dist: mkdocstrings-python; extra == "docs"
|
|
51
|
-
Requires-Dist: mkdocs-table-reader-plugin; extra == "docs"
|
|
52
|
-
Requires-Dist: mkdocs-gen-files; extra == "docs"
|
|
53
|
-
Requires-Dist: mkdocs-include-markdown-plugin; extra == "docs"
|
|
54
|
-
Requires-Dist: mkdocs-literate-nav; extra == "docs"
|
|
55
|
-
Requires-Dist: markdown-include; extra == "docs"
|
|
56
|
-
Requires-Dist: pymdown-extensions; extra == "docs"
|
|
57
|
-
Requires-Dist: pygments; extra == "docs"
|
|
58
|
-
Requires-Dist: mike; extra == "docs"
|
|
49
|
+
Requires-Dist: mkdocs-material<10,>=9.0.0; extra == "docs"
|
|
50
|
+
Requires-Dist: mkdocstrings-python>=1.0.0; extra == "docs"
|
|
51
|
+
Requires-Dist: mkdocs-table-reader-plugin>=2.0.0; extra == "docs"
|
|
52
|
+
Requires-Dist: mkdocs-gen-files>=0.4.0; extra == "docs"
|
|
53
|
+
Requires-Dist: mkdocs-include-markdown-plugin>=6.0.0; extra == "docs"
|
|
54
|
+
Requires-Dist: mkdocs-literate-nav>=0.6.0; extra == "docs"
|
|
55
|
+
Requires-Dist: markdown-include>=0.8.0; extra == "docs"
|
|
56
|
+
Requires-Dist: pymdown-extensions>=10.0.0; extra == "docs"
|
|
57
|
+
Requires-Dist: pygments>=2.14.0; extra == "docs"
|
|
58
|
+
Requires-Dist: mike<2,>=1.1.0; extra == "docs"
|
|
59
59
|
Dynamic: license-file
|
|
60
60
|
|
|
61
61
|
# FlixOpt: Energy and Material Flow Optimization Framework
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
.gitignore
|
|
2
|
+
CHANGELOG.md
|
|
2
3
|
LICENSE
|
|
3
4
|
README.md
|
|
4
5
|
mkdocs.yml
|
|
@@ -20,12 +21,6 @@ docs/images/architecture_flixOpt-pre2.0.0.png
|
|
|
20
21
|
docs/images/architecture_flixOpt.png
|
|
21
22
|
docs/images/flixopt-icon.svg
|
|
22
23
|
docs/javascripts/mathjax.js
|
|
23
|
-
docs/release-notes/_template.txt
|
|
24
|
-
docs/release-notes/index.md
|
|
25
|
-
docs/release-notes/v2.0.0.md
|
|
26
|
-
docs/release-notes/v2.0.1.md
|
|
27
|
-
docs/release-notes/v2.1.0.md
|
|
28
|
-
docs/release-notes/v2.1.1.md
|
|
29
24
|
docs/user-guide/index.md
|
|
30
25
|
docs/user-guide/Mathematical Notation/Bus.md
|
|
31
26
|
docs/user-guide/Mathematical Notation/Effects, Penalty & Objective.md
|
|
@@ -71,8 +66,8 @@ pics/architecture_flixOpt.png
|
|
|
71
66
|
pics/flixOpt_plotting.jpg
|
|
72
67
|
pics/flixopt-icon.svg
|
|
73
68
|
pics/pics.pptx
|
|
69
|
+
scripts/extract_release_notes.py
|
|
74
70
|
scripts/gen_ref_pages.py
|
|
75
|
-
site/release-notes/_template.txt
|
|
76
71
|
tests/__init__.py
|
|
77
72
|
tests/conftest.py
|
|
78
73
|
tests/run_all_tests.py
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
numpy<3,>=1.21.5
|
|
2
|
+
pandas<3,>=2.0.0
|
|
3
|
+
linopy<0.6.0,>=0.5.1
|
|
4
|
+
netcdf4<2,>=1.6.1
|
|
5
|
+
PyYAML<7,>=6.0.0
|
|
6
|
+
rich>=13.0.0
|
|
7
|
+
highspy>=1.5.3
|
|
8
|
+
matplotlib<4.0.0,>=3.5.2
|
|
9
|
+
plotly<6.0.0,>=5.15.0
|
|
10
|
+
|
|
11
|
+
[:python_version < "3.11"]
|
|
12
|
+
tomli>=2.0.1
|
|
13
|
+
|
|
14
|
+
[dev]
|
|
15
|
+
pytest>=7.0.0
|
|
16
|
+
ruff>=0.9.0
|
|
17
|
+
pyvis==0.3.1
|
|
18
|
+
tsam<3.0.0,>=2.3.1
|
|
19
|
+
scipy<2.0.0,>=1.15.1
|
|
20
|
+
gurobipy>=10.0.0
|
|
21
|
+
|
|
22
|
+
[docs]
|
|
23
|
+
mkdocs-material<10,>=9.0.0
|
|
24
|
+
mkdocstrings-python>=1.0.0
|
|
25
|
+
mkdocs-table-reader-plugin>=2.0.0
|
|
26
|
+
mkdocs-gen-files>=0.4.0
|
|
27
|
+
mkdocs-include-markdown-plugin>=6.0.0
|
|
28
|
+
mkdocs-literate-nav>=0.6.0
|
|
29
|
+
markdown-include>=0.8.0
|
|
30
|
+
pymdown-extensions>=10.0.0
|
|
31
|
+
pygments>=2.14.0
|
|
32
|
+
mike<2,>=1.1.0
|
|
33
|
+
|
|
34
|
+
[full]
|
|
35
|
+
pyvis==0.3.1
|
|
36
|
+
tsam<3.0.0,>=2.3.1
|
|
37
|
+
scipy<2.0.0,>=1.15.1
|
|
38
|
+
streamlit<2.0.0,>=1.44.0
|
|
39
|
+
gurobipy>=10.0.0
|
|
@@ -79,12 +79,13 @@ markdown_extensions:
|
|
|
79
79
|
- pymdownx.snippets:
|
|
80
80
|
base_path: ..
|
|
81
81
|
|
|
82
|
-
|
|
83
82
|
plugins:
|
|
84
83
|
- search # Enables the search functionality in the documentation
|
|
85
84
|
- table-reader # Allows including tables from external files
|
|
86
85
|
- include-markdown
|
|
87
|
-
- mike
|
|
86
|
+
- mike:
|
|
87
|
+
version_selector: true
|
|
88
|
+
default_version: latest
|
|
88
89
|
- gen-files:
|
|
89
90
|
scripts:
|
|
90
91
|
- scripts/gen_ref_pages.py
|
|
@@ -33,47 +33,56 @@ classifiers = [
|
|
|
33
33
|
"License :: OSI Approved :: MIT License",
|
|
34
34
|
]
|
|
35
35
|
dependencies = [
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"
|
|
36
|
+
# Core scientific computing
|
|
37
|
+
"numpy >= 1.21.5, < 3",
|
|
38
|
+
"pandas >= 2.0.0, < 3",
|
|
39
|
+
|
|
40
|
+
# Optimization and data handling
|
|
41
|
+
"linopy >= 0.5.1, < 0.6.0",
|
|
42
|
+
"netcdf4 >= 1.6.1, < 2",
|
|
43
|
+
|
|
44
|
+
# Utilities
|
|
45
|
+
"PyYAML >= 6.0.0, < 7",
|
|
46
|
+
"rich >= 13.0.0",
|
|
47
|
+
"tomli >= 2.0.1; python_version < '3.11'", #Only needed with python 3.10 or earlier
|
|
48
|
+
|
|
49
|
+
# Default solver
|
|
50
|
+
"highspy >= 1.5.3",
|
|
51
|
+
|
|
52
|
+
# Visualization
|
|
53
|
+
"matplotlib >= 3.5.2, < 4.0.0",
|
|
54
|
+
"plotly >= 5.15.0, < 6.0.0",
|
|
46
55
|
]
|
|
47
56
|
|
|
48
57
|
[project.optional-dependencies]
|
|
49
58
|
dev = [
|
|
50
|
-
"pytest",
|
|
51
|
-
"ruff",
|
|
52
|
-
"pyvis == 0.3.1", #
|
|
53
|
-
"tsam >= 2.3.1",
|
|
54
|
-
"scipy >= 1.15.1",
|
|
55
|
-
"gurobipy >= 10.0",
|
|
59
|
+
"pytest >= 7.0.0",
|
|
60
|
+
"ruff >= 0.9.0",
|
|
61
|
+
"pyvis == 0.3.1", # Visualizing FlowSystem
|
|
62
|
+
"tsam >= 2.3.1, < 3.0.0", # Time series aggregation
|
|
63
|
+
"scipy >= 1.15.1, < 2.0.0", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257
|
|
64
|
+
"gurobipy >= 10.0.0",
|
|
56
65
|
]
|
|
57
66
|
|
|
58
67
|
full = [
|
|
59
|
-
"pyvis == 0.3.1", #
|
|
60
|
-
"tsam >= 2.3.1",
|
|
61
|
-
"scipy >= 1.15.1",
|
|
62
|
-
"streamlit >= 1.44.0",
|
|
63
|
-
"gurobipy >= 10.0",
|
|
68
|
+
"pyvis == 0.3.1", # Visualizing FlowSystem Network
|
|
69
|
+
"tsam >= 2.3.1, < 3.0.0", # Time series aggregation
|
|
70
|
+
"scipy >= 1.15.1, < 2.0.0", # Used by tsam. Prior versions have conflict with highspy. See https://github.com/scipy/scipy/issues/22257
|
|
71
|
+
"streamlit >= 1.44.0, < 2.0.0",
|
|
72
|
+
"gurobipy >= 10.0.0",
|
|
64
73
|
]
|
|
65
74
|
|
|
66
75
|
docs = [
|
|
67
|
-
"mkdocs-material>=9.0.0",
|
|
68
|
-
"mkdocstrings-python",
|
|
69
|
-
"mkdocs-table-reader-plugin",
|
|
70
|
-
"mkdocs-gen-files",
|
|
71
|
-
"mkdocs-include-markdown-plugin",
|
|
72
|
-
"mkdocs-literate-nav",
|
|
73
|
-
"markdown-include",
|
|
74
|
-
"pymdown-extensions",
|
|
75
|
-
"pygments",
|
|
76
|
-
"mike",
|
|
76
|
+
"mkdocs-material >= 9.0.0, < 10",
|
|
77
|
+
"mkdocstrings-python >= 1.0.0",
|
|
78
|
+
"mkdocs-table-reader-plugin >= 2.0.0",
|
|
79
|
+
"mkdocs-gen-files >= 0.4.0",
|
|
80
|
+
"mkdocs-include-markdown-plugin >= 6.0.0",
|
|
81
|
+
"mkdocs-literate-nav >= 0.6.0",
|
|
82
|
+
"markdown-include >= 0.8.0",
|
|
83
|
+
"pymdown-extensions >= 10.0.0",
|
|
84
|
+
"pygments >= 2.14.0",
|
|
85
|
+
"mike >= 1.1.0, < 2",
|
|
77
86
|
]
|
|
78
87
|
|
|
79
88
|
[project.urls]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Extract release notes from CHANGELOG.md for a specific version.
|
|
4
|
+
Usage: python extract_release_notes.py <version>
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
import sys
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def extract_release_notes(version: str) -> str:
|
|
13
|
+
"""Extract release notes for a specific version from CHANGELOG.md"""
|
|
14
|
+
changelog_path = Path("CHANGELOG.md")
|
|
15
|
+
|
|
16
|
+
if not changelog_path.exists():
|
|
17
|
+
print("❌ Error: CHANGELOG.md not found", file=sys.stderr)
|
|
18
|
+
sys.exit(1)
|
|
19
|
+
|
|
20
|
+
content = changelog_path.read_text(encoding='utf-8')
|
|
21
|
+
|
|
22
|
+
# Pattern to match version section: ## [2.1.2] - 2025-06-14
|
|
23
|
+
pattern = rf'## \[{re.escape(version)}\] - [^\n]+\n(.*?)(?=\n## \[|\n\[Unreleased\]|\Z)'
|
|
24
|
+
match = re.search(pattern, content, re.DOTALL)
|
|
25
|
+
|
|
26
|
+
if not match:
|
|
27
|
+
print(f"❌ Error: No release notes found for version '{version}'", file=sys.stderr)
|
|
28
|
+
sys.exit(1)
|
|
29
|
+
|
|
30
|
+
return match.group(1).strip()
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def main():
|
|
34
|
+
if len(sys.argv) != 2:
|
|
35
|
+
print("Usage: python extract_release_notes.py <version>")
|
|
36
|
+
print("Example: python extract_release_notes.py 2.1.2")
|
|
37
|
+
sys.exit(1)
|
|
38
|
+
|
|
39
|
+
version = sys.argv[1]
|
|
40
|
+
release_notes = extract_release_notes(version)
|
|
41
|
+
print(release_notes)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
if __name__ == "__main__":
|
|
45
|
+
main()
|
|
@@ -165,7 +165,7 @@ class TestStorageModel:
|
|
|
165
165
|
assert_conequal(
|
|
166
166
|
model.constraints['TestStorage|charge_state'],
|
|
167
167
|
charge_state.isel(time=slice(1, None))
|
|
168
|
-
== charge_state.isel(time=slice(None, -1)) * (1 - rel_loss
|
|
168
|
+
== charge_state.isel(time=slice(None, -1)) * (1 - rel_loss) ** hours_per_step
|
|
169
169
|
+ charge_rate * eff_charge * hours_per_step - discharge_rate * eff_discharge * hours_per_step,
|
|
170
170
|
)
|
|
171
171
|
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Release v{version}
|
|
2
|
-
|
|
3
|
-
**Release Date:** YYYY-MM-DD
|
|
4
|
-
|
|
5
|
-
## What's New
|
|
6
|
-
|
|
7
|
-
* Feature 1 - Description
|
|
8
|
-
* Feature 2 - Description
|
|
9
|
-
|
|
10
|
-
## Improvements
|
|
11
|
-
|
|
12
|
-
* Improvement 1 - Description
|
|
13
|
-
* Improvement 2 - Description
|
|
14
|
-
|
|
15
|
-
## Bug Fixes
|
|
16
|
-
|
|
17
|
-
* Fixed issue with X
|
|
18
|
-
* Resolved problem with Y
|
|
19
|
-
|
|
20
|
-
## Breaking Changes
|
|
21
|
-
|
|
22
|
-
* Change 1 - Migration instructions
|
|
23
|
-
* Change 2 - Migration instructions
|
|
24
|
-
|
|
25
|
-
## Deprecations
|
|
26
|
-
|
|
27
|
-
* Feature X will be removed in v{next_version}
|
|
28
|
-
|
|
29
|
-
## Dependencies
|
|
30
|
-
|
|
31
|
-
* Added dependency X v1.2.3
|
|
32
|
-
* Updated dependency Y to v2.0.0
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# Release v2.0.0
|
|
2
|
-
|
|
3
|
-
**Release Date:** March 29, 2025
|
|
4
|
-
|
|
5
|
-
## 🚀 Major Framework Changes
|
|
6
|
-
|
|
7
|
-
- **Migration from Pyomo to Linopy**: Completely rebuilt the optimization foundation to use Linopy instead of Pyomo
|
|
8
|
-
- Significant performance improvements, especially for large models
|
|
9
|
-
- Internal useage of linopys mathematical modeling language
|
|
10
|
-
- **xarray-Based Data Architecture**: Redesigned data handling to rely on xarray.Dataset throughout the package for:
|
|
11
|
-
- Improved solution representation and analysis
|
|
12
|
-
- Enhanced time series management
|
|
13
|
-
- Consistent serialization across all elements
|
|
14
|
-
- Reduced file size and improved performance
|
|
15
|
-
- **Saving and restoring unsolved Models**: The FlowSystem is now fully serializable and can be saved to a file.
|
|
16
|
-
- Share your work with others by saving the FlowSystem to a file
|
|
17
|
-
- Load a FlowSystem from a file to extend or modify your work
|
|
18
|
-
|
|
19
|
-
## 🔧 Key Improvements
|
|
20
|
-
|
|
21
|
-
### Model Handling
|
|
22
|
-
|
|
23
|
-
- **Extend every flixopt model with the linopy language**: Add any additional constraint or variable to your flixopt model by using the linopy language.
|
|
24
|
-
- **Full Model Export/Import**: As a result of the migration to Linopy, the linopy.Model can be exported before or after the solve.
|
|
25
|
-
- **Improved Infeasible Model Handling**: Added better detection and reporting for infeasible optimization models
|
|
26
|
-
- **Improved Model Documentation**: Every model can be documented in a .yaml file, containing human readable mathematical formulations of all variables and constraints. THis is used to document every Calculation.
|
|
27
|
-
|
|
28
|
-
### Calculation Results and documentation:
|
|
29
|
-
The `CalculationResults` class has been completely redesigned to provide a more streamlined and intuitive interface.
|
|
30
|
-
Accessing the results of a Calculation is now as simple as:
|
|
31
|
-
```python
|
|
32
|
-
fx.FullCalculation('Sim1', flow_system)
|
|
33
|
-
calculation.solve(fx.solvers.HighsSolver())
|
|
34
|
-
calculation.results # This object can be entirely saved and reloaded to file without any information loss
|
|
35
|
-
```
|
|
36
|
-
This access doesn't change if you save and load the results to a file or use them in your script directly!
|
|
37
|
-
|
|
38
|
-
- **Improved Documentation**: The FlowSystem as well as a model Documentation is created for every model run.
|
|
39
|
-
- **Results without saving to file**: The results of a Calculation can now be properly accessed without saving the results to a file first.
|
|
40
|
-
- **Unified Solution exploration**: Every `Calculation` has a `Calculation.results` attribute, which accesses the solution. This can be saved and reloaded without any information loss.
|
|
41
|
-
- **Improved Calculation Results**: The results of a Calculation are now more intuitive and easier to access. The `CalculationResults` class has been completely redesigned to provide a more streamlined and intuitive interface.
|
|
42
|
-
|
|
43
|
-
### Data Management & I/O
|
|
44
|
-
|
|
45
|
-
- **Unified Serialization**: Standardized serialization and deserialization across all elements
|
|
46
|
-
- **Compression Support**: Added data compression when saving results to reduce file size
|
|
47
|
-
- **to_netcdf/from_netcdf Methods**: Added for FlowSystem and other core components
|
|
48
|
-
|
|
49
|
-
### Details
|
|
50
|
-
#### TimeSeries Enhancements
|
|
51
|
-
|
|
52
|
-
- **xarray Integration**: Redesigned TimeSeries to depend on xr.DataArray
|
|
53
|
-
- **datatypes**: Added support for more datatypes, with methods for conversion to TimeSeries
|
|
54
|
-
- **Improved TimeSeriesCollection**: Enhanced indexing, representation, and dataset conversion
|
|
55
|
-
- **Simplified Time Management**: Removed period concepts and focused on timesteps for more intuitive time handling
|
|
56
|
-
|
|
57
|
-
## 📚 Documentation
|
|
58
|
-
|
|
59
|
-
- Improved documentation of the FlixOpt API and mathematical formulations
|
|
60
|
-
- **Google Style Docstrings**: Updated all docstrings to Google style format
|
|
61
|
-
|
|
62
|
-
## 🔄 Dependencies
|
|
63
|
-
|
|
64
|
-
- **Linopy**: Added as the core dependency replacing Pyomo
|
|
65
|
-
- **xarray**: Now a critical dependency for data handling and file I/O
|
|
66
|
-
- **netcdf4**: Dependency for fast and efficient file I/O
|
|
67
|
-
|
|
68
|
-
### Dropped Dependencies
|
|
69
|
-
- **pyomo**: Replaced by linopy as the modeling language
|
|
70
|
-
|
|
71
|
-
## 📋 Migration Notes
|
|
72
|
-
|
|
73
|
-
This version represents a significant architecture change. If you're upgrading:
|
|
74
|
-
|
|
75
|
-
- Code that directly accessed Pyomo models will need to be updated to work with Linopy
|
|
76
|
-
- Data handling now uses xarray.Dataset throughout, which may require changes in how you interact with results
|
|
77
|
-
- The way labels are constructed has changed throughout the system
|
|
78
|
-
- The results of calculations are now handled differently, and may require changes in how you access results
|
|
79
|
-
- The framework was renamed from flixOpt to flixopt. Use `import flixopt as fx`.
|
|
80
|
-
|
|
81
|
-
For complete details, please refer to the full commit history.
|
|
82
|
-
|
|
83
|
-
## Installation
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
pip install flixopt==2.0.0
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Upgrading
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
pip install --upgrade flixopt
|
|
93
|
-
```
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Release v2.0.1
|
|
2
|
-
|
|
3
|
-
**Release Date:** 2025-04-10
|
|
4
|
-
|
|
5
|
-
## Improvements
|
|
6
|
-
|
|
7
|
-
* Add logger warning if relative_minimum is used without on_off_parameters in Flow, as this prevents the flow_rate from switching "OFF"
|
|
8
|
-
|
|
9
|
-
## Bug Fixes
|
|
10
|
-
|
|
11
|
-
* Replace "|" with "__" in filenames when saving figures, as "|" can lead to issues on windows
|
|
12
|
-
* Fixed a Bug that prevented the load factor from working without InvestmentParameters
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Release v2.1.0
|
|
2
|
-
|
|
3
|
-
**Release Date:** 2025-04-11
|
|
4
|
-
|
|
5
|
-
## Improvements
|
|
6
|
-
|
|
7
|
-
* Add logger warning if relative_minimum is used without on_off_parameters in Flow, as this prevents the flow_rate from switching "OFF"
|
|
8
|
-
* Python 3.13 support added
|
|
9
|
-
* Greatly improved internal testing infrastructure by leveraging linopy's testing framework
|
|
10
|
-
|
|
11
|
-
## Bug Fixes
|
|
12
|
-
|
|
13
|
-
* Bugfixing the lower bound of `flow_rate` when using optional investments without OnOffParameters.
|
|
14
|
-
* Fixes a Bug that prevented divest effects from working.
|
|
15
|
-
* added lower bounds of 0 to two unbounded vars (only numerical better)
|
|
16
|
-
|
|
17
|
-
## Breaking Changes
|
|
18
|
-
|
|
19
|
-
* We restructured the modeling of the On/Off state of FLows or Components. This leads to slightly renaming of variables and constraints.
|
|
20
|
-
|
|
21
|
-
### Variable renaming
|
|
22
|
-
* "...|consecutive_on_hours" is now "...|ConsecutiveOn|hours"
|
|
23
|
-
* "...|consecutive_off_hours" is now "...|ConsecutiveOff|hours"
|
|
24
|
-
|
|
25
|
-
### Constraint renaming
|
|
26
|
-
* "...|consecutive_on_hours_con1" is now "...|ConsecutiveOn|con1"
|
|
27
|
-
* "...|consecutive_on_hours_con2a" is now "...|ConsecutiveOn|con2a"
|
|
28
|
-
* "...|consecutive_on_hours_con2b" is now "...|ConsecutiveOn|con2b"
|
|
29
|
-
* "...|consecutive_on_hours_initial" is now "...|ConsecutiveOn|initial"
|
|
30
|
-
* "...|consecutive_on_hours_minimum_duration" is now "...|ConsecutiveOn|minimum"
|
|
31
|
-
The same goes for "...|consecutive_off..." --> "...|ConsecutiveOff|..."
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
numpy>=1.21.5
|
|
2
|
-
PyYAML>=6.0
|
|
3
|
-
linopy>=0.5.1
|
|
4
|
-
netcdf4>=1.6.1
|
|
5
|
-
rich>=13.0.1
|
|
6
|
-
highspy>=1.5.3
|
|
7
|
-
pandas<3,>=2
|
|
8
|
-
matplotlib>=3.5.2
|
|
9
|
-
plotly>=5.15
|
|
10
|
-
tomli>=2.0.1
|
|
11
|
-
|
|
12
|
-
[dev]
|
|
13
|
-
pytest
|
|
14
|
-
ruff
|
|
15
|
-
pyvis==0.3.1
|
|
16
|
-
tsam>=2.3.1
|
|
17
|
-
scipy>=1.15.1
|
|
18
|
-
gurobipy>=10.0
|
|
19
|
-
|
|
20
|
-
[docs]
|
|
21
|
-
mkdocs-material>=9.0.0
|
|
22
|
-
mkdocstrings-python
|
|
23
|
-
mkdocs-table-reader-plugin
|
|
24
|
-
mkdocs-gen-files
|
|
25
|
-
mkdocs-include-markdown-plugin
|
|
26
|
-
mkdocs-literate-nav
|
|
27
|
-
markdown-include
|
|
28
|
-
pymdown-extensions
|
|
29
|
-
pygments
|
|
30
|
-
mike
|
|
31
|
-
|
|
32
|
-
[full]
|
|
33
|
-
pyvis==0.3.1
|
|
34
|
-
tsam>=2.3.1
|
|
35
|
-
scipy>=1.15.1
|
|
36
|
-
streamlit>=1.44.0
|
|
37
|
-
gurobipy>=10.0
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Release v{version}
|
|
2
|
-
|
|
3
|
-
**Release Date:** YYYY-MM-DD
|
|
4
|
-
|
|
5
|
-
## What's New
|
|
6
|
-
|
|
7
|
-
* Feature 1 - Description
|
|
8
|
-
* Feature 2 - Description
|
|
9
|
-
|
|
10
|
-
## Improvements
|
|
11
|
-
|
|
12
|
-
* Improvement 1 - Description
|
|
13
|
-
* Improvement 2 - Description
|
|
14
|
-
|
|
15
|
-
## Bug Fixes
|
|
16
|
-
|
|
17
|
-
* Fixed issue with X
|
|
18
|
-
* Resolved problem with Y
|
|
19
|
-
|
|
20
|
-
## Breaking Changes
|
|
21
|
-
|
|
22
|
-
* Change 1 - Migration instructions
|
|
23
|
-
* Change 2 - Migration instructions
|
|
24
|
-
|
|
25
|
-
## Deprecations
|
|
26
|
-
|
|
27
|
-
* Feature X will be removed in v{next_version}
|
|
28
|
-
|
|
29
|
-
## Dependencies
|
|
30
|
-
|
|
31
|
-
* Added dependency X v1.2.3
|
|
32
|
-
* Updated dependency Y to v2.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
|
|
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
|