Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 1 addition & 18 deletions src/power_grid_model_ds/_core/model/graphs/models/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
MissingNodeError,
NoPathBetweenNodes,
)
from power_grid_model_ds._core.model.utils import _get_branch3_branches

if TYPE_CHECKING:
from power_grid_model_ds._core.model.grids.base import Grid
Expand Down Expand Up @@ -421,21 +422,3 @@ def _find_fundamental_cycles(self) -> list[list[int]]: ...

@abstractmethod
def _all_branches(self) -> Generator[tuple[int, int], None, None]: ...


def _get_branch3_branches(branch3: Branch3Array) -> BranchArray:
node_1 = branch3.node_1.item()
node_2 = branch3.node_2.item()
node_3 = branch3.node_3.item()

status_1 = branch3.status_1.item()
status_2 = branch3.status_2.item()
status_3 = branch3.status_3.item()

branches = BranchArray.zeros(3)
branches.from_node = [node_1, node_1, node_2]
branches.to_node = [node_2, node_3, node_3]
branches.from_status = [status_1, status_1, status_2]
branches.to_status = [status_2, status_3, status_3]

return branches
22 changes: 22 additions & 0 deletions src/power_grid_model_ds/_core/model/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# SPDX-FileCopyrightText: Contributors to the Power Grid Model project <[email protected]>
#
# SPDX-License-Identifier: MPL-2.0
from power_grid_model_ds._core.model.arrays.pgm_arrays import Branch3Array, BranchArray


def _get_branch3_branches(branch3: Branch3Array) -> BranchArray:
node_1 = branch3.node_1.item()
node_2 = branch3.node_2.item()
node_3 = branch3.node_3.item()

status_1 = branch3.status_1.item()
status_2 = branch3.status_2.item()
status_3 = branch3.status_3.item()

branches = BranchArray.zeros(3)
branches.from_node = [node_1, node_1, node_2]
branches.to_node = [node_2, node_3, node_3]
branches.from_status = [status_1, status_1, status_2]
branches.to_status = [status_2, status_3, status_3]

return branches
1 change: 1 addition & 0 deletions src/power_grid_model_ds/_core/visualizer/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ def _get_columns_store(grid: Grid) -> dcc.Store:
"line": grid.line.columns,
"link": grid.link.columns,
"transformer": grid.transformer.columns,
"three_winding_transformer": grid.three_winding_transformer.columns,
"branch": grid.branches.columns,
},
)
Expand Down
24 changes: 23 additions & 1 deletion src/power_grid_model_ds/_core/visualizer/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@

from power_grid_model_ds._core.model.arrays.base.array import FancyArray
from power_grid_model_ds._core.model.grids.base import Grid
from power_grid_model_ds.arrays import BranchArray, NodeArray
from power_grid_model_ds._core.model.utils import _get_branch3_branches
from power_grid_model_ds.arrays import Branch3Array, BranchArray, NodeArray


def parse_node_array(nodes: NodeArray) -> list[dict[str, Any]]:
Expand All @@ -32,6 +33,27 @@ def parse_branches(grid: Grid) -> list[dict[str, Any]]:
parsed_branches.extend(parse_branch_array(grid.line, "line"))
parsed_branches.extend(parse_branch_array(grid.link, "link"))
parsed_branches.extend(parse_branch_array(grid.transformer, "transformer"))
parsed_branches.extend(parse_branch3_array(grid.three_winding_transformer, "transformer"))
return parsed_branches


def parse_branch3_array(branches: Branch3Array, group: Literal["transformer"]) -> list[dict[str, Any]]:
"""Parse the three-winding transformer array."""
parsed_branches = []
columns = branches.columns
for branch in branches:
for branch_ in _get_branch3_branches(branch):
cyto_elements = {"data": _array_to_dict(branch_, columns)}
cyto_elements["data"].update(
{
# IDs need to be unique, so we combine the branch ID with the from and to nodes
"id": str(branch.id.item()) + f"_{branch_.from_node.item()}_{branch_.to_node.item()}",
"source": str(branch_.from_node.item()),
"target": str(branch_.to_node.item()),
"group": group,
}
)
parsed_branches.append(cyto_elements)
return parsed_branches


Expand Down
28 changes: 27 additions & 1 deletion tests/unit/visualizer/test_parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
from numpy.typing import NDArray

from power_grid_model_ds._core.model.arrays import LineArray, NodeArray
from power_grid_model_ds._core.visualizer.parsers import parse_branch_array, parse_node_array
from power_grid_model_ds._core.model.arrays.pgm_arrays import Branch3Array
from power_grid_model_ds._core.visualizer.parsers import parse_branch3_array, parse_branch_array, parse_node_array


class CoordinatedNodeArray(NodeArray):
Expand Down Expand Up @@ -64,3 +65,28 @@ def test_parse_line_array(self):
assert parsed[0]["data"]["source"] == "1"
assert parsed[0]["data"]["target"] == "4"
assert parsed[0]["data"]["group"] == "line"

def test_parse_branch3_array(self):
branch3 = Branch3Array.zeros(1)
branch3["id"] = [200]
branch3["node_1"] = [1]
branch3["node_2"] = [2]
branch3["node_3"] = [3]
branch3["status_1"] = [1]
branch3["status_2"] = [1]
branch3["status_3"] = [1]

parsed = parse_branch3_array(branch3, "transformer")
assert len(parsed) == 3
assert parsed[0]["data"]["id"] == "200_1_2"
assert parsed[0]["data"]["source"] == "1"
assert parsed[0]["data"]["target"] == "2"
assert parsed[0]["data"]["group"] == "transformer"
assert parsed[1]["data"]["id"] == "200_1_3"
assert parsed[1]["data"]["source"] == "1"
assert parsed[1]["data"]["target"] == "3"
assert parsed[1]["data"]["group"] == "transformer"
assert parsed[2]["data"]["id"] == "200_2_3"
assert parsed[2]["data"]["source"] == "2"
assert parsed[2]["data"]["target"] == "3"
assert parsed[2]["data"]["group"] == "transformer"
Loading