Permalink
592 lines (393 sloc) 32.1 KB

■ ファイルの説明
docs/
source/
engine/
2017-early-engine/ やねうら王2017 Ealryの探索部
local-game-server/ 自動対局フレームワーク
user-engine/ ユーザーが独自のエンジンを作るときの作業用フォルダ
shogi.h/.cpp コンパイル時の設定や、各種構造体の定義。
bitboard.h/.cpp Bitboard(盤面の駒のある場所や、ある駒による利きなどを表現するのに使う)
evaluate.h/.cpp 評価関数
misc.h/.cpp バージョン情報など
movegen.cpp 指し手生成器(おそらく世界最速)
move_picker.h/.cpp 指し手のオーダリング器
position.h/.cpp 盤面クラス
search.h/.cpp 探索部
thread.h/.cpp スレッド関係
tt.h/.cpp 置換表
usi.cpp USIプロトコルによる入出力
extra/ やねうら王nanoでは削除する(or 用いない)予定の拡張クラス
all.h すべてのheaderをincludeする横着なheader
bitop.h SSE、AVXの命令をsoftwareでemulationするためのマクロ群
book.h/cpp 定跡関連の処理
config.h shogi.hで設定されたコンパイルオプションに基づき、configurationを行なう。
entering_king_win.cpp 宣言勝ち(入玉判定)
key128.h 128bit,256bitのhash key。(実験用)
long_effect.h/.cpp 遠方駒による長い利きとBitboardなどへの変換子
macros.h マクロ集
mate1ply.h 1手詰めのヘッダー
mate1ply_with_effect.cpp 利きを利用した超高速1手詰め判定関数(おそらく世界最速)
mate1ply_without_effect.cpp 利きを用いない、Bonanza6風の1手詰め
see.cpp PositionクラスのSEEの計算用。
timeman.cpp 思考時間計算用。
test_cmd.cpp UnitTestなど。USI拡張コマンドの"test"コマンド関係。
learn/ 評価関数パラメーターの学習関連
learn.h ここで学習関係のオプション設定を行なうことが出来る。
learner.cpp 棋譜自動生成等(あとで整理する予定)
multi_think.h/cpp マルチスレッドで、Search::think関数を呼び出したいときに用いるthread worker
eval/
evaluate_no_eval.cpp 評価関数なしのときのダミーヘッダ
evaluate_material.cpp 駒割りに関する評価関数
evaluate_bona_piece.cpp BonaPieceを用いるときの共通ヘッダ
kppt/ KPPT型の評価関数とその学習用
kpp_kkpt/ KPP_KKPT型の評価関数とその学習用
■ 解説記事等
やねうら王mini公式より解説記事が一通り読めます。
http://yaneuraou.yaneu.com/YaneuraOu_Mini/
やねうら王公式には、コンピューター将棋関係の記事・資料が盛りだくさん!
http://yaneuraou.yaneu.com/
■ コンパイル方法
Visual Studio 2017 Community Edition(無料で使えます)でビルド一発で実行ファイルが出来るはずです。
★ 思考エンジンの種類の選択
ビルドする思考エンジンの種類として、
・やねうら王2017Early
・詰め将棋エンジン
・連続自動対局フレームワーク
のなかから選択することが出来ます。詳しくはshogi.hをご覧ください。
そのときの開発中のエンジンがdefineされていることが多いのでビルドしたいエンジンを選択してください。
■ よくある質問
★ AVX2非対応のCPU用の実行ファイルの作り方。
shogi.hで
#define USE_AVX2
をコメントアウトします。
例)
// #define USE_AVX2
このままだと、コンパイルは通りますが、コンパイラが(明示的にAVX2の命令を使っていなくとも)
AVX2用のコードを生成しますので、Visual Studioで以下のところを変更します。
メニューの[デバッグ]→[YaneuraOuのプロパティ]→構成のプロパティ→C/C++
→コード生成→「拡張命令セットを有効にする」のところ、/arch:AVX2が指定されてると
思いますけど、それをご自分の環境に合わせる。
★ SSE4.2非対応のCPU用の実行ファイルの作り方
SSE4.2非対応ということはAVX2も非対応のはずなので、上のAVX2非対応のときの設定を行ない、
さらに、shogi.hで
#define USE_SSE42
をコメントアウトします。
// #define USE_SSE42
★ 32bit環境用の実行ファイルの作り方
メニューの[ビルド]→構成マネージャー
→「アクティブソリューションプラットフォーム」
を x86 にすれば32bit環境(32bit OS)で動作する実行ファイルが出来るはず。
(実行が遅くなるので64bit環境推奨です。)
スタックサイズは400MBだとスレッド生成のときにランタイムが落ちるようです。(VC++2015のランタイム側の問題?)
100MBなら大丈夫のようです。
★ 長手数の協力詰めで探索深さが深くなると実行中に落ちる。
実行時のスタックが足りないためだと思います。
メニューの[デバッグ]→[YaneuraOuのプロパティ]→構成のプロパティ→リンカー
→ システム → スタックのサイズの設定を
419430400 (400MB)ぐらいの大きな数に。(これで手数が4万手ぐらいの問題でもスタック的には足りるようです)
スタックサイズは400MBだとスレッド生成のときにランタイムが落ちるようです。(VC++2015のランタイム側の問題?)
100MBなら大丈夫のようです。
■ ShogiGUIの検討モードで使う方法
ShogiGUIの検討モードで「定跡を使用する」のオプションはオフにします。
(ここをオンにするとShogiGUI側の定跡が使用されます。)
やねうら王2016Midでは、定跡にhitしたときにその指し手を" multipv "という文字列を付けて
返すようにしています。ゆえに、ShogiGUIではこれがうまく処理されます。
候補手を増やしたときにきちんと検討ウィンドウのところに表示されるはずです。
■ 連続自動対局フレームワークの使い方
shogi.hの
#define LOCAL_GAME_SERVER
を有効にしてビルド。
この実行ファイルと同じフォルダに次の2つのファイルを配置。
engine-config1.txt : 1つ目の思考エンジン
engine-config2.txt : 2つ目の思考エンジン
1行目にengineの実行ファイル名(同じフォルダに配置)
2行目に思考時のコマンド
3行目以降にsetoption等、初期化時に思考エンジンに送りたいコマンドを書く。
例)
test.exe
go btime 100 wtime 100 byoyomi 0
setoption name Threads value 1
setoption name Hash value 1024
次に
goコマンドを打つ。(実行中、stopは利かない)
O : engine1勝ち
X : engine1負け
. : 引き分け
※ engine/local-game-server/local-game-server.cppで ONE_LINE_OUTPUT_MODE がdefineされているときは、
win,sfenで終局の局面図
lose,sfenで終局の局面図
draw,sfenで終局の局面図
という表記に変わる。
対局回数の指定など)
go btime [対局回数] wtime [定跡の手数] byoyomi [予約]
定跡はbook.sfenとしてsfen形式のファイルを与える。1行に1局が書かれているものとする。
このなかからランダムに1行が選ばれてその手数は上のwtimeのところで指定した手数まで進められる。
デフォルトでは対局回数は100回。定跡の手数は32手目から。
 コマンドラインから入力した文字列を連結して、USIコマンドとして実行する機能があるので、
 これを用いて、次のような.batファイルを作ってそれを実行すれば連続自己対局が簡単に開始できる。
