﻿
やねうら王 更新履歴

残り作業
・探索
・持ち時間管理
・定跡部
・長手数の詰将棋ルーチン書く。
・ベンチマーク書く。


■ 2016/01/31 V1.25

・nanoの静止探索、standPatと比較するの忘れてた。修正。
→　修正したら少し強くなった感。


■ 2016/01/31 V1.24

・評価値、局面の差分更新をしたときにおかしくなるので、駒番号まわりのテストコード追加する。
→　難しい。書きにくい。
・BonaPieceの文字列での出力関数実装
・evalstatにPieceListの内容を表示、追加。
・test rpコマンドのランダムプレイヤーに評価値の差分計算のチェック機構追加。
・undo_move()で駒番号おかしくなっていたの修正。
・mateのときの手数表示がおかしいの修正。


■ 2016/01/31 V1.23

・nanoのデバッグ進める。
・USI::score_to_usi()追加
・USI::pv()追加。
・評価関数の値がおかしい気がしなくもない。
・sfenコマンド追加。(以前のものを変更)


■ 2016/01/31 V1.22

・nanoにはsee使わない。
・nanoの静止探索書く。
・nanoにid_loop導入。
・TanspositionTableにvalue_to_tt()とか追加する。
・goコマンドのデフォルトを秒読み1秒にしておく。(テストしにくいので)
・USI::Optionのコンストラクタで、on_changeのイベントハンドラを呼び出すように変更。
	→　この設計だと駄目なのか。仕方ないので置換表のコンストラクタでデフォルト16MB確保する。
・USI::pv()追加。読み筋表示用。


■ 2016/01/30 V1.21

・Position::sse()追加。
・extra/see.cpp追加。
・USE_SEE追加。


■ 2016/01/29 V1.20

・評価関数、旧バージョンと値の比較。
・EvalList::set_piece修正。

position sfen lnsgkgsnl/1r5b1/pppppppp1/9/9/2P5p/PP1PPPPP1/LB5R1/1NSGKGSNL w p 8


■ 2016/01/27 V1.19

・やねうら王nanoとminiの探索部書いていく。
・評価関数のimportしてくるところから。
　→　だいたい出来た気がする
・put_pieceで落ちる。
  → 王手がかかっているのにEVASIONS呼び出さなかったからか。
> position startpos moves 3i4h 3c3d
> position startpos moves 7g7f 3c3d 8h2b
evalおかしい。何これ。


■ 2016/01/27 V1.18

・Bitobardのoperator == () がまさかの高速化。これ、そもそもほとんど使ってないのであまり変わらんが…。


■ 2016/01/25 V1.17

・ByteBoard、WordBoard、無理やり取ってくるなら端にpaddingしといたほうが無難か…。

■ 2016/01/24 V1.16

・1手詰めに影の利きを考慮した詰みも追加。
・1手詰めで漏れているケースもう少し追加する。
・uint8_t -> u8とかtypedefする
・24近傍の9近傍への長い利きを回収するコード追加。
・mate1plyの移動による詰みをlambdaに変更。
・1手詰め判定で影の利き考慮するようにした。

test rp
Random Player test , loop_max = 100000000
mate found = 10000 , mate miss = 827 , mate found rate  = 92.3617%
mate found = 20000 , mate miss = 1590 , mate found rate  = 92.6355%
mate found = 30000 , mate miss = 2354 , mate found rate  = 92.7242%
mate found = 40000 , mate miss = 3190 , mate found rate  = 92.614%
mate found = 50000 , mate miss = 4072 , mate found rate  = 92.4693%
mate found = 60000 , mate miss = 5015 , mate found rate  = 92.2864%
mate found = 70000 , mate miss = 5822 , mate found rate  = 92.3215%
mate found = 80000 , mate miss = 6704 , mate found rate  = 92.2679%
mate found = 90000 , mate miss = 7435 , mate found rate  = 92.3693%
mate found = 100000 , mate miss = 8202 , mate found rate  = 92.4197%
mate found = 110000 , mate miss = 8984 , mate found rate  = 92.4494%

