From 5ff3ddca6f507cc81b1da3c886c8b1001ce3ad5b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Radek=20Hu=C5=A1ek?= <husek@iuuk.mff.cuni.cz>
Date: Thu, 25 Mar 2021 17:42:25 +0100
Subject: [PATCH] graph_to_gadget: add experimental decomposition
---
graph_tools/misc.py | 38 +++++++++++++++++++++++++++++++++++---
1 file changed, 35 insertions(+), 3 deletions(-)
diff --git a/graph_tools/misc.py b/graph_tools/misc.py
index 44c7daa..f6f39a5 100644
--- a/graph_tools/misc.py
+++ b/graph_tools/misc.py
@@ -52,6 +52,40 @@ def _init_():
return b
+ def guess_decomposition(G):
+ from sage.all import flatten
+
+ cycles = []
+ H = G.copy()
+ while not H.is_forest():
+ _, c = H.girth(certificate=True)
+
+ stack = H.vertex_boundary(c)
+ H.delete_vertices(c)
+
+ while stack:
+ v = stack.pop()
+ if v not in H or H.degree(v) > 1: continue
+ c = [ c, v ]
+ stack.extend(H.vertex_boundary([ v ]))
+ H.delete_vertex(v)
+
+ cycles.append(c)
+
+ score = lambda x: len(G.edge_boundary(flatten([cycles[x[0]], cycles[x[1]]])))
+
+ while len(cycles) > 2:
+ i1, i2 = min([ (i, j) for i in range(len(cycles)) for j in range(i) ], key=score)
+ c1 = cycles[i1]
+ c2 = cycles[i2]
+ del cycles[i1]
+ del cycles[i2]
+ cycles.append([ c1, c2 ])
+
+ assert(sorted(flatten(cycles)) == sorted(G.vertices()))
+ return cycles
+
+
def graph_to_gadget(G, decomposition = None, allow_non_graph = False):
"""Transform graph into a Gadget.
@@ -76,9 +110,7 @@ def _init_():
edges = [ (verts[u], verts[v]) for u, v, _ in G.edges() ]
if decomposition is None:
- decomposition = G.vertices()[0]
- for v in G.vertices()[1:]:
- decomposition = [ v, decomposition ]
+ decomposition = guess_decomposition(G)
vert_map = { v: [0, 1, 2] for v in range(len(verts)) }
--
GitLab