> local-game-server.exe go btime 500
例えば、
setoption name Threads value 6
のようにして実行すると6スレッド(×2プロセス)が起動して、6局並列で対局が進行する。
btimeで指定した数に達すると、対局中のものは打ち切られる。
■ 定跡の作り方
[定跡フォーマット]
sfen sfen文字列
この局面での指し手1 相手の応手1 この指し手を指したときの評価値 そのときの探索深さ その指し手が選択された回数
この局面での指し手2 相手の応手2 この指し手を指したときの評価値 そのときの探索深さ その指し手が選択された回数
sfen xxxx..
相手の応手がないときは"none"と書いておく。
例)
sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1
7g7f 3c3d 0 32 2
sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/2P6/PP1PPPPPP/1B5R1/LNSGKGSNL w - 2
3c3d 2g2f 0 32 1
あと、先頭にDBのフォーマットのバージョン識別用の文字列として次の文字列を入れておく。
#YANEURAOU-DB2016 1.00
備考)
1) やねうら標準定跡のように評価値なしの定跡DBにおいては出現頻度の高い順で並んでいることが保証されている。
2) やねうら大定跡のように評価値つきの定跡DBにおいては手番側から見て評価値の良い順に並んでいることは保証されている。
1),2)から、1つ目に書かれている指し手がベストの指し手と言える。
指し手の出現頻度(「その指し手が選択された回数」)のところは、やねうら大定跡のように評価値つきの定跡の場合、
意味をなさないので、エンジンのバージョンを100倍したもの(V3.21なら321)を記入してあります。
これにより、「古いエンジンで思考させた指し手は採用しない」などの処理を行うことが出来るようになります。
> makebook from_sfen book.sfen standard_book.db moves 16
※  やねうら王2017Earlyなど、この機能に対応している思考エンジンが必要。
1行1局の棋譜を読み込ませてそれを上のフォーマットに変換する。standard_book.dbになる。
各局、"moves"のあとに指定した手数までを出力する。このファイルを思考エンジンの実行ファイル配下のbookフォルダに配置する。
floodgateのよさ気な棋譜をsfenに変換してこのコマンドで定跡を作成したものをexe/book/standard_book.dbに入れてあります。ご自由にお使いください。
> makebook from_sfen bw black_book.sfen white_book.sfen standard_book.db moves 16
"from_sfen"の直後に"bw"(black and whiteの意味)を指定した場合、sfenファイルとして2つのファイルが指定できる。
1つ目のsfenファイルは、そのsfenファイルから先手の局面だけを抽出して使う。
1つ目のsfenファイルは、そのsfenファイルから後手の局面だけを抽出して使う。
また、このとき、sfenファイル名として"no_file"を指定すると、先手用 or 後手用のsfenファイルは無しであるというのを指定できる。
例)
> makebook from_sfen bw no_file white_book.sfen standard_book.db moves 16
> makebook think 2016.sfen yaneura_book.db moves 16 depth 32
※  やねうら王2017Earlyなど、この機能に対応している思考エンジンが必要。
2016.sfenという棋譜を読みこみ、その16手目までをdepth 32で思考させて、
そのときの上位3手を定跡ファイルに書き出す。
・定跡ファイル上に、すでにそれ以上深い深さで探索した結果がある場合は、その局面については探索しない。
・同じ深さの場合、登録されている手の数がMultiPVで指定されている手の数以上登録されている場合もその局面については探索しない。
・Hash、Threads、MultiPVの設定に従い思考されるので、事前にこれらのパラメーターを
適切な値に設定しておくこと。
・'.'が1局面終わった合図。'S'がセーブ(ファイルに保存)したという合図。セーブは5分ごとに発生。
中断するときはこの'S'マークが出たのを確認してから終了させると良い。
保存中に終了させるとファイルが破損する可能性がある。
前回から新たな指し手が追加されていないときは's'(小文字)を表示して、ファイルには書き出さない。
例)
Hashメモリ4096MB、スレッド数8(それぞれのスレッドが1局面ずつ担当して検討)、MultiPV 5(それぞれの局面で候補手5手書き出し)、
棋譜2016.sfenの16手目までを深さ32で探索して定跡ファイルuser_book1(すでに存在すれば該当局面のみを上書き更新)を生成。
Hash 4096
Threads 8
MultiPV 5
makebook think 2016.sfen user_book1.db moves 16 depth 32
> makebook think 2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32
startmovesを指定すると、思考対象局面をそこからにします。(省略時は1が指定されているものとみなされます。)
上の例だと、(初期局面を1手目として)5手目から16手目の局面を思考対象とします。
> makebook think 2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32 cluster 1 3
> makebook think 2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32 cluster 2 3
> makebook think 2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32 cluster 3 3
PCを複数台で定跡を並列生成するとき用。
3台あって、1台目、2台目、3台目のPCで上のように入力すると思考対象局面を分散させる。
もちろん3台以外の場合であってても同様にすれば並列生成できる。
> makebook think bw black_2016.sfen white_2016.sfen yaneura_book.db startmoves 5 moves 16 depth 32 cluster 3 3
"from_sfen"のときと同様に、直後に"bw"を指定した場合、sfenファイルとして2つのファイルが指定できる。
1つ目のsfenファイルは、そのsfenファイルから先手の局面だけを抽出して使う。
1つ目のsfenファイルは、そのsfenファイルから後手の局面だけを抽出して使う。
> makebook merge yaneura_book1.db yaneura_book2.db yaneura_book3.db
※  やねうら王2016Midなど、この機能に対応している思考エンジンが必要。
定跡のマージ機能。yaneura_book1.dbとyaneura_book2.dbとをマージ(合体)させてyaneura_book3.dbを作成する。
・1つの局面に対して、深く探索されたほうの結果を優先。
・1つの局面に対して、2つの定跡ファイルがどちらも同じ深さで探索されている場合は、
候補手(MultiPV)が多いほうを採用。
makebook thinkコマンドで自動生成した定跡に対してマージするのに用いる。
> makebook sort book_src.db book_sorted.db
sfen文字列でソートする。
上例では、book_src.dbを読み込み、並び替えられた、book_sorted.dbを出力する。
定跡をメモリに丸読みしたくないときには(BookOnTheFly機能)、並び変わっていないといけない。
(sfen文字列順でソートされていないとバイナリサーチが出来ないため。)
■ 定跡読み込み時に表示されるメッセージの説明
定跡DBに登録されていた局面で表示されるメッセージの意味。
例) narrow book moves to 5 moves.
narrow bookが指定されていたので定跡DBに登録されていた指し手を5手に減らした。
例) BookDepthLimit is lower than the depth of this node.
BookDepthLimitとして指定されていたdepthが、定跡DBに登録されている思考時のdepthを
下回っていたので定跡の指し手は採用されなかった。
例) BookEvalDiff = 30 , moves to 3 moves.
BookEvalDiffが30(定跡DBの最善手との評価値が30に収まる指し手のみ採用する)以内に収まる指し手が
3手しかなかったので3手に減らした。
例) BookEvalBlackLimit = 0 , moves to 2 moves.
BookEvalBlackLimit(先手番の、評価値の下限)が0に設定されていたので、この評価値を持つ指し手は
2手しかなかったため、指し手は2手に減らした。
■ 起動時のコマンドの指定
> YaneuraOu-nano.exe go btime 100 wtime 100 byoyomi 0
のようにUSIコマンドをコマンドライン引数として渡すことが出来る。
コマンドを実行すると思考エンジンを終了する。
> YaneuraOu-nano.exe posision xxx , go btime 100 wtime 100 byoyomi 0
のようにカンマで区切って複数のコマンドを渡すことができる。
> YaneuraOu-nano.exe file cmd.txt
のようにしてコマンドとして実行したいコマンドをファイルから渡すことが出来る。
※ 複数のコマンドを渡せるのでquitしたい場合は最後にquitを手打ちすること。
■ floodgateでの設定
floodgateでは通信遅延が起こりうるので以下の思考エンジン設定で、前者を120~400、後者を1120~1400ぐらいを
設定すると良いと思います。(それぞれの意味については「USI拡張コマンド.txt」のほうを確認してください。)
NetworkDelay 通信の平均遅延時間[ms]
NetworkDelay2 通信の最大遅延時間[ms]
ひどい通信遅延が起こらないネットワーク環境なら、それぞれ120,1120ぐらい(デフォルト値)を推奨。
■ 0.2秒対局
設定の一例ですが、持ち時間0分、秒読み1秒に設定したあと、
MinimumThinkingTimeを1000に設定して、
NetworkDelayとNetworkDelay2を800に設定すれば、
1手0.2秒での対局が出来ます。
■ 他のソフトとの対局のときの設定
公平な条件にするため、
NetworkDelay 通信の平均遅延時間[ms]
NetworkDelay2 通信の最大遅延時間[ms]
は、0 を指定するべきでしょう。
あと、定跡はNarrowBookをオンにしておいたほうが悪い定跡をつかみにくいので
そちらのほうが勝率は上がるはずです。
ただし、やねうら大定跡のような、定跡生成時に探索して、評価値がついている定跡を用いる場合は、
NarrowBookは必ずオフにする必要があります。
■ 対局・検討時の推奨設定
例) やねうら王2017Earlyの場合
スレッド数(Threads) : 論理コア数に(BIOSの設定でHyperThreadingを有効にしておくこと)
置換表サイズ(Hash) : 物理メモリの半分ぐらいに。2のべき乗のほうが良い。例) 16GBのRAMなら8192[MB]を指定
最小思考時間[ms](MinimumThinkingTime) : 1000。ただし、2秒以内に指すと計測1秒になるルールで指すなら2000。
                        他のソフトと対局させるときは、そのソフトの最小思考時間も合わせておかないと公平ではない。