詰み率 92%ちょいぐらいになった。8%ぐらいが影の利きありでの1手詰めなのか。

ランダムプレイヤーで数時間まわしておく。
→　1.6億局面をpassしたのでうまく動いてるやろ…。


■ 2016/01/23 V1.15

・dirs_bw_of()→long_effect_ofとリネーム
・mate1plyの判定率、ランダムプレイヤーで計測できるようにした。

Random Player test , loop_max = 100000000
mate found = 10000 , mate miss = 28848 , mate found rate  = 25.7414%
mate found = 20000 , mate miss = 58089 , mate found rate  = 25.6118%
mate found = 30000 , mate miss = 87252 , mate found rate  = 25.5859%
mate found = 40000 , mate miss = 116252 , mate found rate  = 25.5997%
mate found = 50000 , mate miss = 146594 , mate found rate  = 25.4331%
mate found = 60000 , mate miss = 176384 , mate found rate  = 25.3824%
mate found = 70000 , mate miss = 206668 , mate found rate  = 25.3011%
mate found = 80000 , mate miss = 237090 , mate found rate  = 25.2294%
→　おかしい。低すぎ。

・移動による詰み、駒打ち用のdirectionsテーブルではまずいのか…。修正した。

test rp
Random Player test , loop_max = 100000000
mate found = 10000 , mate miss = 1590 , mate found rate  = 86.2813%
mate found = 20000 , mate miss = 3134 , mate found rate  = 86.4528%
mate found = 30000 , mate miss = 4722 , mate found rate  = 86.4006%
mate found = 40000 , mate miss = 6296 , mate found rate  = 86.4006%
mate found = 50000 , mate miss = 7953 , mate found rate  = 86.2768%
mate found = 60000 , mate miss = 9620 , mate found rate  = 86.1821%
mate found = 70000 , mate miss = 11028 , mate found rate  = 86.3899%
mate found = 80000 , mate miss = 12651 , mate found rate  = 86.3455%
mate found = 90000 , mate miss = 14175 , mate found rate  = 86.3931%
mate found = 100000 , mate miss = 15725 , mate found rate  = 86.4118%
→　だいぶ上がった。もう少し上がって欲しい気が。



■ 2016/01/23 V1.14

・do_move()に関するベンチが要るな。
	test rpbenchコマンド追加。書けた。4600 games/sec程度。
	1局が大抵256手まで行くことを考えると256×4600回の指し手生成 + do_move()/undo_move()だから妥当なところ？
	ASSERT、long_effectオフにしたら6327 gps
	long_effectだけオフにしたら5909gps
	ASSERTだけオフにしたら4959 gps。
	・ASSERTで5%ほど低下。long_effectは探索部と評価関数がなしだとすると30%ぐらい低下ということなのかな。
・Effect8に各駒の利き追加する
・1手詰め作っていく。
・UnitTestにMate1Ply関連のテストコード追加。
・HAND_KIND_ZERO追加。
・PRO_GOLD→QUEENに変更してeffects_fromにQUEEN追加。
・effects_fromにNO_PIECEのときの処理追加。
・駒打ちによる1手詰め判定できるようになった。
・桂の移動による1手詰め判定できるようになった。
・銀の移動による1手詰め判定うまく動いた。
・ランダムプレイヤーで1手詰め判定の自動テストするコードを追加。
・pseudo_legal()で金の成る手のチェックが抜けていたのを修正。
・1手詰めでの大駒による長い利きの遮断修正。
・1手詰めで桂打ちで利きを遮断するケース考慮。
・ランダムプレイヤーでランニング。動いているようだ。


■ 2016/01/22 V1.13

