У меня есть функция, которая возвращает подграф S из G. Я хочу создать граф H, где каждый связанный компонент в S является вершиной в H, и две вершины связаны в H, если междуэти наборы вершин в G.
Сейчас у меня есть кое-что, что работает, но создание H занимает вдвое больше времени, чем создание S. (в основном из-за функций node_boundary и connected_components, согласно cProfile) Этот процесс будетбудет сделано много-много раз, так что я надеюсь побриться хотя бы часть времени.Мне действительно нужен только H, так что я подумывал о создании H без промежуточной функции, но я не мог заставить это работать с сокращением.Проблема в том, что ребра должны выбираться случайным образом из G, но сжатие ребер меняет имена вершин в H, и перевод имени ребра был для меня очень трудным.
Создание S:
def sp(G):
nodes = list(G.nodes)
out = nx.Graph()
for v in nodes:
out.add_edge(v, random.choice(list(G.neighbors(v))))
return out
Создание H из S:
spr = sp(G)
H = nx.Graph()
bound = []
CC = list(nx.connected_components(spr))
for c in CC:
H.add_node(CC.index(c))
for c in CC:
bound.append(nx.node_boundary(G,c))
for b in bound:
inter = c.intersection(b)
if len(inter) > 0:
H.add_edge(CC.index(c), bound.index(b))
Создание H без S:
nodes = list(G.nodes)
edges = []
out = G.copy()
for v in nodes:
edges.append( (v, random.choice(list(G.neighbors(v)))) )
for e in edges:
out = nx.contracted_edge(out, e)
return out