---------------------------------------------------------------------
    Operation instructions for Bonanza Feliz 0.0 Windows Binary
                                             Kunihito Hoki, Jan 2010
---------------------------------------------------------------------

src/main/ 以下のソースファイルをビルドして得られた Windows 実行形式
bonanza.exe を，他のアプリケーションから利用する方法を記します．ここで、
この Windows 実行形式とは，Makefile.vs 内の /DCSASHOGI マクロを定義し
てビルドされたものです．

まず，子プロセスとして bonanza.exe を起動して下さい．引数 csa_shogi
を指定する必要があります．情報のやり取りは anonymous pipe で行います．
bonanza.exe は作業用ファイル book.bin, hash.bin, game.csa,
restraint.dat を参照・生成します．これらのパスは，子プロセプロセスを生
成する際に指定されたカレントディレクトリになります．

このフォルダ内にある以下のファイルは sikou.dll のソースファイルです．
Visual C++ 2008 によりビルド可能なことを確認しています．サンプルとして
参考にして下さい．

- Makefile
- sikou.c      
- sikou.h
- sikou.rc
- bonanza.ico


bonanza.exe への入出力一覧表を以下に列挙します．

【入力コマンド一覧】
一行単位で入力を受け付けます．最後に必ず改行コードをつけて下さい．

また，read [filename] コマンドで棋譜を読み込む際，可能な限り棋譜には初
期局面からの指し手を記述して下さい．現局面を初期局面と見なす等した場合，
思考ルーチンの千日手に対する取り扱いが上手く働かない場合があります．
bonanza.exe が所持している棋譜は game.csa に保存されています．

予測読みの中断，または新しい条件で初めから読み直しをおこなう副作用があ
るコマンドには * を付けました．主に棋譜の変更，対局条件の変更を行うも
のがこの副作用を持ちます．これらのコマンドを入力した場合，直前まで CPU
時間を消費し続けた予測読みは無駄になるので注意してください．

* mpv num [num]
  読み筋を num 個まで生成する．初期値は 1．この値を大きくするほど思考
  効率は低下する．思考中は無効，予測読み中は読み直し．

* mpv width [num]
  読み筋を複数生成する際，num 以上評価点が低い指し手は考慮しない．初期
  値は 400 程度．この値を大きくするほど思考効率が低下する．思考中は無
  効，予測読み中は読み直し．

- tlp num [num]
  並列処理を行うスレッド数を num に設定．初期値は 1．

- (EOF)
  bonanza.exe を終了．親プロセスで pipe のハンドルを閉じた際に送られる
  ようです．

 book off
  序盤データベースの参照を禁止．book on を入力するまで有効．

- book on
  序盤データベースを参照（初期設定）book off を入力するまで有効．

- book narrow
  序盤データベースの指手のうち，頻度の低い手を採用しない．book wide を
  入力するまで有効．

- book wide
  序盤データベースから幅広く指し手を選ぶ (初期設定)．book narrow を入
  力するまで有効．

- display
  bonanza.exe が保持する盤面を CSA 形式で出力．思考・予測読み中は出力
  結果不定．

* hash [num]
  ハッシュテーブルとして確保するメモリ領域の大きさを指定．大きさは大体，
  2 の num 乗かける 48 バイト程度，初期値は 18．思考中は無効，予測読み
  中は読み直し．

* limit depth [num]
  思考時間を探索の探索基準深さ [num] で制限．思考中は無効，予測読み中
  は読み直し．limit nodes [num], limit time [num] を入力するまで有効．

* limit nodes [num]
  思考時間を探索ノード数 [num] で制限．思考中は無効，予測読み中は読み
  直し．limit depth [num], limit time [num] を入力するまで有効．

* limit time [num1] [num2]
  思考時間を持ち時間で制限 (初期設定)．num1 分，切れてから一手 num2 秒
  に設定．初期設定は 0分 - 10秒．思考中は無効，予測読み中は読み直し．
  limit depth [num], limit node [num] を入力するまで有効．

* limit time strict
  思考時間を持ち時間で制限した場合，切れてから一手辺りの秒数を厳守 (初
  期設定)．思考中は無効，予測読み中は読み直し．limit time extendable
  を入力するまで有効．

* limit time extendable
  思考時間を持ち時間で制限した場合，より良い指手が見つかりそうな場合に，
  切れてから一手辺りの秒数を超えて思考することを許す．思考中は無効，予
  測読み中は読み直し．limit time strict を入力するまで有効．

* time remain [num1] [num2]
  思考時間を持ち時間で制限した場合，持ち時間の残りを秒単位で変更．
  num1  先手残り時間
  num2  後手残り時間

* move
  次の一手を思考し，bonanza.exe が保持する棋譜を一手進める．思考中は無
  効，予測読み中は読み直し．

- [move]
  対局相手の指し手 [move] を受け取り，次の一手を思考．更に bonanza.exe
  が保持する棋譜を一手進める．手を表す文字列 [move] の形式は CSA 形式
  の指手から +, - を除いたもになります．(例：7776FU, 0087FU) 思考中は
  無効．直前まで行っていた予測読みがヒットした場合，その結果を利用して
  思考する．

* move [move]
  現在の棋譜から一手進める．手を表す文字列 [move] の形式は CSA 形式の
  指手から +, - を除いたもになります．(例：move 7776FU, move 0087FU)
  思考中は無効，予測読み中は読み直し．

* move restraint
  次の一手を思考．但し，restraint.dat 内に羅列されている合法手を指さな
  いようにする．ファイル内の文字列は以下のようにして下さい．
  -------- restraint.dat --------
2726FU(改行)
7776FU(改行)
(EOF)
  -------------------------------
  思考中は無効，予測読み中は読み直し．

* new
  bonanza.exe が保持する棋譜を平手の初期状態に復帰 (初期設定)．思考中
  は無効，予測読み中断．

- ping
  pong の出力を促す．

- ponder on
  予測読み機能オン（初期設定）．ponder off を入力するまで有効．

* ponder off
  予測読み機能オフ．予測読み中は中断．ponder on を入力するまで有効

* read [filename] t [num]
  CSA 形式の棋譜ファイルを読む．bonanza.exe が保持する棋譜を更新．思考
  中は無効，予測読み中は新しい局面から読み直し．
  [filename]  ファイル名を指定．ピリオド "." を指定した場合は現在の棋
              譜を読む．
  [num]       手数を指定．省略した場合は終端まで読む．

- resign [num]
  投了するスコアの下限 num を指定．32600 に設定すると投了しない．初期
  設定は 533．

- s
  次の一手をできるだけ早く指させる．思考中でない場合は無効．


【出力】　（一行単位で行います．最後に必ず改行コードが存在します）

move[move]
  思考結果の指手．手を表す文字列 [move] の形式は CSA 形式の指手から +,
  - を除いたもになります．(例：move7776FU, move0087FU)

info ponder start
  予測読みを開始するときに出力

info ponder end
  予測読みが終了した時きに出力．'info ponder start' が出力されてから
  '[move]' コマンドを入力するまでが実際に予測読みに費やした時間．予測
  読みの中断・読み直しを行った場合，途中で 'info ponder end' が出力さ
  れる．

info[statistics]
  思考した局面が序盤データベース内に見つかった場合に出力される統計情報．
  (例：info 7776FU(86%) 2726FU(14%))

info[score] [move sequence]:...
  思考中に多数回出力される思考の途中経過．mpv num の値を 2以上指定する
  と，文字 ":" で区切って [score] [move sequence]　を複数出力する．

  [score]
    出力された時点での bonanza の推定評価値
     325.99            - 先手にとって優勢な繰り返し
     325.98 ~  300.01  - 先手玉詰み
     300.00 ~ -300.00  - 評価値．1点が歩一枚分に相当
    -300.01 ~ -325.98  - 後手玉詰み
    -325.99            - 後手にとって優勢な繰り返し

  [move sequence]
    出力された時点での bonanza の推定最善応手．CSA 形式の指手をスペー
    スで区切って出力
  (例：info+0.43 -5142OU +2726FU -4232OU +2625FU -7162GI)

info tt [num]
  思考に費やした時間 num を出力

pong
  ping 入力を与えた際に出力

statsatu=[num1] cpu=[num2] nps=[num3]
  思考終了時に出力される bonanza のコンピュータ資源使用状況推定値．現
  局面局が序盤データベース内で見つかった場合は出力されません．
  [num1]  ハッシュ領域使用パーセンテージ
  [num2]  CPU 時間占有パーセンテージ
  [num3]  一秒当たりの検索ノード数 / 1000
  (例：statsatu=22 cpu=98 nps=886.28)


【例】
入出力の一例．[out]: 以降の行は出力，[in]: 以降の行は入力を表す．

 1 [out]: Bonanza Version 4.0.3 - The Computer Shogi Engine
 2 [in ]: book off
 3 [in ]: 5968OU
 4 [out]: info+0.47 -5142OU +7776FU -3334FU +3948GI ...
 5 [out]: info+0.26 -5142OU +7776FU -7162GI +6878OU ...
 6 [out]: info+0.47 -5142OU +7776FU -3334FU +6878OU ...
 7 [out]: info+0.15 -5142OU +7776FU -4232OU +7978GI ...
 8 [out]: statsatu=54 cpu=100 nps=461.92
 9 [out]: move5142OU
10 [out]: info tt 000:10
11 [out]: info ponder start
12 [out]: info+0.27 +7776FU -3334FU +6878OU -4232OU ...
13 [out]: info+0.27 +7776FU -3334FU +6878OU -4232OU ...
14 [out]: info+0.33 +7776FU -3334FU +2726FU -7162GI ...
15 [out]: info+0.32 +7776FU -3132GI +6878OU -4231OU ...
16 [in ]: 7776FU
17 [out]: info ponder end
18 [out]: info+0.13 -8384FU +2726FU -8485FU +2625FU ...


 1     バージョン情報
 2     序盤データベースの参照を禁止させる
 3     先手の初手▲６八王．後手の次の指し手を bonanza に思考させる
 4-  7 評価値，読み筋途中経過
 8     コンピュータ資源使用状況推定値
 9     思考結果の指手
10     思考に費やした時間
11     予測読み開始の合図
12- 15 評価値，読み筋途中経過．読み筋第一手目▲７六歩は予測手．
16     先手の２手目▲７六歩．後手の次の指し手を bonanza に思考させる
17     予測読み終了の合図
18     評価値，読み筋途中経過
