
■　ファイルの説明

docs/
source/
  nano-engine/          やねうら王nano関連の探索部
  nano-plus-engine/     やねうら王nano plus関連の探索部
  mini-engine/          やねうら王mini関連の探索部
  classic-engine/       やねうら王classic関連の探索部
  classic-tce-engine/   やねうら王classic-tce関連の探索部
  2016-mid-engine/      やねうら王2016 Midの探索部
  help-mate-engine/     やねうら王 協力詰めsolver関連
  random-player-engine/ ランダムプレイヤー
  local-game-server/    自動対局フレームワーク
  user-engine/          ユーザーが独自のエンジンを作るときの作業用フォルダ

  shogi.h/.cpp          コンパイル時の設定や、各種構造体の定義。
  bitboard.h/.cpp       Bitboard(盤面の駒のある場所や、ある駒による利きなどを表現するのに使う)
  evaluate.h/.cpp       評価関数
  misc.h/.cpp           バージョン情報など
  movegen.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
	evaluate_kppt_learn.cpp 学習のときに(損失関数の勾配を計算するのに)用いるkppt評価関数。

  eval/
	evaluate_no_eval.cpp      評価関数なしのときのダミーヘッダ
	evaluate_material.cpp     駒割りに関する評価関数
    evaluate_bona_piece.cpp   BonaPieceを用いるときの共通ヘッダ
	evaluate_kpp.cpp          KPP型の3駒の評価関数
	

■　解説記事等

やねうら王mini公式より解説記事が一通り読めます。
http://yaneuraou.yaneu.com/YaneuraOu_Mini/ 

やねうら王公式には、コンピューター将棋関係の記事・資料が盛りだくさん！
http://yaneuraou.yaneu.com/


■　コンパイル方法

Visual Studio 2015 Community Edition(無料で使えます)でビルド一発で実行ファイルが出来るはずです。

実行ファイル等は、プロジェクトフォルダの一つ上のフォルダ配下に以下のように作られます。

  YaneuraOu2016Engine/YaneuraOu.exe

★　思考エンジンの種類の選択

ビルドする思考エンジンの種類として、

・ランダムプレイヤー
・やねうら王nano
・やねうら王nano plus
・やねうら王mini
・やねうら王classic
・やねうら王2016mid
・やねうら王 協力詰めsolver
・ランダムプレイヤー
・連続自動対局フレームワーク

のなかから選択することが出来ます。詳しくはshogi.hをご覧ください。

そのときの開発中のエンジンがdefineされていることが多いのでビルドしたいエンジンを選択してください。

また2016年10月に開催される電王トーナメントに向けて開発している
・やねうら王2016late
の思考エンジンは非公開であるため、このファイルがなくてプロジェクトファイルを開いたときに
エラーになるかも知れませんが、その場合は、プロジェクトから
	リソースファイル
		engine/
			2016-mid-engine/
				2016-late-param.h
				2016-late-search.cpp
		extra/
			move_picker_2016Q3.h
			move_picker_2016Q3.cpp
	などを除外してください。


■ よくある質問

★　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で指定した数に達すると、対局中のものは打ち切られる。
	

■　「内部エラー」でコンパイル出来ない件

Visual Studio 2015であるなら、アップデート(2016年3月31日現在、最新版がUpdate2)を適用してください。
Update1までだと、リンク時に「内部エラー」と表示されてコンパイルが出来ないことがあります。


■　定跡の作り方


	[定跡フォーマット]
	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
	※　	やねうら王2016Midなど、この機能に対応している思考エンジンが必要。

1行1局の棋譜を読み込ませてそれを上のフォーマットに変換する。standard_book.dbになる。
各局、"moves"のあとに指定した手数までを出力する。このファイルを思考エンジンの実行ファイル配下のbookフォルダに配置する。

floodgateのよさ気な棋譜をsfenに変換してこのコマンドで定跡を作成したものをexe/book/standard_book.dbに入れてあります。ご自由にお使いください。

