//////////////////////////////////////////////////////////////////////////////// /// DISCLAIMER /// /// Copyright 2016 ArangoDB GmbH, Cologne, Germany /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// /// Copyright holder is ArangoDB GmbH, Cologne, Germany /// /// @author Simon Grätzer //////////////////////////////////////////////////////////////////////////////// #include "SSSP.h" #include "Pregel/Algorithm.h" #include "Pregel/GraphStore.h" #include "Pregel/IncomingCache.h" #include "Pregel/VertexComputation.h" using namespace arangodb::pregel; using namespace arangodb::pregel::algos; struct SSSPComputation : public VertexComputation { SSSPComputation() {} void compute(MessageIterator const& messages) override { int64_t tmp = vertexData(); for (const int64_t* msg : messages) { if (*msg < tmp) { tmp = *msg; }; } int64_t* state = mutableVertexData(); if (tmp < *state || (tmp == 0 && localSuperstep() == 0)) { *state = tmp; // update state RangeIterator> edges = getEdges(); for (Edge* edge : edges) { int64_t val = *edge->data() + tmp; sendMessage(edge, val); } } voteHalt(); } }; GraphFormat* SSSPAlgorithm::inputFormat() { return new NumberGraphFormat (_sourceField, _resultField, INT64_MAX, 1); } MessageFormat* SSSPAlgorithm::messageFormat() const { return new IntegerMessageFormat(); } MessageCombiner* SSSPAlgorithm::messageCombiner() const { return new MinCombiner(); } VertexComputation* SSSPAlgorithm::createComputation( WorkerConfig const* config) const { return new SSSPComputation(); } struct SSSPCompensation : public VertexCompensation { SSSPCompensation() {} void compensate(bool inLostPartition) override { if (inLostPartition) { int64_t* data = mutableVertexData(); *data = INT64_MAX; } } }; VertexCompensation* SSSPAlgorithm::createCompensation(WorkerConfig const* config) const { return new SSSPCompensation(); }