power-grid-model-ds 1.3.4__py3-none-any.whl → 1.4.0__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.
- power_grid_model_ds/_core/load_flow.py +19 -7
- power_grid_model_ds/_core/model/graphs/container.py +0 -28
- power_grid_model_ds/_core/model/graphs/models/base.py +12 -36
- power_grid_model_ds/_core/model/utils.py +22 -0
- power_grid_model_ds/_core/visualizer/app.py +1 -0
- power_grid_model_ds/_core/visualizer/parsers.py +23 -1
- {power_grid_model_ds-1.3.4.dist-info → power_grid_model_ds-1.4.0.dist-info}/METADATA +1 -1
- {power_grid_model_ds-1.3.4.dist-info → power_grid_model_ds-1.4.0.dist-info}/RECORD +11 -10
- {power_grid_model_ds-1.3.4.dist-info → power_grid_model_ds-1.4.0.dist-info}/WHEEL +0 -0
- {power_grid_model_ds-1.3.4.dist-info → power_grid_model_ds-1.4.0.dist-info}/licenses/LICENSE +0 -0
- {power_grid_model_ds-1.3.4.dist-info → power_grid_model_ds-1.4.0.dist-info}/top_level.txt +0 -0
@@ -4,6 +4,7 @@
|
|
4
4
|
|
5
5
|
"""Power flow functions and classes"""
|
6
6
|
|
7
|
+
import warnings
|
7
8
|
from typing import Dict, Optional
|
8
9
|
|
9
10
|
import numpy as np
|
@@ -50,18 +51,29 @@ class PowerGridModelInterface:
|
|
50
51
|
self.grid = grid or Grid.empty()
|
51
52
|
self.system_frequency = system_frequency
|
52
53
|
|
53
|
-
self.
|
54
|
+
self._input_data = input_data or {}
|
54
55
|
self.output_data: dict[str, NDArray] = {}
|
55
56
|
self.model: Optional[PowerGridModel] = None
|
56
57
|
|
58
|
+
@property
|
59
|
+
def input_data(self) -> Dict[str, NDArray]:
|
60
|
+
"""Get the input data for the PowerGridModel."""
|
61
|
+
warnings.warn(
|
62
|
+
"Input data has been made private and will be removed as public properety in a future version. "
|
63
|
+
"Do not use it directly.",
|
64
|
+
DeprecationWarning,
|
65
|
+
stacklevel=2,
|
66
|
+
)
|
67
|
+
return self._input_data
|
68
|
+
|
57
69
|
def create_input_from_grid(self):
|
58
70
|
"""
|
59
71
|
Create input for the PowerGridModel
|
60
72
|
"""
|
61
73
|
for array_name in PGM_ARRAYS:
|
62
74
|
pgm_array = self._create_power_grid_array(array_name=array_name)
|
63
|
-
self.
|
64
|
-
return self.
|
75
|
+
self._input_data[array_name] = pgm_array
|
76
|
+
return self._input_data
|
65
77
|
|
66
78
|
def create_grid_from_input_data(self, check_ids: bool = True) -> Grid:
|
67
79
|
"""
|
@@ -75,9 +87,9 @@ class PowerGridModelInterface:
|
|
75
87
|
Returns a Grid object with the arrays filled with the PowerGridModel input.
|
76
88
|
"""
|
77
89
|
for pgm_name in PGM_ARRAYS:
|
78
|
-
if pgm_name in self.
|
90
|
+
if pgm_name in self._input_data:
|
79
91
|
pgm_ds_array_class = getattr(self.grid, pgm_name).__class__
|
80
|
-
pgm_ds_array = pgm_ds_array_class(self.
|
92
|
+
pgm_ds_array = pgm_ds_array_class(self._input_data[pgm_name])
|
81
93
|
self.grid.append(pgm_ds_array, check_max_id=False)
|
82
94
|
if check_ids:
|
83
95
|
self.grid.check_ids()
|
@@ -155,6 +167,6 @@ class PowerGridModelInterface:
|
|
155
167
|
return list(set(first_dtype.names).intersection(set(second_dtype.names))) # type: ignore[arg-type]
|
156
168
|
|
157
169
|
def _setup_model(self):
|
158
|
-
self.
|
159
|
-
self.model = PowerGridModel(self.
|
170
|
+
self._input_data = self._input_data or self.create_input_from_grid()
|
171
|
+
self.model = PowerGridModel(self._input_data, system_frequency=self.system_frequency)
|
160
172
|
return self.model
|
@@ -5,7 +5,6 @@
|
|
5
5
|
"""Stores the GraphContainer class"""
|
6
6
|
|
7
7
|
import dataclasses
|
8
|
-
import warnings
|
9
8
|
from dataclasses import dataclass
|
10
9
|
from typing import TYPE_CHECKING, Generator
|
11
10
|
|
@@ -63,45 +62,18 @@ class GraphContainer:
|
|
63
62
|
graph = getattr(self, field.name)
|
64
63
|
graph.add_node_array(node_array=node_array, raise_on_fail=False)
|
65
64
|
|
66
|
-
def add_node(self, node: NodeArray) -> None:
|
67
|
-
"""Add a node to all graphs"""
|
68
|
-
warnings.warn(
|
69
|
-
"add_node is deprecated and will be removed in a future release, use add_node_array instead",
|
70
|
-
category=DeprecationWarning,
|
71
|
-
stacklevel=2,
|
72
|
-
)
|
73
|
-
self.add_node_array(node_array=node)
|
74
|
-
|
75
65
|
def add_branch_array(self, branch_array: BranchArray) -> None:
|
76
66
|
"""Add a branch to all graphs"""
|
77
67
|
for field in self.graph_attributes:
|
78
68
|
graph = getattr(self, field.name)
|
79
69
|
graph.add_branch_array(branch_array=branch_array)
|
80
70
|
|
81
|
-
def add_branch(self, branch: BranchArray) -> None:
|
82
|
-
"""Add a branch to all graphs"""
|
83
|
-
warnings.warn(
|
84
|
-
"add_branch is deprecated and will be removed in a future release, use add_branch_array instead",
|
85
|
-
category=DeprecationWarning,
|
86
|
-
stacklevel=2,
|
87
|
-
)
|
88
|
-
self.add_branch_array(branch_array=branch)
|
89
|
-
|
90
71
|
def add_branch3_array(self, branch3_array: Branch3Array) -> None:
|
91
72
|
"""Add a branch to all graphs"""
|
92
73
|
for field in self.graph_attributes:
|
93
74
|
graph = getattr(self, field.name)
|
94
75
|
graph.add_branch3_array(branch3_array=branch3_array)
|
95
76
|
|
96
|
-
def add_branch3(self, branch: Branch3Array) -> None:
|
97
|
-
"""Add a branch to all graphs"""
|
98
|
-
warnings.warn(
|
99
|
-
"add_branch3 is deprecated and will be removed in a future release, use add_branch3_array instead",
|
100
|
-
category=DeprecationWarning,
|
101
|
-
stacklevel=2,
|
102
|
-
)
|
103
|
-
self.add_branch3_array(branch3_array=branch)
|
104
|
-
|
105
77
|
def delete_node(self, node: NodeArray) -> None:
|
106
78
|
"""Remove a node from all graphs"""
|
107
79
|
for field in dataclasses.fields(self):
|
@@ -2,7 +2,6 @@
|
|
2
2
|
#
|
3
3
|
# SPDX-License-Identifier: MPL-2.0
|
4
4
|
|
5
|
-
import warnings
|
6
5
|
from abc import ABC, abstractmethod
|
7
6
|
from contextlib import contextmanager
|
8
7
|
from typing import TYPE_CHECKING, Generator
|
@@ -16,6 +15,7 @@ from power_grid_model_ds._core.model.graphs.errors import (
|
|
16
15
|
MissingNodeError,
|
17
16
|
NoPathBetweenNodes,
|
18
17
|
)
|
18
|
+
from power_grid_model_ds._core.model.utils import _get_branch3_branches
|
19
19
|
|
20
20
|
if TYPE_CHECKING:
|
21
21
|
from power_grid_model_ds._core.model.grids.base import Grid
|
@@ -253,23 +253,17 @@ class BaseGraphModel(ABC):
|
|
253
253
|
|
254
254
|
return [self._internals_to_externals(path) for path in internal_paths]
|
255
255
|
|
256
|
-
def get_components(self
|
257
|
-
"""Returns all separate components when the substation_nodes are removed of the graph as lists
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
""",
|
268
|
-
category=DeprecationWarning,
|
269
|
-
stacklevel=2,
|
270
|
-
)
|
271
|
-
with self.tmp_remove_nodes(substation_nodes or []):
|
272
|
-
internal_components = self._get_components()
|
256
|
+
def get_components(self) -> list[list[int]]:
|
257
|
+
"""Returns all separate components when the substation_nodes are removed of the graph as lists
|
258
|
+
|
259
|
+
If you want to get the components of the graph without certain nodes,
|
260
|
+
use the `tmp_remove_nodes` context manager.
|
261
|
+
|
262
|
+
Example:
|
263
|
+
>>> with graph.tmp_remove_nodes(substation_nodes):
|
264
|
+
>>> components = graph.get_components()
|
265
|
+
"""
|
266
|
+
internal_components = self._get_components()
|
273
267
|
return [self._internals_to_externals(component) for component in internal_components]
|
274
268
|
|
275
269
|
def get_connected(
|
@@ -421,21 +415,3 @@ Example:
|
|
421
415
|
|
422
416
|
@abstractmethod
|
423
417
|
def _all_branches(self) -> Generator[tuple[int, int], None, None]: ...
|
424
|
-
|
425
|
-
|
426
|
-
def _get_branch3_branches(branch3: Branch3Array) -> BranchArray:
|
427
|
-
node_1 = branch3.node_1.item()
|
428
|
-
node_2 = branch3.node_2.item()
|
429
|
-
node_3 = branch3.node_3.item()
|
430
|
-
|
431
|
-
status_1 = branch3.status_1.item()
|
432
|
-
status_2 = branch3.status_2.item()
|
433
|
-
status_3 = branch3.status_3.item()
|
434
|
-
|
435
|
-
branches = BranchArray.zeros(3)
|
436
|
-
branches.from_node = [node_1, node_1, node_2]
|
437
|
-
branches.to_node = [node_2, node_3, node_3]
|
438
|
-
branches.from_status = [status_1, status_1, status_2]
|
439
|
-
branches.to_status = [status_2, status_3, status_3]
|
440
|
-
|
441
|
-
return branches
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# SPDX-FileCopyrightText: Contributors to the Power Grid Model project <powergridmodel@lfenergy.org>
|
2
|
+
#
|
3
|
+
# SPDX-License-Identifier: MPL-2.0
|
4
|
+
from power_grid_model_ds._core.model.arrays.pgm_arrays import Branch3Array, BranchArray
|
5
|
+
|
6
|
+
|
7
|
+
def _get_branch3_branches(branch3: Branch3Array) -> BranchArray:
|
8
|
+
node_1 = branch3.node_1.item()
|
9
|
+
node_2 = branch3.node_2.item()
|
10
|
+
node_3 = branch3.node_3.item()
|
11
|
+
|
12
|
+
status_1 = branch3.status_1.item()
|
13
|
+
status_2 = branch3.status_2.item()
|
14
|
+
status_3 = branch3.status_3.item()
|
15
|
+
|
16
|
+
branches = BranchArray.zeros(3)
|
17
|
+
branches.from_node = [node_1, node_1, node_2]
|
18
|
+
branches.to_node = [node_2, node_3, node_3]
|
19
|
+
branches.from_status = [status_1, status_1, status_2]
|
20
|
+
branches.to_status = [status_2, status_3, status_3]
|
21
|
+
|
22
|
+
return branches
|
@@ -60,6 +60,7 @@ def _get_columns_store(grid: Grid) -> dcc.Store:
|
|
60
60
|
"line": grid.line.columns,
|
61
61
|
"link": grid.link.columns,
|
62
62
|
"transformer": grid.transformer.columns,
|
63
|
+
"three_winding_transformer": grid.three_winding_transformer.columns,
|
63
64
|
"branch": grid.branches.columns,
|
64
65
|
},
|
65
66
|
)
|
@@ -6,7 +6,8 @@ from typing import Any, Literal
|
|
6
6
|
|
7
7
|
from power_grid_model_ds._core.model.arrays.base.array import FancyArray
|
8
8
|
from power_grid_model_ds._core.model.grids.base import Grid
|
9
|
-
from power_grid_model_ds.
|
9
|
+
from power_grid_model_ds._core.model.utils import _get_branch3_branches
|
10
|
+
from power_grid_model_ds.arrays import Branch3Array, BranchArray, NodeArray
|
10
11
|
|
11
12
|
|
12
13
|
def parse_node_array(nodes: NodeArray) -> list[dict[str, Any]]:
|
@@ -32,6 +33,27 @@ def parse_branches(grid: Grid) -> list[dict[str, Any]]:
|
|
32
33
|
parsed_branches.extend(parse_branch_array(grid.line, "line"))
|
33
34
|
parsed_branches.extend(parse_branch_array(grid.link, "link"))
|
34
35
|
parsed_branches.extend(parse_branch_array(grid.transformer, "transformer"))
|
36
|
+
parsed_branches.extend(parse_branch3_array(grid.three_winding_transformer, "transformer"))
|
37
|
+
return parsed_branches
|
38
|
+
|
39
|
+
|
40
|
+
def parse_branch3_array(branches: Branch3Array, group: Literal["transformer"]) -> list[dict[str, Any]]:
|
41
|
+
"""Parse the three-winding transformer array."""
|
42
|
+
parsed_branches = []
|
43
|
+
columns = branches.columns
|
44
|
+
for branch in branches:
|
45
|
+
for branch_ in _get_branch3_branches(branch):
|
46
|
+
cyto_elements = {"data": _array_to_dict(branch_, columns)}
|
47
|
+
cyto_elements["data"].update(
|
48
|
+
{
|
49
|
+
# IDs need to be unique, so we combine the branch ID with the from and to nodes
|
50
|
+
"id": str(branch.id.item()) + f"_{branch_.from_node.item()}_{branch_.to_node.item()}",
|
51
|
+
"source": str(branch_.from_node.item()),
|
52
|
+
"target": str(branch_.to_node.item()),
|
53
|
+
"group": group,
|
54
|
+
}
|
55
|
+
)
|
56
|
+
parsed_branches.append(cyto_elements)
|
35
57
|
return parsed_branches
|
36
58
|
|
37
59
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: power-grid-model-ds
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.4.0
|
4
4
|
Summary: Power Grid Model extension which provides a grid data structure for simulation and analysis
|
5
5
|
Author-email: Contributors to the Power Grid Model project <powergridmodel@lfenergy.org>
|
6
6
|
License: MPL-2.0
|
@@ -9,7 +9,7 @@ power_grid_model_ds/graph_models.py,sha256=so5niaXJqtuL0hUmtSPxV6Bven5c8DfAlF3MM
|
|
9
9
|
power_grid_model_ds/visualizer.py,sha256=W9GfWuM-CrDTnniCj1y-lxSt6IQkLJViW5aPC4syauw,411
|
10
10
|
power_grid_model_ds/_core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
11
11
|
power_grid_model_ds/_core/fancypy.py,sha256=EKH1gIACBPF9lUFI4kUPZJ_peS6B_udsLTs-PysdIns,2065
|
12
|
-
power_grid_model_ds/_core/load_flow.py,sha256=
|
12
|
+
power_grid_model_ds/_core/load_flow.py,sha256=8GYzHw2Uxlzo4pZbjgOXELAP69_0o0yoav4yprZRJ_s,6247
|
13
13
|
power_grid_model_ds/_core/data_source/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
14
|
power_grid_model_ds/_core/data_source/generator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
15
15
|
power_grid_model_ds/_core/data_source/generator/grid_generators.py,sha256=knAtQOhdUru3z6Kzc0rjSE9PPeC4_c7SUVVLqTi3ZBU,2972
|
@@ -21,6 +21,7 @@ power_grid_model_ds/_core/data_source/generator/arrays/source.py,sha256=rlrjDI73
|
|
21
21
|
power_grid_model_ds/_core/data_source/generator/arrays/transformer.py,sha256=o2MOhWfitED2YDACLrxSYbeyDf3Rr_4fF0rsW2nROD4,1526
|
22
22
|
power_grid_model_ds/_core/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
23
23
|
power_grid_model_ds/_core/model/constants.py,sha256=pxkZ-a4J8RVu4ziw_A6usY81I2tt6sOY1xDBsv6Ta14,746
|
24
|
+
power_grid_model_ds/_core/model/utils.py,sha256=j9DDnwTMIbkWTu7HdxGvrRKVZZPaIFtZN212ujsD7p0,786
|
24
25
|
power_grid_model_ds/_core/model/arrays/__init__.py,sha256=WMMIUW5RAkJ6E7tRtu8sImhxjnQDo7h5J2I9dhvfAcw,1013
|
25
26
|
power_grid_model_ds/_core/model/arrays/pgm_arrays.py,sha256=Vmzj6BFVY3vZqfpiOZ0-KDNdi3EbkWv3cUHUx8D29jw,3318
|
26
27
|
power_grid_model_ds/_core/model/arrays/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -43,11 +44,11 @@ power_grid_model_ds/_core/model/dtypes/sensors.py,sha256=U8HqvyH3fV348m4QjWy8IEY
|
|
43
44
|
power_grid_model_ds/_core/model/enums/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
45
|
power_grid_model_ds/_core/model/enums/nodes.py,sha256=UuJsWFasKREhVGbsUwGg5A-LvHnGTc4j636A_B4N9A4,356
|
45
46
|
power_grid_model_ds/_core/model/graphs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
46
|
-
power_grid_model_ds/_core/model/graphs/container.py,sha256=
|
47
|
+
power_grid_model_ds/_core/model/graphs/container.py,sha256=M10tTUF_Mn3d2xPmfW2UAf9v5wLzNzCyqokDS5kIbT4,5524
|
47
48
|
power_grid_model_ds/_core/model/graphs/errors.py,sha256=-9fAsCqpKM0-lCM-tO2fVot9hqZBJa8WCxxqWEH_z6k,479
|
48
49
|
power_grid_model_ds/_core/model/graphs/models/__init__.py,sha256=xwhMajQKIAfL1R3cq2sMNXMWtqfI5WGBi6-P4clyTes,262
|
49
50
|
power_grid_model_ds/_core/model/graphs/models/_rustworkx_search.py,sha256=TqRR22TPx8XjRLukQxK8R8FjZvJ60CttDFctbISSbOM,2979
|
50
|
-
power_grid_model_ds/_core/model/graphs/models/base.py,sha256=
|
51
|
+
power_grid_model_ds/_core/model/graphs/models/base.py,sha256=LTWn5QROenDxEOu_8d1ehFGg8rj7oCgxsnHX-JoEkEg,16822
|
51
52
|
power_grid_model_ds/_core/model/graphs/models/rustworkx.py,sha256=jccM7MUhNqH2215mk_X8ihQ-Q8IkjjRhUk4jSruaxy8,6158
|
52
53
|
power_grid_model_ds/_core/model/grids/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
53
54
|
power_grid_model_ds/_core/model/grids/_text_sources.py,sha256=3CWn0zjaUkFhrnSEIqAas52xeW0EX3EWXIXyo8XSQgw,4229
|
@@ -58,8 +59,8 @@ power_grid_model_ds/_core/utils/misc.py,sha256=fPjpczUr3IZ7EnAYI2darLzN2O8NJwhxg
|
|
58
59
|
power_grid_model_ds/_core/utils/pickle.py,sha256=LGeTc7nu9RY1noOzLJzYaSHSWIgqzHy2xhmueKGuipc,1445
|
59
60
|
power_grid_model_ds/_core/utils/zip.py,sha256=9RtJYhjlgNZOtxr4iI-CpsjT1axw5kCCqprfTjaIsiI,2197
|
60
61
|
power_grid_model_ds/_core/visualizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
61
|
-
power_grid_model_ds/_core/visualizer/app.py,sha256=
|
62
|
-
power_grid_model_ds/_core/visualizer/parsers.py,sha256=
|
62
|
+
power_grid_model_ds/_core/visualizer/app.py,sha256=dnigMtdGkYquBpFDznLDogTzXR-BHPaa_scdF4GxUlw,3421
|
63
|
+
power_grid_model_ds/_core/visualizer/parsers.py,sha256=2QBUkUQD4EsrcJKAY-G0q657ngU41ceMbBBd_0GKJvQ,3246
|
63
64
|
power_grid_model_ds/_core/visualizer/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
64
65
|
power_grid_model_ds/_core/visualizer/callbacks/element_scaling.py,sha256=l8PPSqglytqBQgZ4yyNVx3wMYLF8Fcx8ku4skbGNZLM,1136
|
65
66
|
power_grid_model_ds/_core/visualizer/callbacks/element_selection.py,sha256=Teaeq0atd2rD_edaW0u_N-YCnaf6MQyC8WsgnEhQczk,963
|
@@ -74,8 +75,8 @@ power_grid_model_ds/_core/visualizer/layout/header.py,sha256=el-5SlWIPeEbZZLbi3v
|
|
74
75
|
power_grid_model_ds/_core/visualizer/layout/legenda.py,sha256=8JTrMRgaYRaSIXAEoM0b3PgX7AYvW0_fHuYg8nY4y0g,2161
|
75
76
|
power_grid_model_ds/_core/visualizer/layout/search_form.py,sha256=4LPU6MjD3QEIeBEOOWBvV5-GyLMqNYWyKcUa_oWScCs,2002
|
76
77
|
power_grid_model_ds/_core/visualizer/layout/selection_output.py,sha256=fuPAdG5XmTj2E0oQ8w_tp9PGbB8bJ5fguteLtnM1EDg,534
|
77
|
-
power_grid_model_ds-1.
|
78
|
-
power_grid_model_ds-1.
|
79
|
-
power_grid_model_ds-1.
|
80
|
-
power_grid_model_ds-1.
|
81
|
-
power_grid_model_ds-1.
|
78
|
+
power_grid_model_ds-1.4.0.dist-info/licenses/LICENSE,sha256=GpbnG1pNl-ORtSP6dmHeiZvwy36UFli6MEZy1XlmBqo,14906
|
79
|
+
power_grid_model_ds-1.4.0.dist-info/METADATA,sha256=yu_d7xuCeaF_aadOmXQss8t5JeCWVeSXDCGVNSPWdSk,8873
|
80
|
+
power_grid_model_ds-1.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
81
|
+
power_grid_model_ds-1.4.0.dist-info/top_level.txt,sha256=nJa103Eqvm5TESYEKPFVImfLg_ugGOBznikrM-rZQZg,20
|
82
|
+
power_grid_model_ds-1.4.0.dist-info/RECORD,,
|
File without changes
|
{power_grid_model_ds-1.3.4.dist-info → power_grid_model_ds-1.4.0.dist-info}/licenses/LICENSE
RENAMED
File without changes
|
File without changes
|