====== リファレンス(Book系コマンド編) ======
~~SOCIAL_META:
description = EdaxのBook系コマンドのリファレンスです。
~~
Edaxのコマンドについて、ヘルプの説明だけではよくわからないものもあるので、仕様を整理してみました。コマンドにもいろいろな種類がありますが、今回はBook系のコマンドについて整理しました。それ以外のものについては下記リンクを参照ください(リンク切れのものは未作成です)
* [[edax:ref_command_basic|基本コマンド]]
* Book系コマンド(本ページ)
* [[edax:ref_command_db|データベース系コマンド]]
* [[edax:ref_command_test|テスト系コマンド]]
* [[edax:ref_option|オプション]]
Book系のコマンドを使う上では、[[edax:book|Bookとは]]を参照して基本的な概念を覚えておくと理解しやすいと思います。
[隠しコマンド]と書かれているコマンドはヘルプに記載されていないコマンドですので、使用する場合は自己責任にてお願いします
===== リファレンス =====
==== 管理系コマンド ====
=== book new ===
**書式**
book new レベル 深さ
指定されたレベルと深さのBookを新規に作成します。レベルの初期値は21、深さの初期値は36です。作成直後は、初期局面のみが登録されています。
コマンドを実行した時点ではメモリ上に作成するのみでファイルは更新されませんが、''quit''や''exit''を実行してEdaxを終了した時に自動でファイルに保存されます。既存のBookファイルは上書きされてしまうので注意してください。
**実行例**
book new 24 40
=== book merge ===
**書式**
book merge ファイル名
「現在のBook」に、指定された「マージ対象のBookファイル」をマージします。Bookのレベルや深さは「現在のBook」のまま変わりません。「マージ対象のBookファイル」に含まれるpositionの内、「現在のBook」に存在しないpositionがleaf情報とともに取り込まれます。取り込まれたpositionは元のpositionのレベルを引き継ぎます(これによって異なるレベルのpositionが混在するBookファイルができるケースがあります)。また、取り込まれたpositionの評価値等は未計算のままになっているので、メッセージにも出力されますが使用前に''book fix''を行ってください。
「現在のBook」と「マージ対象のBookファイル」の両方に同じpositionがある場合は取り込まれませんが、ソース上は「マージ対象のBookファイル」の方がレベルが高ければleaf情報を取り込む意図っぽいコードもあり(実際には動作しません)、現状の動作が想定通りなのかどうかはよくわかりません。
**実行例**
book merge data/book2.dat
=== book depth ===
**書式**
book depth 深さ
現在のBookの深さを指定した値に変更します。大きくすることも小さくすることも可能です。保存が行われるわけではないので、変更後は''book save''コマンドを実行して保存してください。また、深さの値を小さくしたからと言って、既に登録されているそれ以上深い局面のデータが削除されるわけではありません。
値を指定しなかった場合は、36を指定したものとみなされます。
**実行例**
book depth 40
=== book info ===
**書式**
book info
Bookの基本情報を表示します。表示内容は「[[edax:book|Bookとは]]」を参照してください。
=== book fix ===
**書式**
book fix
Book内の各種情報を再計算・再設定します。以下の処理が行われます。
* 各position情報が正しいかのチェック(盤面の状態、手の合法性、二重登録チェック等)。正しくない場合は以下を実行。
* 不正な盤面の場合は削除
* 正しい盤面であれば、positionのレベルをBookのレベルに再設定し、linkの張り直しとleafの再計算を実施
* 全positionに対してlinkの張り直し(ただし、追加のみで削除は行われません)
* 全positionに対して評価値、勝敗数等の統計情報の再計算(leafの再探索は行われません)
* 全positionに対してlinkの順序を評価値の高い順に並べ直し
=== book prune ===
**書式**
book prune
以下の局面がBookから削除されます。
* Bookに指定された深さを超える局面
* 初期局面から以下のどちらかを満たすBook内の手(link)をたどって到達できない局面
- 黒はBook内の最善手を打ち続ける(白は最善手でない手を打って良い)
- 白はBook内の最善手を打ち続ける(黒は最善手でない手を打って良い)
例えば、以下の3つの定石が登録されているBookがあったとします。
* f5d6c3d3c4(虎定石)
* f5d6c5f4e3c6(兎定石)
* f5d6c5f4e3d3(三村流)
このBookに対して''book prune''を実行した場合、以下のようになります。
* 虎定石は双方最善なので残ります
* 兎定石は3手目のc5で黒が最善ではない変化をしていますが、白は最善を打ち続けているので2の条件を満たし、残ります
* 三村流は3手目のc5で黒が最善ではない変化をしており、6手目のd3で今度は白が最善ではない変化をしたので、1,2のいずれの条件も満たせず、最後のd3を打った後の局面が削除されます
また、削除後に''book fix''と同じ処理を行い、各種再計算を行っています。
ヘルプを見ると、到達できない局面だけが削除されそうに見えますが、上述の通り双方が最善ではない変化を行った局面は削除されてしまうので注意してください。
=== book subtree ===
**書式**
book subtree
現局面以降の局面以外を全て削除します。削除後に''book fix''と同じ処理を行い、各種再計算を行っています。
例えば、''f5d6c3''としてから''book subtree''を行うと、虎系以外は全て削除され、虎系のみのBookとなります。
初期局面や、初期局面から現局面に至る局面も削除されてしまいますが、Bookの仕様上あまり良くない状況なので、''book subtree''実行後は、''book store''を行って、初期局面から現局面までの局面を再登録しておくことを強く推奨します。
=== book negamax[隠しコマンド] ===
**書式**
book negamax
Book内の評価値関連情報を再計算します。以下の処理が行われます。
* 全positionに対して評価値、勝敗数等の統計情報の再計算(leafの再探索は行われません)
* 全positionに対してlinkの順序を評価値の高い順に並べ直し
''book fix''の後半部分の処理のみが行われます。
=== book correct[隠しコマンド] ===
**書式**
book correct
Book内の局面のうち、完全読み(終局までselectivity=100%で探索)を行っている局面について、leafを再探索します。
探索後は''book fix''と同じ処理を行い、各種再計算を行っています。
結果は、元々のBookファイル名に拡張子''.err''を付加したファイル名で保存されます。
過去、バグによってBookのleafが誤って登録されることがあったことに対する復旧コマンドのようです。
=== book stats[隠しコマンド] ===
**書式**
book stats
Book内の局面についての統計情報を出力します。以下の内容が出力されます。
- ハッシュ値の分布
* 局面はメモリ上で、ハッシュ値を元にサイズ=$2^k$の配列内に格納されています($k$の値はBookの規模によって決まります。最小サイズは$2^{16}=65536$です)。この$2^k$個の格納先について、局面がいくつずつ格納されているかの分布が出力されます。
* indexは同一の格納先に格納されている局面の個数を表します(indexという名称から格納先の位置のような印象がありますが、違うようです)
* positionsは局面の個数がindex個格納されている格納先の個数を表します。つまり$\Sigma(positions)=2^k$、$\Sigma(positions \times index)=$全局面数、となります。
- 空きマス数の分布
* 空きマス数ごとの局面の分布が出力されます。
* stageは空きマス数を表します。stage=60は初期局面です。
* positionsはの局面数を表します。
* linksはlinkの数を表します。
* leavesはleafの数を表します。
* terminal nodesは末端の局面、すなわちlinkが1つもない局面の数を表します。
- 評価値の分布
* 評価値ごとの局面の分布が出力されます。
* Scoreは局面の評価値を表します。
* positionsはの局面数を表します。
**出力例**
Book statistics:
Hash distribution:
index positions
0 23921
1 24000
2 12174
3 4133
4 1055
5 216
6 34
7 3
Stage distribution:
stage positions links leaves terminal nodes
22 467 0 467 467
23 413 473 413 0
24 365 416 365 0
(中略)
58 3 8 2 0
59 1 3 0 0
60 1 4 0 0
Best Score Distribution:
Score positions
-64 8
-62 3
(中略)
+62 7
+64 11
=== book verbose[隠しコマンド] ===
**書式**
book verbose ログ出力レベル
Bookを学習する際のログ出力レベルを指定します。
**実行例**
book verbose 2
=== book check[隠しコマンド] ===
**書式**
book check 棋譜データベースファイル名
指定された棋譜データベースの棋譜に現れる全局面について、Book上の最善の手かどうかを集計し出力します。
* missingは棋譜データベース上に現れる局面のうち、Bookに存在しない局面の数を表します
* goodは棋譜データベース上で打たれた手について、Book上の最善であった手の数を表します
* badは棋譜データベース上で打たれた手について、Book上の最善ではない手の数を表します
棋譜データベースで打たれた手で、その局面はBook上に存在していて、かつその手はBookに登録されていない場合は、上記のいずれにもカウントされないようです。
**実行例**
book check game.txt
==== 学習・拡張系コマンド ====
=== book store ===
**書式**
book store
棋譜を学習するコマンドです。
最新の対局の各局面のうち、Bookに指定された深さまでの範囲で、かつBookに未登録の局面をBookに追加し、leafを探索します。詳細は[[book#bookに棋譜を追加した時に何が起きているのか|「Bookとは」内の説明]]を参照してください。
学習した結果は、元々のBookファイル名に拡張子''.store''を付加したファイル名で保存されます。
=== book deviate ===
**書式**
book deviate 相対誤差 絶対誤差
Bookを拡張するコマンドです。まず、拡張対象となる局面の選定を行い、選定された局面を拡張する、という2つのステップで行われます。
- 拡張対象となる局面の選定
- 既にBookに登録されている局面に対し、現局面を起点に(以降、この局面を起点局面と呼びます)以下の条件を満たす手(link)をたどっていきます
* 評価値が、自分側(起点局面の手番側)は「その局面の最善の評価値ー相対誤差」以上の手、相手側は最善の手
* 評価値が、「起点局面の評価値±絶対誤差」の範囲内
- たどった局面のうち、最善の手とleafの手の評価値の差が、自分側は相対誤差以内、相手側は0以内であれば、その局面を対象局面とします
- 選定された局面の拡張
- 選定された局面Aについて、leafの手を打った局面BをBookに追加し、局面Bのleafを探索します
- 局面Aについてleafを再探索します(局面Bを追加したことにより、元々のleafがlinkになったので)
以上のステップを、自分側と相手側の立場を入れ替えてもう一度行います。
さらに、上記を追加する局面がなくなるまで繰り返し行います。結果、「自分は相対誤差だけ悪い手を打って良く、相手は常に最善」「自分は常に最善で、相手は相対誤差だけ悪い手を打って良い」という条件でたどり着く局面について、Bookの深さに到達するまでBookを拡張することになります。
結果は、元々のBookファイル名に拡張子''.dev''を付加したファイル名で保存されます。
相対誤差、絶対誤差の省略値はそれぞれ2,4です。
**実行例**
book deviate 2 4
=== book enhance ===
**書式**
book enhance 序中盤誤差 終盤誤差
Bookを拡張するコマンドです。まず、指定された序中盤誤差、終盤誤差に基づいて、Bookの各局面の評価値の上限と下限を再計算します。上限・下限については[[book#上限・下限|「Bookとは」内の説明]]を参照してください。その後、拡張対象となる局面の選定を行い、選定された局面を拡張する、という2つのステップの処理が行われます。
- 拡張対象となる局面の選定
- 既にBookに登録されている局面に対し、現局面を起点に以下の条件を満たす手(link)をたどっていきます
* 手の評価値の上限がその局面の評価値の上限以上の手(実際には超えることはないはずなので、上限と等しい)
* または、手の評価値の下限がその局面の評価値の下限以上の手(こちらも実際には超えることはないはずなので、下限と等しい)
- たどった局面のうち、leafの評価値の上限がその局面の評価値の上限以上、またはleafの評価値の下限がその局面の評価値の下限以上であれば、その局面を対象局面とします
- 選定された局面の拡張
- 選定された局面Aについて、leafの手を打った局面BをBookに追加し、局面Bのleafを探索します
- 局面Aについてleafを再探索します(局面Bを追加したことにより、元々のleafがlinkになったので)
以上のステップを、追加する局面がなくなるまで繰り返し行います。
結果は、元々のBookファイル名に拡張子''.enh''を付加したファイル名で保存されます。
序中盤誤差 終盤誤差の省略値はそれぞれ2,4です。
序中盤誤差と終盤誤差は意味的に序中盤誤差の方が大きいはずなので、省略値が適切ではないように思われます。
**実行例**
book enhance 4 2
=== book fill ===
**書式**
book fill 深さ
Bookに登録された各局面に対して、指定された深さ分だけ任意の手を進めたときに再びBook内の局面に到達した場合、その過程の局面がBookに未登録であれば追加登録します。
例えば、虎定石f5d6c3d3c4だけが登録されているBookについて、''book fill 3''を行うと、Book内にあるf5d6の局面からc4d3c3と3手進めると(いわゆる猫→虎)再びBook内の局面に到達するので、この途中の局面がBookに追加されることになります。
結果は、元々のBookファイル名に拡張子''.fill''を付加したファイル名で保存されます。
深さの省略値は1です。
**実行例**
book fill 2
''book store'',''book deviate'',''book enhance''等でBookに新たな局面を追加する場合、追加した局面で打てる手全てについて、その次の局面がBookにあればlinkを張るので、深さ=1で''book fill''を行う意味はないように思われます。
=== book add ===
**書式**
book add 棋譜データベースファイル名
指定した棋譜データベースの棋譜をBookに追加します。データベースに関しては、[[edax:ref_command_db|データベース系コマンド]]を参照してください。
結果は、元々のBookファイル名に拡張子''.gam''を付加したファイル名で保存されます。
**実行例**
book add game.txt
=== book play[隠しコマンド] ===
**書式**
book play
Bookを拡張するコマンドです。まず、拡張対象となる局面の選定を行い、選定された局面を拡張する、という2つのステップで行われます。
- 拡張対象となる局面の選定
- Bookの深さの範囲内で、かつlinkが1つも登録されていない局面を対象局面とします
- 選定された局面の拡張
- 選定された局面Aについて、leafの手を打った局面BをBookに追加し、局面Bのleafを探索します
- 局面Aについてleafを再探索します(局面Bを追加したことにより、元々のleafがlinkになったので)
以上のステップを、追加する局面がなくなるまで繰り返し行います。
結果は、元々のBookファイル名に拡張子''.play''を付加したファイル名で保存されます。
=== book deepen ===
**書式**
book deepen
v4.4現在、このコマンドは機能しないように思われます。実装上は、Bookのレベルとpositionのレベルを比較し、異なる場合はpositionのレベルに基づいて再計算を行います。positionは元々positionのレベルに基づいて計算されているはずなので、通常は評価値は変わらないものと考えられます。ヘルプコマンドではパラメータとしてレベルを指定し、Bookのレベルを変更するコマンドのように書かれていますが、レベルを指定しても何も使われません。
==== 利用系コマンド ====
=== book on ===
**書式**
book on
''go''コマンド、''hint''コマンド、自動対戦の際に、Bookを使用するようにします。初期値はonです。
=== book off ===
**書式**
book off
''go''コマンド、''hint''コマンド、自動対戦の際に、Bookを使用しないようにします。初期値はonです。
=== book show ===
**書式**
book show
現局面のBook情報を表示します。表示内容は「[[edax:book|Bookとは]]」を参照してください。
=== book analyze (a) または book analyse ===
**書式**
book analyze 手数
book analyse 手数
Bookを利用して棋譜の解析を行います。基本コマンドの[[ref_command_basic#analyze_a_または_analyse|analyze]]コマンドとほぼ同じですが、以下の点が異なります。
* 解析にはBookのみを使用する。したがって、Bookの存在する局面のみが出力対象となる。
* 引数に手数を指定することができる。手数は、最終局面から何手遡った局面までを解析対象とするかを表す。手数は省略可能で、省略すると全ての手を解析対象とする。
* 最後の統計は出力されない
**実行例**
book analyze 60
=== book randomness ===
**書式**
book randomness 値
''go''コマンド、自動対戦の際に、Book中でその局面に登録されている最善手の評価値からいくつ低い評価値の手までを採用するかを指定します。採用する手はその範囲の中からランダムで決まります。例えば''book randomness 2''とした場合で、その局面の最善手の評価値が+3だった場合、採用する手は+3〜+1の範囲の手の中からランダムで決まります。
値を指定しなかった場合は、0を指定したものとみなされます。また、初期値は0です。
**実行例**
book randomness 2
=== book problem[隠しコマンド] ===
**書式**
book problem 空きマス数 局面数
Bookの中にある局面のうち、以下の条件を満たす局面を指定された局面数だけ出力します。
* 空きマス数が指定された空きマス数
* linkとleafを合わせて2手以上の手が登録されている
* 最善手の評価値が次善手の評価値よりも高い(等しくない)
出力結果は、最初の64文字が盤面の配置(Xが黒石、Oが白石、-が空きマス)、次の1文字が手番(X or O)、bmの後が最善手とその評価値、baの後が次善手とその評価値です。
空きマス数と局面数の省略値はそれぞれ24と10です。
**実行例**
>book problem 57 5
Extracting 5 positions at 57 ...
-------------------O-------OXX-----XX-----X--------------------- O % bm d6:+0; ba f5:-2;
-----------------X--------XOO------XX------X-------------------- O % bm f6:+9; ba e6:+7;
------------------X-------OXO------XX------X-------------------- O % bm e6:+4; ba c6:+1;
-------------------X------OXO-----XXX--------------------------- O % bm c2:-6; ba c6:-7;
---------------------X-----OXX-----XXX-------------------------- O % bm f6:+1; ba g4:-1;
最善手が1つしかない局面ということなので、「次の一手」を出題するためのコマンドと思われます。
=== book feed-hash[隠しコマンド] ===
**書式**
book feed-hash
現局面配下でBookに登録されている局面をメモリ上のhashテーブルに登録します。
用途はよくわかりませんでした。
==== ファイル操作系コマンド ====
=== book load または book open ===
**書式**
book load ファイル名
book open ファイル名
指定されたBookファイルを読み込みます。
ファイルが存在しなかったり、メモリが足りなかった場合など、読み込みに失敗すると内部で''book new''が行われ、新規にBookを生成します。この時点ではメモリ上に新規作成されただけですが、''book new''の注意書きに書いたように、この後Edaxを終了すると既存のBookファイルは新規の空のBookファイルで上書きされてしまいますので、必要であれば速やかに退避してください。
**実行例**
book load data/book.dat
=== book save ===
**書式**
book save ファイル名
指定されたファイル名でBookを保存します。
**実行例**
book save data/book.dat
=== book import ===
**書式**
book import ファイル名
''book export''コマンドでexportしたファイルからBookの内容を読み込みます。新規のBookとして取り込まれます(現在のBookに追加するわけではなく、新規のBookとなるので注意してください)。また、本コマンドでは読み込んだ内容はメモリ上に展開されるだけなので、必要であれば本コマンド実行後、''book save''コマンドで読み込んだBookを保存してください。新規のBookのレベルと深さは、取り込んだpositionのレベルと深さの中で最大のものになります。
また、読み込み後に''book fix''と同じ処理を行い、各種再計算を行っています。
v4.3.2以前はバグがあり、取り込んだBookの深さは1になります。実行後、''book depth''コマンドで適切な深さに再設定してください。このバグはv4.4で修正されています。
**実行例**
book import data/book_export.txt
=== book export ===
**書式**
book export ファイル名
指定したファイルにBookの内容を書き出します。ファイルはCSV形式で書き出されます。CSVの各行は1つのpositionを表し、以下の項目が出力されます。
* 盤面の状態(Xが自分、Oが相手、-は空きマス。最後のXは今の手番が自分であることを表します)
* positionのレベル
* そのpositionのleafの手
* leafの評価値
**実行例**
book export data/book_export.txt
=== book extract[隠しコマンド] ===
**書式**
book extract 出力ファイル名
Bookに登録されている局面で、初期配置から両者最善の進行の棋譜を指定されたファイルに出力します。出力ファイル形式は''.txt'',''.ggf'',''.sgf'',''.pgn'',''.wtb'',''.edx''に対応しています。
出力される棋譜は、対称形や虎と猫→虎を重複して出力しないようにするために、最初の数手が''F5D6C4''または''F5F6E6F4''のもののみが出力されます。
最初の部分の重複を避けるだけで、途中で合流するような棋譜は全てのパターンが出力されます。
指定された出力ファイルが既に存在する場合は、そのファイルに追記されます。
なお、出力ファイルが存在しない場合はファイルがない旨の警告メッセージが表示されると思いますが、ファイルは出力されます。