Grid Challenge in SACSIS 2005

規定課題出題API(C言語用)

参加プログラムは、出題APIを用いて問題の取得と解答の正解判定をする必要がある。 出題APIを用いるためには、
#include "grid_challenge_api.h"
によってヘッダファイルをインクルードし、またリンク時にはlibgrch.a をリンクすること。参加者の環境で以下のAPIを使ってプログラムを開発するための パッケージお試しパックが用意されている。

int get_problem(const int problem_number, const char* config_dir, const char** key_string, int* width, int* height);
プログラムは開始時にget_problem()を呼ぶことにより、データ復号化鍵などを 取得する必要がある。全ノードを通して一つのプロセスのみがget_problem()を 呼ぶこと

problem_number: 問題番号を指定する。
config_dir: お試しパックにおいては、正答ファイル (例えば01.ansという名前のファイル)の置いてあるディレクトリ (例えば/some/where/data01)を 指定する。予選・決勝においてはNULLとすること。
key_string: 鍵文字列が返されるアドレスである。鍵文字列は、 データ復号化鍵を含む、0で終る文字列である(詳細は後述)。 鍵文字列は出題API内部でstaticに確保されているので、freeしないこと。
width: 元画像の、X方向の分割数が返されるアドレスである。
height: 元画像の、Y方向の分割数が返されるアドレスである。

return value: 正常の場合は0、異常の場合は0以外が返される。

鍵文字列は"XXXX-YYYYYY"という形式の文字列である。`-'(ハイフン) 以前のXXXXという部分は、16進ASCII表現による復号化鍵である。 復号化鍵の長さは固定ではないため、`-'の位置によって判断すること。 また、復号化鍵の長さをL bytesとすると、Lは4以上256以下で4の倍数であることが 保証される。 復号化鍵の各byteは左にゼロ詰めされた2桁16進で表される。そのため、 XXXXの部分の長さは2*L文字である。 プログラムはYYYYYYの部分について気にする必要はないが、 文字列全体をそのままget_problem_files()とanswer_problem()に渡す必要がある。
int get_problem_files(const int problem_number, const char* key_string, const char* problem_dir, const char** problem_file_list);
プログラムは、各クラスタ内の少なくとも1つのプロセスで、 get_problem_files()を呼ぶことにより入力ファイル名を取得する必要がある。 get_problem()から得られた 鍵文字列が必要なので、前もって通信などを行なっておくこと。

problem_number: 問題番号を指定する。
key_string: get_problem()から得られた、鍵文字列を指定する。
problem_dir: お試しパックにおいては、問題ファイルの置いてあるディレクトリ (例えば/some/where/data01)を 指定する。予選・決勝においてはNULLとすること。
problem_file_list: 呼び出したノードの属するクラスタにおいてアクセス可能な 全画像ファイル(マスター、レプリカすべて)のフルパス名を 連結した文字列が返されるアドレスである。 各ファイル名の直後には全て : (コロン)が置かれている。

return value: 正常の場合は0、異常の場合は0以外が返される。
このAPIを呼び出したマシンによって、problem_file_listに 返されるファイルの集合は一般には異なっている。具体的には、 マシンA, Bでの呼出しで返される二つの集合は、 (1) 全く同一であるか、(2) それらのファイル集合中に含まれるマスターファ イルに全く重なりがない、のどちらかが満たされている。
二つのマシンが同一クラスタ内のマシンである場合、それらは同一 の共有ディレクトリ(ファイルサーバ)をアクセスしており、この場合は(1)に なり、そうでない場合は(2) になる。プログラム作成にあたっては、 この事実を用いても良いし用いなくても良い。
int answer_problem(const int problem_number, const char* key_string, const int result, const char* file_coordinates, const char* config_dir);
プログラムは計算が終了したら、その解答をanswer_problem()を用いて 報告する必要がある。解答に対する判定が返される。 get_problem()を呼び出したプロセスのみが、answer_problem()を 呼ばなければならない。

problem_number: 問題番号を指定する。
key_string: get_problem()から得られた、鍵文字列を指定する。
result: 解答である、物体の総数を指定する。
file_coordinates: 解答に使った画像ファイル群を示す文字列を 指定する(詳細は後述)。
config_dir: お試しパックにおいては、正答ファイルの置いてあるディレクトリ (例えば/some/where/data01. get_problemに渡したのと同じディレクトリ名)を 指定する。予選・決勝においてはNULLとすること。

return value: Resultに対する判定が返される。返される値は以下のうちの どれかである。
  • GRCH_CORRECT: 正解であり、全ての画像ファイルを使用した。
  • GRCH_OK: 一部の画像ファイルが使われていないが、 使用されたファイル群については正解である。
  • GRCH_WRONG: 不正解である。
  • GRCH_NG: 不正な呼び出しである。引数が不正である、 get_problemを呼んでいないプロセスが呼んでいるなど。
標準エラー出力に解答時間を可読形式にしたものと、正解証明の鍵が出力される。 正解証明の鍵はGRCH_CORRECTの場合にのみ付加される。
File_coordinatesは、 WとHをそれぞれ元画像のX方向の分割数とY方向の分割数とすると、 W*H個の'0'または'1'が並んだ文字列である ((char)0や(char)1ではなく、(char)'0'と(char)'1'であることに注意)。 各文字は1つの画像ファイルに対応し、'1'は対応する画像ファイルが 解答のために使用されていることを、'0'は使用されていないことを表す。 画像ファイルは左上の画像ファイルを起点として行優先で並べる。 つまり、i行j列の画像ファイルが使われていれば、 上記文字列の(i + W * j)文字目を'1'に、使われていなければ'0'にする (行、列、文字のいずれも0を起点として数える)。 なお、決勝において有効な判定(後述のGRCH_CORRECT)を得るためには、 全ての画像ファイルを使用したことを示すために、W*H個の文字の全てが'1'で ある文字列を与える必要がある。