Sequential 実行モードのパフォーマンスの改善

Sequential アルゴリズムを使用する場合は、ルールが均一で、かつルールがチェーニングされていないことを確認してください。 逐次アルゴリズムでは、コントロール・プロパティーを使用して、タプルごとに実行するルールの数と実行の順序を定義できます。

Sequential アルゴリズム

どちらのアルゴリズムを使用した場合でも同じ実行になることを保証するためには、次の両方の条件が必要です。
  • ルールが均一である必要があります。 均一なルールとは、同じ種類および同じ数のオブジェクトでこれらのルールの条件を設定する必要がある、という意味です。 逐次アルゴリズムを異機種混合の規則に適用しようとすると、通常、より多くのタプル・オブジェクトが作成されます。これにより、 RetePlus モードよりも多くのルールが実行される可能性があります。 共通タプル・シグニチャーは、不均一なルールが実行されない原因となる可能性もあります。 作業メモリー内の対応するインスタンスがない場合、タプルは作成できません。

  • ルールをチェーニングしないでください。つまり、ルールのアクション部分の変更によって、別のルールが実行されてはなりません。

Sequential 実行モードに準拠しないルールに Sequential 実行モードを指定すると、エンジンでエラーが発生します。

Sequential 実行モードの使用について詳しくは、以下のセクションを参照してください。

タプル

タプルとは、特定の構造に準拠するオブジェクトのリストです。 タプル構造 とは、クラス記述子の単なるシーケンスです。 タプル構造内のそれぞれの場所のことをスロット と呼びます。 同じクラス記述子を異なるスロットで繰り返し使用することができます。

次のようなタプル構造があるとします。

(Customer,Product)

この構造に準拠するタプルは、次のようになります。

(new Customer("Henry"),new DVD("Mickey"))

DVDProductであるため、サブクラス化が考慮されることに注意してください。 ただし、以下に示すように、この構造に準拠しないタプルもあります。

例えば、次のタプルは大きすぎます。


(new Customer("Henry"),new CD("Madona"),new DVD("Mickey"))

次のタプルは順序付けが正しくありません。


(new DVD("Lord of the rings"),new Customer("Henry"))

また、次のタプルは小さすぎます。


(new Customer("Henry"))

Java™では、タプルはオブジェクトの配列として簡単に実装できます。


Java Tuple = Object[]

タプルとそのオブジェクトを作成する Java コードは、以下のとおりです。


new Object[] {new Customer("Henry"),new DVD("Mickey")}

実行時、タプルは、作業メモリーの内容から自動的に作成され、ルール・エンジンに渡されます。 タプルは、タプル・マッチング・メソッドに順に渡されます。

Sequential モードでの制御プロパティー

制御プロパティーは Sequential モードの実行およびタプルの構造に影響します。 一般情報については、 実行モードでのルール・タスクのコントロール・プロパティー を参照してください。

タプルごとに実行するルールの数、およびそれらのルールの実行順序は、制御プロパティー orderingfiring、および firinglimit で指定できます。

ordering プロパティー

ordering プロパティーは Sequential 処理に必須です。 ルール・タスクのルールの実行順序を表します。

使用可能な値は、次の 2 つです。

  • literal: ルールは (上/下矢印を使用して) タスク本体に設定するときの順序で保持されます。

  • sorted: ルールはそれぞれの静的優先度に従ってソートされます。

もう 1 つの値である dynamic は、RetePlus 実行モードを使用しているルール・タスクに対してのみ使用可能であることに注意してください。

firing プロパティー

firing プロパティーは、タプルごとに、適用されるすべてのルールを実行するか、それとも適用される最初のルールのみを実行するかを指定します。 このプロパティーはオプションです。

次の 2 つの値があります。

  • allrules

    この値は、適用されるすべてのルールを実行してから、次のタプルにスキップすることを意味します。 これはデフォルト値です。

  • rule

    この値は、適用される最初のルールのみを最初のタプルで実行することを意味します。

firinglimit プロパティー

firinglimit プロパティーは、firing プロパティーが allrules に設定されたときに別の制御レベルを提供します。 このプロパティーを使用して、次のタプルにスキップする前に実行するルールの最大数を表す数値を指定します。 この数値はゼロより大きい必要があります。

