Source code for ewokscore.graph.compare
from typing import List, Sequence
import networkx
[docs]
def graphs_are_equal(graph1: networkx.DiGraph, graph2: networkx.DiGraph) -> bool:
if not _attrs_are_equal(graph1.graph, graph2.graph):
return False
if set(graph1.nodes) != set(graph2.nodes):
return False
for node_id, node_attr1 in graph1.nodes.items():
node_attr2 = graph2.nodes[node_id]
if not _attrs_are_equal(node_attr1, node_attr2):
return False
if set(graph1.edges) != set(graph2.edges):
return False
for edge_id, edge_attrs1 in graph1.edges.items():
edge_attrs2 = graph2.edges[edge_id]
if not _attrs_are_equal(edge_attrs1, edge_attrs2):
return False
return True
def _attrs_are_equal(attrs1: dict, attrs2: dict) -> bool:
if set(attrs1) != set(attrs2):
return False
for name, value1 in attrs1.items():
value2 = attrs2[name]
if name in ("input_nodes", "output_nodes"):
value1 = _items_to_dict(value1, ["id"])
value2 = _items_to_dict(value2, ["id"])
elif name == "default_inputs":
value1 = _items_to_dict(value1, ["name"])
value2 = _items_to_dict(value2, ["name"])
elif name == "data_mapping":
value1 = _items_to_dict(value1, ["source_output", "target_input"])
value2 = _items_to_dict(value2, ["source_output", "target_input"])
elif name == "conditions":
value1 = _items_to_dict(value1, ["source_output"])
value2 = _items_to_dict(value2, ["source_output"])
if value1 != value2:
return False
return True
def _items_to_dict(items: List[dict], keys: Sequence[str]) -> dict:
result = dict()
for item in items:
result[tuple(item[k] for k in keys)] = item
return result