・undo_move()で戻す処理に利きを戻す処理も書くことにする。たぶん、そんなに遅くないはずで…。
・undo_move()も先後分けた。
・LongEffectLibraryに利きの更新の逆変換関数追加。
・ランダムプレイヤーで利きのrevertのテスト。
　このまましばらくランニングさせておく。
・関数の名前revertでなくrewindにしよう。
・Position::set_effect、LongEffect::に移動。


■ 2016/01/22 V1.12

・captureとnon_captureのときの利きの更新処理追加。
　→　これで利きの更新処理は一通り書けた。あとは…
・ランダムプレイヤーによる利きの更新の自動テスト追加。
・UNREACHABLE、ASSERT_LV3に変更。
・undo_moveで利きを巻き戻す作業がいるのか..これは難しい..
・LSB32/64にASSERT_LV3追加。
・利きのdo_move()での更新はこれで問題なさげ。undo_move()をどうするか考え中。


■ 2016/01/22 V1.11

・長い利き、WordBoardでないとまずいのか…。書き直し。
・make_piece()引数の順番変更。Colorをつねに先に。
・ENABLE_BIT_OPERATORS_ONに operator &= などを追加。
・WordBoardの表示修正。
・利きの初期化部、マクロいくつか削除。
・LongEffect::dir_bw_of()追加。
・Directionsのenumに定数追加。
・Position::do_move()のdropのときの利きの更新処理書けた。
　あとはcaptureとnon_captureのときの利きの更新処理！


■ 2016/01/21 V1.10

・has_long_effect()追加。
・↑をUnitTestに追加。
・UPDATE_EFFECT_BY_PUTTING_PIECE、マクロ化した。(利きの差分更新のところでも使うため。)
・LONG_EFFECTにINCもDECも要らんかった。一つにまとめた。
・Direction削除。Effect8のものを持ってきて、これを使うことにする。
・SQWW_RIGHT→SQWW_Rとかにリネーム。
・Position::do_move()を内部的に、先後分ける。
・pop_lsb(uint8_t)追加。
・pop_directionsの引数変更。
・ENABLE_BIT_OPERATORS_ON追加。
・Directionsにbegin(),end()追加。
→　あかん。よくなかった。削除。
・pop_lsb()をbitop.hに移動。templateで書くことにした。


■ 2016/01/20 V1.09

・Effect8::directions_of()追加。
・長い利きの初期化コード書けた。→　正しそう。
・ByteBoardの出力関数書いた。
・MAX_PLY_ → MAX_PLY_NUMにリネーム。
・LONG_EFFECT→LONG_EFFECT_LIBRARYにリネーム。
・long_effect.h/cpp、ifdef LONG_EFFECT_LIBRARYで囲った。


■ 2016/01/19 V1.08

・user.cpp、わかりにくいのでuser-engine.cppにリネーム。
・Positionクラスに利きを持たせる。
・利きの初期化コードおよび差分更新コードを追加する。
・Position::set_effect()書いた。
・評価関数、shogi.hで選択可能にする。(まずは準備だけ)
・config.h、書式整えた。


■ 2016/01/19 V1.07

・SquareWithWall追加。これを使って利き関係の初期化処理を書き直す。
・dist、これがあれば不要？ → 不要ではなかった。
・LongEffectライブラリにSquareWithWallの差分値追加。


■ 2016/01/19 V1.06

・aligned_stack、内部的にvectorを使うように変更。


■ 2016/01/19 V1.05

・std::stack<StateInfo>を用いるときにpush()に対して内部的にstackがStateInfoをnewするのだが
　これがalignmentされてなくてまずいのか…。そんな問題があるのか…。
→　StateInfoにcustom new/delete追加。

  // custom allocator(このクラスはstd::stack<StateInfo>のpush()によって内部的にnewされるが、そのときに
  // alignasが無視されるので、custom allocatorが必要になる…ようだ。)
  static void* operator new (std::size_t count){ return _mm_malloc(count,alignof(StateInfo));  }
  static void operator delete(void* p) { _mm_free(p); }

→　これでも駄目なのか。難しい…。

