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.
@@ -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.input_data = input_data or {}
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.input_data[array_name] = pgm_array
64
- return self.input_data
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.input_data:
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.input_data[pgm_name])
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.input_data = self.input_data or self.create_input_from_grid()
159
- self.model = PowerGridModel(self.input_data, system_frequency=self.system_frequency)
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, substation_nodes: list[int] | None = None) -> list[list[int]]:
257
- """Returns all separate components when the substation_nodes are removed of the graph as lists"""
258
- if substation_nodes:
259
- warnings.warn(
260
- message="""
261
- get_components: substation_nodes argument is deprecated and will be removed in a future release.
262
- The functionality is still available with the use of the `tmp_remove_nodes` context manager.
263
-
264
- Example:
265
- >>> with graph.tmp_remove_nodes(substation_nodes):
266
- >>> components = graph.get_components()
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.arrays import BranchArray, NodeArray
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.4
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=2XKWHwhwvDa6hRgmlrv9XAKIZmTac4BGfpu9cZ1f_to,5832
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=ZsE6Wr7DvVcYJYjvBszqnHI0QF9cFlHFwTfTAQnWYOA,6602
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=OyhSN4Vn3otM20HDBt0Y6aXeQW7Lis7MuTgGe9aeEgM,17637
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=uTtbHCRTQgLnfmJgwRmRSA_2kBHO2PZHD7fn2osGJSE,3340
62
- power_grid_model_ds/_core/visualizer/parsers.py,sha256=WPotNkHkDNOia6J7YE4F4rWXgKW2TDiBaU3TbolEjLg,2165
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.3.4.dist-info/licenses/LICENSE,sha256=GpbnG1pNl-ORtSP6dmHeiZvwy36UFli6MEZy1XlmBqo,14906
78
- power_grid_model_ds-1.3.4.dist-info/METADATA,sha256=v75WOuMLCD-YxQdwPTYP3216PeLRyjSvgYV3c9Y38wI,8873
79
- power_grid_model_ds-1.3.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
80
- power_grid_model_ds-1.3.4.dist-info/top_level.txt,sha256=nJa103Eqvm5TESYEKPFVImfLg_ugGOBznikrM-rZQZg,20
81
- power_grid_model_ds-1.3.4.dist-info/RECORD,,
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,,