4.9.1.3 削減
これらの並列ブロック内では一般に、ラムダ外部に定義された変数をアトミックに更新するか、この変数まで削減します。これらのアトミック型削減は、Scalar<T>: reduceAdd、reduceMul、reduceAnd
などでメソッドとして使用できます。たとえば、グラフ内の頂点の数をカウントするには、次のようにします。
public int countVertices() {
Scalar<Integer> count = Scalar.create(0);
G.getVertices().forEach(n -> {
count.reduceAdd(1);
});
return count.get();
}
複数の値を原子的に更新する必要がある場合があります。たとえば、最小のプロパティ値と、この最小値にプロパティ値が到達した頂点を検出できます。並列実行による2つの別々の削減文のために、状態の一貫性が失われる場合があります。
この問題を解決するために、Reductions
クラスにはargMin
関数とargMax
関数が用意されています。argMin
の最初の引数は現在の値で、2番目の引数は潜在的な新しい最小値です。また、ArgMinMax
オブジェクトに対してandUpdate
コールを連鎖的に実行することにより、他の変数およびこれらの(アトミックな)更新先の値を示すことができます。次に例を示します。
VertexProperty<Integer> rank = VertexProperty.create();
int minRank = Integer.MAX_VALUE;
PgxVertex minVertex = PgxVertex.NONE;
G.getVertices().forEach(n ->
argMin(minRank, rank.get(n)).andUpdate(minVertex, n)
);
親トピック: カスタムPGXアルゴリズムの作成