flixopt 2.1.7__py3-none-any.whl → 2.1.8__py3-none-any.whl

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/solvers.py CHANGED
@@ -2,9 +2,11 @@
2
2
  This module contains the solvers of the flixopt framework, making them available to the end user in a compact way.
3
3
  """
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import logging
6
8
  from dataclasses import dataclass, field
7
- from typing import Any, ClassVar, Dict, Optional
9
+ from typing import Any, ClassVar
8
10
 
9
11
  logger = logging.getLogger('flixopt')
10
12
 
@@ -14,41 +16,42 @@ class _Solver:
14
16
  """
15
17
  Abstract base class for solvers.
16
18
 
17
- Attributes:
18
- mip_gap (float): Solver's mip gap setting. The MIP gap describes the accepted (MILP) objective,
19
- and the lower bound, which is the theoretically optimal solution (LP)
20
- logfile_name (str): Filename for saving the solver log.
19
+ Args:
20
+ mip_gap: Acceptable relative optimality gap in [0.0, 1.0].
21
+ time_limit_seconds: Time limit in seconds.
22
+ extra_options: Additional solver options merged into `options`.
21
23
  """
22
24
 
23
25
  name: ClassVar[str]
24
26
  mip_gap: float
25
27
  time_limit_seconds: int
26
- extra_options: Dict[str, Any] = field(default_factory=dict)
28
+ extra_options: dict[str, Any] = field(default_factory=dict)
27
29
 
28
30
  @property
29
- def options(self) -> Dict[str, Any]:
31
+ def options(self) -> dict[str, Any]:
30
32
  """Return a dictionary of solver options."""
31
33
  return {key: value for key, value in {**self._options, **self.extra_options}.items() if value is not None}
32
34
 
33
35
  @property
34
- def _options(self) -> Dict[str, Any]:
36
+ def _options(self) -> dict[str, Any]:
35
37
  """Return a dictionary of solver options, translated to the solver's API."""
36
38
  raise NotImplementedError
37
39
 
38
40
 
39
41
  class GurobiSolver(_Solver):
40
42
  """
43
+ Gurobi solver configuration.
44
+
41
45
  Args:
42
- mip_gap (float): Solver's mip gap setting. The MIP gap describes the accepted (MILP) objective,
43
- and the lower bound, which is the theoretically optimal solution (LP)
44
- time_limit_seconds (int): Solver's time limit in seconds.
45
- extra_options (str): Filename for saving the solver log.
46
+ mip_gap: Acceptable relative optimality gap in [0.0, 1.0]; mapped to Gurobi `MIPGap`.
47
+ time_limit_seconds: Time limit in seconds; mapped to Gurobi `TimeLimit`.
48
+ extra_options: Additional solver options merged into `options`.
46
49
  """
47
50
 
48
51
  name: ClassVar[str] = 'gurobi'
49
52
 
50
53
  @property
