More Related Content More from Daichi Teruya (7) Mado magisystemx hago312. MadoMagi System
PC1
Algorithm Pool
Puella Magi #1
Puella Magi #2
Battle Manager Battle Agent
Incubator SoulGem Puella Magi #3
Puella Magi #4
PC2
Algorithm Pool
Puella Magi #1
競技サーバー Puella Magi #2
Witch Battle Agent
SoulGem Puella Magi #3
Puella Magi #4
13. MadoMagi System Sequence(概略)
Witch Incubator SoulGem PuellaMagi#1 PuellaMagi#1 PuellaMagi#1
接続確認
問題
アルゴ
リズム
選択
プロセス生成
起動
プロセス生成
起動
起動 プロセス生成
問題
問題
問題
問題
計 計 計
算 算 算
解答 解答
終了 プロセス終了
解答 解答
プロセス終了
終了
解答 解答
終了 プロセス終了
解答提出
14. MadoMagi System Sequence(詳細)
Witch Incubator SoulGem PuellaMagi
接続要求
接続
接続確認
接続応答
問題要求
問題
アルゴリズム起動要求
プロセス生成
アルゴリズム起動要求
アルゴリズム起動応答
アルゴリズム起動応答
問題
問題
問題受け取り確認
問題受け取り確認
計算開始要求
計算開始要求
計算開始応答
計算開始応答 計
算
計算完了通知
計算完了通知
計算結果要求
計算結果要求
解答提出
解答提出
解答提出
アルゴリズム終了要求
プロセス終了
アルゴリズム終了応答
15. MadoMagi System(緊急モー
ド)
ネットワークのトラブル、IncubatorやSoulGemの不具合でMadoMagiSystemが動作
しない場合、魔法少女はスタンドアローンで動作する。緊急モードでのシステム
構成は下記のようになる
PC1
Puella Magi #1
緊急モード
問題
回答提出
クライアン
ト Puella Magi #1
緊急モード
解答
競技サーバー
Witch
16. インキュベー
タ
- Battle Manager -
17. Incubator内部構成
User Interface
問題バッファ 問題解析
SoulGem
問題受信
Witch
通信
sample 状態管理 メッセージ ライブラ
client
BEAR リ
KUMA
解答提出
最適解バッファ 解答解析 システム構成
マネージャ
システム構
成ファイル
Battle Log
20. SoulGem内部構成
Soul Gem
問題バッファ プロセス管理
Battle Manager
通信 通信
ライブラ メッセージ メッセージ ライブラ Puella Magi
リ リ
解答バッファ
ネットワー
ク構成ファ
イル
22. PuellaMagi内部構成
魔法少女(アルゴリズ
ム)
魔法少女API
魔法少女プラット
フォーム
状態管理
データ構造
変換
メッセージ通信
BEAR
SoulGem
通信ライブラリ
KUMA
魔法少女API
int PuellaMagi(PROBLEM *problem, int *answer_len, UBYTE *answer)
※戻り値はスタンプ数を返す
※answerの領域は魔法少女プラットフォームで確保し、魔法少女に与える
魔法少女をC++で実装する場合は、魔法少女の関数定義を次のように宣言するとよい
extern "C" int PuellaMagi(PROBLEM *problem, int *answer_len, UBYTE *answer)
23. Puella Magi状態遷移図
準備
完了
問題 計算開始
計算完了
待機 終了 計算
起動
終了 終了
休止
26. KUMA-API
• int KUMA_init(int my_port, int rand_seed)
– KUMAの初期化処理。引数は自分の受信ポートと乱数シード
• int KUMA_connect(char *ip, int sendport)
– 接続処理。戻り値は通信ハンドル
• int KUMA_send(int handle, int length, unsigned char *message)
– メッセージ送信。送信メッセージが大きい場合は分割される。また、同期処
理で送信される。
• int KUMA_receive(int *length, unsigned char **message)
– メッセージ受信処理。受信したメッセージへのポインタを返す。分割された
メッセージは結合されたものが返される。返されたメッセージ領域は
KUMA_freeで解放しなければいけない。
• int KUMA_free(unsigned char *message)
– KUMA_receiveで受け取ったメッセージ領域を開放する
• int KUMA_term (int handle)
– 終了処理
27. KUMA パケット構成
Message
PacketID fromPort TotalLen DivNo MessageLen
(4) Offset BEAR Message
(4) (4) (4) (4)
(4)
フィールド名 意味 サイズ
パケットのID。分割されたパケットは同一IDを持つ。パケットIDは0以
PacketID 4bytes
外の値である。
fromPort 送信元が送信したPort 4bytes
TotalLen メッセージ全体長(分割前の長さ) 4bytes
DivNo パケットの分割数 4bytes
MessageLen メッセージ領域のデータサイズ 4bytes
メッセージ部が分割されたメッセージの先頭から何バイト目からのも
MessageOffset 4bytes
のであるかを示す
(Message
Message 送信するメッセージ本体(BEARが生成するパケット)
Len)bytes
28. KUMAの分割送信
送信側 受信側
BEAR KUMA KUMA BEAR
確認パケット
・message長を1024としたとき、受信側は9パケット受信毎に送信側に確認パケッ
トを送信する
・送信側は9パケット送信すると受信待ちとなり送信を停止する
・更新側から9の倍数のパケットを送るとき、最終パケットを送信した後の確認
パケットは送信しない
30. BEAR-API
• int BEAR_init(int my_id)
– BEARの初期化処理。
• int BEAR_connect(int dest_id)
– 指定したサブシステム(dest_id)との接続処理を行う。どちらかのサブシステムが魔法少女の場合、IPアドレスはもう一方のサブシステムのIPアドレスと同
じとして、KUMAを初期化する
• int BEAR_send_message(int dest_id , int message)
– メッセージ送信
• int BEAR_agreement_puellamagi(int dest_id , int puellamagi_id)
– 魔法少女(アルゴリズム)の起動要求
• int BEAR_agreement_puellamagi_result(int dest_id , int puellamagi_id )
– 魔法少女(アルゴリズム)の起動結果
• int BEAR_send_problem(int dest_id , int length, char *problem)
– 問題を送信する
• int BEAR_send_problem(int dest_id , int puellamagi_id )
– 問題を受信応答
• int BEAR_calc_start(int dest_id , int puellamagi_id)
– 魔法少女(アルゴリズム)の計算開始要求
• int BEAR_calc_start_res(int dest_id , int puellamagi_id )
– 魔法少女(アルゴリズム)の計算開始応答
• int BEAR_calc_end(int dest_id , int puellamagi_id )
– 魔法少女(アルゴリズム)の計算終了通知
• int BEAR_req_answer(int dest_id , int puellamagi_id )
– 魔法少女(アルゴリズム)の計算結果送信要求
• int BEAR_send_answer(int dest_id , int length, char *answer)
– 計算結果送信
• int BEAR_kill_puellamagi(int dest_id , int puellamagi_id )
– 魔法少女(アルゴリズム)終了要求
• int BEAR_kill_puellamagi_res(int dest_id , int puellamagi_id )
– 魔法少女(アルゴリズム)終了応答
• int BEAR_receive(int *send_id, int *message, int *length, unsigned char **parameter)
– メッセージ受信処理。送信元のサブシステムIDと受信したメッセージへのポインタを返す。分割されたメッセージは結合されたものが返される。返され
たメッセージ領域はBEAR_freeで解放しなければいけない。
• int BEAR_free(unsigned char *message)
– BEAR_receiveで受け取ったメッセージ領域を開放する
• int BEAR_term (int dest_id )
– 指定したサブシステムとの接続処理を終了する。該当IDの接続管理のための内部変数や動的に確保したメモリ領域を開放する
31. メッセージ一覧
メッセージ名 マクロ名 パラメータ部 I←→S S←→P
接続確認 MSG_CONNECT_REQ なし → ×
接続応答 MSG_CONNECT_RES なし ← ×
魔法少女起動要求 MSG_WAKEUP_REQ 魔法少女ID → →
魔法少女起動応答 MSG_WAKEUP_RES 魔法少女ID ← ←
問題送信 MSG_PROBLEM 問題データ → →
問題受け取り確認 MSG_PROBLEM_ACK ← ←
戦闘開始 MSG_CALC_START 魔法少女ID → →
MSG_CALC_START_R 魔法少女ID
戦闘開始応答 ← ←
ES
魔法少女ID
戦闘終了通知 MSG_CALC_END ← ←
魔法少女ID
戦闘報告要求 MSG_ANSWER_REQ → →
戦闘報告 MSG_ANSWER_RES 解答データ ← ←
魔法少女終了要求 MSG_TERM_REQ 魔法少女ID → ×
魔法少女終了応答 MSG_TERM_RES 魔法少女ID ← ×
エラー MSG_ERROR なし ←→ ←→
32. BEARメッセージ構成
SendID Message ParamLen
Parameter
(4) (4) (4)
フィールド名 意 味 サイズ
SendID 送信元ID 4bytes
Message メッセージ種別 4bytes
パラメータ部の長さ。魔法少女契約、問題と回答以外のメッセージは0であ
ParamLen 4bytes
る
魔法少女名、問題と回答が格納される。それ以外のメッセージではこの
Parameter N bytes
フィールドは存在しない
※BEARはこのデータ形式でKUMAとやりとりする
33. C#版KUMA, BEAR
BITTER, MELON
• IncubatorはC#で記述されるため、KUMAと
BEARをC#で実装する必要がある
• C#で実装したBEARをBITTER、KUMAを
MELONと呼ぶ
50. ご清聴
ありがとうございまし
た!
沖縄高専 ICT委員会
おすぞ☆すたんぷ