Сжимающиеся узлы с самоконтролями в сети x
Я заметил несоответствие в поведении networkx.contracted_nodes(G,u,v)
, Ожидается, что функция будет сжимать (объединять) узлы u
а также v
на графике G
что он делает - до тех пор, пока ни u
ни v
иметь край петли Если имеется цикл, функция удаляет цикл без объединения узлов. Пример:
G = nx.Graph([(1,1), (1,2), (2,2)]) # Two nodes
H = nx.contracted_nodes(G, 1, 2, self_loops=False)
H.edges() # Should be one node now
Выход:
[(1, 1), (1, 2)] # Nope, same two nodes, but only one edge
Это ошибка, неопределенное поведение или недокументированная функция?
1 ответ
Это похоже на ошибку для меня. FWIW, это происходит даже без (1,1) края в G
, В исходном коде для ненаправленного графа
new_edges = ((u, w, d) for x, w, d in G.edges(v, data=True)
if self_loops or w != u)
В твоем случае u
является 1
а также w
является 2
, Он проходит по всем краям формы (v,w,d)
с x
всегда равно v
, w
другой узел на краю и d
это данные для ребра (в вашем случае ничего).
Когда дело доходит до (2,2)
край, это добавляет грань между u
который 1
а также w
который 2
, Это вызывает 2
быть узлом в новом графе.
Так что нужно разобраться с делом w == v
лучше.
РЕДАКТИРОВАТЬ Похоже, эта ошибка будет исправлена в следующем выпуске, который скоро будет.