Graphx: возможно ли выполнить программу на каждой вершине без получения сообщения?

Когда я пытался реализовать алгоритм в Graphx с помощью Scala, я не нашел возможности активировать все вершины в следующей итерации. Как я могу отправить сообщение всем вершинам моего графа? В моем алгоритме есть несколько супершагов, которые должны быть выполнены всеми вершинами (независимо от того, получают они сообщение или нет, потому что даже не получение сообщения является событием, которое должно быть обработано в следующей итерации).

Я привожу здесь официальный код алгоритма SSSP, реализованного в логике Прегеля. Вы можете видеть, что только вершины, получившие сообщение, будут выполнять свою программу на следующей итерации, но в моем случае я хочу, чтобы функция pregel выполнялась итеративно, т.е. каждый супершаг вершины выполняют свои программы, и они могут голосовать, чтобы остановить, если это необходимо!! Рассуждения в этом примере не похожи на логику Прегеля. Пожалуйста, есть идеи, как реализовать настоящую логику Прегеля?

val graph: Graph[Long, Double] =
  GraphGenerators.logNormalGraph(sc, numVertices = 100).mapEdges(e => e.attr.toDouble)
val sourceId: VertexId = 42 // The ultimate source
// Initialize the graph such that all vertices except the root have distance infinity.
val initialGraph = graph.mapVertices((id, _) =>
    if (id == sourceId) 0.0 else Double.PositiveInfinity)
val sssp = initialGraph.pregel(Double.PositiveInfinity)(
  (id, dist, newDist) => math.min(dist, newDist), // Vertex Program
  triplet => {  // Send Message
    if (triplet.srcAttr + triplet.attr < triplet.dstAttr) {
      Iterator((triplet.dstId, triplet.srcAttr + triplet.attr))
    } else {
      Iterator.empty
    }
  },
  (a, b) => math.min(a, b) // Merge Message
)
println(sssp.vertices.collect.mkString("\n"))

}

0 ответов

Прочитав два ответа от @Mahmoud Hanafy и @Shaido, подтвердив, что в GraphX ​​нет способа активировать вершины или проголосовать за остановку, я попытался реализовать эту логику в самом алгоритме. Итак, вот что я сделал:

  • API Прегеля отправляет init message ко всем вершинам графа в первом супершаге, где они могут выполнить свои процедуры хотя бы один раз, прежде чем они станут неактивными.
  • В конце этого суперэтапа каждая вершина v может отправлять сообщения своим соседям и ждать получения сообщений от других.
  • Во втором супершаге не все вершины будут получать информацию от своих соседей, что означает, что не все вершины будут активированы во втором супершаге! Итак, чтобы решить это, нам нужно вернуться к супершагу и убедиться, что каждая вершина получит сообщение! Как? отправив сообщение себе! (Это единственный способ, которым я могу гарантировать активацию своей вершины на следующем супершаге, но я считаю, что это не самый лучший способ сделать это, потому что это увеличит количество отправленных и полученных сообщений).
  • На втором супершаге каждая вершина получит хотя бы одно сообщение и, следовательно, будет активна, чтобы выполнить свою программу.
  • Чтобы гарантировать, что вершина будет активирована в следующих супершагах, мы можем сделать то же самое.

Я повторяю, это единственный способ решить мою проблему, но я не призываю вас использовать его.

Другие вопросы по тегам