Skip to content

Commit

Permalink
- peta_shockコマンド、定跡がsortされているを前提とする。
Browse files Browse the repository at this point in the history
  - sortされてなかったらmakebook sortコマンドを使ってsortしてから適用すること。
  • Loading branch information
yaneurao committed Jan 8, 2024
1 parent f5c0e65 commit 5e74e98
Showing 1 changed file with 28 additions and 110 deletions.
138 changes: 28 additions & 110 deletions source/book/makebook2023.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -712,9 +712,6 @@ namespace MakeBook2023
// 行番号
size_t line_no = 0;

// sfenファイルがsort済みであるかのフラグ
bool sorted_db = false;

while(reader.ReadLine(line).is_ok())
{
progress.check(reader.GetFilePos());
Expand All @@ -730,8 +727,7 @@ namespace MakeBook2023
} else if (line_no == 2)
{
// 2行目には
// # NOE:258,SORTED
// のようにエントリー数と、sfenがsort済みであるかを指定することができる。
// # NOE:258
// よって、この文字列をparseする必要がある。
auto splited = StringExtension::Split(line.substr(2),",");
for(auto command : splited)
Expand All @@ -740,11 +736,7 @@ namespace MakeBook2023
if (splited2.size() >= 1)
{
auto& token = splited2[0];
if (token == "SORTED")
{
sorted_db = true;
cout << "This book DB is sorted." << endl;
} else if (token == "NOE" && splited2.size() == 2) // numbers of entires
if (token == "NOE" && splited2.size() == 2) // numbers of entires
{
size_t noe = StringExtension::to_int(splited2[1],0);
cout << "Number of Sfen Entries = " << noe << endl;
Expand Down Expand Up @@ -1430,117 +1422,43 @@ namespace MakeBook2023

size_t n = book_nodes.size();

if (!sorted_db)
{
cout << "Unpack packed sfens : " << endl;

// 並び替えを行う。
// ただしbook_nodes直接並び替えるのはメモリ移動量が大きいのでindexのみをsortする。
// ⇨ あー、これ、sfen文字列でsortしないといけないのか…わりと大変か…。
using BookNodeIndexString = pair<BookNodeIndex,string>;
vector<BookNodeIndexString> book_indices(n);
progress.reset(n - 1);
for(size_t i = 0 ; i < n ; ++i)
{
auto& book_node = book_nodes[i];
auto sfen = pos.sfen_unpack(book_node.packed_sfen);
// 元のDBで後手の局面は後手の局面として書き出す。(ので、ここでsfenをflipしてからsortする)
if (book_node.color() == WHITE)
sfen = Position::sfen_to_flipped_sfen(sfen);

book_indices[i] = BookNodeIndexString(BookNodeIndex(i), sfen);
progress.check(i);
}

cout << "Sorting book_nodes : " << endl;
sort(book_indices.begin(), book_indices.end(),
[&](BookNodeIndexString& i, BookNodeIndexString& j){
return i.second < j.second;
});

// ⇑ここでsfenをunpackしてしまうなら、最初からsfenで持っておいたほうがいい気がするし、
// あるいは、このままsortなしで書き出したほうがいいような気もする。
// (sortは改めてやるとして)

// しかしsortするのも丸読みしないといけないから大変か…。
// この時点で要らないものをいったん解放できると良いのだが…。

cout << "Write to a book DB : " << endl;
cout << "Write to a book DB : " << endl;

SystemIO::TextWriter writer;
if (writer.Open(writebook_path).is_not_ok())
{
cout << "Error! : open file error , path = " << writebook_path << endl;
return;
}

progress.reset(n - 1);

// バージョン識別用文字列
writer.WriteLine(::Book::BookDBHeader2016_100);
SystemIO::TextWriter writer;
if (writer.Open(writebook_path).is_not_ok())
{
cout << "Error! : open file error , path = " << writebook_path << endl;
return;
}

for(size_t i = 0 ; i < n ; ++i)
{
auto& book_node = book_nodes[book_indices[i].first];
auto& sfen = book_indices[i].second;
progress.reset(n - 1);

// sfenを出力。上でsortしているのでsfen文字列順で並び替えされているはず。
writer.WriteLine("sfen " + sfen);
// バージョン識別用文字列
writer.WriteLine(::Book::BookDBHeader2016_100);

// 指し手を出力
for(auto& move : book_node.moves)
{
// 元のDB上で後手の局面なら後手の局面として書き出したいので、
// 後手の局面であるなら指し手を反転させる。
Move16 m16 = (book_node.color() == WHITE) ? flip_move(move.move) : move.move;
writer.WriteLine(to_usi_string(m16) + " None " + to_string(move.vd.value) + " " + to_string(move.vd.depth));
}
for(size_t i = 0 ; i < n ; ++i)
{
auto& book_node = book_nodes[i];
auto sfen = Position::sfen_unpack(book_node.packed_sfen);

progress.check(i);
write_counter++;
}
} else {
// sort済みDBを読み込んだので、book_nodesのentryはsortされた順に並んでいることが保証される。
cout << "Skip sorting sfen." << endl;
// 元の局面がWHITEであるなら、WHITEの局面として書き出さないとsortされていたものが崩れる。
if (book_node.color() == WHITE)
sfen = Position::sfen_to_flipped_sfen(sfen);

cout << "Write to a book DB : " << endl;
writer.WriteLine("sfen " + sfen);

SystemIO::TextWriter writer;
if (writer.Open(writebook_path).is_not_ok())
// 指し手を出力
for(auto& move : book_node.moves)
{
cout << "Error! : open file error , path = " << writebook_path << endl;
return;
// 元のDB上で後手の局面なら後手の局面として書き出したいので、
// 後手の局面であるなら指し手を反転させる。
Move16 m16 = (book_node.color() == WHITE) ? flip_move(move.move) : move.move;
writer.WriteLine(to_usi_string(m16) + " None " + to_string(move.vd.value) + " " + to_string(move.vd.depth));
}

progress.reset(n - 1);

// バージョン識別用文字列
writer.WriteLine(::Book::BookDBHeader2016_100);

for(size_t i = 0 ; i < n ; ++i)
{
auto& book_node = book_nodes[i];
auto sfen = Position::sfen_unpack(book_node.packed_sfen);

// 元の局面がWHITEであるなら、WHITEの局面として書き出さないとsortされていたものが崩れる。
if (book_node.color() == WHITE)
sfen = Position::sfen_to_flipped_sfen(sfen);

writer.WriteLine("sfen " + sfen);

// 指し手を出力
for(auto& move : book_node.moves)
{
// 元のDB上で後手の局面なら後手の局面として書き出したいので、
// 後手の局面であるなら指し手を反転させる。
Move16 m16 = (book_node.color() == WHITE) ? flip_move(move.move) : move.move;
writer.WriteLine(to_usi_string(m16) + " None " + to_string(move.vd.value) + " " + to_string(move.vd.depth));
}

progress.check(i);
write_counter++;
progress.check(i);
write_counter++;

}
}

cout << "write " + writebook_path << endl;
Expand Down

0 comments on commit 5e74e98

Please sign in to comment.