倭マン's BLOG

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

反復条件あれこれ 其ノ弐

前回に引き続き、今回も具体的な反復条件を考えていきます。 特に今回は、複合的な反復条件(以下、複合反復条件)を考えます。

複合反復条件とは?


複合反復条件(composite iteration condition)とは、他の反復条件の結果を加工して反復条件の評価に使う様なものを言います・・・ まぁ簡単に言えば論理演算みたいなものです。

例えば、『観測量「Position」の値が -10 以上、10 以下の範囲に収まっている間だけ反復を繰り返す』という条件は、前回やった関係演算による反復条件を使って

<iteration-condition type="and">
  <iteration-condition var="Position" type="ge" bench-mark="-10"/>
  <iteration-condition var="Position" type="le" bench-mark="10"/>
</iteration-condition>

となります。 親 iteration-condition 要素の type 要素の値が and になっているので、2つの子 iteration-condition 要素の評価結果を、論理積を用いて評価します。

シミュレーション設計図と複合反復条件


複合反復条件をシミュレーション設計図上で記述するには、(上で挙げた例以上の説明はあまりいらないかと思いますが)XML 要素のネスト構造を用います。 勿論、階層は何重になってもかまいません。

自作の IterationCondition クラスと複合反復条件


自作クラスが複合反復条件であると認識させるためには、IterationCondition インターフェースを拡張したインターフェース CompositeIterationCondition を実装するようにします。

import java.util.List;

public interface CompositeIterationCondition 
        extends IterationCondition{

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

IterationCondition インターフェースをちょっと変更


以前、観測量の値を反復条件の評価に使用する場合にのみ、DataAccessor インターフェースを拡張した反復条件 DataControlledIterationCondition を使用すると言いました。 しかし複合反復条件がある場合、この仕様だと実装が面倒臭くなる*1ので、IterationCondition インターフェース自体が DataAccessor インターフェースを拡張するように変更します:

public interface IterationCondition
        extends DataAccessor{
    
    void initialize();
    boolean continueIteration();
    
    void continued();
    void stopped();
}

DataControlledIterationCondition は削除(もしくは抽象クラスとして提供)します。

複合反復条件の具体例


では、複合反復条件の具体例を見ていきましょう。 あまり細かい説明の必要はないかと思います。
★論理演算

not
子要素の評価結の否定を返します。 子要素の個数は1個。
and
子要素の評価結果が全て真なら真を、そうでなければ偽を返します。 子要素の個数は任意個。
or
子要素の評価結果に1つでも真が含まれていれば真を、そうでなければ偽を返します。 子要素の個数は任意個。
xor
2つの子要素の評価結果のうち、どちらか一方だけが真の場合真を、そうでなければ偽を返します。 子要素の個数は2個。

★sleep

子要素を評価する前に、指定時間だけ処理を遅らせます。 リアルタイムに GUI 上に系の配位を描画する際などに使用します。 シミュレーション設計図はこんな感じ:

<iteration-condition type="sleep" sleep-millis="100">
  <iteration-condition type="count" total="100"/>
</iteration-condition>

JavaWorldメモリアルDVD

JavaWorldメモリアルDVD

*1:子要素の IterationConditionDataTable オブジェクトをセットするところが。