// C++11では、std::stack<StateInfo>がalignasを無視するために、代わりにstack相当のものを自作。
template <typename T> struct aligned_stack {
  void push(const T& t) { auto ptr = (T*)_mm_malloc(sizeof(T), alignof(T)); *ptr = t; container.push(ptr); }
  T& top() const { return *container.top(); }
  ~aligned_stack() { while (container.size()) { auto ptr = container.top(); _mm_free(ptr); container.pop(); } }
private:
  std::stack<T*> container;
};
こうしてみた。


■ 2016/01/19 V1.04

・engine/mate-engine/ 追加。このあとコードを書いていく。


■ 2016/01/19 V1.03

・自動対局フレームワークの開始局面をランダマイズする機能追加。
 →　定跡を読み込めるようにした。


■ 2016/01/19 V1.02

・move_from_usi()に合法チェック追加。
・連続自動対局フレームワーク、一通り動くようになった。
 →　対局開始局面のrandomize出来たほうがいいので何か考える。


■ 2016/01/18 V1.01

・連続自己対戦サーバー用のProcessNegotiatorで入出力のリダイレクトは出来るようになった。
　あとはこれを非同期入出力にして連続自己対局が出来るようにすればOk.


■ 2016/01/18 V1.00

・連続自己対戦サーバー機能追加作業開始。
	engine/local-game-server
・"Version"がwindows.hの内部の文字列と衝突した。"ENGINE_VERSION"にリネーム。
・_mm_malloc()～_mm_free()を使うように変更。


■ 2016/01/18 V0.99

・bitop.hとkey128.hのコメント掃除。


■ 2016/01/18 V0.98

・128bit hash keyを用いるときにalignmentが合ってないエラーがでうるのを修正。


■ 2016/01/18 V0.97

・x86で正常動作するようになった。指し手生成とか半分ぐらいの速度しか出ないが…。
・aligned_allocをbitop.hに移動させた。


■ 2016/01/18 V0.96

・size_t、x86環境だと32bitなのか…。ランダムプレイヤー修正。
・ランダムプレイヤー、GitHubにpushするの忘れてたので追加。


■ 2016/01/18 V0.95

・x86用のコード、allocatorだけ追加しておく。
・USE_AVX2をコメントアウトしたときにコンパイルが通らなくなっていたの修正。


■ 2016/01/18 V0.94

・Stockfishの升の差分を表現するDELTA_Nとか読みにくくてカナワンので、SQ_UPとかに変更。


■ 2016/01/18 V0.93

・engine関係、ひとつのフォルダにまとめる
・ランダムプレイヤーをengineとして追加。
・とりあえず、ビルドのデフォルトをランダムプレイヤーにしておく。(やねうら王miniの探索部が書けたらそれをデフォルトに変更する)
・StateInfo,Positionクラスのアライメントの調整をしたせいか、指し手生成が少し速くなったようだ。指し手生成祭りの局面で5.4M回/s程度(Core i7 4771にて)
・PRNGクラス、少しメンバー追加した。


■ 2016/01/18 V0.92

・x86用にコード修正。コンパイルは通るようになったが、Bitboardの代入等で落ちる。(アライメント合ってないから？)
コンパイル時に、こんな警告。
> source\thread.cpp(15): warning C4316: 'MainThread': ヒープで割り当てられたオブジェクトが 16 にアラインメントされていない可能性があります
	→　thread.cppのnewしているところでaligned_new<T>()みたいなものが必要っぽいのだが、これを修正しても
　ランタイムで落ちるようだ。よくわからんので誰か助けて欲しい…。
・よく考えるとKey256を使う場合も_mm256_store_si256()が32byteでアライメントされていることを要求するから、
	これと同じ問題があるのか…。誰も使ってないだろうからそっちはまあいいか…。

■ 2016/01/17 V0.91

・x86用のemulation code、各種追加。

■ 2016/01/17 V0.90

・GitHubにて公開。

