Skip to content

Commit 68c7ffc

Browse files
committed
Merge remote-tracking branch 'origin/main' into feat/setup-model-public
# Conflicts: # tests/integration/loadflow/test_power_grid_model.py
2 parents 785b00b + 0cd8cb3 commit 68c7ffc

File tree

5 files changed

+74
-20
lines changed

5 files changed

+74
-20
lines changed

src/power_grid_model_ds/_core/model/graphs/models/base.py

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
MissingNodeError,
1616
NoPathBetweenNodes,
1717
)
18+
from power_grid_model_ds._core.model.utils import _get_branch3_branches
1819

1920
if TYPE_CHECKING:
2021
from power_grid_model_ds._core.model.grids.base import Grid
@@ -414,21 +415,3 @@ def _find_fundamental_cycles(self) -> list[list[int]]: ...
414415

415416
@abstractmethod
416417
def _all_branches(self) -> Generator[tuple[int, int], None, None]: ...
417-
418-
419-
def _get_branch3_branches(branch3: Branch3Array) -> BranchArray:
420-
node_1 = branch3.node_1.item()
421-
node_2 = branch3.node_2.item()
422-
node_3 = branch3.node_3.item()
423-
424-
status_1 = branch3.status_1.item()
425-
status_2 = branch3.status_2.item()
426-
status_3 = branch3.status_3.item()
427-
428-
branches = BranchArray.zeros(3)
429-
branches.from_node = [node_1, node_1, node_2]
430-
branches.to_node = [node_2, node_3, node_3]
431-
branches.from_status = [status_1, status_1, status_2]
432-
branches.to_status = [status_2, status_3, status_3]
433-
434-
return branches
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# SPDX-FileCopyrightText: Contributors to the Power Grid Model project <[email protected]>
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

src/power_grid_model_ds/_core/visualizer/app.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def _get_columns_store(grid: Grid) -> dcc.Store:
6060
"line": grid.line.columns,
6161
"link": grid.link.columns,
6262
"transformer": grid.transformer.columns,
63+
"three_winding_transformer": grid.three_winding_transformer.columns,
6364
"branch": grid.branches.columns,
6465
},
6566
)

src/power_grid_model_ds/_core/visualizer/parsers.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66

77
from power_grid_model_ds._core.model.arrays.base.array import FancyArray
88
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
1011

1112

1213
def parse_node_array(nodes: NodeArray) -> list[dict[str, Any]]:
@@ -32,6 +33,27 @@ def parse_branches(grid: Grid) -> list[dict[str, Any]]:
3233
parsed_branches.extend(parse_branch_array(grid.line, "line"))
3334
parsed_branches.extend(parse_branch_array(grid.link, "link"))
3435
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)
3557
return parsed_branches
3658

3759

tests/unit/visualizer/test_parsers.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
from numpy.typing import NDArray
77

88
from power_grid_model_ds._core.model.arrays import LineArray, NodeArray
9-
from power_grid_model_ds._core.visualizer.parsers import parse_branch_array, parse_node_array
9+
from power_grid_model_ds._core.model.arrays.pgm_arrays import Branch3Array
10+
from power_grid_model_ds._core.visualizer.parsers import parse_branch3_array, parse_branch_array, parse_node_array
1011

1112

1213
class CoordinatedNodeArray(NodeArray):
@@ -64,3 +65,28 @@ def test_parse_line_array(self):
6465
assert parsed[0]["data"]["source"] == "1"
6566
assert parsed[0]["data"]["target"] == "4"
6667
assert parsed[0]["data"]["group"] == "line"
68+
69+
def test_parse_branch3_array(self):
70+
branch3 = Branch3Array.zeros(1)
71+
branch3["id"] = [200]
72+
branch3["node_1"] = [1]
73+
branch3["node_2"] = [2]
74+
branch3["node_3"] = [3]
75+
branch3["status_1"] = [1]
76+
branch3["status_2"] = [1]
77+
branch3["status_3"] = [1]
78+
79+
parsed = parse_branch3_array(branch3, "transformer")
80+
assert len(parsed) == 3
81+
assert parsed[0]["data"]["id"] == "200_1_2"
82+
assert parsed[0]["data"]["source"] == "1"
83+
assert parsed[0]["data"]["target"] == "2"
84+
assert parsed[0]["data"]["group"] == "transformer"
85+
assert parsed[1]["data"]["id"] == "200_1_3"
86+
assert parsed[1]["data"]["source"] == "1"
87+
assert parsed[1]["data"]["target"] == "3"
88+
assert parsed[1]["data"]["group"] == "transformer"
89+
assert parsed[2]["data"]["id"] == "200_2_3"
90+
assert parsed[2]["data"]["source"] == "2"
91+
assert parsed[2]["data"]["target"] == "3"
92+
assert parsed[2]["data"]["group"] == "transformer"

0 commit comments

Comments
 (0)