Sequential アルゴリズムの既知の制限

次の表は、順次処理の制限、特に特定の ILOG ® Rule Language (IRL) 構成体と組み合わせて使用する場合の制限の概要を示しています。

制約事項 説明
ILOG ルール言語 (IRL) の制限

ステートフルの Rete マッチング向けに設計されたルール・パターンは必ずしもすべて使用できるとは限りません。 ルールが現在のタプル・マッチングの実装に準拠していないと、コンパイル時エラーが発生します。

そのため、Sequential 処理が使用される場合、IRL は次のフィーチャーをサポートしません。

  • 動的優先度

    Sequential 処理ではアジェンダがないため、静的優先度を使用するルールのみが許可されます。

  • 列挙子が指定されていない notexistscollect の各条件

    列挙子 (from または in) を持つ notexists、および collect 条件は、Java バイトコードに変換されます。 列挙子が指定されている場合は、オブジェクトのセットを、条件に結合された値として使用できます (これは、RetePlus または Fastpath では制約事項にはならないことに注意してください)。

条件コンストラクト

Sequential 処理で使用可能な条件コンストラクトは、次のとおりです。

  • 単純な条件バインディングおよびテストが使用可能です。

  • from

  • in

屈折

エンジン・サイクルのデータ単位はタプルです。 エンジンは、一致するタプルを記録せず、サイクルとサイクルの間で忘れます。 そのため、屈折の組み込みサポートはありません。

Sequential 実行モードを使用すると、上記のルール・タスクは次のようになります。

ruletask main {
   algorithm = sequential;
   ordering = literal;
   body = {Person,PersonProduct}
}

実行トレースでは、逐次実行モードを使用することにより、同じルールが 2 つの異なるタプルの同じ部分に対して 2 回実行されることが示されます。

屈折の組み込みサポートはありませんが、Sequential 実行モードは、タプル・マッチング・メソッドの本体を生成する場合に特定のルール・アプリケーション戦略を使用します。 ただし、この戦略では、屈折の使用制限が試行されます。

ILOG ルール言語 (IRL) 機能

一方、Sequential 処理では、IRL の実質的にすべてのスクリプト・レベルの式およびステートメントが使用可能です。 これらは、主に、Sequential アルゴリズムに設定されていないその他のルール・タスクの整合性を維持することを目的としています。

次に、これらのフィーチャーのリストを示します。

関数

関数定義および関数呼び出しはすべて使用可能です。

スクリプト・レベルの式

IRL の式はすべて使用可能です (?instance はどの実行モードでも動作します)。

スクリプト・レベルのステートメント

IRL のステートメントはすべて使用可能です。

更新日

順次アルゴリズムに設定されたルール・タスクに偽の更新が存在する可能性があるため、更新構成体を使用できます。 スプリアス更新とは、Sequential アルゴリズムに設定されたルール・タスクの条件部分と一致する可能性はないが、RetePlus アルゴリズムを使用しているその他のルール・タスクにとっては意味を持つ可能性があるオブジェクトに関する更新です。 ルール・タスクはすべてルール・セットに指定されるので、現在のエンジンとの整合性を維持する必要があります。 ただし、ステートレスの Sequential 処理アルゴリズムでは通常の更新はまったく処理されないことに注意してください。

反復可能ルール

反復可能ルールは、Sequential 処理アルゴリズムでは処理されませんが、RetePlus アルゴリズムを使用するその他のルール・タスクに関連している可能性があります。

挿入

Sequential アルゴリズムに設定されているルール・タスクの条件部分と一致する可能性があるオブジェクトを挿入すると、作業メモリーからオブジェクトのタプルを取り出したときに不整合を引き起こす場合があります。 これは、オブジェクトが最初の位置に挿入され、タプルを作成するイテレーターに通知されないためです。 そのため、イテレーターは、新しいオブジェクトを含むタプルを Sequential 処理エンジンに提供しません。 ただし、この挿入は、RetePlus アルゴリズムを使用しているその他のルール・タスクにも関連します。