出現確率の低い定跡を採用しない(NarrowBook) : オフ(False)
通信の平均遅延時間(NetworkDelay)  : 0(floodgateでは150~400ぐらいで調整)
通信の最大遅延時間(NetworkDelay2) : 0(floodgateでは600~1100ぐらいで調整)
定跡(BookFile) : 真やねうら定跡(yaneura_book3.db)
定跡の第一候補手との評価値の差(BookEvalDiff): 0
■ gcc/clangでのbuild
Msys2環境下のgcc/clangで
gccの場合
> make avx2 (AVX2命令を使うときのbuild)
clangの場合は、makefileのほうでコンパイラとしてclangを指定してください。
とすればbuild出来て、これをWindows用の実行ファイルとして使えるところまでは確認しました。
Ubuntu16.04、Mac OSでbuild出来ることも確認しました。
やねうら王プロジェクトでは、local-game-server以外はWindows環境に依存するコードは混じっておらず、
標準的なC++11/c++14コンパイラでコンパイル出来るはずです。
■ 教師局面からの学習のOpenMP対応について
learnコマンドで教師局面から学習させるときにOpen MPを有効にしてコンパイルすると、Open MP対応になります。
weight配列の更新が並列化されるので、many coreでもmini batch sizeを小さくすることが出来ます。
■ 評価関数の共用について
やねうら王2016 Mid以降のWindows版では、評価関数のテーブルを複数プロセスにまたがって共用する機能が
追加されました。(V3.34~)
この機能は、思考エンジン設定でオン/オフ切り替えられます。USI option名は"EvalShare"です。
異種評価関数との自己対局のときにこの設定で引っかかる人が後を絶たないのでデフォルトでオフになっています。
この機能をオンにすると、10個やねうら王を起動したとしても評価関数は共用されているので、1つ分しかメモリを
消費しません。
やねうら王のバージョンナンバーを識別子に使っていますので、異なるバージョンナンバーを持つやねうら王とは
評価関数を共用しません。
共有する条件は、YaneuraOu + やねうら王のバージョンナンバー + EvalDir名 が合致したときです。
評価関数の配置しているフォルダの絶対pathが一致したときではないので注意してください。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
よくあるミスとして、EvalDirをevalフォルダにしている2つのやねうら王エンジンで対局させてしまうケースがあります。
この場合、EvalShareがオンになっていると、評価関数が共有されてしまいます。
また、複数起動したとして、最初にisreadyコマンドを送った時点でそのやねうら王に評価関数ファイルを読み込みます。
以降に立ち上げたやねうら王は、isreadyコマンドを送った時点で、1つ目にisreadyを送られた
やねうら王の評価関数テーブルを共用します。
isreadyコマンドに対して評価関数ファイルを読み込むときに表示されるメッセージについて
use non-shared eval_memory. → EvalShareがオフになっていたので共有メモリは用いなかった。
created shared eval memory. → EvalShareがオンになっていて、他に起動している同じバージョンのやねうら王がなかったので
                共有メモリ上に新規に評価関数パラメーターを展開した。
