2016-03-26 5 views
3

После долгой мысли, я, наконец, решил опубликовать этот вопрос здесь. Несколько дней назад я начал использовать graph-tool, чтобы делать разные вещи. До этого я использовал Networkx. Я уже видел впечатляющие performance comparision и думал, что все будет достаточно просто. Тем не менее, я сразу же столкнулся с проблемой скорости и asked a question, связанной с конкретным аспектом этого. Я получил быстрый ответ, который удовлетворил меня. Однако сейчас эта проблема с периодичностью меня толкает, и я не могу найти документацию о graph-tool, которая связана с ее эффективным использованием. Например, из ответа на мой последний вопрос, я понял, что лучше добавить все ребра вместе, а не один за другим, что очень важно отметить, но нигде не упоминалось! У меня теперь есть еще две аналогичные проблемы:Использование графического инструмента эффективно

(1) Как выбрать случайный сосед данного узла? Я могу видеть только следующее решение:

nbr = np.random.choice(list(v.all_neighbours())) 

поскольку v.all_neighbours() является генератором, я должен преобразовать его в список, чтобы выбрать случайный элемент. Это замедляет код, но я не вижу лучшего способа.

(2) Я хочу назначить 1d-вектор (list okay?) Каждой из вершин на графике, а затем я обмениваюсь и изменяю их определенным образом. Это просто карта свойств, и я хотел бы увидеть некоторую документацию о том, как ее эффективно использовать. Однако я ничего не могу найти.

(3) Я пытаюсь моделировать triadic closure в некоторой сети, которая сама меняет свое время. Таким образом, на каждом временном шаге мне нужна информация о соседях каждой вершины графика. Опять же, я должен создать список (или массив numpy):

nbrs = [w for w in v.neighbours()] 

, который существенно снижает скорость моего кода. Это означает, что я делаю это неправильно, но я не мог найти документацию, которая бы рассказывала мне, как эффективно использовать соседей в графическом инструменте.

Каким-то образом Networkx программы, которые я написал для одних и тех же задач, полностью превзошли графики графиков, я просто не могу их купить.

Этот список может увеличиться, и, следовательно, я был бы очень рад, если бы кто-нибудь мог указать мне на какую-либо документацию об использовании графического инструмента эффективно, кроме ответа на вышеупомянутые конкретные вопросы.

Заранее спасибо.

+0

Придавая принятый ответ связанного вопроса быстрый взгляд, кажется, что вы можете добавлять ребра в один конец с помощью '' add_edges_from' '(https://networkx.github.io/documentation/latest/reference/generated/ networkx.Graph.add_edges_from.html), если это одно узкое место. Возможно, это не относится к делу, так как я предположил, что «networkx» там. – Divakar

+0

Справа. Есть ли у вас какие-либо другие идеи о графическом инструменте? Networkx, вопреки моим ожиданиям, работает довольно быстро. Это просто означает, что я неправильно использую графический инструмент. – Peaceful

+0

У меня нет никакого опыта работы с 'graph-tool', на самом деле слышал об этом в первый раз. Но если они утверждают, что они эффективны, я надеюсь, что у них будет какая-то реализация, чтобы соответствовать этой функциональности добавления всех ребер в один проход, например, в 'networkx'. Тем не менее, я сам попробовал этот модуль, выглядит интересно! – Divakar

ответ

1

Вы можете получить доступ к соседям и вершины, как массивы, которые будут SpeedUp код, как описано в документации: https://graph-tool.skewed.de/static/doc/quickstart.html#fast-iteration-over-vertices-and-edges

Например, вместо того, чтобы делать:

nbr = np.random.choice(list(v.out_neighbours())) 

вы должны сделать:

nbr = np.random.choice(g.get_out_neighbours(v)) 

, который должен быть значительно быстрее, поскольку вместо списков используются массивы.

+0

Это вызывает ошибку: «AttributeError: объект« Вершина »не имеет атрибута« get_all_neighbours » – Peaceful

+0

@ Возможно, вы используете старую версию. Вам нужно обновить. –

+0

Я использую версию 2.26, которую я обновил до сегодняшнего дня. Я на Ubuntu 16.04. – Peaceful

1

Я постараюсь сделать больше «graph-tool Определённые» ответы:

1) а на самом деле это одна связана с питоном, так что вы можете захотеть использовать раствор из this thread using random.shuffle Однако, если вы собираетесь сделать это несколько раз, (и если у вас есть достаточное количество доступной памяти), я думаю, что было бы лучше, чтобы получить матрицу смежности как scipy разреженная матрица затем использовать эту матрицу:

import graph_tool 
from graph_tool.spectral import adjacency 
import numpy as np 

g = graph_tool.Graph() 
g.add_vertex(100) 
edges = np.random.randint(0, 100, (500,2)) 
g.add_edge_list(edges) 

mat = adjacency(g).tolil() 
rows = mat.rows.copy() # mat.rows = in-neighbours for each vertex 
map(np.random.shuffle, rows) 
rnd_neighbours = { i:row[0] for i, row in enumerate(rows) if row } 

Где rnd_neighbours содержит индекс одного случайный сосед для каждой вершины ненулевого i п-степени.

2) чтение graph-tool documentation regarding PropertyMaps и detailed version, list ы принимаются в качестве python::object или просто object.Затем вы можете получить к ним доступ в качестве элементов в PropertyMap.

3) Для триадного закрытия посмотрите на clustering module и на this thread в списке рассылки.

EDIT: Кстати, я забыл упомянуть об этом, но вы можете получить доступ и изменить количество OpenMP нитей с openmp_enabled, openmp_get_num_threads и openmp_set_num_threads в graph-tool. Не могу найти его в документе, хотя ... Но вот the source.

 Смежные вопросы

  • Нет связанных вопросов^_^