51
- def _options(self) -> Dict[str, Any]:
54
+ def _options(self) -> dict[str, Any]:
52
55
  return {
53
56
  'MIPGap': self.mip_gap,
54
57
  'TimeLimit': self.time_limit_seconds,
@@ -57,19 +60,20 @@ class GurobiSolver(_Solver):
57
60
 
58
61
  class HighsSolver(_Solver):
59
62
  """
60
- Args:
61
- mip_gap (float): Solver's mip gap setting. The MIP gap describes the accepted (MILP) objective,
62
- and the lower bound, which is the theoretically optimal solution (LP)
63
- time_limit_seconds (int): Solver's time limit in seconds.
64
- threads (int): Number of threads to use.
65
- extra_options (str): Filename for saving the solver log.
63
+ HiGHS solver configuration.
64
+
65
+ Attributes:
66
+ mip_gap: Acceptable relative optimality gap in [0.0, 1.0]; mapped to HiGHS `mip_rel_gap`.
67
+ time_limit_seconds: Time limit in seconds; mapped to HiGHS `time_limit`.
68
+ extra_options: Additional solver options merged into `options`.
69
+ threads (int | None): Number of threads to use. If None, HiGHS chooses.
66
70
  """
67
71
 
68
- threads: Optional[int] = None
72
+ threads: int | None = None
69
73
  name: ClassVar[str] = 'highs'
70
74
 
71
75
  @property
72
- def _options(self) -> Dict[str, Any]:
76
+ def _options(self) -> dict[str, Any]:
73
77
  return {
74
78
  'mip_rel_gap': self.mip_gap,
75
79
  'time_limit': self.time_limit_seconds,
flixopt/structure.py CHANGED
@@ -3,25 +3,28 @@ This module contains the core structure of the flixopt framework.
3
3
  These classes are not directly used by the end user, but are used by other modules.
4
4
  """
5
5
 
6
+ from __future__ import annotations
7
+
6
8
  import inspect
7
9
  import json
8
10
  import logging
9
- import pathlib
10
11
  from datetime import datetime
11
12
  from io import StringIO
12
- from typing import TYPE_CHECKING, Any, Dict, List, Literal, Optional, Tuple, Union
13
+ from typing import TYPE_CHECKING, Any, Literal
13
14
 
14
15
  import linopy
15
16
  import numpy as np
16
- import pandas as pd
17
17
  import xarray as xr
18
18
  from rich.console import Console
19
19
  from rich.pretty import Pretty
20
20
 
21
- from .config import CONFIG
22
- from .core import NumericData, Scalar, TimeSeries, TimeSeriesCollection, TimeSeriesData
21
+ from .core import TimeSeries, TimeSeriesData
23
22
 
24
23
  if TYPE_CHECKING: # for type checking and preventing circular imports
24
+ import pathlib
25
+
26
+ import pandas as pd
27
+
25
28
  from .effects import EffectCollectionModel
26
29
  from .flow_system import FlowSystem
27
30
 
@@ -49,7 +52,7 @@ class SystemModel(linopy.Model):
49
52
  It is used to create and store the variables and constraints for the flow_system.
50
53
  """
51
54
 
52
- def __init__(self, flow_system: 'FlowSystem'):
55
+ def __init__(self, flow_system: FlowSystem):
53
56
  """
54
57
  Args:
55
58
  flow_system: The flow_system that is used to create the model.
@@ -57,7 +60,7 @@ class SystemModel(linopy.Model):
57
60
  super().__init__(force_dim_names=True)
58
61
  self.flow_system = flow_system
59
62
  self.time_series_collection = flow_system.time_series_collection
60
- self.effects: Optional[EffectCollectionModel] = None
63
+ self.effects: EffectCollectionModel | None = None
61
64
 
62
65
  def do_modeling(self):
63
66
  self.effects = self.flow_system.effects.create_model(self)
@@ -99,11 +102,11 @@ class SystemModel(linopy.Model):
99
102
  return self.time_series_collection.hours_of_previous_timesteps
100
103
 
101
104
  @property
102
- def coords(self) -> Tuple[pd.DatetimeIndex]:
105
+ def coords(self) -> tuple[pd.DatetimeIndex]:
103
106
  return (self.time_series_collection.timesteps,)
104
107
 
105
108
  @property
106
- def coords_extra(self) -> Tuple[pd.DatetimeIndex]:
109
+ def coords_extra(self) -> tuple[pd.DatetimeIndex]:
107
110
  return (self.time_series_collection.timesteps_extra,)
108
111
 
109
112
 
@@ -112,11 +115,11 @@ class Interface:
112
115
  This class is used to collect arguments about a Model. Its the base class for all Elements and Models in flixopt.
113
116
  """
114
117
 
115
- def transform_data(self, flow_system: 'FlowSystem'):
118
+ def transform_data(self, flow_system: FlowSystem):
116
119
  """Transforms the data of the interface to match the FlowSystem's dimensions"""
117
120
  raise NotImplementedError('Every Interface needs a transform_data() method')
118
121
 
119
- def infos(self, use_numpy: bool = True, use_element_label: bool = False) -> Dict:
122
+ def infos(self, use_numpy: bool = True, use_element_label: bool = False) -> dict:
120
123
  """
121
124
  Generate a dictionary representation of the object's constructor arguments.
122
125
  Excludes default values and empty dictionaries and lists.
@@ -150,7 +153,7 @@ class Interface:
150
153
  details[name] = copy_and_convert_datatypes(value, use_numpy, use_element_label)
151
154
  return details
152
155
 
153
- def to_json(self, path: Union[str, pathlib.Path]):
156
+ def to_json(self, path: str | pathlib.Path):
154
157
  """
155
158
  Saves the element to a json file.
156
159
  This not meant to be reloaded and recreate the object, but rather used to document or compare the object.
@@ -162,7 +165,7 @@ class Interface:
162
165
  with open(path, 'w', encoding='utf-8') as f:
163
166
  json.dump(data, f, indent=4, ensure_ascii=False)
164
167
 
165
- def to_dict(self) -> Dict:
168
+ def to_dict(self) -> dict:
166
169
  """Convert the object to a dictionary representation."""
167
170
  data = {'__class__': self.__class__.__name__}
168
171
 
@@ -200,7 +203,7 @@ class Interface:
200
203
  return {k: self._serialize_value(v) for k, v in d.items()}
201
204
 
202
205
  @classmethod
203
- def _deserialize_dict(cls, data: Dict) -> Union[Dict, 'Interface']:
206
+ def _deserialize_dict(cls, data: dict) -> dict | Interface:
204
207
  if '__class__' in data:
205
208
  class_name = data.pop('__class__')
206
209
  try:
@@ -217,7 +220,7 @@ class Interface:
217
220
  return {k: cls._deserialize_value(v) for k, v in data.items()}
218
221
 
219
222
  @classmethod
220
- def _deserialize_list(cls, data: List) -> List:
223
+ def _deserialize_list(cls, data: list) -> list:
221
224
  return [cls._deserialize_value(value) for value in data]
222
225
 
223
226
  @classmethod
@@ -232,7 +235,7 @@ class Interface:
232
235
  return value
233
236
 
234
237
  @classmethod
235
- def from_dict(cls, data: Dict) -> 'Interface':
238
+ def from_dict(cls, data: dict) -> Interface:
236
239
  """
237
240
  Create an instance from a dictionary representation.
238
241
 
@@ -257,7 +260,7 @@ class Interface:
257
260
  class Element(Interface):
258
261
  """This class is the basic Element of flixopt. Every Element has a label"""
259
262
 
260
- def __init__(self, label: str, meta_data: Dict = None):
263
+ def __init__(self, label: str, meta_data: dict | None = None):
261
264
  """
262
265
  Args:
263
266
  label: The label of the element
@@ -265,13 +268,14 @@ class Element(Interface):
265
268
  """
266
269
  self.label = Element._valid_label(label)
267
270
  self.meta_data = meta_data if meta_data is not None else {}
268
- self.model: Optional[ElementModel] = None
271
+ self.model: ElementModel | None = None
269
272
 
270
273
  def _plausibility_checks(self) -> None:
271
- """This function is used to do some basic plausibility checks for each Element during initialization"""
274
+ """This function is used to do some basic plausibility checks for each Element during initialization.
275
+ This is run after all data is transformed to the correct format/type"""
272
276
  raise NotImplementedError('Every Element needs a _plausibility_checks() method')
273
277
 
274
- def create_model(self, model: SystemModel) -> 'ElementModel':
278
+ def create_model(self, model: SystemModel) -> ElementModel:
275
279
  raise NotImplementedError('Every Element needs a create_model() method')
276
280
 
277
281
  @property
@@ -303,7 +307,7 @@ class Element(Interface):
303
307
  class Model:
304
308
  """Stores Variables and Constraints."""
305
309
 
306
- def __init__(self, model: SystemModel, label_of_element: str, label: str = '', label_full: Optional[str] = None):
310
+ def __init__(self, model: SystemModel, label_of_element: str, label: str = '', label_full: str | None = None):
307
311
  """
308
312
  Args:
309
313
  model: The SystemModel that is used to create the model.
@@ -316,21 +320,21 @@ class Model:
316
320
  self._label = label
317
321
  self._label_full = label_full
318
322
 
319
- self._variables_direct: List[str] = []
320
- self._constraints_direct: List[str] = []
321
- self.sub_models: List[Model] = []
323
+ self._variables_direct: list[str] = []
324
+ self._constraints_direct: list[str] = []
325
+ self.sub_models: list[Model] = []
322
326
 
323
- self._variables_short: Dict[str, str] = {}
324
- self._constraints_short: Dict[str, str] = {}
325
- self._sub_models_short: Dict[str, str] = {}
327
+ self._variables_short: dict[str, str] = {}
328
+ self._constraints_short: dict[str, str] = {}
329
+ self._sub_models_short: dict[str, str] = {}
326
330
  logger.debug(f'Created {self.__class__.__name__} "{self.label_full}"')
327
331
 
328
332
  def do_modeling(self):
329
333
  raise NotImplementedError('Every Model needs a do_modeling() method')
330
334
 
331
335
  def add(
332
- self, item: Union[linopy.Variable, linopy.Constraint, 'Model'], short_name: Optional[str] = None
333
- ) -> Union[linopy.Variable, linopy.Constraint, 'Model']:
336
+ self, item: linopy.Variable | linopy.Constraint | Model, short_name: str | None = None
337
+ ) -> linopy.Variable | linopy.Constraint | Model:
334
338
  """
335
339
  Add a variable, constraint or sub-model to the model
336
340
 
@@ -356,8 +360,8 @@ class Model:
356
360
 
357
361
  def filter_variables(
358
362
  self,
359
- filter_by: Optional[Literal['binary', 'continuous', 'integer']] = None,
360
- length: Literal['scalar', 'time'] = None,
363
+ filter_by: Literal['binary', 'continuous', 'integer'] | None = None,
364
+ length: Literal['scalar', 'time'] | None = None,
361
365
  ):
362
366
  if filter_by is None:
363
367
  all_variables = self.variables
@@ -399,7 +403,7 @@ class Model:
399
403
  return self._model.constraints[self._constraints_direct]
400
404
 
401
405
  @property
402
- def _variables(self) -> List[str]:
406
+ def _variables(self) -> list[str]:
403
407
  all_variables = self._variables_direct.copy()
404
408
  for sub_model in self.sub_models:
405
409
  for variable in sub_model._variables:
@@ -411,7 +415,7 @@ class Model:
411
415
  return all_variables
412
416
 
413
417
  @property
414
- def _constraints(self) -> List[str]:
418
+ def _constraints(self) -> list[str]:
415
419
  all_constraints = self._constraints_direct.copy()
416
420
  for sub_model in self.sub_models:
417
421
  for constraint in sub_model._constraints:
@@ -429,7 +433,7 @@ class Model:
429
433
  return self._model.constraints[self._constraints]
430
434
 
431
435
  @property
432
- def all_sub_models(self) -> List['Model']:
436
+ def all_sub_models(self) -> list[Model]:
433
437
  return [model for sub_model in self.sub_models for model in [sub_model] + sub_model.all_sub_models]
434
438
 
435
439
 
@@ -547,7 +551,7 @@ def copy_and_convert_datatypes(data: Any, use_numpy: bool = True, use_element_la
547
551
  raise TypeError(f'copy_and_convert_datatypes() did get unexpected data of type "{type(data)}": {data=}')
548
552
 
549
553
 
550
- def get_compact_representation(data: Any, array_threshold: int = 50, decimals: int = 2) -> Dict:
554
+ def get_compact_representation(data: Any, array_threshold: int = 50, decimals: int = 2) -> dict:
551
555
  """
552
556
  Generate a compact json serializable representation of deeply nested data.
553
557
  Numpy arrays are statistically described if they exceed a threshold and converted to lists.
@@ -558,7 +562,7 @@ def get_compact_representation(data: Any, array_threshold: int = 50, decimals: i
558
562
  decimals (int): Number of decimal places in which to describe the arrays.
559
563
 
560
564
  Returns:
561
- Dict: A dictionary representation of the data
565
+ dict: A dictionary representation of the data
562
566
  """
563
567
 
564
568
  def format_np_array_if_found(value: Any) -> Any:
@@ -577,7 +581,7 @@ def get_compact_representation(data: Any, array_threshold: int = 50, decimals: i
577
581
  )
578
582
  return value
579
583
 
580
- def describe_numpy_arrays(arr: np.ndarray) -> Union[str, List]:
584
+ def describe_numpy_arrays(arr: np.ndarray) -> str | list:
581
585
  """Shortens NumPy arrays if they exceed the specified length."""
582
586
 
583
587
  def normalized_center_of_mass(array: Any) -> float:
flixopt/utils.py CHANGED
@@ -2,21 +2,24 @@
2
2
  This module contains several utility functions used throughout the flixopt framework.
3
3
  """
4
4
 
5
+ from __future__ import annotations
6
+
5
7
  import logging
6
- from typing import Any, Dict, List, Literal, Optional, Union
8
+ from typing import TYPE_CHECKING, Any, Literal
7
9
 
8
- import numpy as np
9
- import xarray as xr
10
+ if TYPE_CHECKING:
11
+ import numpy as np
12
+ import xarray as xr
10
13
 
11
14
  logger = logging.getLogger('flixopt')
12
15
 
13
16
 
14
- def is_number(number_alias: Union[int, float, str]):
15
- """Returns True is string is a number."""
17
+ def is_number(number_alias: int | float | str) -> bool:
18
+ """Returns True if value is a number or a number-like string."""
16
19
  try:
17
20
  float(number_alias)
18
21
  return True
19
- except ValueError:
22
+ except (ValueError, TypeError):
20
23
  return False
21
24
 
22
25
 
@@ -32,7 +35,7 @@ def round_floats(obj, decimals=2):
32
35
 
33
36
  def convert_dataarray(
34
37
  data: xr.DataArray, mode: Literal['py', 'numpy', 'xarray', 'structure']
35
- ) -> Union[List, np.ndarray, xr.DataArray, str]:
38
+ ) -> list[Any] | np.ndarray | xr.DataArray | str:
36
39
  """
37
40
  Convert a DataArray to a different format.
38
41
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flixopt
3
- Version: 2.1.7
3
+ Version: 2.1.8
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>
@@ -24,54 +24,58 @@ Description-Content-Type: text/markdown
24
24
  License-File: LICENSE
25
25
  Requires-Dist: numpy<3,>=1.21.5
26
26
  Requires-Dist: pandas<3,>=2.0.0
27
- Requires-Dist: linopy<0.5.8,>=0.5.7
27
+ Requires-Dist: xarray<2026.0,>=2024.2.0
28
+ Requires-Dist: linopy<0.6,>=0.5.1
28
29
  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"
32
- Requires-Dist: highspy>=1.5.3
33
- Requires-Dist: matplotlib<4.0.0,>=3.5.2
34
- Requires-Dist: plotly<6.0.0,>=5.15.0
30
+ Requires-Dist: pyyaml<7,>=6.0.0
31
+ Requires-Dist: rich<15,>=13.0.0
32
+ Requires-Dist: tomli<3,>=2.0.1; python_version < "3.11"
33
+ Requires-Dist: highspy<2,>=1.5.3
34
+ Requires-Dist: matplotlib<4,>=3.5.2
35
+ Requires-Dist: plotly<7,>=5.15.0
35
36
  Provides-Extra: network-viz
36
- Requires-Dist: dash>=3.0.0; extra == "network-viz"
37
- Requires-Dist: dash-cytoscape>=1.0.0; extra == "network-viz"
38
- Requires-Dist: dash-daq>=0.6.0; extra == "network-viz"
39
- Requires-Dist: networkx>=3.0.0; extra == "network-viz"
40
- Requires-Dist: werkzeug>=3.0.0; extra == "network-viz"
37
+ Requires-Dist: dash<4,>=3.0.0; extra == "network-viz"
38
+ Requires-Dist: dash-cytoscape<2,>=1.0.0; extra == "network-viz"
39
+ Requires-Dist: dash-daq<1,>=0.6.0; extra == "network-viz"
40
+ Requires-Dist: networkx<4,>=3.0.0; extra == "network-viz"
41
+ Requires-Dist: werkzeug<4,>=3.0.0; extra == "network-viz"
42
+ Requires-Dist: flask<4,>=3.0.0; extra == "network-viz"
41
43
  Provides-Extra: full
42
44
  Requires-Dist: pyvis==0.3.2; extra == "full"
43
- Requires-Dist: tsam<3.0.0,>=2.3.1; extra == "full"
44
- Requires-Dist: scipy<2.0.0,>=1.15.1; extra == "full"
45
- Requires-Dist: gurobipy>=10.0.0; extra == "full"
46
- Requires-Dist: dash>=3.0.0; extra == "full"
47
- Requires-Dist: dash-cytoscape>=1.0.0; extra == "full"
48
- Requires-Dist: dash-daq>=0.6.0; extra == "full"
49
- Requires-Dist: networkx>=3.0.0; extra == "full"
50
- Requires-Dist: werkzeug>=3.0.0; extra == "full"
45
+ Requires-Dist: tsam<3,>=2.3.1; extra == "full"
46
+ Requires-Dist: scipy<2,>=1.15.1; extra == "full"
47
+ Requires-Dist: gurobipy<13,>=10.0.0; extra == "full"
48
+ Requires-Dist: dash<4,>=3.0.0; extra == "full"
49
+ Requires-Dist: dash-cytoscape<2,>=1.0.0; extra == "full"
50
+ Requires-Dist: dash-daq<1,>=0.6.0; extra == "full"
51
+ Requires-Dist: networkx<4,>=3.0.0; extra == "full"
52
+ Requires-Dist: werkzeug<4,>=3.0.0; extra == "full"
53
+ Requires-Dist: flask<4,>=3.0.0; extra == "full"
51
54
  Provides-Extra: dev
52
- Requires-Dist: pytest>=7.0.0; extra == "dev"
53
- Requires-Dist: ruff>=0.9.0; extra == "dev"
54
- Requires-Dist: pre-commit>=4.0.0; extra == "dev"
55
+ Requires-Dist: pytest==8.4.2; extra == "dev"
56
+ Requires-Dist: nbformat==5.10.4; extra == "dev"
57
+ Requires-Dist: ruff==0.13.0; extra == "dev"
58
+ Requires-Dist: pre-commit==4.3.0; extra == "dev"
55
59
  Requires-Dist: pyvis==0.3.2; extra == "dev"
56
- Requires-Dist: tsam<3.0.0,>=2.3.1; extra == "dev"
57
- Requires-Dist: scipy<2.0.0,>=1.15.1; extra == "dev"
58
- Requires-Dist: gurobipy>=10.0.0; extra == "dev"
59
- Requires-Dist: dash>=3.0.0; extra == "dev"
60
- Requires-Dist: dash-cytoscape>=1.0.0; extra == "dev"
61
- Requires-Dist: dash-daq>=0.6.0; extra == "dev"
62
- Requires-Dist: networkx>=3.0.0; extra == "dev"
63
- Requires-Dist: werkzeug>=3.0.0; extra == "dev"
60
+ Requires-Dist: tsam==2.3.1; extra == "dev"
61
+ Requires-Dist: scipy==1.15.1; extra == "dev"
62
+ Requires-Dist: gurobipy==12.0.3; extra == "dev"
63
+ Requires-Dist: dash==3.0.0; extra == "dev"
64
+ Requires-Dist: dash-cytoscape==1.0.2; extra == "dev"
65
+ Requires-Dist: dash-daq==0.6.0; extra == "dev"
66
+ Requires-Dist: networkx==3.0.0; extra == "dev"
67
+ Requires-Dist: werkzeug==3.0.0; extra == "dev"
64
68
  Provides-Extra: docs
65
- Requires-Dist: mkdocs-material<10,>=9.0.0; extra == "docs"
66
- Requires-Dist: mkdocstrings-python>=1.0.0; extra == "docs"
67
- Requires-Dist: mkdocs-table-reader-plugin>=2.0.0; extra == "docs"
68
- Requires-Dist: mkdocs-gen-files>=0.4.0; extra == "docs"
69
- Requires-Dist: mkdocs-include-markdown-plugin>=6.0.0; extra == "docs"
70
- Requires-Dist: mkdocs-literate-nav>=0.6.0; extra == "docs"
71
- Requires-Dist: markdown-include>=0.8.0; extra == "docs"
72
- Requires-Dist: pymdown-extensions>=10.0.0; extra == "docs"
73
- Requires-Dist: pygments>=2.14.0; extra == "docs"
74
- Requires-Dist: mike>=2.0.0; extra == "docs"
69
+ Requires-Dist: mkdocs-material==9.6.19; extra == "docs"
70
+ Requires-Dist: mkdocstrings-python==1.18.2; extra == "docs"
71
+ Requires-Dist: mkdocs-table-reader-plugin==3.1.0; extra == "docs"
72
+ Requires-Dist: mkdocs-gen-files==0.5.0; extra == "docs"
73
+ Requires-Dist: mkdocs-include-markdown-plugin==7.1.7; extra == "docs"
74
+ Requires-Dist: mkdocs-literate-nav==0.6.2; extra == "docs"
75
+ Requires-Dist: markdown-include==0.8.1; extra == "docs"
76
+ Requires-Dist: pymdown-extensions==10.16.1; extra == "docs"
77
+ Requires-Dist: pygments==2.19.2; extra == "docs"
78
+ Requires-Dist: mike==2.1.3; extra == "docs"
75
79
  Dynamic: license-file
76
80
 
77
81
  # FlixOpt: Energy and Material Flow Optimization Framework
@@ -11,44 +11,46 @@ docs/images/flixopt-icon.svg,sha256=_1a6bk2pDOVEy233LC1nM6jZ35NdzD8Hd3UqGxW1Xpg,
11
11
  docs/javascripts/mathjax.js,sha256=LJDaO5MM_5W8gI5-S5SiZ17qeMgeoVJO-inMyBNy7UE,402
12
12
  docs/user-guide/index.md,sha256=TBO7lk13M95w2A9WiT5asfZn9oU9GZ1O0XW9eUm5GLo,7450
13
13
  docs/user-guide/Mathematical Notation/Bus.md,sha256=pqjGa3PZBSmuO4YR44bK21bMmRcWC8dkzP3z0XX-PJw,1613
14
- "docs/user-guide/Mathematical Notation/Effects, Penalty & Objective.md",sha256=OZnpxhX0R6NpJNP-FJ4g3lXWTRlv-Hhpp484Wits-ZI,5664
15
- docs/user-guide/Mathematical Notation/Flow.md,sha256=wqUgP_SntSyzcJNxbkxa2TmApqpPaq6GZ_Qk_qcAAlw,1095
16
- docs/user-guide/Mathematical Notation/LinearConverter.md,sha256=9oFHIA3-QLSOV-QQ3a6je7kcIluJGZH8qtgquf5zieE,1322
14
+ "docs/user-guide/Mathematical Notation/Effects, Penalty & Objective.md",sha256=vXQWt-UyITOVTJWPkKfjJzucbyml2OTQ6URQiMoc9dU,5671
15
+ docs/user-guide/Mathematical Notation/Flow.md,sha256=zxCp02o0t2EwB-hlwGtmh8aQveRGgcgwqMN8MvLxaI0,1099
16
+ docs/user-guide/Mathematical Notation/InvestParameters.md,sha256=UeuCpAyhOfDS2C3efmi_2EFkaFBK7HcqhHeBXl9BhFw,48
17
+ docs/user-guide/Mathematical Notation/LinearConverter.md,sha256=mKYbpnYxXW9xI2ybVfAyxDJdwahnj7L9ZTY0mnq3_l0,1321
18
+ docs/user-guide/Mathematical Notation/OnOffParameters.md,sha256=QEgxhqb53VlyBifIdExwaQpsdeE0Cyb8aN3-aCHQ21U,47
17
19
  docs/user-guide/Mathematical Notation/Piecewise.md,sha256=GgTQ7dVTTb0lq14GFuuZeGYrUXtMy1wkztJLIVchchw,1993
18
- docs/user-guide/Mathematical Notation/Storage.md,sha256=Zk5Irnr4bxIqI2KL2wcbAg8PdFDGTxhDFlRrnvjK6Bk,2200
20
+ docs/user-guide/Mathematical Notation/Storage.md,sha256=-QiZN2vA-f-P8JGkQDPYBdt2xt6J0Z2jbKDuk6j-rIs,2201
19
21
  docs/user-guide/Mathematical Notation/index.md,sha256=2d6k4zbKET1kg7zBt1fEdKsG8jM5j2IIe6yclMTUlDw,1254
20
22
  docs/user-guide/Mathematical Notation/others.md,sha256=z6LOzcnvfI-1qQx0Fg7Q6wSK9tAzH2d34KbW4lYNyCE,48
21
23
  flixopt/__init__.py,sha256=xTxHXC-_lWa65roGUM3J3HXfiYcMCJHoQsuL5mS0Xkg,688
22
- flixopt/aggregation.py,sha256=xgQu2U5YEbtdDAEMjWiuP9uo_KjhzC95VNmY4ZcSX3I,16939
23
- flixopt/calculation.py,sha256=pj8nvAG3Vv6NHNyvhU3YbrMDogClFni5CfuJk4631Fw,19914
24
+ flixopt/aggregation.py,sha256=BFy2ngr0a0By5wfBZet9fX8X5ZPmkn1x6HMRaw1ZsTo,16892
25
+ flixopt/calculation.py,sha256=VBcvpQr7ZXvWZfryfilwUzK161br4ZP3zTwvYHraGjY,24476
24
26
  flixopt/commons.py,sha256=ZNlUN1z-h9OGHPo-s-n5OLlJaoPZKVGcAdRyGKpMk4M,1256
25
- flixopt/components.py,sha256=o9H4yfwuI_Y31BuYZH_NkVYm_Du4aoAiVTtHO_KhMUg,33297
26
- flixopt/config.py,sha256=Kt8QYk7hX5qHcQUtfgjM862C6SQr4K2lDvtk_LLER8Y,9085
27
+ flixopt/components.py,sha256=efUwx_eqgVPsQEn8u0HUrgkvU2eU2tgv7wKwT2eeX_I,54632
28
+ flixopt/config.py,sha256=2GJ9NZl35OKMUvofIpztgKh3kdca1m1wa77RjsUaob0,9509
27
29
  flixopt/config.yaml,sha256=imzAnnhcJhIfKNTTXFB5Td7Pvk5ARn5j720k-oGGRug,392
28
- flixopt/core.py,sha256=vaIBRQE0w9Ro5Xe_jWHKXMLRenSS2P1Tpy9-geTuWcE,38103
29
- flixopt/effects.py,sha256=7kwZwfv3oRmkzc30kdjeOyB4qnyA9zxsPun1ysQdDxM,16662
30
- flixopt/elements.py,sha256=MDOQb17FkUGN1bgdbAMoavBuBmVtN6evDbLT7ExL4pI,26944
31
- flixopt/features.py,sha256=JgvwIK5o8GKJBUnicfMe7sfXbzojFQGfAkCpGVwzKww,43983
32
- flixopt/flow_system.py,sha256=Gowg5k7LWlF6VYRHtrIbKVCKWKMrzlZQtBCfdeEq4jQ,19607
33
- flixopt/interface.py,sha256=uXf6Z29OfHpIRsS1-oZZ6SSuy8FLe13FjtqzHPqzzQE,12088
34
- flixopt/io.py,sha256=2QKdtu2-mkzSGBIqHtUcF9UaG32nq9qcIRxZghf1hLw,11284
35
- flixopt/linear_converters.py,sha256=ej5V_ML_3m1k9HbDnuey6pHEpQtguYkxBXHxWyE9sq0,10936
36
- flixopt/network_app.py,sha256=oVdARrTDV43H5ZAypJP3dmIL4A9x-Y3ec0zZC5gS8rA,28019
37
- flixopt/plotting.py,sha256=wUwBSQxxwy1uui-mi2hgj6h__O6EvxCnocIbX0ewpMk,54111
38
- flixopt/results.py,sha256=GKSZmz0GCuJwspTC8Ot6MOKinvy_mhnDXCafb_f7uVY,35161
39
- flixopt/solvers.py,sha256=k1bSoiXec3asWED70-erXkgtpn2C8KRBfSZj0FLviSM,2436
40
- flixopt/structure.py,sha256=CZIz_8UVF56BT4tiDQYzfH4WCR-yaiZHW0--u6olHx4,26281
41
- flixopt/utils.py,sha256=f-_vFDvvG27-c_VMpzkv3lb79Yny4rvoSmemushbzhU,1687
42
- flixopt-2.1.7.dist-info/licenses/LICENSE,sha256=HKsZnbrM_3Rvnr_u9cWSG90cBsj5_slaqI_z_qcxnGI,1118
30
+ flixopt/core.py,sha256=HnXnUXnAL8yqBExdsXGgwu5HnfWRH0omjjMKgp_SBKc,37824
31
+ flixopt/effects.py,sha256=HcalPMUaAfuzD2p1OeQ9nLY2vmHv_GxwyGLLeqNGNZ8,19435
32
+ flixopt/elements.py,sha256=IWtr0zyS1GEttYMiBZxC6sEX7y8pCWEbySxok3nDxwI,33535
33
+ flixopt/features.py,sha256=m61ixTFJ_Jh-Emx6QKVxo04Heswm89XsPUqbH8ezNr8,43891
34
+ flixopt/flow_system.py,sha256=qvR4uktXERDKCI40w9tJidkWxt5B36XVoebCw5bJons,20886
35
+ flixopt/interface.py,sha256=e5tom-aTEPfl4FQg8abyDv7g1tTvxeOWiSWg_IGti-g,47575
36
+ flixopt/io.py,sha256=BziCFlHfqx1kWFBhr1EZi-odZaqTVZdfmHhl-_rf5Ug,11367
37
+ flixopt/linear_converters.py,sha256=rKa0AZlJHgDsPF_LVsvrhxhsmVTRanPE0NuKP7OICtg,22668
38
+ flixopt/network_app.py,sha256=JlEbufeg3WK89ILwz2gXq6xdZzHEo5urIcz1eBpgJyc,29456
39
+ flixopt/plotting.py,sha256=cGM8f5QDMOkKuBapgD6-EhN1X-f5WkDqyoxGPberjzI,59661
40
+ flixopt/results.py,sha256=121FoO3WrAuHm18_-OP93_-9JxuCVVm5JWvmC33P3-8,40682
41
+ flixopt/solvers.py,sha256=m38Smc22MJfHYMiqfNf1MA3OmvbTRm5OWS9nECkDdQk,2355
42
+ flixopt/structure.py,sha256=vyD1lc80NH3JLexKJuar9btgHhEbcNEmihCQkBWea8k,26254
43
+ flixopt/utils.py,sha256=a-YKR7C7HtD8dSIcxzlJTgryV5HMS7zELSXNYr_Lz9Q,1775
44
+ flixopt-2.1.8.dist-info/licenses/LICENSE,sha256=HKsZnbrM_3Rvnr_u9cWSG90cBsj5_slaqI_z_qcxnGI,1118
43
45
  pics/architecture_flixOpt-pre2.0.0.png,sha256=9RWSA3vys588aadr2437zor-_-xBTQNQ0bAf8xGcu5g,70605
44
46
  pics/architecture_flixOpt.png,sha256=KjN1bJwESbkHmTW7UsJ7dZyiKZlTO7Dx20dg8KlR1HU,260219
45
47
  pics/flixOpt_plotting.jpg,sha256=zn7ZPAtXm5eRTxtOj86e4-PPhHpCar1jqGh7vMBgQGY,518862
46
48
  pics/flixopt-icon.svg,sha256=_1a6bk2pDOVEy233LC1nM6jZ35NdzD8Hd3UqGxW1Xpg,135341
47
49
  pics/pics.pptx,sha256=ImWeGGvjtWJ6BGruipsnZYmWtHj5sWdbw1NSFePbkC8,683344
48
50
  scripts/extract_release_notes.py,sha256=3UUE4hWhdd2t2m2x0ZpchGP-A0MvfqO2Wc5EdNN-fgE,1249
49
- scripts/gen_ref_pages.py,sha256=AYRtXyz78x5I_Hn0oRtGVbTxgLLj2QNyRX6vWRefPjc,1960
51
+ scripts/gen_ref_pages.py,sha256=7bxRu2VfqFrnr7wln1BjMAqpQUzuTkLPJSBh83uikIQ,1948
50
52
  tests/ressources/Zeitreihen2020.csv,sha256=kbsDTKZS0iUsNZAS7m3DohzZI_OHHWe44s3GwLvcTLw,1918412
51
- flixopt-2.1.7.dist-info/METADATA,sha256=_cFPusrwdee_4dJRFbKQWGhTWZOHTrWsT4PdBVhLhJA,8229
52
- flixopt-2.1.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
53
- flixopt-2.1.7.dist-info/top_level.txt,sha256=DEuo4R1z7GmEp5R3pjbQEJbaPRjKHFvNX2ceiBnVOL0,32
54
- flixopt-2.1.7.dist-info/RECORD,,
53
+ flixopt-2.1.8.dist-info/METADATA,sha256=OMNIQF_kyzEFA1H3d-IUWwEEL84bG4t8KfS2nbW-TTU,8432
54
+ flixopt-2.1.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
55
+ flixopt-2.1.8.dist-info/top_level.txt,sha256=DEuo4R1z7GmEp5R3pjbQEJbaPRjKHFvNX2ceiBnVOL0,32
56
+ flixopt-2.1.8.dist-info/RECORD,,
scripts/gen_ref_pages.py CHANGED
@@ -47,7 +47,7 @@ with mkdocs_gen_files.open(f'{api_dir}/index.md', 'w') as index_file:
47
47
  index_file.write('# API Reference\n\n')
48
48
  index_file.write(
49
49
  'This section contains the documentation for all modules and classes in flixopt.\n'
50
- 'For more information on how to use the classes and functions, see the [Concepts & Math](../concepts-and-math/index.md) section.\n'
50
+ 'For more information on how to use the classes and functions, see the [User Guide](../user-guide/index.md) section.\n'
51
51
  )
52
52
 
53
53
  with mkdocs_gen_files.open(f'{api_dir}/SUMMARY.md', 'w') as nav_file: