16.6.2 実行中のアルゴリズムの進行状況の取得

グラフ・アルゴリズムの進行状況は単調に増加するカウンタの値に基づきます。カウンタの値はアルゴリズムの実行中に定期的に増加します。

AlgorithmProgress Java APIを使用してアルゴリズムの進行状況を追跡し、様々な時点のカウンタ値とカウンタの最終予測値とを比較して、アルゴリズムの進行状況を確認できます。

AlgorithmProgressオブジェクトは、特定の時点でのアルゴリズム実行の進行状況を表します。これには、次の2つの属性が含まれています:

  • numberOfStepsCompleted: このカウンタは、現在までに実行されたステップ数を表します。
  • numberOfStepsEstimatedForCompletion: この値は、完了までに必要とされるステップの合計数の見積りです。

    次に示す組込みアルゴリズムでは、numberOfStepsEstimatedForCompletionにデフォルトの正の値が指定されます。

    • PageRank
    • 近似PageRank
    • パーソナライズされたPageRank
    • パーソナライズされたPageRank (頂点のセットに対する)
    • パーソナライズされた加重PageRank
    • パーソナライズされた加重PageRank (頂点のセットに対する)
    • 加重PageRank
    • 次数中心性
    • 入次数中心性
    • 出次数中心性
    • フィルタされたスピーカ・リスナー・ラベルの伝播
    • フィルタされた加重スピーカ・リスナー・ラベルの伝播
    • 加重スピーカ・リスナー・ラベルの伝播
    • スピーカ・リスナー・ラベルの伝播
    • ラベルの伝播
    • Louvain
    • SomanおよびNarang
    • 加重Infomap

numberOfStepsEstimatedForCompletionの値を提供しないアルゴリズムの場合、進行状況をパーセントとして見積もることはできません。このような場合、アクセスできるのはカウンタの値(numberOfStepsCompleted)のみです。

ただし、カスタムPGXグラフ・アルゴリズムにはnumberOfStepsEstimatedForCompletion値を設定できます。詳細は、「実行中のカスタムPGXグラフ・アルゴリズムの進行状況の追跡」を参照してください。

次は、組込みのPageRankアルゴリズムを使用する例です。AlgorithmProgress Java APIを使用して実行中の組込みアルゴリズムの進行状況を取得するステップを示しています。

opg4j> var graph = session.readGraphByName("BANK_TXN_GRAPH", GraphSource.PG_PGQL)
g ==> PgxGraph[name=BANK_TXN_GRAPH,N=1000,E=4993,created=1712307339271]
opg4j>  var future = analyst.pagerankAsync(graph)
future ==> oracle.pgx.api.PgxFuture@1dfe5dd1[Not completed]
opg4j> var futureProgress = future.getProgress()
futureProgress ==> oracle.pgx.api.DefaultFutureProgress@6d7bb5cc
opg4j> var algorithmProgress = futureProgress.asAlgorithmExecutionProgress()
PgxGraph graph = session.readGraphByName("BANK_TXN_GRAPH", GraphSource.PG_PGQL);
PgxFuture<?> future = analyst.pagerank.runAsync(graph);
FutureProgress futureProgress = future.getProgress();
Optional<AlgorithmProgress> algorithmProgress = futureProgress.asAlgorithmExecutionProgress();

次のコードは、実行中のアルゴリズムの進行状況をパーセンテージとして見積もる方法を示しています。

opg4j> if (algorithmProgress.isPresent()) {
...>   var progress = algorithmProgress.get();
...>   var completedSteps = progress.getNumberOfStepsCompleted();
...>   var numberOfStepsEstimatedForCompletion = progress.getNumberOfStepsEstimatedForCompletion();
...>   var progressPercentage = completedSteps * 100 / numberOfStepsEstimatedForCompletion;
...>   System.out.println(completedSteps);
...>   System.out.println(numberOfStepsEstimatedForCompletion);
...>   System.out.println(progressPercentage);
...> }
if (algorithmProgress.isPresent()) {
  AlgorithmProgress progress = algorithmProgress.get();
  long completedSteps = progress.getNumberOfStepsCompleted();
  Long numberOfStepsEstimatedForCompletion = progress.getNumberOfStepsEstimatedForCompletion();
  long progressPercentage = completedSteps * 100 / numberOfStepsEstimatedForCompletion;
  System.out.println(completedSteps); 
  System.out.println(numberOfStepsEstimatedForCompletion); 
  System.out.println(progressPercentage); 
};

前述のコードは、現時点での進行状況を示しています。しばらくしてから実行中のアルゴリズムの進行状況(たとえば、1min)を取得すると、progressPercentageの値が大きくなっていることを確認できます。