ブローカー
MaaS Blender は、複数のコンポーネントをイベントを介して連携させながら実行します。 任意のシミュレーション時刻において、同時に実行されるのはいつも「1つのコンポーネントのみ」です。つまり、コンポーネントは並列実行されません。 どの順序でコンポーネントが実行されるかは完全に決定的であり、各コンポーネント自体が決定的に振る舞う限り、シミュレーション全体も決定的です。
この実行順序の制御を担うのが「ブローカー(Broker)」です。 ブローカーは次に実行すべきコンポーネントを選択し、そのコンポーネントを呼び出してイベントを生成させ、生成されたイベントを他のすべてのコンポーネントに伝播します。
コンポーネントのインターフェース
各コンポーネントは、以下の3つの API を公開しなければいけません。
-
peek()次にそのコンポーネントで予定されているイベントのシミュレーション時刻を返します。 -
step()コンポーネントを実行し、1つ以上のイベントを発生させます。 -
triggered(event)他のコンポーネントによって生成されたイベントを受け取ります。
ブローカーの処理フロー
シミュレーションは、以下の手順を繰り返すことで進行します。
- ブローカーが全コンポーネントに対して
peek()を呼び、最も小さい時刻を返したコンポーネントを選択します。 - ブローカーは選択したコンポーネントに対して
step()を呼びます。コンポーネントは実行され、生成したイベント群を返します。 - ブローカーはそれぞれの生成イベントについて、全コンポーネントに対して
triggered(event)を呼び出しイベントを伝播します。 - 手順1に戻り、これをシミュレーション終了まで継続します。
API 詳細
-
peek()-
Returns:
{ "next": number }ここで
nextは、そのコンポーネントで次のイベントが発生するシミュレーション時刻です。
-
-
step()-
Returns:
{ "now": number, "events": Event[] }ここで
nowは、イベントが発生したシミュレーション時刻です。 同一時刻に複数のイベントが発生する場合は配列で返します。
-
-
triggered(event)-
引数:
event: 他のコンポーネントによって発生したイベント
-