API ガイド > ディペンデンシー グラフ プラグイン >

# compute メソッド

ディペンデンシー グラフ ノードの実装は、アトリビュートの割り当てと compute メソッドのコーディングに過ぎません。DG ノードは C++ クラスで、アトリビュートがスタティック クラス メンバーになっています。クラスのインスタンスは、DG ノードの個々のインスタンスをグラフ内に作成します。プラグは、ノードの特定のアトリビュートの状態を示す別個のオブジェクトです。

compute メソッドは、ノードのインスタンスのアトリビュートとプラグから入力を取ります(プラグがない場合はアトリビュートの既定値、プラグがある場合はプラグの特定値)。プラグから情報を要求すると、プラグは自分自身が適切な状態になっているかどうか判断します(たとえば clean かどうか)。適切な状態になっていない場合、プラグは自分自身を更新するよう、接続されたノードに自動的に要求します。これは DG 全体に広がります。すべてのプラグがクリーン(clean)になると、ノードはプラグからデータを取り(データ ブロックとデータ ハンドルを通して)、結果を計算して出力アトリビュートに出力を送信します。

ノードが、そのアトリビュートとプラグの外側について認識する必要はありません。たとえば、あるノードが DAG やその他のディペンデンシー グラフ ノードを変更してはなりません。DAG、または DG 内の別のノードを変更すると、新しい DG の評価を要求することになり、ノード自身を再評価することになります。するとまた変更することになって、新しい DG の評価を強制することになる、というように無限ループに陥ります。何らかの理由でノードがまわりの状態について認識する必要がある場合は、接続可能なアトリビュートとしてその知識が提供される必要があります。外部データを使用すると、ほとんどの場合以下のうちいずれかに反することになります。

- 多重処理の使いやすさ
- 別のコンテキストでの評価(たとえば、時間 T での評価)
- ノードのインスタンス化
- 計算のベクトル化

すべてのノードの compute() メソッドは、パラメータ内に存在するデータのみで動作する必要があります。その他のデータが必要な場合は、アトリビュートにする必要があります。情報を一時的にキャッシュして計算スピードを上げる場合でも、それを隠しアトリビュートとして、ファイルの取り出し後の最初のリフレッシュを高速にすると便利です。

また、プラグで入ってくるデータの参照をノードに保存しないでください。たとえばサーフェス ジオメトリがプラグで入ってきても、このジオメトリへのポインタを保存しないでください。プラグで入ってくるデータは一時的なもので、気付かないうちに消えることがあります。このデータは、ノードの compute 関数の実行中に限って存在することが保証されます。