Merge pull request #317 from fsmosca/3fold_rep_termination

Fix segfault and end the game by 3-fold repetitions
This commit is contained in:
Tomasz Sobczyk
2021-04-05 12:39:21 +02:00
committed by GitHub
3 changed files with 25 additions and 2 deletions

View File

@@ -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;
}

View File

@@ -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<LEGAL>(*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.

View File

@@ -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;