> makebook think 2016.sfen yaneura_book.db moves 16 depth 32
	※　	やねうら王2016Midなど、この機能に対応している思考エンジンが必要。

	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 merge yaneura_book1.db yaneura_book2.db yaneura_book3.db
	※　	やねうら王2016Midなど、この機能に対応している思考エンジンが必要。

	定跡のマージ機能。yaneura_book1.dbとyaneura_book2.dbとをマージ(合体)させてyaneura_book3.dbを作成する。

	・1つの局面に対して、深く探索されたほうの結果を優先。
	・1つの局面に対して、２つの定跡ファイルがどちらも同じ深さで探索されている場合は、
		候補手(MultiPV)が多いほうを採用。

	makebook thinkコマンドで自動生成した定跡に対してマージするのに用いる。

> makebook sort book_src.db book_sorted.db

	sfen文字列でソートする。
	上例では、book_src.dbを読み込み、並び替えられた、book_sorted.dbを出力する。

	定跡をメモリに丸読みしたくないときには(BookOnTheFly機能)、並び変わっていないといけない。
	(sfen文字列順でソートされていないとバイナリサーチが出来ないため。)



■　定跡読み込み時に表示されるメッセージの説明

やねうら王2016 Midで定跡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ぐらい(デフォルト値)を推奨。


■　他のソフトとの対局のときの設定

公平な条件にするため、
	NetworkDelay 通信の平均遅延時間[ms]
	NetworkDelay2 通信の最大遅延時間[ms]
は、0 を指定するべきでしょう。

あと、定跡はNarrowBookをオンにしておいたほうが悪い定跡をつかみにくいので
そちらのほうが勝率は上がるはずです。

ただし、やねうら大定跡のような、定跡生成時に探索して、評価値がついている定跡を用いる場合は、
NarrowBookは必ずオフにする必要があります。


■　gccでのbuild

Msys2環境下のgccで

	> make avx2	(AVX2命令を使うときのbuild)

とすればbuild出来て、これをWindows用の実行ファイルとして使えるところまでは確認しました。
Ubuntu16.04、Mac OSでbuild出来ることも確認しました。

やねうら王プロジェクトでは、local-game-server以外はWindows環境に依存するコードは混じっておらず、
標準的なC++14コンパイラでコンパイル出来るはずです。
	

■　評価関数の共用について

やねうら王2016 MidのWindows版では、評価関数のテーブルを複数プロセスにまたがって共用する機能が
追加されました。(V3.34～)

この機能により、10個やねうら王を起動したとしても評価関数は共用されているので、1つ分しかメモリを
消費しません。

やねうら王のバージョンナンバーを識別子に使っていますので、異なるバージョンナンバーを持つやねうら王とは
評価関数を共用しません。

共有する条件は、YaneuraOu + やねうら王のバージョンナンバー + EvalDir名 が合致したときです。

また、複数起動したとして、最初にisreadyコマンドを送った時点でそのやねうら王に評価関数ファイルを読み込みます。
以降に立ち上げたやねうら王は、isreadyコマンドを送った時点で、1つ目にisreadyを送られた
やねうら王の評価関数テーブルを共用します。

この機能は、思考エンジン設定でオフにも出来ます。USI option名は"EvalShare"です。

isreadyコマンドに対して評価関数ファイルを読み込むときに表示されるメッセージについて
	use non-shared eval_memory.  →　EvalShareがオフになっていたので共有メモリは用いなかった。
	created shared eval memory.  →　EvalShareがオンになっていて、他に起動している同じバージョンのやねうら王がなかったので
	　　　　　　　　　　　　　　　　共有メモリ上に新規に評価関数パラメーターを展開した。
	use shared eval memory.      →　EvalShareがオンになっていて、他に起動している同じバージョンのやねうら王がすでに存在したので
	　　　　　　　　　　　　　　　　その共有メモリ上にある評価関数パラメーターを利用させてもらうことにした。

