前回考えた DataOutputter インターフェースに、OutputTiming という型が出てきましたが、今回はこれを考えましょう。 そもそもこれは、観測量値(観測量の測定値)を出力するタイミングを指定するために定義したものでした。
一連の記事では反復シミュレーション*1に話題を限定しているので、勿論、出力のタイミングもそれに沿ったもののみを考えます。 いきなりですが、反復シミュレーションで指定しそうな出力タイプは以下の3つくらいでしょう:
- 終状態のみを出力
- 始状態と終状態を出力
- 全状態(始状態と更新後の状態全て)を出力
これらを解決するには、まず initial, after-evolution, final の3つの出力タイミングを定義して
- initial → 初期状態
- after-evolution → 更新直後の状態
- final → 終状態
がそれぞれ出力されるようにします。 これを使って、
- 始状態と終状態 → initial, final
- 終状態のみ → final
- 全状態 → initial, after-evolution
と指定すれば(DataOutputter#setOutputTiming(java.lang.String) メソッドに引数を指定して実行する)、上記の出力タイプを実現できます。
では、実装例を考えてみましょう。 まず、OutputTiming は enum を用いて実装します*2:
public enum OutputTiming{ INITIAL, AFTER_EVOLUTION, FINAL; public static OutputTiming getValue(final String id){ if(id.equals("initial")) return INITIAL; if(id.equals("after-evolution")) return AFTER_EVOLUTION; if(id.equals("final")) return FINAL; return null; } }
メソッド OutputTiming#getValue(java.lang.String) は、出力タイプを指定する文字列( initial, after-evolution, final )から OutputTiming オブジェクトを取得する static メソッドです。
また、反復シミュレーションの実装例は、以前の何も出力しないシミュレーションの記事に載せた IterativeSimulator の実装例に、観測量値の出力を“織り込”んで作成します(下の例では処理を挿入する箇所にコメントで目印を付けてるだけですが):
public class IteratativeSimulator implements Simulator{ private PhysicalSystem system; private Properties initParams; private IterationCondition ic; // ... フィールドのsetterメソッドなど public void simulate(){ system.initialize(initParams); // ← ★★★初期状態(initial)を出力★★★ for(ic.initialize(); ic.continueIteration(); ic.continued()){ system.evolveState(); // ← ★★★更新後の状態(after-evolution)を出力★★★ } ic.stopped(); // ← ★★★終状態(final)を出力★★★ } }
次回は、今までに出てきたインターフェースを組み合わせて Simulator オブジェクトを構築するための設定ファイルを考えます。 出力タイミングなどもこのファイルから指定できるようにします。