[実施例に係る照合システムの構成]
実施例に係る照合システムの構成の一例について説明する。図1は、本実施例にかかる照合システムの構成を示す図である。図1に示すように、この照合システムは、イベントストリーム発生装置40、ユーザ端末50、照合装置100を有する。照合装置100は、ネットワーク30を介して、イベントストリーム発生装置40、ユーザ端末50に接続される。
イベントストリーム発生装置40は、複数のイベントの系列を含むイベントストリームを発生する装置である。イベントストリーム発生装置40は、イベントストリームの情報を、照合装置100に送信する。
ユーザ端末50は、照合装置100にイベントパターンを送信し、照合装置100から照合結果を受信する装置である。
照合装置100は、イベントパターンがイベントストリームに含まれるか否かを照合する装置である。照合装置100は、照合結果をユーザ端末50に送信する。
[実施例に係る照合装置の構成]
図1に示した照合装置100の構成について説明する。図2は、実施例に係る照合装置の構成を示す機能ブロック図である。図2に示すように、この照合装置100は、通信部110、入力部120、表示部130、記憶部140、制御部150を有する。
通信部110は、ネットワーク30を介して、イベントストリーム発生装置40、ユーザ端末50とデータ通信を行う処理部である。後述する制御部150は、通信部110を介して、イベントストリームやイベントパターンの情報を受信する。通信部110は、所定の通信プロトコルを用いてデータ通信を行う通信装置、通信カード等に対応する。
入力部120は、ユーザが各種の情報を照合装置100に入力するための入力装置である。例えば、入力部120は、キーボード、マウス、タッチパネルに対応する。表示部130は、各種の情報を表示する表示装置である。例えば、表示部130は、ディスプレイ、タッチパネルに対応する。
記憶部140は、イベントパターン140a、NFA(Nondeterministic Finite Automaton)140bおよびイベントストリーム140cを記憶する。記憶部140は、例えば、RAM(Random Access Memory)、ROM(Read Only Memory)、フラッシュメモリ(Flash Memory)等の半導体メモリ素子、またはハードディスク、光ディスク等の記憶装置に対応する。
イベントパターン140aは、イベントストリーム140cの照合に用いられるイベントパターンである。本実施例では、イベントパターンを間隔条件付きイベントの並列パターンとする。例えば、イベントパターン140aを「P={b:(2:a)}&{c:(5:a)}」の分岐パターンとする。または、イベントパターン140aを「{e:(6:b)}&{e:(4:c)}」の結合パターンとする。このイベントパターンのa、b、c、d、eは、それぞれイベントa、b、c、d、eに対応する。なお、{b:(2:a)}とは、イベントaとの差が2以内でイベントbを受理することを意味する。{c:(5:a)}、{e:(6:b)}および{e:(4:c)}も同様の意味合いであるので、具体的な説明を省略する。
イベントパターンの「&」は、順不同で該当するイベントを全て照合することを示す記号である。例えば、「A&B」は、順不同でイベントA、Bの双方を照合する並列パターンである。
NFA140bは、イベントパターン140aを基にして生成される非決定性有限オートマトンである。イベントストリーム140cは、複数のイベントの系列を含むデータである。図3は、イベントストリームのデータ構造の一例を示す図である。図3に示すように、イベントストリーム140cは、イベントの系列を示すイベントストリームと、各イベントが発生した時刻とを対応づけて記憶する。
制御部150は、データ取得部150a、NFA生成部150bおよび照合部150cを有する。例えば、制御部150は、ASIC(Application Specific Integrated Circuit)や、FPGA(Field Programmable Gate Array)などの集積装置に対応する。また、制御部150は、例えば、CPUやMPU(Micro Processing Unit)等の電子回路に対応する。
データ取得部150aは、イベントストリーム発生装置40から、イベントストリームを取得し、ユーザ端末50からイベントパターンを取得する処理部である。データ取得部150aは、イベントパターンおよびイベントストリームを、イベントパターン140a、イベントストリーム140cとして記憶部140に格納する。
NFA生成部150bは、イベントパターン140aを基にして、NFA140bを生成する処理部である。NFA生成部150bは、生成したNFA140bを記憶部140に格納する。なお、NFA生成部150bは、ThompsonNFA手法を利用して、NFAを生成するが、これに限定されるものではなく、如何なる従来技術を利用してNFAを生成しても良い。
ここで、NFA生成部150bのNFA構築法について説明する。図4〜図7は、NFA生成部のNFA構築法を説明するための図である。
単一のイベントに対するNFAは、図4に示すものとなる。図4は、単一イベントに対応するNFAを示す。NFA生成部150bは、ノード1aとノード1bとを接続し、イベントaの受理によりノード1aからノード1bに無条件に遷移するNFAを生成する。このように、ノードからノードに無条件に遷移する通常遷移を「間隔条件なしの通常遷移」とする。
非連続直列パターンに対するNFAは、図5に示すものとなる。図5は、非連続直列パターンに対応するNFAを示す。なお、図5では、bはイベントを指し、xはイベント間の間隔条件を指すものとする。P1、P2は、それぞれイベントの集合を指すものとする。
NFA生成部150bは、ノード2aとノード2bとを接続し、ノード2bとノード2cとを接続し、ノード2cとノード2dとを接続する。また、NFA生成部150bは、ノード2dとノード2eとを接続し、ノード2eとノード2fとを接続する。図5において、ノード2bからノード2cへの遷移およびノード2dからノード2eへの遷移を「ε遷移」とする。例えば、イベントP1によりノード2aからノード2bに遷移した場合に、ノード2bからノード2cへの遷移が発動される。
図5において、ノード2cからノード2dへの遷移を、イベント間隔の条件を持つ遷移「b:x」とする。すなわち、ノード2cがイベントbを受理すると、既にノード2cが受理したイベントとの間隔条件xを満たすとき、ノード2cからノード2dへの遷移が発動される。このように、間隔条件をチェックしたうえでノードからノードに遷移する通常遷移を「間隔条件ありの通常遷移」とする。
分岐パターンに対するNFAは、図6に示すものとなる。図6は、分岐パターンに対応するNFAを示す。なお、図6では、a、b、cはそれぞれイベントを指し、x、yはイベント間の間隔条件を指すものとする。P1、P2、P3は、それぞれイベントの集合を指すものとする。
NFA生成部150bは、分岐パターンの分岐の起点となるイベントaの受理時刻を当該イベントaの遷移先を示すノード3aに対応付けて保持させる。ここで、イベントの受理時刻を保持させるノードを「受理時刻保持ノード」(起点ノードに相当)というものとする。図6の例では、受理時刻保持ノードを「@」で示している。そして、NFA生成部150bは、分岐の起点となるイベントaに対応させて、受理時刻保持ノードに一意の識別子となる@番号を割り当てる。
また、NFA生成部150bは、ノード3aから分岐先のノード3bおよびノード3cにε遷移で接続する。また、NFA生成部150bは、ノード3bからノード3dに間隔条件ありの通常遷移「b:x」で接続する。この結果、ノード3bがイベントbを受理すると、既にノード3bまで遷移したイベントとの間隔条件xを満たすとき、ノード3bからノード3dへの遷移が発動される。また、NFA生成部150bは、ノード3cからノード3eに間隔条件ありの通常遷移「c:y」で接続する。この結果、ノード3cがイベントcを受理すると、既にノード3cまで遷移したイベントとの間隔条件yを満たすとき、ノード3cからノード3eへの遷移が発動される。
また、NFA生成部150bは、ノード3dからノード3fにε遷移で接続し、ノード3eからノード3gにε遷移で接続する。また、NFA生成部150bは、ノード3hおよびノード3iからノード3jへそれぞれε=遷移で接続する。ここで、複数のノードからε=遷移で接続されたノード、言い換えると複数のノードを結合する結合点を示すノードを「合流ノード」(結合点ノードに相当)というものとする。図6の例では、合流ノード3jを「=@」で示している。すなわち、NFA生成部150bは、合流ノード3jにて複数のノード3h、3iから遷移されるイベントaの受理時刻が同じものがあるか否かを判定させるようにする。
結合パターンに対するNFAは、図7に示すものとなる。図7は、結合パターンに対応するNFAを示す。なお、図7では、cはイベントを指し、x、yはイベント間の間隔条件を指すものとする。P1、P2、P3は、それぞれイベントの集合を指すものとする。
NFA生成部150bは、結合パターンの結合の終点となるイベントcの受理時刻を当該イベントcの遷移先を示すノード4e、4fに対応付けて保持させる。ここで、ノード4e、4fは、それぞれイベントcの受理時刻を保持させるノードであるので、それぞれ受理時刻保持ノードとなる。図7の例では、受理時刻保持ノード4e、4fを「@」で示している。そして、NFA生成部150bは、結合の終点となるイベントcに対応させて、受理時刻保持ノード4e、4fに一意の識別子となる同一の@番号を割り当てる。
また、NFA生成部150bは、ノード4eおよびノード4fからノード4gへそれぞれε=遷移で接続する。ここで、ノード4gは、複数のノード4e、4fからε=遷移で接続されたノードであるので、合流ノードとなる。図7の例では、合流ノード4gを「=@」で示している。すなわち、NFA生成部150bは、合流ノード4gにて複数のノード4e、4fから遷移されるイベントcの受理時刻が同じものがあるか否かを判定させるようにする。
図2に戻って、照合部150cは、NFA140bを利用して、イベントストリーム140aを照合する処理部である。例えば、照合部150cは、NFA140bを用いて、分岐の起点となるイベントの受理時刻を間隔条件に合った受理状態と共に遷移させ、結合点となる合流ノードで受理時刻が同じものがあれば更に遷移させる。そして、照合部150cは、照合結果をユーザ端末50に通知する。
一例として、照合部150cは、イベントストリーム140cの各イベントを順に辿り、NFA140bの各ノードと比較し、NFA140bに含まれる分岐パターンについて、以下のように照合する。照合部150cは、分岐パターンの分岐の起点となるイベントが受理時刻保持ノードで受理されると、受理されたイベントの受理時刻を受理時刻保持ノードに対応付けて保持する。
そして、照合部150cは、イベントストリーム140c上の分岐の起点となるイベントに後続するイベントが分岐先のノードで受理されると、受理されたイベントの受理が分岐先のノードに対応付けられた間隔条件を満たすか否かを判定する。そして、照合部150cは、受理されたイベントの受理が分岐先のノードに対応付けられた間隔条件を満たすと判定した場合、受理時刻保持ノードに対応付けて保持された受理時刻を分岐先のノードの受理状態と共に遷移させる。ここで、受理状態とは、分岐先のノードが現段階で最終的に受理したイベントの状態を意味し、例えば、受理したイベントの受理時刻を示す。なお、受理時刻保持ノードが受理したイベントが複数ある場合には、そのイベントを受理した受理時刻毎に複数存在することもある。
さらに、照合部150cは、合流ノードにて複数の分岐先のノードから遷移された受理時刻に同一の受理時刻があるか否かを判定する。そして、照合部150cは、同一の受理時刻があると判定した場合、同一の受理時刻を含む結合状態を生成し、生成した結合状態を更に遷移させる。ここで、結合状態とは、例えば同一の受理時刻に対応する複数の受理状態を結合した状態を意味する。
照合部150cは、最終状態であるノードへの遷移を発動した時点で、照合完了とし、照合結果として例えば終了時刻を出力する。
また、照合部150cは、イベントストリーム140cの各イベントを順に辿り、NFA140bの各ノードと比較し、NFA140bに含まれる結合パターンについて、以下のように照合する。照合部150cは、結合パターンの結合の終点となるイベントが受理時刻保持ノードで受理されると、遷移元の受理状態を複製する。また、照合部150cは、受理されたイベントの受理時刻を受理時刻保持ノードに対応付けて保持する。そして、照合部150cは、該保持した受理時刻を該複製した受理状態と共に合流ノードに遷移させる。
さらに、照合部150cは、合流ノードにて複数の分岐先のノードから遷移された受理時刻に終点となるイベントの同一の受理時刻があるか否かを判定する。そして、照合部150cは、同一の受理時刻があると判定した場合、同一の受理時刻を含む結合状態を生成し、生成した結合状態を更に遷移させる。
ここで、照合部150cの照合について説明する。図8および図9は、照合部の照合を説明するための図である。
図8において、イベントパターン140aに含まれる分岐パターン200pは、イベントaを分岐の起点とし、イベントaからイベントbまでの間隔が2以内であって、イベントaからイベントcまでの間隔が2以内である分岐パターンとする。分岐パターン200pに対するNFA140bは、図8に示す200nに示すものとなる。なお、図8の示す200n内の@0は、@番号を0とする受理時刻保持ノードであることを示す。また、=@0は、@番号を0とする受理時刻保持ノードで受理されたイベントの受理時刻を照合する合流ノードであることを示す。
照合部150cは、イベントストリーム140c上の分岐パターンの分岐の起点となるイベントaを間隔条件なしの通常遷移を経て受理時刻保持ノード5aで受理すると、受理したイベントaの受理時刻を受理時刻保持ノード5aに対応付けて保持する。そして、照合部150cは、受理時刻保持ノード5aでイベントaを受理したので、受理時刻保持ノード5aからノード5bに接続されたε遷移を発動する。このとき、照合部150cは、受理時刻保持ノード5aに対応付けて保持したイベントaの受理時刻と共に、受理時刻保持ノード5aの受理状態をノード5bに遷移させる。
そして、照合部150cは、イベントストリーム140c上の分岐の起点となるイベントaに後続するイベントbを分岐先のノード5bで受理すると、受理したイベントbに関する間隔条件ありの通常遷移を発動する。そして、照合部150cは、イベントbの受理が分岐先のノード5bに対応付けられた間隔条件2を満たすか否かを判定する。ここでは、照合部150cは、イベントaの受理時刻からイベントbまでの間隔条件が2以下であるか否かを判定する。そして、照合部150cは、間隔条件2を満たせば、受理ノード5bに遷移したイベントaの受理時刻をノード5bの受理状態と共にノード5dに遷移させる。そして、照合部150cは、ノード5dでイベントbを受理したので、ノード5dからノード5fに接続されたε=遷移を発動する。
すると、照合部150cは、合流ノード5fにて複数の分岐先のノード5d、5eから遷移された受理時刻に@0に対応する同一の受理時刻があるか否かを判定する。そして、照合部150cは、@0に対応する同一の受理時刻があると判定した場合、ノード5d、5eのそれぞれの受理状態から同一の受理時刻に対する受理状態を結合した結合状態を生成し、生成した結合状態を更に遷移させる。
図9において、イベントパターン140aに含まれる結合パターン201pは、イベントeを結合の終点とし、結合元のイベントbからイベントeまでの間隔が6以内であって、結合元のイベントcからイベントeまでの間隔が4以内である結合パターンとする。結合パターン201pに対するNFA140bは、図9に示す201nに示すものとなる。なお、図9の示す201n内の@0は、@番号を0とする受理時刻保持ノードであることを示す。また、=@0は、@番号を0とする受理時刻保持ノードで受理されたイベントの受理時刻を照合する合流ノードであることを示す。
照合部150cは、イベントストリーム140c上のイベントbをノード6aで受理すると、受理したイベントbに関する間隔条件なしの通常遷移を発動し、ノード6aの受理状態をノード6cに遷移させる。さらに、照合部150cは、ノード6cからノード6eに接続されたε遷移を発動し、ノード6cの受理状態をノード6eに遷移させる。
そして、照合部150cは、結合パターンの結合の終点となるイベントeをノード6eで受理すると、受理したイベントeに関する間隔条件ありの通常遷移を発動する。そして、照合部150cは、イベントeの受理がノード6eに対応付けられた間隔条件6を満たすか否かを判定する。ここでは、照合部150cは、イベントbの受理時刻からイベントeまでの間隔条件が6以下であるか否かを判定する。そして、照合部150cは、間隔条件6を満たせば、ノード6eの受理状態をノード6gに遷移させる。そして、照合部150cは、受理時刻保持ノードであるノード6gでイベントeを受理すると、遷移元のノード6eの受理状態を複製する。そして、照合部150cは、受理したイベントeの受理時刻を受理時刻保持ノード6gに対応付けて保持する。そして、照合部150cは、ノード6gからノード6iに接続されたε=遷移を発動する。このとき、照合部150cは、保持した受理時刻を複製した受理状態と共に合流ノード6iに遷移させる。
すると、照合部150cは、合流ノード6iにて複数のノード6g、6hから遷移された受理時刻に@0に対応する同一の受理時刻があるか否かを判定する。そして、照合部150cは、@0に対応する同一の受理時刻があると判定した場合、同一の受理時刻を含む結合状態を生成し、生成した結合状態を更に遷移させる。
[実施例に係るNFA生成部におけるNFA構築の処理手順]
次に、実施例に係るNFA生成部150bにおけるNFA構築の処理手順を、図10〜図13を参照して説明する。図10はNFA生成部におけるNFA構築の主処理の手順を示し、図11〜図13はNFA生成部におけるNFA構築のサブルーチン処理の手順を示す。
[NFA構築の主処理の手順]
まず、NFA構築の主処理の手順について、図10を参照して説明する。図10は、実施例に係るNFA生成部におけるNFA構築の主処理の手順を示すフローチャートである。図10に示す処理は、例えば、イベントのパターンPを入力とし、NFAを指すN(P)を出力とする。そして、ノード番号を変数iとし、@番号を変数jとする。ここで、ノード番号とは、各ノードに割り振られるユニークな番号であり、状態番号と同じ意味を示す。状態の種類には、ノードに応じて、例えば、初期状態、最終状態がある。@番号とは、受理時刻保持ノード(@ノード)に対応する番号を示す。
まず、NFA生成部150bは、ノード番号を0とする初期状態のノードを生成し、生成したノードに空の「@リスト」を登録する。そして、NFA生成部150bは、現ノード番号iの値を0に設定し、現@番号jの値を0に設定する(ステップS11)。なお、「@リスト」とは、@番号とタイムアウトの期間とを対応付けたリストである。
そして、NFA生成部150bは、入力されたパターンPに示されたイベント(以降、「イベント受理制約」と同義)の内、イベントの前に間隔制約がないものを集め、仮のイベント集合(仮イベント集合)とする(ステップS12)。なお、間隔制約とは、間隔条件と同じ意味であるものとする。
そして、NFA生成部150bは、初期状態のノードを起点ノードとして、仮イベント集合に集めたイベント受理制約について、サブルーチン処理を行なう(ステップS13)。
その後、サブルーチン処理が終了すると、NFA生成部150bは、最終状態のノードを生成し、生成したノードに、現ノード番号iに1を加算した値を割り当てる。そして、NFA生成部150bは、「終端ノードリスト」に含まれるそれぞれのノードから、生成した最終状態のノードへε=遷移で接続する(ステップS14)。なお、「終端ノードリスト」は、終端となるノードを集めたリストであり、サブルーチン処理で作成される。
そして、NFA生成部150bは、終端ノードリストに含まれる異なるノードについて、各ノードの@リストを取り出す。そして、NFA生成部150bは、取り出した@リストに存在する共通の@番号を指定@番号として、タイムアウトの中で一番大きいものをタイムアウト長として最終状態のノードに登録する(ステップS15)。
[サブルーチン処理の手順]
次に、図10のステップS13に示したサブルーチン処理について、図11〜図13を参照して説明する。図11〜図13は、サブルーチン処理の手順を示すフローチャートである。
NFA生成部150bは、起点ノードが初期状態のノードでない、且つ仮イベント集合に集めたイベント受理制約が2つ以上であるか否かを判定する(ステップS131)。起点ノードが初期状態のノードである場合、又は、起点ノードが初期状態のノードでない、且つ仮イベント集合に集めたイベント受理制約が2つ以上でない場合(ステップS131;No)、NFA生成部150bは、ステップS132に移行する。
ステップS132では、NFA生成部150bが、集めた各イベント受理制約に対応するイベントを入力するノード(以降、「イベント入力ノード」という。)を生成する。そして、NFA生成部150bは、現ノード番号iに1を加算しながら、現ノード番号iを生成したノードに割り当てる。そして、NFA生成部150bは、起点ノードから、生成したイベント入力ノードへε遷移で接続する。すなわち、NFA生成部150bは、起点ノードからイベント入力ノードへの遷移をε遷移とする。さらに、NFA生成部150bは、起点ノードの@リストを、生成したノードの@リストにコピーする(ステップS132)。
一方、起点ノードが初期状態のノードでない、且つ仮イベント集合に集めたイベント受理制約が2つ以上である場合(ステップS131;Yes)、NFA生成部150bは、ステップS133に移行する。すなわち、仮イベント集合に集めたイベント受理制約が分岐パターンとなるイベント受理制約である場合である。
ステップS133では、NFA生成部150bが、起点ノードに現@番号jを割り当て、@番号jに1を加算する(ステップS133)。すなわち、この起点ノードは、分岐の起点となるイベントの受理時刻を保持する「受理時刻保持ノード」となる。そして、NFA生成部150bは、起点ノードの@リストに、割り当てた@番号およびタイムアウト0を設定し(ステップS134)、ステップS132に移行する。
ステップS132の処理後、NFA生成部150bは、仮イベント集合に集めたイベント受理制約の中で未処理のものがあるか否かを判定する(ステップS135)。集めたイベント受理制約の中で未処理のものがない場合(ステップS135;No)、NFA生成部150bは、サブルーチン処理を終了する。
一方、集めたイベント受理制約の中で未処理のものがある場合(ステップS135;Yes)、NFA生成部150bは、集めたイベント受理制約から未処理のイベント受理制約を1つ取り出す(ステップS136)。
そして、NFA生成部150bは、現在のイベント受理制約に前方間隔制約があるか否かを判定する(ステップS137)。現在のイベント受理制約に前方の間隔制約がない場合(ステップS137;No)、NFA生成部150bは、現ノード番号iに1を加算し、イベント受理完了ノードを生成し、生成したノードに、加算した現ノード番号を割り当てる。そして、NFA生成部150bは、指定したイベントの受理によりイベント入力ノードからイベント受理完了ノードに遷移するエッジで接続する。すなわち、NFA生成部150bは、イベント入力ノードからイベント受理完了ノードへの遷移を「間隔条件なしの通常遷移」とする。さらに、NFA生成部150bは、イベント入力ノードの@リストをイベント受理完了ノードの@リストにコピーする(ステップS138)。その後、NFA生成部150bは、ステップS141に移行する。
一方、現在のイベント受理制約に前方間隔制約がある場合(ステップS137;Yes)、NFA生成部150bは、現ノード番号iに1を加算し、イベント受理完了ノードを生成し、生成したノードに、加算した現ノード番号を割り当てる。そして、NFA生成部150bは、前方間隔制約を満たすイベントの受理で、イベント入力ノードからイベント受理完了ノードに遷移するエッジで接続する。すなわち、NFA生成部150bは、イベント入力ノードからイベント受理完了ノードへの遷移を「間隔条件付きの通常遷移」とする。さらに、NFA生成部150bは、イベント入力ノードの@リストの各タイムアウトに前方間隔制約を加えてから、生成したイベント受理完了ノードの@リストにコピーする(ステップS139)。その後、NFA生成部150bは、ステップS141に移行する。
続いて、NFA生成部150bは、現在のイベント受理制約の前方間隔制約の数をFに設定する(ステップS141)。そして、NFA生成部150bは、Fの値が2以上であるか否かを判定する(ステップS142)。Fの値が2以上でない場合(ステップS142;No)、NFA生成部150bは、生成したイベント受理完了ノードを完了ノードとする(ステップS143)。その後、NFA生成部150bは、現在のイベント受理制約の後方間隔制約における処理を行うべく、ステップS151に移行する。
一方、Fの値が2以上である場合(ステップS142;Yes)、NFA生成部150bは、現在のイベント受理制約に対応する生成済みのイベント受理完了ノードの数がFの値と一致するか否かを判定する(ステップS144)。現在のイベント受理制約に対応する生成済みのイベント受理完了ノードの数がFの値と一致しない場合(ステップS144;No)、NFA生成部150bは、集めたイベント受理制約の中で未処理のイベント受理制約の処理をすべく、ステップS135に移行する。
一方、現在のイベント受理制約に対応する生成済みのイベント受理完了の数がFの値と一致する場合(ステップS144;Yes)、NFA生成部150bは、現ノード番号iに1を加算し、現在のイベント受理制約に対応する合流ノードを生成する。そして、NFA生成部150bは、現在のイベント受理制約に対応する生成済みの全てのイベント受理完了ノードから、生成した合流ノードへε=遷移で接続する(ステップS145)。すなわち、NFA生成部150bは、イベント受理完了ノードから合流ノードへの遷移を「ε=遷移」とする。
続いて、NFA生成部150bは、現在の@番号jおよびタイムアウト0を現在のイベント受理制約に対応する生成済みの全てのイベント受理完了ノードに割り当て、それぞれの@リストに追加する。すなわち、これら生成済みの全てのイベント受理完了ノードは、イベントの受理時刻を保持する「受理時刻保持ノード」となる。さらに、NFA生成部150bは、@番号jに1を加算する(ステップS146)。
続いて、NFA生成部150bは、現在のイベント受理制約に対応する生成済みのイベント受理完了ノードの@リストにおいて、複数の生成済みのイベント受理完了ノードが持っている同一の@番号を合流ノードの指定@番号とする。そして、NFA生成部150bは、タイムアウトの中で一番大きい値をタイムアウト長として、@番号とともに合流ノードに対応付けて登録する(ステップS147)。
続いて、NFA生成部150bは、現在のイベント受理制約に対応する生成済みのイベント受理完了ノードの@リストに含まれる@番号および各@番号で最大のタイムアウトを重複なく合流ノードの@リストに設定する(ステップS148)。そして、NFA生成部150bは、合流ノードを完了ノードとし(ステップS149)、現在のイベント受理制約の後方間隔制約における処理を行うべく、ステップS151に移行する。
ステップS151では、NFA生成部150bが、ステップS136で取り出したイベント受理制約の後方への間隔制約を持つイベント受理制約を集め、仮イベント集合とする(ステップS151)。そして、NFA生成部150bは、仮イベント集合に集めたイベント受理制約が1つ以上であるか否かを判定する(ステップS152)。集めたイベント受理制約が1つ以上でない場合、すなわち0である場合(ステップS152;No)、NFA生成部150bは、終端ノードリストに完了ノードを追加する(ステップS153)。その後、NFA生成部150bは、集めたイベント受理制約の中で未処理のイベント受理制約の処理をすべく、ステップS135に移行する。
一方、集めたイベント受理制約が1つ以上である場合(ステップS152;Yes)、NFA生成部150bは、完了ノードを起点ノードとして、仮イベント集合に集めたイベント受理制約について、サブルーチン処理を再帰的に行う(ステップS154)。その後、NFA生成部150bは、集めたイベント受理制約の中で未処理のイベント受理制約の処理をすべく、ステップS135に移行する。
[NFAを生成する処理の一例]
次に、分岐パターンをイベントパターン140aとした場合に、図10〜図13に示したNFAの構築法を用いて、NFA生成部150bが、イベントパターン140aからNFA140bを生成する処理の一例について説明する。図14A〜図14Cは、NFAを生成する処理を説明する図である。
図14Aに示すように、イベントパターン140aのデータ構造を、符号202pに示すものとする。イベントパターン140aは、イベントAを分岐の起点とし、イベントAからイベントBまでの間隔を2以内とし、イベントAからイベントCまでの間隔を5以内とする分岐パターンであるものとする。
図14Bの1段目に示すように、NFA生成部150bは、ノード番号を0とする初期状態のノード7aを生成し、生成したノード7aに空の@リストを登録する。そして、NFA生成部150bは、現ノード番号iの値を0に設定し、現@番号jの値を0に設定する。そして、NFA生成部150bは、入力されたイベントパターン140aに示されたイベント受理制約の内、前に間隔制約がないものを集め、仮イベント集合とする。ここでは、NFA生成部150bは、イベントAのイベント受理制約を仮イベント集合とする。そして、NFA生成部150bは、初期状態のノード7aを起点ノードとする。
図14Bの2段目に示すように、NFA生成部150bは、起点ノードが初期状態のノード7aであるので、仮イベント集合に集められたイベント受理制約(A)に対応するイベント入力ノード7bを生成する。そして、NFA生成部150bは、生成したノード7bに現ノード番号iに1を加算した値1を割り当てる。そして、NFA生成部150bは、起点ノード7aからイベント入力ノード7bへε遷移で接続する。
図14Bの3段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(A)から未処理のイベント受理制約を1つ取り出す。ここでは、NFA生成部150bはイベントAを取り出す。そして、NFA生成部150bは、イベント受理完了ノード7cを生成し、生成したノード7cに、現ノード番号iに1を加算した値2を割り当てる。そして、NFA生成部150bは、イベントAの受理によりイベント入力ノード7bからイベント受理完了ノード7cに遷移するエッジで接続する。すなわち、イベント入力ノード7bからイベント受理完了ノード7cへの遷移が「間隔条件なしの通常遷移」となる。さらに、NFA生成部150bは、イベント入力ノード7bの@リストをイベント受理完了ノード7cの@リストにコピーする。
続いて、NFA生成部150bは、現在のイベント受理制約(A)の前方の間隔制約の数をFとする。ここでは、NFA生成部150bは、イベントAの前方の間隔に制約がないので、Fを0に設定する。そして、NFA生成部150bは、Fが2以上でないので、イベント受理完了ノード7cを完了ノードとする。さらに、NFA生成部150bは、取り出したイベント受理制約(A)の後方への間隔制約を持つイベント受理制約を集め、仮イベント集合とする。ここでは、NFA生成部150bは、イベントAの後方イベントBまでの間隔制約が2、イベントAの後方イベントCまでの間隔制約が5であるので、イベント受理制約B、Cを仮イベント集合とする。そして、NFA生成部150bは、完了ノード7cを起点ノードとする。
図14Bの4段目に示すように、NFA生成部150bは、起点ノード7cが初期状態のノードでなく、且つ仮イベント集合に集められたイベント受理制約(B、C)が2つ以上であるので、起点ノード7cに現@番号jの値0を割り当てる。すなわち、この起点ノード7cは、@番号0(@0)を有する受理時刻保持ノードとなる。そして、NFA生成部150bは、現@番号jの値を、1加算した値1に設定する。
図14Bの5段目に示すように、NFA生成部150bは、起点ノード7cの@リスト1mに、割り当てた@番号0およびタイムアウト0を設定する。
図14Cの1段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(B、C)に対応するイベント入力ノード7d、7eを生成する。そして、NFA生成部150bは、生成したノード7dに現ノード番号i(2)に1を加算した値3を割り当て、生成したノード7eにさらに現ノード番号i(3)に1を加算した値4を割り当てる。そして、NFA生成部150bは、起点ノード7cからイベント入力ノード7dへε遷移で接続し、起点ノード7cからイベント入力ノード7eへε遷移で接続する。そして、NFA生成部150bは、起点ノード7cの@リストをイベント入力ノード7d、7eのそれぞれの@リストにコピーする。
図14Cの2段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(B、C)から未処理のイベント受理制約を1つ取り出す。ここでは、NFA生成部150bはイベントBを取り出す。そして、NFA生成部150bは、イベント受理完了ノード7fを生成し、生成したノード7fに、現ノード番号iに1を加算した値5を割り当てる。そして、NFA生成部150bは、前方間隔制約2を満たすイベントBの受理によりイベント入力ノード7dからイベント受理完了ノード7fに遷移するエッジで接続する。すなわち、イベント入力ノード7dからイベント受理完了ノード7fへの遷移が「間隔条件ありの通常遷移」となる。さらに、NFA生成部150bは、イベント入力ノード7dの@リストのタイムアウトに前方間隔制約2を加えてからイベント受理完了ノード7fの@リストにコピーする。
続いて、NFA生成部150bは、現在のイベント受理制約(B)の前方の間隔制約の数をFとする。ここでは、イベントBの前方間隔制約は2のものだけであるので、NFA生成部150bは、前方の間隔制約の数Fを1に設定する。そして、NFA生成部150bは、Fが2以上でないので、イベント受理完了ノード7fを完了ノードとする。さらに、NFA生成部150bは、取り出したイベント受理制約(B)の後方への間隔制約を持つイベント受理制約を集め、仮イベント集合とする。ここでは、NFA生成部150bは、イベントBの後方への間隔制約を持つイベント受理制約がないので、空の仮イベント集合とする。そして、NFA生成部150bは、仮イベント集合が空なので、終端ノードリストに完了ノード7fを追加する。ここで、イベント受理制約Bの処理が終了する。
図14Cの3段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(B、C)から未処理のイベント受理制約を1つ取り出す。ここでは、NFA生成部150bは、イベントBの処理が終了しているので、未処理のイベントCを取り出す。そして、NFA生成部150bは、イベント受理完了ノード7gを生成し、生成したノード7gに、現ノード番号iに1を加算した値6を割り当てる。そして、NFA生成部150bは、前方間隔制約5を満たすイベントCの受理によりイベント入力ノード7eからイベント受理完了ノード7gに遷移するエッジで接続する。すなわち、イベント入力ノード7eからイベント受理完了ノード7gへの遷移が「間隔条件ありの通常遷移」となる。さらに、NFA生成部150bは、イベント入力ノード7eの@リストのタイムアウトに前方間隔制約5を加えてからイベント受理完了ノード7gの@リストにコピーする。
続いて、NFA生成部150bは、現在のイベント受理制約(C)もイベントBと同様に、前方の間隔制約の数が1つで、後方の間隔制約がないので、終端ノードリストに完了ノード7gを追加する。すなわち、終端ノードリストには、完了ノード7f、7gがある。ここで、イベント受理制約Cの処理が終了する。この結果、イベント受理制約Aの処理が終了する。
続いて、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(B、C)の処理が終了したので、元の仮イベント集合および元の起点ノードに戻す。すなわち、起点ノードは初期状態のノード7aとなり、仮イベント集合はイベント受理制約Aを含んだものになる。
図14Cの4段目に示すように、NFA生成部150bは、戻した仮イベント集合に含まれるイベント受理制約Aの処理を終了しているので、最終状態のノード7hを生成し、生成したノード7hに、現ノード番号iに1を加算した値7を割り当てる。そして、NFA生成部150bは、終端ノードリストに含まれるそれぞれの完了ノード7f、7gから、生成した最終状態のノード7hへε=遷移で接続する。
図14Cの5段目に示すように、NFA生成部150bは、終端ノードリストに含まれる異なるノードについて、各ノードの@リストを取り出す。ここでは、NFA生成部150bは、終端ノードリストに含まれる完了ノード7f、7gの@リストを取り出す。そして、NFA生成部150bは、取り出した@リストに存在する共通の@番号を指定@番号として、タイムアウトの中で一番大きいものをタイムアウト長として最終状態のノード7hに登録する。ここでは、完了ノード7fの@リストには、@番号0とタイムアウト長2とが対応付けられ、完了ノード7gの@リストには、@番号0とタイムアウト長5とが対応付けられている。このため、NFA生成部150bは、指定@番号を0として、タイムアウト長を5として最終状態のノード7hに登録する。
上述したように、NFA生成部150bは、図14A〜図14Cに示す処理を実行することで、図14Aに示すイベントパターン140aからNFA140bを生成する。
[NFAを生成する処理の別の例]
次に、分岐パターンと結合パターンを含むパターンをイベントパターン140aとした場合に、図10〜図13に示したNFAの構築法を用いて、NFA生成部150bが、イベントパターン140aからNFA140bを生成する処理の別の例について説明する。図15A〜図15Eは、NFAを生成する処理を説明する図である。
図15Aに示すように、イベントパターン140aのデータ構造を、符号203pに示すものとする。イベントパターン140aは、イベントAからイベントBまでの間隔を2以内とする非連続直列パターンを有する。そして、イベントパターン140aは、イベントBを分岐の起点とし、イベントBからイベントDまでの間隔を6以内とし、イベントBからイベントEまでの間隔を5以内とする分岐パターンを有する。さらに、イベントパターン140aは、イベントBからイベントEまでの間隔を5以内とし、イベントCからイベントEまでの間隔を4以内とし、イベントEを結合の終点とする結合パターンを有する。
図15Bの1段目に示すように、NFA生成部150bは、ノード番号を0とする初期状態のノード8aを生成し、生成したノード8aに空の@リストを登録する。そして、NFA生成部150bは、現ノード番号iの値を0に設定し、現@番号jの値を0に設定する。そして、NFA生成部150bは、入力されたイベントパターン140aに示されたイベント受理制約の内、前に間隔制約がないものを集め、仮イベント集合とする。ここでは、NFA生成部150bは、前に間隔制約がないものがAとCであるので、イベント受理制約A、Cを仮イベント集合とする。そして、NFA生成部150bは、初期状態のノード8aを起点ノードとする。
図15Bの2段目に示すように、NFA生成部150bは、起点ノードが初期状態のノード8aであるので、仮イベント集合に集められたイベント受理制約(A、C)に対応するイベント入力ノード8b、8cを生成する。そして、NFA生成部150bは、生成したノード8bに現ノード番号iを1加算して、加算した値1を割り当て、生成したノード8cに現ノード番号iを1加算して、加算した値2を割り当てる。そして、NFA生成部150bは、起点ノード8aからイベント入力ノード8bへε遷移で接続し、起点ノード8aからイベント入力ノード8cへε遷移で接続する。
図15Bの3段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(A、C)から未処理のイベント受理制約を1つ取り出す。ここでは、NFA生成部150bはイベントAを取り出す。そして、NFA生成部150bは、イベント受理完了ノード8dを生成し、生成したノード8dに、現ノード番号iに1を加算した値3を割り当てる。そして、NFA生成部150bは、イベントAの受理によりイベント入力ノード8bからイベント受理完了ノード8dに遷移するエッジで接続し、@リストをコピーする。
続いて、NFA生成部150bは、現在のイベント受理制約(A)の前方の間隔制約がないので、イベント受理完了ノード8dを完了ノードとする。さらに、NFA生成部150bは、取り出したイベント受理制約(A)の後方への間隔制約を持つイベント受理制約を集め、仮イベント集合とする。ここでは、NFA生成部150bは、イベントAの後方イベントBまでの間隔制約が2であるので、イベント受理制約Bを仮イベント集合とする。そして、NFA生成部150bは、完了ノード8dを起点ノードとする。
図15Bの4段目に示すように、NFA生成部150bは、起点ノード8dが初期状態のノードでなく、且つ仮イベント集合に集められたイベント受理制約(B)が2つ以上でないので、次の処理を行う。すなわち、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(B)に対応するイベント入力ノード8eを生成する。そして、NFA生成部150bは、生成したノード8eに現ノード番号iに1を加算した値4を割り当てる。そして、NFA生成部150bは、起点ノード8dからイベント入力ノード8eへε遷移で接続する。
図15Bの5段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(B)から未処理のイベント受理制約を1つ取り出す。ここでは、NFA生成部150bはイベントBを取り出す。そして、NFA生成部150bは、イベント受理完了ノード8fを生成し、生成したノード8fに、現ノード番号iに1を加算した値5を割り当てる。そして、NFA生成部150bは、前方間隔制約2を満たすイベントBの受理によりイベント入力ノード8eからイベント受理完了ノード8fに遷移するエッジで接続する。すなわち、イベント入力ノード8eからイベント受理完了ノード8fへの遷移が「間隔条件ありの通常遷移」となる。さらに、NFA生成部150bは、イベント入力ノード8eの@リストのタイムアウトに前方間隔制約2を加えてからイベント受理完了ノード8fの@リストにコピーする。
続いて、NFA生成部150bは、現在のイベント受理制約(B)の前方の間隔制約の数が2以上でないので、イベント受理完了ノード8fを完了ノードとする。さらに、NFA生成部150bは、取り出したイベント受理制約(B)の後方への間隔制約を持つイベント受理制約を集め、仮イベント集合とする。ここでは、NFA生成部150bは、イベントBの後方イベントDまでの間隔制約が6、イベントEまでの間隔制約が5であるので、イベント受理制約D、Eを仮イベント集合とする。そして、NFA生成部150bは、完了ノード8fを起点ノードとする。
図15Cの1段目に示すように、NFA生成部150bは、起点ノード8fが初期状態のノードでなく、且つ仮イベント集合に集められたイベント受理制約(D、E)が2つ以上であるので、起点ノード8fに現@番号jの値0を割り当てる。すなわち、この起点ノード8fは、@番号0(@0)を有する受理時刻保持ノードとなる。そして、NFA生成部150bは、現@番号jの値を、1加算した値1に設定する。
図15Cの2段目に示すように、NFA生成部150bは、起点ノード8fの@リスト2mに、割り当てた@番号0およびタイムアウト0を設定する。
図15Cの3段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(D、E)に対応するイベント入力ノード8g、8hを生成する。そして、NFA生成部150bは、生成したノード8gに現ノード番号i(5)に1を加算した値6を割り当て、生成したノード8hにさらに現ノード番号i(6)に1を加算した値7を割り当てる。そして、NFA生成部150bは、起点ノード8fからイベント入力ノード8gへε遷移で接続し、起点ノード8fからイベント入力ノード8hへε遷移で接続する。そして、NFA生成部150bは、起点ノード8fの@リストをイベント入力ノード8g、8hのそれぞれの@リストにコピーする。
図15Cの4段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(D、E)から未処理のイベント受理制約Dを取り出す。そして、NFA生成部150bは、イベント受理完了ノード8iを生成し、生成したノード8iに、現ノード番号iに1を加算した値8を割り当てる。そして、NFA生成部150bは、前方間隔制約6を満たすイベントDの受理によりイベント入力ノード8gからイベント受理完了ノード8iに遷移するエッジで接続する。すなわち、イベント入力ノード8gからイベント受理完了ノード8iへの遷移が「間隔条件ありの通常遷移」となる。さらに、NFA生成部150bは、イベント入力ノード8gの@リストのタイムアウトに前方間隔制約6を加えてからイベント受理完了ノード8iの@リストにコピーする。
続いて、NFA生成部150bは、現在のイベント受理制約(D)の前方の間隔制約の数が2以上でないので、イベント受理完了ノード8iを完了ノードとする。さらに、NFA生成部150bは、取り出したイベント受理制約(D)の後方への間隔制約を持つイベント受理制約を集め、仮イベント集合とする。ここでは、NFA生成部150bは、イベントDの後方への間隔制約を持つイベント受理制約がないので、空の仮イベント集合とする。そして、NFA生成部150bは、仮イベント集合が空なので、終端ノードリストに完了ノード8iを追加する。ここで、イベント受理制約Dの処理が終了する。
図15Cの5段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(D、E)から未処理のイベント受理制約を1つ取り出す。ここでは、NFA生成部150bは、イベントDの処理が終了しているので、未処理のイベントEを取り出す。そして、NFA生成部150bは、イベント受理完了ノード8iを生成し、生成したノード8jに、現ノード番号iに1を加算した値9を割り当てる。そして、NFA生成部150bは、前方間隔制約5を満たすイベントEの受理によりイベント入力ノード8hからイベント受理完了ノード8jに遷移するエッジで接続する。すなわち、イベント入力ノード8hからイベント受理完了ノード8jへの遷移が「間隔条件ありの通常遷移」となる。さらに、NFA生成部150bは、イベント入力ノード8hの@リストのタイムアウトに前方間隔制約5を加えてからイベント受理完了ノード8jの@リストにコピーする。ここで、イベント受理制約Eの処理が終了する。
続いて、NFA生成部150bは、現在のイベント受理制約(E)の前方の間隔制約の数の数をFとする。ここでは、イベントEの前方間隔制約はイベントBからの5の制約とイベントCからの4の制約があるので、NFA生成部150bは、前方の間隔制約の数Fを2に設定する。そして、NFA生成部150bは、Fが2以上であり、現在のイベント受理制約(E)に対応する生成済みのイベント受理完了ノードがノード8jの1個のみであるので、仮イベント集合に集められたイベント受理制約のうち未処理のものがあるか否かを判定する。ここでは、NFA生成部150bは、仮イベント集合に集められたイベント受理制約D、EおよびBの処理が終了したので、元の仮イベント集合および元の起点ノードに戻す。すなわち、起点ノードは初期状態のノード8aとなり、仮イベント集合はイベント受理制約A、Cになる。
図15Dの1段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(A、C)から未処理のイベント受理制約を1つ取り出す。ここでは、NFA生成部150bは、イベントAの処理が終了しているので、イベントCを取り出す。そして、NFA生成部150bは、イベント受理完了ノード8kを生成し、生成したノード8kに、現ノード番号iに1を加算した値10を割り当てる。そして、NFA生成部150bは、イベントCの受理によりイベント入力ノード8cからイベント受理完了ノード8kに遷移するエッジで接続し、@リストをコピーする。
続いて、NFA生成部150bは、現在のイベント受理制約(C)の前方の間隔制約がないので、イベント受理完了ノード8kを完了ノードとする。さらに、NFA生成部150bは、取り出したイベント受理制約(C)の後方への間隔制約を持つイベント受理制約を集め、仮イベント集合とする。ここでは、NFA生成部150bは、イベントCの後方イベントEまでの間隔制約が4であるので、イベント受理制約Eを仮イベント集合とする。そして、NFA生成部150bは、完了ノード8kを起点ノードとする。
図15Dの2段目に示すように、NFA生成部150bは、起点ノード8kが初期状態のノードでなく、且つ仮イベント集合に集められたイベント受理制約(E)が2つ以上でないので、次の処理を行う。すなわち、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(E)に対応するイベント入力ノード8lを生成する。そして、NFA生成部150bは、生成したノード8lに現ノード番号iに1を加算した値11を割り当てる。そして、NFA生成部150bは、起点ノード8kからイベント入力ノード8lへε遷移で接続する。
図15Dの3段目に示すように、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(E)から未処理のイベント受理制約を1つ取り出す。ここでは、NFA生成部150bはイベントEを取り出す。そして、NFA生成部150bは、イベント受理完了ノード8mを生成し、生成したノード8mに、現ノード番号iに1を加算した値12を割り当てる。そして、NFA生成部150bは、前方間隔制約4を満たすイベントEの受理によりイベント入力ノード8lからイベント受理完了ノード8mに遷移するエッジで接続する。すなわち、イベント入力ノード8lからイベント受理完了ノード8mへの遷移が「間隔条件ありの通常遷移」となる。さらに、NFA生成部150bは、イベント入力ノード8lの@リストのタイムアウトに前方間隔制約4を加えてからイベント受理完了ノード8mの@リストにコピーする。
続いて、NFA生成部150bは、現在のイベント受理制約(E)の前方の間隔制約の数をFとする。ここでは、イベントEの前方間隔制約はイベントBからの5の制約とイベントCからの4の制約があるので、NFA生成部150bは、前方の間隔制約の数Fを2に設定する。
図15Dの4段目に示すように、NFA生成部150bは、Fが2以上であり、現在のイベント受理制約(E)に対応する生成済みのイベント受理完了ノードがノード8jおよびノード8mの2個あるので、次の処理を行う。すなわち、NFA生成部150bは、現在のイベント受理制約(E)に対応する合流ノード8nを生成する。そして、NFA生成部150bは、生成したノード8nに現ノード番号iに1を加算した値13を割り当てる。そして、NFA生成部150bは、生成済みのイベント受理完了ノード8j、8mから合流ノード8nへε=遷移で接続する。
図15Dの5段目に示すように、NFA生成部150bは、現在の@番号j(1)およびタイムアウト0を現在のイベント受理制約(E)に対応する生成済みの全てのイベント受理完了ノード8j、8mに割り当て、それぞれの@リストに追加する。すなわち、このイベント受理完了ノード8j、8mは、@番号1(@1)を有する受理時刻保持ノードとなる。そして、NFA生成部150bは、@番号jに1を加算して2を設定する。
図15Eの1段目に示すように、NFA生成部150bは、現在のイベント受理制約(E)に対応する生成済みのイベント受理完了ノード8j、8mの@リストにおいて、双方共が持っている同一の@番号を合流ノード8nの指定@番号とする。ここでは、ノード8jが持っている@番号は@0、@1であり、ノード8jが持っている@番号は@1であるので、NFA生成部150bは、@1を合流ノード8nの指定@番号とする。そして、NFA生成部150bは、タイムアウトの中で一番大きい値(ここでは0)をタイムアウト長として、@番号@1とともに合流ノードに対応付けて登録する。
図15Eの2段目に示すように、NFA生成部150bは、現在のイベント受理制約(E)に対応する生成済みのイベント受理完了ノード8j、8mの各@リストに含まれる@番号および各@番号で最大のタイムアウト長を合流ノード8nの@リストに設定する。ここでは、NFA生成部150bは、@番号@0およびタイムアウト長5を対応付けて設定し、@番号@1およびタイムアウト長0を対応付けて設定する。そして、NFA生成部150bは、合成ノード8nを完了ノードとする。
続いて、NFA生成部150bは、現在のイベント受理制約(E)の後方の間隔制約がないので、終端ノードリストに完了ノードである合成ノード8nを追加する。すなわち、終端ノードリストには、完了ノード8i、8nがある。ここで、イベント受理制約Eの処理が終了する。この結果、イベント受理制約Aの処理が終了する。
続いて、NFA生成部150bは、仮イベント集合に集められたイベント受理制約(E)の処理が終了したので、元の仮イベント集合および元の起点ノードに戻す。すなわち、起点ノードは初期状態のノード8aとなり、仮イベント集合はイベント受理制約A、Cとなる。
図15Eの3段目に示すように、NFA生成部150bは、戻した仮イベント集合に含まれるイベント受理制約A、Cの処理を終了しているので、最終状態のノード8oを生成し、生成したノード8oに、現ノード番号iに1を加算した値14を割り当てる。そして、NFA生成部150bは、終端ノードリストに含まれるそれぞれの完了ノード8i、8nから、生成した最終状態のノード8oへε=遷移で接続する。
図15Eの4段目に示すように、NFA生成部150bは、終端ノードリストに含まれる異なるノードについて、各ノードの@リストを取り出す。ここでは、NFA生成部150bは、終端ノードリストに含まれる完了ノード8i、8nの各@リストを取り出す。そして、NFA生成部150bは、取り出した各@リストに存在する共通の@番号を指定@番号として、タイムアウトの中で一番大きいものをタイムアウト長として最終状態のノード8oに登録する。ここでは、完了ノード8iの@リストには、@番号0とタイムアウト長6とが対応付けられている。また、完了ノード8nの@リストには、@番号0とタイムアウト長5とが対応付けられ、@番号1とタイムアウト長0とが対応付けられている。このため、NFA生成部150bは、指定@番号を0として、タイムアウト長を6として最終状態のノード8oに登録する。
上述したように、NFA生成部150bは、図15A〜図15E示す処理を実行することで、図15Aに示すイベントパターン140aからNFA140bを生成する。
[実施例に係る照合部におけるパターン照合の処理手順]
次に、実施例に係る照合部150cにおけるパターン照合の処理手順を、図16〜図18を参照して説明する。図16は照合部におけるパターン照合の主処理の手順を示し、図17は通常遷移を発動する処理の手順を示し、図18は全てのε遷移とε=遷移を発動する処理の手順を示す。
[パターン照合の主処理の手順]
まず、パターン照合の主処理の手順について、図16を参照して説明する。図16は、実施例に係る照合部におけるパターン照合の主処理の手順を示すフローチャートである。例えば、図16に示す処理は、イベントパターン140aとイベントストリーム140cとを取得した後に、NFA140bを生成したことを契機にして実行される。
まず、照合部150cは、現在のイベント位置iの値を1に設定する(ステップS21)。そして、照合部150cは、イベントS[i]が存在するか否かを判定する(ステップS22)。ここで、イベントS[i]は、イベントストリーム140cの現在のイベント位置i、言い換えると時刻iのイベントに対応する。
イベントS[i]が存在しない場合(ステップS22;No)、照合部150cは、主処理を終了する。一方、イベントS[i]が存在する場合(ステップS22;Yes)、照合部150cは、イベントストリーム140cからイベントS[i]を読み込む(ステップS23)。
続いて、照合部150cは、読み込んだイベントS[i]に関するNFA(N(P))の全ての通常遷移を発動する(ステップS24)。ここで、NFA(N(P))は、NFA140bに対応する。
さらに、照合部150cは、NFA(N(P))の全てのε遷移とε=遷移を発動する(ステップS25)。そして、照合部150cは、現在のイベント位置iの値に1を加算し(ステップS26)、ステップS22に移行する。
[通常遷移を発動する処理の手順]
次に、図16のステップS24に示した通常遷移を発動する処理について、図17を参照して説明する。図17は、通常遷移を発動する処理の手順を示すフローチャートである。
図17に示すように、照合部150cは、状態jの値を1に設定し、遷移先状態kの値を0に設定する(ステップS211)。ここで、状態jはNFA140bのノード番号、すなわち状態番号に対応するものである。また、遷移先状態kは遷移先のノード番号、すなわち遷移先の状態番号に対応するものである。
そして、照合部150cは、状態jが存在するか否かを判定し(ステップS212)、状態jが存在しない場合には(ステップS212;No)、処理を終了する。一方、照合部150cは、状態jが存在する場合には(ステップS212;Yes)、状態jからイベントS[i]に関する通常遷移が出ているか否かを判定する(ステップS213)。通常遷移が出ていない場合には(ステップS213;No)、状態jの値に1を加算し(ステップS214)、ステップS212に移行する。
一方、通常遷移が出ている場合には(ステップS213;Yes)、照合部150cは、間隔条件付きの通常遷移であるか否かを判定する(ステップS213A)。そして、照合部150cは、間隔条件付きの通常遷移でない場合には(ステップS213A;No)、仮リストを空に設定する(ステップS215)。ここで、仮リストはイベントリストを生成するための一時的に用いられる仮のリストであり、イベントリストと同じ構成を有する。また、イベントリストは、イベントを受理したノード毎に対応付けられ、イベントの受理状態が設定される。受理状態には、例えば@番号位置と最終受理位置とが対応付けられる。@番号位置には、@番号が割り当てられた受理時刻保持ノードで受理したイベントのイベント位置を書き込む領域を指す。また、最終受理位置とは、現段階で最終的に受理したイベントのイベント位置を書き込む領域を指す。
そして、照合部150cは、状態jの通常遷移先の状態番号を状態kに設定する(ステップS216)。そして、照合部150cは、状態kが@番号が割り当てられているか否かを判定する(ステップS217)。すなわち、照合部150cは、状態kのノード番号に対応するノードが受理時刻保持ノードであるか否かを判定する。状態kが@番号が割り当てられている場合には(ステップS217;Yes)、照合部150cは、仮リストの@番号位置に現在のイベント位置iを書き込み(ステップS218)、ステップS219に移行する。そして、照合部150cは、仮リストの最終受理位置に現在のイベント位置iを書き込み、状態kのイベントリストとして追加する(ステップS219)。そして、照合部150cは、ステップS224に移行する。
一方、照合部150cは、間隔条件付きの通常遷移である場合には(ステップS213A;Yes)、状態jに未処理のイベントリストがあるか否かを判定する(ステップS220)。状態jに未処理のイベントリストがある場合には(ステップS220;Yes)、照合部150cは、未処理のイベントリストを選択し、選択したイベントリストの最終受理位置と現在のイベント位置iが間隔条件を満たすか否かを判定する(ステップS221)。そして、間隔条件を満たさない場合には(ステップS221;No)、照合部150cは、選択したイベントリストを削除し(ステップS222)、状態jの処理を継続すべく、ステップS220に移行する。一方、間隔条件を満たす場合には(ステップS221;Yes)、照合部150cは、選択したイベントリストを仮リストにコピーし(ステップS223)、ステップS216に移行する。
すなわち、照合部150cは、状態jの通常遷移先の状態番号を状態kに設定する。そして、照合部150cは、状態kが@番号が割り当てられている場合には、仮リストの@番号位置に現在のイベント位置iを上書きし、仮リストの最終受理位置に現在のイベント位置iを上書きし、状態kのイベントリストとして追加する。一方、照合部150cは、状態kが@番号が割り当てられていない場合には、仮リストの最終受理位置に現在のイベント位置iを上書きし、状態kのイベントリストとして追加する。
続いて、照合部150cは、状態kが最終状態であり、且つイベントリストがあるか否かを判定する(ステップS224)。状態kが最終状態であり、且つイベントリストがある場合には(ステップS224;Yes)、照合部150cは、現在のイベント位置iを通知し、状態kのイベントリストを削除する(ステップS225)。すなわち、照合部150cは、イベント位置iをイベントパターンの終了時刻として通知する。そして、照合部150cは、状態jの処理を継続すべく、ステップS220に移行する。一方、状態kが最終状態でない場合、またはイベントリストがない場合には(ステップS224;No)、照合部150cは、状態jの処理を継続すべく、ステップS220に移行する。
[全てのε遷移とε=遷移を発動する処理の手順]
次に、図16のステップS25に示した全てのε遷移とε=遷移を発動する処理について、図18を参照して説明する。図18は、全てのε遷移とε=遷移を発動する処理の手順を示すフローチャートである。
図18に示すように、照合部150cは、状態jの値に1を設定する(ステップS231)。そして、照合部150cは、状態jが存在するか否かを判定する(ステップS232)。状態jが存在しない場合には(ステップS232;No)、照合部150cは処理を終了する。
一方、状態jが存在する場合には(ステップS232;Yes)、照合部150cは状態jが合流ノードであるか否かを判定する(ステップS233)。状態jが合流ノードでない場合には(ステップS233;No)、照合部150cは状態jからε遷移が出ているか否かを判定する(ステップS234)。状態jからε遷移が出ていない場合には(ステップS234;No)、照合部150cは状態jの値に1を加算し(ステップS235)、ステップS232に移行する。一方、状態jからε遷移が出ている場合には(ステップS234;Yes)、照合部150cは状態jの全てのイベントリストを全ての遷移先の状態のイベントリストとして追加し、状態jのイベントリストを削除する(ステップS236)。
続いて、照合部150cは、状態kが最終状態であり、且つイベントリストがあるか否かを判定する(ステップS237)。状態kが最終状態であり、且つイベントリストがある場合には(ステップS237;Yes)、照合部150cは、現在のイベント位置iを照合結果として通知し、状態kのイベントリストを削除する(ステップS238)。すなわち、照合部150cは、照合が完了した結果として、イベントパターンの終了時刻を通知する。そして、照合部150cは、状態jの処理を継続すべく、ステップS235に移行する。一方、状態kが最終状態でない場合、またはイベントリストがない場合には(ステップS237;No)、照合部150cは、状態jの処理を継続すべく、ステップS235に移行する。
一方、状態jが合流ノードである場合には(ステップS233;Yes)、照合部150cは、状態jのε=遷移元のイベントリストの、状態jで指定された指定@番号の@番号位置のイベント位置が一致しているイベントリストを探索する。そして、照合部150cは、探索の結果、@番号位置のイベント位置が一致しているイベントリストの全ての組み合わせに対して、イベントリストを結合し、結合したイベントリストを状態jに追加する(ステップS239)。
そして、照合部150cは、状態jの各ε=遷移元のイベントリストの、状態jで指定された指定@番号の@番号位置のイベント位置を取り出す。そして、照合部150cは、取り出したイベント位置が{「現在のイベント位置」−「状態jの各@番号に対応するタイムアウト長」}以下の場合、タイムアウトであると判断し、そのイベントリストを削除する(ステップS240)。
続いて、照合部150cは、状態jが最終状態であり、且つイベントリストがあるか否かを判定する(ステップS241)。状態jが最終状態であり、且つイベントリストがある場合には(ステップS241;Yes)、照合部150cは、現在のイベント位置iを照合結果として通知し、状態jのイベントリストを削除する(ステップS242)。すなわち、照合部150cは、照合が完了した結果として、イベントパターンの終了時刻を通知する。そして、照合部150cは、状態jの処理を継続すべく、ステップS234に移行する。一方、状態jが最終状態でない場合、またはイベントリストがない場合には(ステップS241;No)、照合部150cは、状態jの処理を継続すべく、ステップS234に移行する。
[パターン照合処理の一例]
次に、図を用いて照合部150cの処理を説明する。図19A〜図19Kは、照合部の処理を説明するための図である。なお、図19A〜図19Kの説明では、状態番号によって、各ノードを区別して説明する。以下では、状態番号1〜14のノードを、状態1〜14として説明する。また、NFA140bと比較するイベントストリーム140cを、図3に示すものとし、各イベントをS[i](i=1〜10)に保持するものとする。
図19Aに示すように、イベントパターン140aのデータ構造を、符号204pに示すものとする。イベントパターン140aは、イベントAからイベントBまでの間隔を2以内とする非連続直列パターンを有する。そして、イベントパターン140aは、イベントBを分岐の起点とし、イベントBからイベントAまでの間隔を6以内とし、イベントBからイベントEまでの間隔を3以内とする分岐パターンを有する。さらに、イベントパターン140aは、イベントBからイベントEまでの間隔を3以内とし、イベントCからイベントEまでの間隔を4以内とし、イベントEを結合の終点とする結合パターンを有する。このイベントパターン140aを入力としてNFA生成部150bによって生成されたNFAは、符号204nに示すものとなる。
図19Bの1段目に示すように、照合部150cは、現在のイベント位置iの値を1に設定し、イベントストリーム140cからイベント位置1のイベントS[1]、すなわちイベント「A」を読み込む。言い換えれば、照合部150cは、時刻1のイベント「A」を読み込む。
図19Bの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「A」に関する通常遷移が出ているか否かを判定する。ここでは、状態1からイベント「A」に関する間隔条件なしの通常遷移が出ているので、照合部150cは、イベントの受理状態を設定する仮リストを空に設定する。そして、照合部150cは、状態kに状態1の通常遷移先である状態3を設定する。
図19Bの3段目に示すように、照合部150cは、状態3に@番号が割り当てられていないので、仮リストの最終受理位置に現在のイベント位置1を設定し、設定後仮リストを状態3のイベントリスト1rとして追加する。そして、状態2から状態5まで各状態からイベント「A」に関する通常遷移が出ていないので、照合部150cは、状態jの値を1ずつ増やし、5を設定する。
図19Bの4段目に示すように、照合部150cは、さらに状態jの値を1増やした状態6からイベント「A」に関する間隔条件付きの通常遷移が出ているが、状態6に未処理のイベントリストがなく、間隔条件を比較する対象がないので、そのまま処理を継続する。
続いて、照合部150cは、状態7から状態14まで各状態からイベント「A」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置1(時刻1)のイベント「A」に関する全ての通常遷移の発動を終了する。
図19Bの5段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態3からε遷移が出ているので、状態3のイベントリストr1を遷移先の状態4のイベントリストr2として追加し、状態3のイベントリストr1を削除する。そして、照合部150cは、状態14まで処理を完了すると、全てのε遷移とε=遷移の発動を終了する。
図19Cの1段目に示すように、照合部150cは、現在のイベント位置iの値を2に設定し、イベントストリーム140cからイベント位置1のイベントS[2]、すなわちイベント「C」を読み込む。言い換えれば、照合部150cは、時刻2のイベント「C」を読み込む。
図19Cの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「C」に関する通常遷移が出ているか否かを判定する。ここでは、状態2からイベント「C」に関する間隔条件なしの通常遷移が出ているので、照合部150cは、仮リストを空に設定する。そして、照合部150cは、状態kに状態2の通常遷移先である状態10を設定する。
図19Cの3段目に示すように、照合部150cは、状態10に@番号が割り当てられていないので、仮リストの最終受理位置に現在のイベント位置2を設定し、設定後仮リストを状態10のイベントリストr3として追加する。そして、状態3から状態14まで各状態からイベント「C」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置2(時刻2)のイベント「C」に関する全ての通常遷移の発動を終了する。
図19Cの4段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態3からε遷移が出ているが、状態3のイベントリストがもともと空なので、状態3のイベントリストに変化はない。
図19Cの5段目に示すように、照合部150cは、状態10からε遷移を発動し、状態10のイベントリストr3を遷移先の状態11のイベントリストr4として追加し、状態10のイベントリストr3を削除する。そして、照合部150cは、状態14まで処理を完了すると、全てのε遷移とε=遷移の発動を終了する。
図19Dの1段目に示すように、照合部150cは、現在のイベント位置iの値を3に設定し、イベントストリーム140cからイベント位置3のイベントS[3]、すなわちイベント「A」を読み込む。言い換えれば、照合部150cは、時刻3のイベント「A」を読み込む。
図19Dの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「A」に関する通常遷移が出ているか否かを判定する。ここでは、状態1からイベント「A」に関する間隔条件なしの通常遷移が出ているので、照合部150cは、仮リストを空に設定する。そして、照合部150cは、状態kに状態1の通常遷移先である状態3を設定する。そして、照合部150cは、状態3に@番号が割り当てられていないので、仮リストの最終受理位置に現在のイベント位置3を設定し、設定後仮リストを状態3のイベントリストr5として追加する。
続いて、照合部150cは、状態6からイベント「A」に関する間隔条件付きの通常遷移が出ているが、状態6に未処理のイベントリストがなく、間隔条件を比較する対象がないので、そのまま処理を継続する。そして、照合部150cは、状態7から状態14まで各状態からイベント「A」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置3(時刻3)のイベント「A」に関する全ての通常遷移の発動を終了する。
図19Dの3段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態3からε遷移が出ているので、状態3のイベントリストr5を遷移先の状態4のイベントリストr6として追加し、状態3のイベントリストr5を削除する。そして、照合部150cは、状態14まで処理を完了すると、全てのε遷移とε=遷移の発動を終了する。
図19Eの1段目に示すように、照合部150cは、現在のイベント位置iの値を4に設定し、イベントストリーム140cからイベント位置4のイベントS[4]、すなわちイベント「B」を読み込む。言い換えれば、照合部150cは、時刻4のイベント「B」を読み込む。
図19Eの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「B」に関する通常遷移が出ているか否かを判定する。ここでは、状態4からイベント「B」に関する間隔条件ありの通常遷移が出ているので、照合部150cは、状態4の未処理のイベントリストr2を選択し、選択したイベントリストr2の最終受理位置と現在のイベント位置4が間隔条件を満たすか否かを判定する。選択したイベントリストr2の最終受理位置が1であり、現在のイベント位置4との間隔が3であるので、照合部150cは、間隔条件2を満たさないと判定し、イベントリストr2を削除する。
図19Eの3段目に示すように、照合部150cは、状態4の未処理のイベントリストr6を選択し、選択したイベントリストr6の最終受理位置と現在のイベント位置4が間隔条件を満たすか否かを判定する。選択したイベントリストr6の最終受理位置が3であり、現在のイベント位置4との間隔が1であるので、照合部150cは、間隔条件2を満たすと判定する。そして、照合部150cは、仮リストにそのイベントリストr6をコピーし、状態kに状態4の通常遷移先である状態5を設定する。
図19Eの4段目に示すように、照合部150cは、状態5に@番号0が割り当てられているので、仮リストの@番号位置x1に現在のイベント位置4を書き込む。
図19Eの5段目に示すように、照合部150cは、仮リストの最終受理位置z1に現在のイベント位置4を設定する。そして、照合部150cは、仮リストを状態5のイベントリストr7として追加する。そして、照合部150cは、状態5から状態14まで各状態からイベント「B」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置4(時刻4)のイベント「B」に関する全ての通常遷移の発動を終了する。
図19Eの6段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態5から状態6および状態7にε遷移が出ているので、状態5のイベントリストr7を遷移先の状態6および状態7のイベントリストr8、r9として追加する。そして、照合部150cは、状態5のイベントリストr7を削除する。そして、照合部150cは、状態14まで処理を完了すると、全てのε遷移とε=遷移の発動を終了する。
図19Fの1段目に示すように、照合部150cは、現在のイベント位置iの値を5に設定し、イベントストリーム140cからイベント位置5のイベントS[5]、すなわちイベント「A」を読み込む。言い換えれば、照合部150cは、時刻5のイベント「A」を読み込む。
図19Fの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「A」に関する通常遷移が出ているか否かを判定する。ここでは、状態1からイベント「A」に関する間隔条件なしの通常遷移が出ているので、照合部150cは、仮リストを空に設定する。そして、照合部150cは、状態kに状態1の通常遷移先である状態3を設定する。そして、照合部150cは、状態3に@番号が割り当てられていないので、仮リストの最終受理位置に現在のイベント位置5を設定し、設定後仮リストを状態3のイベントリストr10として追加する。
図19Fの3段目に示すように、照合部150cは、状態6からイベント「A」に関する間隔条件ありの通常遷移が出ているので、照合部150cは、状態6の未処理のイベントリストr8を選択し、選択したイベントリストr8の最終受理位置と現在のイベント位置5が間隔条件を満たすか否かを判定する。選択したイベントリストr8の最終受理位置が4であり、現在のイベント位置5との間隔が1であるので、照合部150cは、間隔条件6を満たすと判定する。そして、照合部150cは、仮リストにそのイベントリストr8をコピーし、状態kに状態6の通常遷移先である状態8を設定する。
図19Fの4段目に示すように、照合部150cは、状態8に@番号が割り当てられていないので、仮リストの最終受理位置に現在のイベント位置5を設定し、設定後仮リストを状態8のイベントリストr11として追加する。そして、照合部150cは、状態7から状態14まで各状態からイベント「A」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置5(時刻5)のイベント「A」に関する全ての通常遷移の発動を終了する。
図19Fの5段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態3から状態4にε遷移が出ているので、状態3のイベントリストr10を遷移先の状態4のイベントリストr12として追加する。そして、照合部150cは、状態3のイベントリストr10を削除する。
図19Fの6段目に示すように、照合部150cは、状態14が合流ノードであるので、状態14のε=遷移元の状態8、13のイベントリストの、状態14で指定された指定@番号0の@番号位置のイベント位置が一致しているイベントリストを探索する。ここでは、1つのε=遷移元の状態13にイベントリストがないので、状態14のイベントリストに変化はない。そして、照合部150cは、状態14まで処理を完了したので、全てのε遷移とε=遷移の発動を終了する。
図19Gの1段目に示すように、照合部150cは、現在のイベント位置iの値を6に設定し、イベントストリーム140cからイベント位置4のイベントS[6]、すなわちイベント「B」を読み込む。言い換えれば、照合部150cは、時刻6のイベント「B」を読み込む。
図19Gの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「B」に関する通常遷移が出ているか否かを判定する。ここでは、状態4からイベント「B」に関する間隔条件ありの通常遷移が出ているので、照合部150cは、状態4の未処理のイベントリストr12を選択し、選択したイベントリストr12の最終受理位置と現在のイベント位置6が間隔条件を満たすか否かを判定する。選択したイベントリストr12の最終受理位置が5であり、現在のイベント位置6との間隔が1であるので、照合部150cは、間隔条件2を満たすと判定する。そして、照合部150cは、仮リストにそのイベントリストr12をコピーし、状態kに状態4の通常遷移先である状態5を設定する。照合部150cは、状態5に@番号0が割り当てられているので、仮リストの@番号位置に現在のイベント位置6を書き込む。そして、照合部150cは、仮リストの最終受理位置に現在のイベント位置6を設定する。そして、照合部150cは、仮リストを状態5のイベントリストr13として追加する。そして、照合部150cは、状態5から状態14まで各状態からイベント「B」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置6(時刻6)のイベント「B」に関する全ての通常遷移の発動を終了する。
図19Gの3段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態5から状態6および状態7にε遷移が出ているので、状態5のイベントリストr13を遷移先の状態6および状態7のイベントリストr14、r15として追加する。そして、照合部150cは、状態5のイベントリストr13を削除する。そして、照合部150cは、状態14まで処理を完了すると、全てのε遷移とε=遷移の発動を終了する。
図19Hの1段目に示すように、照合部150cは、現在のイベント位置iの値を7に設定し、イベントストリーム140cからイベント位置7のイベントS[7]、すなわちイベント「E」を読み込む。言い換えれば、照合部150cは、時刻7のイベント「E」を読み込む。
図19Hの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「E」に関する通常遷移が出ているか否かを判定する。ここでは、状態7からイベント「E」に関する間隔条件ありの通常遷移が出ているので、照合部150cは、状態7の未処理のイベントリストr9を選択し、選択したイベントリストr9の最終受理位置と現在のイベント位置7が間隔条件を満たすか否かを判定する。選択したイベントリストr9の最終受理位置が4であり、現在のイベント位置7との間隔が3であるので、照合部150cは、間隔条件3を満たすと判定する。そして、照合部150cは、仮リストにそのイベントリストr9をコピーし、状態kに状態7の通常遷移先である状態9を設定する。そして、照合部150cは、状態9に@番号1が割り当てられているので、仮リストの@番号1の@番号位置に現在のイベント位置7を書き込む。そして、照合部150cは、仮リストの最終受理位置に現在のイベント位置7を設定する。そして、照合部150cは、仮リストを状態9のイベントリストr16として追加する。
続いて、照合部150cは、状態7の未処理のイベントリストr15を選択し、選択したイベントリストr15の最終受理位置と現在のイベント位置7が間隔条件を満たすか否かを判定する。選択したイベントリストr15の最終受理位置が6であり、現在のイベント位置7との間隔が2であるので、照合部150cは、間隔条件3を満たすと判定する。そして、照合部150cは、仮リストにそのイベントリストr15をコピーし、状態kに状態7の通常遷移先である状態9を設定する。そして、照合部150cは、状態9に@番号1が割り当てられているので、仮リストの@番号1の@番号位置に現在のイベント位置7を書き込む。そして、照合部150cは、仮リストの最終受理位置に現在のイベント位置7を設定する。そして、照合部150cは、仮リストを状態9のイベントリストr17として追加する。そして、照合部150cは、状態8から状態14まで各状態からイベント「E」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置7(時刻7)のイベント「E」に関する全ての通常遷移の発動を終了する。
図19Hの3段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態13が合流ノードであるので、状態13のε=遷移元の状態9、12のイベントリストの、状態13で指定された指定@番号1の@番号位置のイベント位置が一致しているイベントリストを探索する。ここでは、1つのε=遷移元の状態12にイベントリストがないので、状態13のイベントリストに変化はない。
続いて、照合部150cは、状態13のε=遷移元9、12のイベントリストr16、r17の、状態13で指定された指定@番号1に対応するイベント位置(@1の受理時刻)を取り出す。ここでは、照合部150cは、イベントリストr16から7、イベントリストr17から7を取り出す。そして、照合部150cは、取り出したイベント位置が{「現在のイベント位置」−「状態13の@番号1に対応するタイムアウト長」}以下であるか否かを判定する。ここでは、取り出したイベント位置が7、現在のイベント位置は7、状態13の@番号1に対応するタイムアウト長が0であり、「7=7−0」となるので、照合部150cは、タイムアウトであると判断し、イベントリストr16、r17を削除する。
続いて、状態14は合流ノードであるが、状態14のε=遷移元の状態8、13のうち状態13にイベントリストがないので、状態14のイベントリストに変化はない。そして、状態8のイベントリストr11の、状態14で指定された指定@番号0に対応するイベント位置が4であり、「4>7−6」となるので、照合部150cは、タイムアウトでないと判断し、イベントリストr11をそのままにする。そして、照合部150cは、状態14まで処理を完了したので、全てのε遷移とε=遷移の発動を終了する。
図19Iの1段目に示すように、照合部150cは、現在のイベント位置iの値を8に設定し、イベントストリーム140cからイベント位置1のイベントS[8]、すなわちイベント「C」を読み込む。言い換えれば、照合部150cは、時刻8のイベント「C」を読み込む。
図19Iの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「C」に関する通常遷移が出ているか否かを判定する。ここでは、状態2からイベント「C」に関する間隔条件なしの通常遷移が出ているので、照合部150cは、仮リストを空に設定し、状態kに状態2の通常遷移先である状態10を設定する。
続いて、照合部150cは、状態10に@番号が割り当てられていないので、仮リストの最終受理位置に現在のイベント位置8を設定し、設定後仮リストを状態10のイベントリストr16として追加する。そして、状態3から状態14まで各状態からイベント「C」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置8(時刻8)のイベント「C」に関する全ての通常遷移の発動を終了する。
図19Iの3段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態10からε遷移が出ているので、状態10のイベントリストr16を遷移先の状態11のイベントリストr17として追加し、状態10のイベントリストr16を削除する。そして、照合部150cは、状態14まで処理を完了すると、全てのε遷移とε=遷移の発動を終了する。
図19Jの1段目に示すように、照合部150cは、現在のイベント位置iの値を9に設定し、イベントストリーム140cからイベント位置9のイベントS[9]、すなわちイベント「E」を読み込む。言い換えれば、照合部150cは、時刻9のイベント「E」を読み込む。
図19Jの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「E」に関する通常遷移が出ているか否かを判定する。ここでは、状態7からイベント「E」に関する間隔条件ありの通常遷移が出ているので、照合部150cは、状態7の未処理のイベントリストr9を選択し、選択したイベントリストr9の最終受理位置と現在のイベント位置9が間隔条件を満たすか否かを判定する。選択したイベントリストr9の最終受理位置が4であり、現在のイベント位置9との間隔が5であり、間隔条件3を超えているので、照合部150cは、間隔条件3を満たさないと判定する。そして、照合部150cは、そのイベントリストr9を削除する。
続いて、照合部150cは、状態7の未処理のイベントリストr15を選択し、選択したイベントリストr15の最終受理位置と現在のイベント位置7が間隔条件を満たすか否かを判定する。選択したイベントリストr15の最終受理位置が6であり、現在のイベント位置9との間隔が3であるので、照合部150cは、間隔条件3を満たすと判定する。そして、照合部150cは、仮リストにそのイベントリストr15をコピーし、状態kに状態7の通常遷移先である状態9を設定する。そして、照合部150cは、状態9に@番号1が割り当てられているので、仮リストの@番号1の@番号位置y2に現在のイベント位置9を書き込む。そして、照合部150cは、仮リストの最終受理位置z2に現在のイベント位置9を設定する。そして、照合部150cは、仮リストを状態9のイベントリストr18として追加する。
さらに、状態11からイベント「E」に関する間隔条件ありの通常遷移が出ているので、照合部150cは、状態7の場合と同様に処理する。すなわち、照合部150cは、@番号位置を現在のイベント位置9とし、最終受理位置を9とした仮リストを状態12のイベントリストr19として追加する。そして、照合部150cは、状態12から状態14まで各状態からイベント「E」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置9(時刻9)のイベント「E」に関する全ての通常遷移の発動を終了する。
図19Jの3段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態13が合流ノードであるので、状態13のε=遷移元の状態9、12のイベントリストの、状態13で指定された指定@番号1の@番号位置のイベント位置が一致しているイベントリストを探索する。ここでは、状態9のイベントリストr18の指定@番号1に対応するイベント位置と状態12のイベントリストr19の指定@番号1に対応するイベント位置とが9で一致している。そこで、照合部150cは、これらイベントリストr18、r19の組み合わせに対して、イベントリストを結合し、結合したイベントリストr20を状態13に追加する。
図19Jの4段目に示すように、照合部150cは、状態13のε=遷移元9、12のイベントリストr18、r19の、状態13で指定された指定@番号1に対応するイベント位置(@1の受理時刻)を取り出す。ここでは、照合部150cは、イベントリストr18から9、イベントリストr19から9を取り出す。そして、照合部150cは、取り出したイベント位置が{「現在のイベント位置」−「状態13の@番号1に対応するタイムアウト長」}以下であるか否かを判定する。ここでは、取り出したイベント位置が9、現在のイベント位置は9、状態13の@番号1に対応するタイムアウト長が0であり、「9=9−0」となるので、照合部150cは、タイムアウトであると判断し、イベントリストr18、r19を削除する。
図19Jの5段目に示すように、照合部150cは、状態14が合流ノードであるので、状態14のε=遷移元の状態8、13のイベントリストの、状態14で指定された指定@番号0の@番号位置のイベント位置が一致しているイベントリストを探索する。ここでは、状態8のイベントリストr11の指定@番号0に対応するイベント位置が4であり、状態13のイベントリストr20の指定@番号0に対応するイベント位置が6であり、各イベント位置が一致していないので、状態14のイベントリストに変化はない。そして、照合部150cは、状態14まで処理を完了したので、全てのε遷移とε=遷移の発動を終了する。
図19Kの1段目に示すように、照合部150cは、現在のイベント位置iの値を10に設定し、イベントストリーム140cからイベント位置10のイベントS[10]、すなわちイベント「A」を読み込む。言い換えれば、照合部150cは、時刻10のイベント「A」を読み込む。
図19Kの2段目に示すように、照合部150cは、状態jの値と遷移先状態kの値を初期化し、状態jの値を1に設定し、遷移先状態kの値を0に設定する。照合部150cは、状態jの値を1ずつ加算し、状態jからイベント「A」に関する通常遷移が出ているか否かを判定する。ここでは、状態1からイベント「A」に関する間隔条件なしの通常遷移が出ているので、照合部150cは、仮リストを空に設定する。そして、照合部150cは、状態kに状態1の通常遷移先である状態3を設定する。そして、照合部150cは、状態3に@番号が割り当てられていないので、仮リストの最終受理位置に現在のイベント位置10を設定し、設定後仮リストを状態3のイベントリストr21として追加する。
続いて、照合部150cは、状態6からイベント「A」に関する間隔条件ありの通常遷移が出ているので、照合部150cは、状態6の未処理のイベントリストr8を選択し、選択したイベントリストr8の最終受理位置と現在のイベント位置10が間隔条件を満たすか否かを判定する。選択したイベントリストr8の最終受理位置が4であり、現在のイベント位置10との間隔が6であるので、照合部150cは、間隔条件6を満たすと判定する。そして、照合部150cは、仮リストにそのイベントリストr8をコピーし、状態kに状態6の通常遷移先である状態8を設定する。そして、照合部150cは、状態8に@番号が割り当てられていないので、仮リストの最終受理位置に現在のイベント位置10を設定し、設定後仮リストを状態8のイベントリストr22として追加する。
続いて、照合部150cは、状態6の未処理のイベントリストr14についてもイベントリストr8と同様に処理し、状態8にイベントリストr23を追加する。そして、照合部150cは、状態7から状態14まで各状態からイベント「A」に関する通常遷移が出ていないので、照合部150cは、現在のイベント位置10(時刻10)のイベント「A」に関する全ての通常遷移の発動を終了する。
図19Kの3段目に示すように、照合部150cは、状態jの値を1ずつ増やしながら、状態jから出ている全てのε遷移とε=遷移の発動を実行する。照合部150cは、状態3から状態4にε遷移が出ているので、状態3のイベントリストr21を遷移先の状態4のイベントリストr24として追加し、状態3のイベントリストr21を削除する。
図19Kの4段目に示すように、照合部150cは、状態14が合流ノードであるので、状態14のε=遷移元の状態8、13のイベントリストの、状態14で指定された指定@番号0の@番号位置のイベント位置が一致しているイベントリストを探索する。ここでは、状態8のイベントリストr23の指定@番号0に対応するイベント位置と状態13のイベントリストr20の指定@番号0に対応するイベント位置とが6で一致している。そこで、照合部150cは、これらイベントリストr23、r20の組み合わせに対して、イベントリストを結合し、結合したイベントリストr25を状態14に追加する。
図19Kの5段目に示すように、照合部150cは、状態14が最終状態で、イベントリストがあるので、現在のイベント位置14を照合結果として通知し、状態14のイベントリストを削除する。すなわち、照合部150cは、照合が完了した結果として、イベントパターンの終了時刻を通知する。そして、照合部150cは、状態14まで処理を完了したので、全てのε遷移とε=遷移の発動を終了する。
照合部150cは、上述した図19A〜図19Kに示す処理を実行することにより、NFA140bを利用して、イベントストリーム140cを照合する。照合部150cは、照合結果をユーザ端末50に通知する。なお、照合部150cは、照合結果を表示部130に表示させても良い。上述した図19A〜図19Kでは、照合結果を、イベントストリーム140c上のイベントパターン140aの終了時刻としたが、開始時刻を含んだものとしても良い。
[実施例の効果]
次に、本実施例にかかる照合装置100の効果について説明する。照合装置100は、イベントパターン140aに含まれる分岐パターンについて、分岐パターンの分岐の起点となるイベントの受理時刻を当該イベントの遷移先を示す起点ノードに対応付けて保持させる。また、照合装置100は、起点ノードから分岐パターンの分岐先となるイベントおよび間隔条件を対応付けた分岐ノードに接続する。また、照合装置100は、複数の分岐ノードから、複数の分岐ノードを結合する結合点を示す結合点ノードに接続することで、NFA140bを生成する。そして、照合装置100は、複数のイベントの発生順序を含むイベントストリーム140cと、NFA140bとを順次比較し、分岐パターンの分岐の起点となるイベントが起点ノードで受理されると、受理されたイベントの受理時刻を起点ノードに対応付けて保持する。また、照合装置100は、分岐の起点となるイベントに後続するイベントが分岐ノードで受理されると、受理されたイベントの受理が分岐ノードに対応付けられた間隔条件を満たせば、該保持した受理時刻を分岐ノードの受理状態と共に遷移させる。また、照合装置100は、結合点ノードにて複数の分岐ノードから遷移された受理時刻に同一の受理時刻があると、当該受理時刻を含む結合状態を更に遷移させることで、イベントストリーム140cにイベントパターン140aが含まれているか否かを照合する。照合装置100によれば、イベントパターンの分岐パターンにイベント間の間隔条件があっても、イベント間の分岐パターンを誤ることなく照合を行うことができるため、イベントパターンを効率的に照合することができる。
また、照合装置100は、イベントパターン140aに含まれる結合パターンについて、結合パターンの結合の終点となるイベントの受理時刻を当該イベントの遷移先を示す分岐ノードに対応付けて保持させる。また、照合装置100は、複数の分岐ノードから複数の分岐ノードを結合する結合点を示す結合点ノードに接続することで、更にNFA140bを生成する。そして、照合装置100は、結合パターンの結合の終点となるイベントが分岐ノードで受理されると、遷移元の受理状態を複製すると共に、受理されたイベントの受理時刻を分岐ノードに対応付けて保持する。また、照合装置100は、該保持した受理時刻を該複製した受理状態と共に結合点ノードに遷移させる。また、照合装置100は、結合点ノードにて複数の分岐ノードから遷移された受理時刻に終点となるイベントの同一の受理時刻があると、当該受理時刻を含む結合状態を更に遷移させる。このため、照合装置100によれば、イベントパターンの結合パターンにイベント間の間隔条件があっても、イベント間の結合パターンを誤ることなく照合を行うことができるため、イベントパターンを効率的に照合することができる。
[プログラムなど]
なお、照合装置100は、既知のパーソナルコンピュータ、ワークステーションなどの情報処理装置に、上記したNFA生成部150b、照合部150cなどの各機能を搭載することによって実現することができる。
また、図示した各装置の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、NFA生成部150bと照合部150cとを1個の部として統合しても良い。一方、NFA生成部150bを、分岐パターンについてNFAを生成する第1の生成部と結合パターンについてNFAを生成する第2の生成部とに分散しても良い。また、NFA140bなどの記憶部を照合装置100の外部装置としてネットワーク経由で接続するようにしても良い。
また、上記実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図2に示した照合装置100と同様の機能を実現する照合プログラムを実行するコンピュータの一例を説明する。図20は、照合プログラムを実行するコンピュータの一例を示す図である。
図20に示すように、コンピュータ200は、各種演算処理を実行するCPU201と、ユーザからのデータの入力を受け付ける入力装置202と、ディスプレイ203を有する。また、コンピュータ200は、記憶媒体からプログラム等を読取る読み取り装置204と、ネットワークを介して他のコンピュータとの間でデータの授受を行うインタフェース装置205とを有する。また、コンピュータ200は、各種情報を一時記憶するRAM206と、ハードディスク装置207を有する。そして、各装置201〜207は、バス208に接続される。
ハードディスク装置207は、NFA生成プログラム207a、照合プログラム207bを記憶する。CPU201は、各プログラム207a〜207bを読み出して、RAM206に展開する。NFA生成プログラム207aは、NFA生成プロセス206aとして機能する。照合プログラム207bは、照合プロセス206bとして機能する。
例えば、NFA生成プロセス206aは、NFA生成部150bに対応する。照合プロセス206bは、照合部150cに対応する。
なお、各プログラム207a〜207bについては、必ずしも最初からハードディスク装置207に記憶させておかなくてもよい。例えば、コンピュータ200に挿入されるフレキシブルディスク(FD)、CD−ROM、DVDディスク、光磁気ディスク、ICカードなどの「可搬用の物理媒体」に各プログラムを記憶させておく。そして、コンピュータ200がこれらから各プログラム207a〜207bを読み出して実行するようにしても良い。
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
(付記1)イベント間の発生順序と間隔条件とを伴ったイベントパターンに含まれる分岐パターンについて、前記分岐パターンの分岐の起点となるイベントの受理時刻を当該イベントの遷移先を示す起点ノードに対応付けて保持させる処理、前記起点ノードから前記分岐パターンの分岐先となるイベントおよび間隔条件を対応付けた分岐ノードに接続する処理、複数の分岐ノードから前記複数の分岐ノードを結合する結合点を示す結合点ノードに接続する処理を行うことで、オートマトンを生成するオートマトン生成部と、
複数のイベントの発生順序を含むイベントストリームと、前記オートマトンとを順次比較し、前記分岐パターンの分岐の起点となるイベントが前記起点ノードで受理されると、受理されたイベントの受理時刻を前記起点ノードに対応付けて保持し、前記分岐の起点となるイベントに後続するイベントが前記分岐ノードで受理されると、受理されたイベントの受理が前記分岐ノードに対応付けられた間隔条件を満たせば、該保持した受理時刻を前記分岐ノードの受理状態と共に遷移させ、前記結合点ノードにて複数の分岐ノードから遷移された受理時刻に同一の受理時刻があると、当該受理時刻を含む結合状態を更に遷移させることで、前記イベントストリームに前記イベントパターンが含まれているか否かを照合する照合部と
を有することを特徴とする照合装置。
(付記2)前記オートマトン生成部は、前記イベントパターンに含まれる結合パターンについて、前記結合パターンの結合の終点となるイベントの受理時刻を当該イベントの遷移先を示す分岐ノードに対応付けて保持させる処理、複数の分岐ノードから前記複数の分岐ノードを結合する結合点を示す前記結合点ノードに接続する処理を行うことで、更に前記オートマトンを生成し、
前記照合部は、前記結合パターンの結合の終点となるイベントが前記分岐ノードで受理されると、遷移元の受理状態を複製すると共に、受理されたイベントの受理時刻を前記分岐ノードに対応付けて保持し、該保持した受理時刻を該複製した受理状態と共に前記結合点ノードに遷移させ、前記結合点ノードにて複数の分岐ノードから遷移された受理時刻に前記終点となるイベントの同一の受理時刻があると、当該受理時刻を含む結合状態を更に遷移させることを特徴とする付記1に記載の照合装置。
(付記3)コンピュータに、
イベント間の発生順序と間隔条件とを伴ったイベントパターンに含まれる分岐パターンについて、前記分岐パターンの分岐の起点となるイベントの受理時刻を当該イベントの遷移先を示す起点ノードに対応付けて保持させる処理、前記起点ノードから前記分岐パターンの分岐先となるイベントおよび間隔条件を対応付けた分岐ノードに接続する処理、複数の分岐ノードから前記複数の分岐ノードを結合する結合点を示す結合点ノードに接続する処理を行うことで、オートマトンを生成し、
複数のイベントの発生順序を含むイベントストリームと、前記オートマトンとを順次比較し、前記分岐パターンの分岐の起点となるイベントが前記起点ノードで受理されると、受理されたイベントの受理時刻を前記起点ノードに対応付けて保持し、前記分岐の起点となるイベントに後続するイベントが前記分岐ノードで受理されると、受理されたイベントの受理が前記分岐ノードに対応付けられた間隔条件を満たせば、保持された受理時刻を前記分岐ノードの受理状態と共に遷移させ、前記結合点ノードにて複数の分岐ノードから遷移された受理時刻に同一の受理時刻があると、当該受理時刻を含む結合状態を更に遷移させることで、前記イベントストリームに前記イベントパターンが含まれているか否かを照合する
各処理を実行させることを特徴とする照合プログラム。
(付記4)前記生成する処理は、前記イベントパターンに含まれる結合パターンについて、前記結合パターンの結合の終点となるイベントの受理時刻を当該イベントの遷移先を示す分岐ノードに対応付けて保持させる処理、複数の分岐ノードから前記複数の分岐ノードを結合する結合点を示す前記結合点ノードに接続する処理を行うことで、更に前記オートマトンを生成し、
前記照合する処理は、前記結合パターンの結合の終点となるイベントが前記分岐ノードで受理されると、遷移元の受理状態を複製すると共に、受理されたイベントの受理時刻を前記分岐ノードに対応付けて保持し、該保持した受理時刻を該複製した受理状態と共に前記結合点ノードに遷移させ、前記結合点ノードにて複数の分岐ノードから遷移された受理時刻に前記終点となるイベントの同一の受理時刻があると、当該受理時刻を含む結合状態を更に遷移させることを特徴とする付記1に記載の照合装置。