倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

反復

前回までは、シミュレーションに必要な部品をあれこれ見てきました。 今回はそれらのなかで、反復条件 (IterationCondition) とデータ出力 (DataOutputter) を使ってシミュレーションの実行を制御する Iteration クラスと、そのシミュレーション設計図内での書き方を見ていきましょう。

<iteration> 要素と Iteration インターフェース


シミュレーション設計図内での <iteration> 要素の書き方は、今まで何度か出てきてます。 例えば以下のような感じです:

<?xml version="1.0" encoding="UTF-8"?>

<simulation-schema xmlns="http://xmlns.org.waman/simulation/0.1">
  ...
  <iteration>
    <iteration-condition type="count" total="100"/>

    <output type="console" output-timing="all"/>
    <output type="csv" file="data.csv" output-timing="all" overwrite="true"/>
  </iteration>
  ...
</simulation-schema>

<iteration> 要素は、シミュレーション設計図のルート要素である <simulation-schema> の子要素として書きます。 <simulation-schema> 要素下にはただ1つの <iteration> 要素のみを持てます。

また、<iteration> 要素下には、

  • 0または1個の <iteration-condition> 要素
  • 任意個の <output> 要素

を書けます。 <iteration-condition> 要素がない場合のシミュレーションの振る舞いは今のところ「実装任せ」ってことで。 状態更新を1度だけ行うというのが妥当かと思いますが。

次に Iteration インターフェースを考えてみましょう。 子要素に <iteration-condition> と <output> があることに対応して、Iteration インターフェースにもそれら(を表すインターフェース)にアクセスするメソッドを定義する必要があります。 併せてシミュレーションを実行する際に呼び出すメソッド prepare(), execute(), dispose() も定義しておきましょう:

public interface Iteration extends DataAccessor{
    
    /* IterationCondition へのアクセッサ */
    IterationCondition getIterationCondition();
    void setIterationCondition(IterationCondition ic);
    
    /* DataOutputter へのアクセッサ */
    Set<DataOutputter> getDataOutputters();
    void addDataOutputter(DataOutputter outputter);
    void removeDataOutputter(final DataOutputter outputter);

    /* シミュレーション実行時に使うメソッド */
    void prepare()throws SimulationException;
    void execute(PhysicalSystem system)throws SimulationException;
    void dispose()throws SimulationException;
}

<iteration> 要素のネストと CompositeIteration インターフェース


基本的には上記の定義でいいと思いますが、均一な反復と出力を繰り返すだけだと制限が強い気がするので、<iteration> 要素をネスト出来るようにしましょう。

例えば10回の反復ごとにデータを出力したいとしましょう。 このとき <iteration> 要素下にまた <iteration> 要素を定義し、そこに <iteration-condition> で10回の反復を指定します:

<?xml version="1.0" encoding="UTF-8"?>

<simulation-schema xmlns="http://xmlns.org.waman/simulation/0.1">
  ...
  <iteration>
    <iteration-condition type="count" total="100"/>

    <iteration>
      <iteration-condition type="count" total="10"/>
    </iteration>

    <output type="console" output-timing="all"/>
  </iteration>
  ...
</simulation-schema>

他にも、<iteration> 要素下に複数の <iteration> 要素を付け加えてそれらを順次実行していく、といったような使い方も考えてますが。

とりあえず、このような <iteration> 要素のネスト構造に対応した Iteration インターフェース CompositeIteration を定義しておきましょう。 これは IterationCondition インターフェースを拡張して CompositeIterationCondition インターフェースを定義したのと同じように行うことにします:

public interface CompositeIteration extends Iteration{

    int capacity();
    int size();
    
    void add(Iteration child);
    void remove(Iteration child);
    
    List<Iteration> getChildren();
    Iteration get(int i);
}