power-grid-model-ds 1.1.0__tar.gz → 1.1.2__tar.gz
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-1.1.0 → power_grid_model_ds-1.1.2}/PKG-INFO +1 -1
- power_grid_model_ds-1.1.2/PYPI_VERSION +1 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/graphs/models/base.py +44 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/graphs/models/rustworkx.py +21 -1
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/grids/base.py +6 -6
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds.egg-info/PKG-INFO +1 -1
- power_grid_model_ds-1.1.0/PYPI_VERSION +0 -1
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/LICENSE +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/README.md +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/pyproject.toml +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/setup.cfg +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/setup.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/data_source/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/data_source/generator/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/data_source/generator/arrays/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/data_source/generator/arrays/base.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/data_source/generator/arrays/line.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/data_source/generator/arrays/node.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/data_source/generator/arrays/source.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/data_source/generator/arrays/transformer.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/data_source/generator/grid_generators.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/fancypy.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/load_flow.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/base/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/base/_build.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/base/_filters.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/base/_modify.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/base/_optional.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/base/_string.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/base/array.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/base/errors.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/arrays/pgm_arrays.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/constants.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/containers/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/containers/base.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/containers/grid_protocol.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/dtypes/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/dtypes/appliances.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/dtypes/branches.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/dtypes/id.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/dtypes/nodes.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/dtypes/regulators.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/dtypes/sensors.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/enums/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/enums/nodes.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/graphs/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/graphs/container.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/graphs/errors.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/graphs/models/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/graphs/models/_rustworkx_search.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/grids/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/grids/_text_sources.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/model/grids/helpers.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/utils/__init__.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/utils/misc.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/utils/pickle.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/utils/zip.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/arrays.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/constants.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/enums.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/errors.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/fancypy.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/generators.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/graph_models.py +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds.egg-info/SOURCES.txt +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds.egg-info/dependency_links.txt +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds.egg-info/requires.txt +0 -0
- {power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: power-grid-model-ds
|
3
|
-
Version: 1.1.
|
3
|
+
Version: 1.1.2
|
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
|
@@ -0,0 +1 @@
|
|
1
|
+
1.1.2
|
@@ -275,8 +275,49 @@ class BaseGraphModel(ABC):
|
|
275
275
|
nodes_to_ignore=self._externals_to_internals(nodes_to_ignore),
|
276
276
|
inclusive=inclusive,
|
277
277
|
)
|
278
|
+
|
278
279
|
return self._internals_to_externals(nodes)
|
279
280
|
|
281
|
+
def find_first_connected(self, node_id: int, candidate_node_ids: list[int]) -> int:
|
282
|
+
"""Find the first connected node to the node_id from the candidate_node_ids
|
283
|
+
|
284
|
+
Note:
|
285
|
+
If multiple candidate nodes are connected to the node, the first one found is returned.
|
286
|
+
There is no guarantee that the same candidate node will be returned each time.
|
287
|
+
|
288
|
+
Raises:
|
289
|
+
MissingNodeError: if no connected node is found
|
290
|
+
ValueError: if the node_id is in candidate_node_ids
|
291
|
+
"""
|
292
|
+
internal_node_id = self.external_to_internal(node_id)
|
293
|
+
internal_candidates = self._externals_to_internals(candidate_node_ids)
|
294
|
+
if internal_node_id in internal_candidates:
|
295
|
+
raise ValueError("node_id cannot be in candidate_node_ids")
|
296
|
+
return self.internal_to_external(self._find_first_connected(internal_node_id, internal_candidates))
|
297
|
+
|
298
|
+
def get_downstream_nodes(self, node_id: int, start_node_ids: list[int], inclusive: bool = False) -> list[int]:
|
299
|
+
"""Find all nodes downstream of the node_id with respect to the start_node_ids
|
300
|
+
|
301
|
+
Example:
|
302
|
+
given this graph: [1] - [2] - [3] - [4]
|
303
|
+
>>> graph.get_downstream_nodes(2, [1]) == [3, 4]
|
304
|
+
>>> graph.get_downstream_nodes(2, [1], inclusive=True) == [2, 3, 4]
|
305
|
+
|
306
|
+
args:
|
307
|
+
node_id: node id to start the search from
|
308
|
+
start_node_ids: list of node ids considered 'above' the node_id
|
309
|
+
inclusive: whether to include the given node id in the result
|
310
|
+
returns:
|
311
|
+
list of node ids sorted by distance, downstream of to the node id
|
312
|
+
"""
|
313
|
+
connected_node = self.find_first_connected(node_id, start_node_ids)
|
314
|
+
path, _ = self.get_shortest_path(node_id, connected_node)
|
315
|
+
_, upstream_node, *_ = (
|
316
|
+
path # path is at least 2 elements long or find_first_connected would have raised an error
|
317
|
+
)
|
318
|
+
|
319
|
+
return self.get_connected(node_id, [upstream_node], inclusive)
|
320
|
+
|
280
321
|
def find_fundamental_cycles(self) -> list[list[int]]:
|
281
322
|
"""Find all fundamental cycles in the graph.
|
282
323
|
Returns:
|
@@ -316,6 +357,9 @@ class BaseGraphModel(ABC):
|
|
316
357
|
@abstractmethod
|
317
358
|
def _get_connected(self, node_id: int, nodes_to_ignore: list[int], inclusive: bool = False) -> list[int]: ...
|
318
359
|
|
360
|
+
@abstractmethod
|
361
|
+
def _find_first_connected(self, node_id: int, candidate_node_ids: list[int]) -> int: ...
|
362
|
+
|
319
363
|
@abstractmethod
|
320
364
|
def _has_branch(self, from_node_id, to_node_id) -> bool: ...
|
321
365
|
|
@@ -7,7 +7,7 @@ from typing import Generator
|
|
7
7
|
|
8
8
|
import rustworkx as rx
|
9
9
|
from rustworkx import NoEdgeBetweenNodes
|
10
|
-
from rustworkx.visit import BFSVisitor, PruneSearch
|
10
|
+
from rustworkx.visit import BFSVisitor, PruneSearch, StopSearch
|
11
11
|
|
12
12
|
from power_grid_model_ds._core.model.graphs.errors import MissingBranchError, MissingNodeError, NoPathBetweenNodes
|
13
13
|
from power_grid_model_ds._core.model.graphs.models._rustworkx_search import find_fundamental_cycles_rustworkx
|
@@ -103,6 +103,13 @@ class RustworkxGraphModel(BaseGraphModel):
|
|
103
103
|
def _in_branches(self, int_node_id: int) -> Generator[tuple[int, int], None, None]:
|
104
104
|
return ((source, target) for source, target, _ in self._graph.in_edges(int_node_id))
|
105
105
|
|
106
|
+
def _find_first_connected(self, node_id: int, candidate_node_ids: list[int]) -> int:
|
107
|
+
visitor = _NodeFinder(candidate_nodes=candidate_node_ids)
|
108
|
+
rx.bfs_search(self._graph, [node_id], visitor)
|
109
|
+
if visitor.found_node is None:
|
110
|
+
raise MissingNodeError(f"node {node_id} is not connected to any of the candidate nodes")
|
111
|
+
return visitor.found_node
|
112
|
+
|
106
113
|
def _find_fundamental_cycles(self) -> list[list[int]]:
|
107
114
|
"""Find all fundamental cycles in the graph using Rustworkx.
|
108
115
|
|
@@ -124,3 +131,16 @@ class _NodeVisitor(BFSVisitor):
|
|
124
131
|
if v in self.nodes_to_ignore:
|
125
132
|
raise PruneSearch
|
126
133
|
self.nodes.append(v)
|
134
|
+
|
135
|
+
|
136
|
+
class _NodeFinder(BFSVisitor):
|
137
|
+
"""Visitor that stops the search when a candidate node is found"""
|
138
|
+
|
139
|
+
def __init__(self, candidate_nodes: list[int]):
|
140
|
+
self.candidate_nodes = candidate_nodes
|
141
|
+
self.found_node: int | None = None
|
142
|
+
|
143
|
+
def discover_vertex(self, v):
|
144
|
+
if v in self.candidate_nodes:
|
145
|
+
self.found_node = v
|
146
|
+
raise StopSearch
|
@@ -331,6 +331,7 @@ class Grid(FancyArrayContainer):
|
|
331
331
|
|
332
332
|
def get_downstream_nodes(self, node_id: int, inclusive: bool = False):
|
333
333
|
"""Get the downstream nodes from a node.
|
334
|
+
Assuming each node has a single feeding substation and the grid is radial
|
334
335
|
|
335
336
|
Example:
|
336
337
|
given this graph: [1] - [2] - [3] - [4], with 1 being a substation node
|
@@ -349,15 +350,14 @@ class Grid(FancyArrayContainer):
|
|
349
350
|
Returns:
|
350
351
|
list[int]: The downstream nodes.
|
351
352
|
"""
|
352
|
-
|
353
|
+
substation_nodes = self.node.filter(node_type=NodeType.SUBSTATION_NODE.value)
|
353
354
|
|
354
|
-
if node_id
|
355
|
+
if node_id in substation_nodes.id:
|
355
356
|
raise NotImplementedError("get_downstream_nodes is not implemented for substation nodes!")
|
356
357
|
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
return self.graphs.active_graph.get_connected(node_id, nodes_to_ignore=[upstream_node], inclusive=inclusive)
|
358
|
+
return self.graphs.active_graph.get_downstream_nodes(
|
359
|
+
node_id=node_id, start_node_ids=list(substation_nodes.id), inclusive=inclusive
|
360
|
+
)
|
361
361
|
|
362
362
|
def cache(self, cache_dir: Path, cache_name: str, compress: bool = True):
|
363
363
|
"""Cache Grid to a folder
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds.egg-info/PKG-INFO
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.2
|
2
2
|
Name: power-grid-model-ds
|
3
|
-
Version: 1.1.
|
3
|
+
Version: 1.1.2
|
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
|
@@ -1 +0,0 @@
|
|
1
|
-
1.1.0
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/__init__.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/fancypy.py
RENAMED
File without changes
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/load_flow.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/utils/misc.py
RENAMED
File without changes
|
File without changes
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/_core/utils/zip.py
RENAMED
File without changes
|
File without changes
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/constants.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/generators.py
RENAMED
File without changes
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds/graph_models.py
RENAMED
File without changes
|
{power_grid_model_ds-1.1.0 → power_grid_model_ds-1.1.2}/src/power_grid_model_ds.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|