use shared eval memory. → EvalShareがオンになっていて、他に起動している同じバージョンのやねうら王がすでに存在したので
                その共有メモリ上にある評価関数パラメーターを利用させてもらうことにした。
■ ShogiGUIの検討/棋譜解析モードで読み筋が途中までしか出力されない問題
やねうら王、2017Early以降では、思考エンジン設定でPvIntervalを0にすればこの問題は解決されます。
また、(思考時間無制限の)検討モードは
go infinite
で思考が開始されるはずで、このとき、PvIntervalを強制的に0にみなすようになっています。
■ エンジン名の偽装方法について
GUIで連続対局をさせる場合など、エンジン名として任意の名前をつけたいことがあります。
思考エンジンのあるフォルダに"engine_name.txt"というファイルを用意しておけば、
そこに書かれている1行目の内容をエンジン名、2行目をエンジン作者名としてGUIに返します。
■ エンジンオプションのデフォルト値の変更
"usi"に対して返すオプションリストのオプションのデフォルト値を変更する機能
カレントフォルダに"engine_options.txt"というファイルを配置して、
ここにOptionを構築するための文字列を書きます。(この"option"で始まる文字列は、
"usi"に対して応答として返している文字列なので、コマンドプロンプト上でエンジンを
実行して、"usi"とタイプして、返ってきた文字列一覧をコピペして編集すると良い)
例)
option name EvalDir type string default ../eval/YaneuraOu_2018
option name EvalShare type check default true
option name BookDir type string default ../book
■ Aperyの定跡DB / まふ定跡の読み込みについて
まふ定跡はAperyの定跡フォーマットで提供されています。
やねうら王2017Early以降であればAperyの定跡フォーマットの読み込みに対応しています。
book/book.bin
(実行ファイル配下のbookフォルダにbook.binというファイル名の定跡ファイルを配置するという意味)
に定跡ファイルを配置すれば、思考エンジン設定の定跡として「book.bin(Apery用定跡DB)」を選択することで読み込めます。
■ 検討モード用オプションについて
やねうら王2017Early以降では、思考エンジンのオプションとしてConsiderationModeを追加しました。
これはShogiGUIなどの検討モードで用いるためのもので、このオプションをオンにすると中途半端な読み筋が
出力されることが減ります。
なお、置換表から読み筋をかき集めてくるので、置換表が破壊されてると読み筋が途中で途切れることがあります。
途切れるときは置換表用のメモリ(思考エンジン設定のHashオプションで設定できる)を大きめに確保してみてください。
なお、
読み筋が千日手のときは読み筋の末尾に
"rep_draw" : 普通の千日手
"rep_sup" : 優等局面(盤上の駒配置が同一で手駒が一方的に増えている局面への突入。相手からの歩の成り捨て~同金~歩打ち~金引きみたいな循環)
"rep_inf" : 劣等局面(盤上の駒配置が同一で手駒が一方的に減っている局面への突入)
"rep_win" : 王手を含む千日手(反則勝ち) // これ実際には出力されないはずだが…。
"rep_lose" : 王手を含む千日手(反則負け) // これ実際には出力されないはずだが…。
読み筋が宣言勝ちのときは読み筋の末尾に "win"
投了の局面で呼び出されたとき "resign"
と出力されます。
■ トーナメント用 思考エンジンとは何ですか?
大会で使うためのものです。bench以外のテスト用のコマンドは使えません。無駄を削ぎ落とし、実行ファイルを小さくしています。
またEVAL_HASH大きめにしてあるのでメモリはたくさん消費しますが、一度探索した局面は評価関数の計算を端折れます。
2手前に思考した内容が生きるので通常対局においてはやや有利で、3~5%速いはずです。
■ Apery(WCSC27)で使われている評価関数ファイルと、やねうら王2017Earlyで使われている評価関数ファイルとの相互変換について
以下では
「Apery(WCSC27)で使われている評価関数ファイル」のことを"kppt16"と呼びます。
「やねうら王2017Earlyで使われている評価関数ファイル」のことを"kppt32"と呼びます。
「ponanza(WCSC26)で使われているらしい評価関数ファイル」のことを"kpp_kkpt32"と呼びます。
これらの相互変換は "test evalconvert"というコマンドで行なうことが出来ます。
例)
> test evalconvert kppt16 eval/elmo_apery27 kppt32 eval/elmo_yane27
eval/elmo_apery27に格納されているkppt16の評価関数ファイルが、kppt32に変換されてeval/elmo_yane27に格納されます。
出力先のフォルダが存在しない場合は自動的に作成されます。
> test evalconvert kppt32 eval/elmo_yane27 kppt16 eval/elmo_apery27
eval/elmo_yane27に格納されているkppt32の評価関数ファイルが、kppt16に変換されてeval/elmo_apery27に格納されます。
出力先のフォルダが存在しない場合は自動的に作成されます。
備考)
変換に際して、isreadyコマンドが走るので、このときに評価関数ファイルがEvalDirにないといけないが、
このファイルを用意できていなくて読み込みに失敗する場合は、SkipLoadingEval true
(これにより、ファイルがないときにゼロクリアされたファイルを読み込んだことにする)としてから、この"test evalconvert"コマンドを実行すると良い。
SkipLoadingEvalオプションは、EVAL_LEARNをdefineしてビルドした実行ファイルでのみ使える隠しコマンド。
■ ゼロクリアされた評価関数ファイルの作り方
色々作り方はあると思いますが、やねうら王のLEARN版を使えば、以下の手順で作れます。
EvalDir xyz // 存在しないフォルダを評価関数の読み込みフォルダに指定する
SkipLoadingEval true // こうしておけば評価関数ファイルの読み込みに失敗してもエラーにならない
isready // このタイミングで評価関数が読み込まれるが存在しないフォルダから読み込むのでゼロクリアされた評価関数を読み込んだことになる。
EvalSaveDir eval_zero // 保存フォルダ名を"eval_zero"に設定(何でも良い)
test evalsave // メモリ上の評価関数を保存するコマンド
これでeval_zeroフォルダにゼロクリアされた評価関数ファイルが保存されます。
■ clangでlearn版(学習用)の実行ファイルのmakeが出来ない件
Ubuntu 17.04,clang4では問題なくビルド出来るらしい。
Msys2では、たまさんの情報によると…。
OpenMP部分がダイナミックライブラリになってしまいますが、以下の方法で動かせます。
1.LLVM4.0.1のWindows版をDLしてきて、適当なところにインストールする
※ホントはソースからビルドすれば、全てをスタティックライブラリにできるのですが、LLVMのビルドを通すのは糸を針の穴に通すより難しいです。敷居はこれが一番低いです。
2.(LLVMをインストールしたディレクトリ)/libにある「libomp.lib」をlibgomp.aが配置されているディレクトリに「libomp.a」としてコピーする→これがlibgomp.aの代わりになる
3.exeの格納ディレクトリと同じところに(LLVMをインストールしたディレクトリ)/bin/libomp.dllをコピーする
これで動きます。が、libomp.dllを含めて配布するのは何かと問題になりそうです。あくまで解決の参考としてください。
■ MSYS2上でNNUEのAVX2以外の評価関数の実行ファイルがビルドできない件
toolchainの問題かと思います。例えば以下のようにすると32bit NO SSE版がビルドできるようです。
(MSYS2 MinGW 32-bit上で)
$ pacman -S mingw-w64-i686-clang mingw-w64-i686-toolchain
$ pacman -Syuu
$ mingw32-make -j8 nosse YANEURAOU_EDITION=YANEURAOU_2018_TNK_ENGINE 2>&1 | tee 2018tnk_nosse.log`
64bit版
$ pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-toolchain
注意点)
makefileを使ってcleanするときに、.oファイルを削除しないといけないが、そのときにYANEURAOU_EDITIONを指定していないと
コンパイル対象のソースファイルとしてNNUE用の評価関数のソースコードファイルが追加されず、.oファイルが全部消えないので
コンパイルに失敗することがある。cleanするときは、この点に注意すること。
mingw32-make clean YANEURAOU_EDITION=YANEURAOU_2018_TNK_ENGINE