diff --git a/colored_pentagon_contractions.py b/colored_pentagon_contractions.py index c0ff7a0..bce6153 100644 --- a/colored_pentagon_contractions.py +++ b/colored_pentagon_contractions.py @@ -1,5 +1,4 @@ """Example: colored pentagon reduction on a random 20-vertex triangulation.""" -import hashlib import json import base64 from collections import defaultdict @@ -9,30 +8,11 @@ from sage.all import graphs, Graph # type: ignore[attr-defined] # pylint: disa from lib.tutte_embedding import tutte_embedding from lib.planar_embedding import outer_face, get_embedding_from_pos from lib.colored_graphs import ColoredGraphId, VertexColoring, save_colored_graph +from lib.operations import Operation, operation_to_string, operation_sequence_id DIR = Path(__file__).parent PALETTE = ['red', 'blue', 'green', 'yellow'] -class Operation(TypedDict): - """Information about a change made to a (colored) graph""" - name: Any - meta: Any - source_graph: Graph - source_canon_id: ColoredGraphId - result_graph: Graph - result_coloring: VertexColoring - result_canon_id: ColoredGraphId - -def colored_graph_id_to_string(cid: ColoredGraphId) -> str: - return f"{cid['graph_id']} {cid['coloring_id']}" - -def op_to_transform_id(op: Operation) -> str: - return f"{colored_graph_id_to_string(op['source_canon_id'])} -> {colored_graph_id_to_string(op['result_canon_id'])}" - -def operation_sequence_id(ops: list[Operation]) -> str: - joined = "\n".join(op_to_transform_id(op) for op in ops) - return hashlib.sha256(joined.encode()).hexdigest() - def _neighbors_form_cycle(g: Graph, v: Any) -> bool: """Return True if the neighbors of v induce a cycle in g.""" return bool(cast(Graph, g.subgraph(g.neighbors(v))).is_cycle()) @@ -188,6 +168,4 @@ def save_operation_sequence(op_sequence: list[ReduceOperation], g: Graph, colori return op_seq_id op_sequence = reduce(G, starting_coloring, initial_canon_id) -print("\nOp sequence:") -print(json.dumps(strip_graphs(op_sequence), indent=2)) save_operation_sequence(op_sequence, G, starting_coloring) diff --git a/lib/operations.py b/lib/operations.py new file mode 100644 index 0000000..e1a5094 --- /dev/null +++ b/lib/operations.py @@ -0,0 +1,24 @@ +import hashlib +from typing import Any, TypedDict +from sage.all import Graph # type: ignore[attr-defined] # pylint: disable=no-name-in-module +from lib.colored_graphs import ColoredGraphId, VertexColoring + +class Operation(TypedDict): + """Information about a change made to a (colored) graph""" + name: Any + meta: Any + source_graph: Graph + source_canon_id: ColoredGraphId + result_graph: Graph + result_coloring: VertexColoring + result_canon_id: ColoredGraphId + +def colored_graph_id_to_string(cid: ColoredGraphId) -> str: + return f"{cid['graph_id']} {cid['coloring_id']}" + +def operation_to_string(op: Operation) -> str: + return f"{colored_graph_id_to_string(op['source_canon_id'])} -> {colored_graph_id_to_string(op['result_canon_id'])}" + +def operation_sequence_id(ops: list[Operation]) -> str: + joined = "\n".join(operation_to_string(op) for op in ops) + return hashlib.sha256(joined.encode()).hexdigest()