40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
from typing import Set
|
|
from plesna.graph.graph import Graph
|
|
from plesna.models.graphs import Edge, EdgeOnSet
|
|
from itertools import product
|
|
|
|
|
|
class GraphSet:
|
|
def __init__(self):
|
|
self._edges = []
|
|
self._node_sets = set()
|
|
|
|
def append(self, edge: EdgeOnSet):
|
|
self._edges.append(edge)
|
|
self._node_sets.add(frozenset(edge.sources))
|
|
self._node_sets.add(frozenset(edge.targets))
|
|
|
|
@property
|
|
def edges(self) -> Set[EdgeOnSet]:
|
|
return self._edges
|
|
|
|
@property
|
|
def node_sets(self) -> Set[frozenset]:
|
|
return self._node_sets
|
|
|
|
def to_graph(self) -> Graph:
|
|
graph = Graph()
|
|
for node_set in self.node_sets:
|
|
graph.add_nodes(node_set)
|
|
for edge in self._edges:
|
|
flatten_edge = [
|
|
Edge(arrow=edge.arrow, source=s, target=t, metadata=edge.metadata)
|
|
for (s, t) in product(edge.sources, edge.targets)
|
|
]
|
|
graph.add_edges(flatten_edge)
|
|
|
|
return graph
|
|
|
|
def is_valid_dag(self) -> bool:
|
|
return self.to_graph().is_dag()
|