今回は反復を実行する Iteration インターフェースです。
Iteration インターフェースにはネスト構造に出来るサブクラス CompositeIteration があります。 通常の、物理系の状態を発展させる Iteration の実装クラスを LeafIteration、CompositeIteration の実装クラスを BranchIteration、それらを抽象化した親クラスを AbstractIteration として実装を行います。
AbstractIteration
AbstractIteration は IterationCondition (反復条件)を属性として持ち、反復を実行するクラスです。 Iteration#iterate() メソッドを呼び出すことで反復を開始することが出来ます。 反復の仕方は
セットされている反復条件を評価した結果*1が真である限り、Iteration#evolve() メソッドを呼び出し続ける
というものです(下記の実装を参照)。 Iteration#evolve() メソッドは基本的に外部から呼び出しません*2。 また、反復条件 (IterationCondition) が設定されていない場合は、1度だけ Iteration.evolve() を呼び出して終了します*3。
public abstract class AbstractIteration implements Iteration{ private IterationCondition ic; // IterationCondition へのアクセッサ・メソッド @Prepare public void setupIterationCondition(){ if(this.ic == null){ // OnceIC オブジェクトは「1度だけ反復を実行する」 // IterationCondition クラス。 this.ic = new OnceIC(); } } public void iterate(final PhysicalSystem system) throws SimulationException{ while(this.ic.evaluate()) evolve(system); } }
LeafIteration
LeafIteration は、PhysicalSystem#evolveState() を呼び出して物理系の状態を発展させます。
public class LeafIteration extends AbstractIteration{ public void evolve(final PhysicalSystem system) throws SimulationException{ system.evolveState(); } }
BranchIteration
BranchIteration は所持している Iteration オブジェクトを用いて順々に反復を行っていきます。
public class BranchIteration extends AbstractIteration implements CompositeIteration{ private final List<Iteration> children = new ArrayList<Iteration>(); // org.waman.ops.simulation.util.Composite インターフェースに // 定義されている各メソッドの実装 public void evolve(final PhysicalSystem system) throws SimulationException{ for(final Iteration child: this.children) child.iterate(system); } }