diff --git a/src/learn/gensfen.cpp b/src/learn/gensfen.cpp index 06e6295b..b28afa13 100644 --- a/src/learn/gensfen.cpp +++ b/src/learn/gensfen.cpp @@ -110,6 +110,8 @@ namespace Learner save_every = std::max(save_every, REPORT_STATS_EVERY); num_threads = Options["Threads"]; + + random_multi_pv_depth = std::max(search_depth_max, random_multi_pv_depth); } }; @@ -489,8 +491,11 @@ namespace Learner // draw at the maximum number of steps to write. const int ply = move_hist_scores.size(); - // has it reached the max length or is a draw - if (ply >= params.write_maxply || pos.is_draw(ply)) + // has it reached the max length or is a draw by fifty-move rule + // or by 3-fold repetition + if (ply >= params.write_maxply + || pos.is_fifty_move_draw() + || pos.is_three_fold_repetition()) { return 0; } diff --git a/src/position.cpp b/src/position.cpp index 934c1403..1b5ff222 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1180,6 +1180,22 @@ bool Position::is_draw(int ply) const { } +/// Position::is_fifty_move_draw() returns true if a game can be claimed +/// by a fifty-move draw rule. + +bool Position::is_fifty_move_draw() const { + + return (st->rule50 > 99 && (!checkers() || MoveList(*this).size())); +} + + +/// Position::is_three_fold_repetition() returns true if there is 3-fold repetition. +bool Position::is_three_fold_repetition() const { + + return st->repetition < 0; +} + + // Position::has_repeated() tests whether there has been at least one repetition // of positions since the last capture or pawn move. diff --git a/src/position.h b/src/position.h index e7513eb1..fe5be374 100644 --- a/src/position.h +++ b/src/position.h @@ -161,6 +161,8 @@ public: bool is_chess960() const; Thread* this_thread() const; bool is_draw(int ply) const; + bool is_fifty_move_draw() const; + bool is_three_fold_repetition() const; bool has_game_cycle(int ply) const; bool has_repeated() const; int rule50_count() const;