From ae4967744686ae6e95ca0cdb9e0d788de05d4e03 Mon Sep 17 00:00:00 2001 From: Tord Romstad Date: Thu, 6 Aug 2009 18:07:32 +0200 Subject: [PATCH] Fixed a bug in PV extraction from the transposition table: The previous used move_is_legal to verify that the move from the TT was legal, and the old version of move_is_legal only works when the side to move is not in check. Fixed this by adding a separate, slower version of move_is_legal which works even when the side to move is in check. --- src/movegen.cpp | 23 +++++++++++++++++++++++ src/movegen.h | 1 + src/tt.cpp | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/movegen.cpp b/src/movegen.cpp index 079918e9..eb65e7b9 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -567,6 +567,29 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { } +/// Another version of move_is_legal(), which takes only a position and a move +/// as input. This function does not require that the side to move is not in +/// check. It is not optimized for speed, and is only used for verifying move +/// legality when building a PV from the transposition table. + +bool move_is_legal(const Position& pos, const Move m) { + + Bitboard pinned = pos.pinned_pieces(pos.side_to_move()); + if (!pos.is_check()) + return move_is_legal(pos, m, pinned); + else + { + Position p(pos); + MoveStack moves[64]; + int n = generate_evasions(p, moves, pinned); + for (int i = 0; i < n; i++) + if (moves[i].move == m) + return true; + return false; + } +} + + namespace { template diff --git a/src/movegen.h b/src/movegen.h index e16a8ab5..991b0de3 100644 --- a/src/movegen.h +++ b/src/movegen.h @@ -38,6 +38,7 @@ extern int generate_non_capture_checks(const Position& pos, MoveStack* mlist, Bi extern int generate_evasions(const Position& pos, MoveStack* mlist, Bitboard pinned); extern int generate_legal_moves(const Position& pos, MoveStack* mlist); extern bool move_is_legal(const Position& pos, const Move m, Bitboard pinned); +extern bool move_is_legal(const Position& pos, const Move m); #endif // !defined(MOVEGEN_H_INCLUDED) diff --git a/src/tt.cpp b/src/tt.cpp index c1a8b1b9..1e98aa24 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -207,7 +207,7 @@ void TranspositionTable::extract_pv(const Position& pos, Move pv[]) { tte && tte->move() != MOVE_NONE && !stop; tte = retrieve(p.get_key()), ply++) { - if (!move_is_legal(p, tte->move(), p.pinned_pieces(p.side_to_move()))) + if (!move_is_legal(p, tte->move())) break; pv[ply] = tte->move(); p.do_move(pv[ply], st[ply]); -- 2.39.2