From: Marco Costalba Date: Mon, 28 Jan 2013 16:24:01 +0000 (+0100) Subject: Revert "Extend full 3 fold detection to PvNodes" X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=58c9fbacc787cc3b654244c071169057e6895c91 Revert "Extend full 3 fold detection to PvNodes" --- diff --git a/src/position.cpp b/src/position.cpp index 4045a25d..310e46e3 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1363,31 +1363,36 @@ Value Position::compute_non_pawn_material(Color c) const { /// Position::is_draw() tests whether the position is drawn by material, /// repetition, or the 50 moves rule. It does not detect stalemates, this /// must be done by the search. -template +template bool Position::is_draw() const { + // Draw by material? if ( !pieces(PAWN) && (non_pawn_material(WHITE) + non_pawn_material(BLACK) <= BishopValueMg)) return true; + // Draw by the 50 moves rule? if (st->rule50 > 99 && (!checkers() || MoveList(*this).size())) return true; - if (CheckRepetition) + // Draw by repetition? + if (!SkipRepetition) { - int i = 4, e = std::min(st->rule50, st->pliesFromNull), cnt; + int i = 4, e = std::min(st->rule50, st->pliesFromNull); if (i <= e) { StateInfo* stp = st->previous->previous; - for (cnt = 0; i <= e; i += 2) - { + do { stp = stp->previous->previous; - if (stp->key == st->key && (!CheckThreeFold || ++cnt >= 2)) + if (stp->key == st->key) return true; - } + + i += 2; + + } while (i <= e); } } @@ -1395,9 +1400,8 @@ bool Position::is_draw() const { } // Explicit template instantiations -template bool Position::is_draw() const; -template bool Position::is_draw() const; -template bool Position::is_draw() const; +template bool Position::is_draw() const; +template bool Position::is_draw() const; /// Position::flip() flips position with the white and black sides reversed. This diff --git a/src/position.h b/src/position.h index 8b475dd9..579b5308 100644 --- a/src/position.h +++ b/src/position.h @@ -179,7 +179,7 @@ public: Thread* this_thread() const; int64_t nodes_searched() const; void set_nodes_searched(int64_t n); - template bool is_draw() const; + template bool is_draw() const; // Position consistency check, for debugging bool pos_is_ok(int* failedStep = NULL) const; diff --git a/src/search.cpp b/src/search.cpp index 15c3b15a..cb7b30b8 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -534,7 +534,7 @@ namespace { if (!RootNode) { // Step 2. Check for aborted search and immediate draw - if (Signals.stop || pos.is_draw() || ss->ply > MAX_PLY) + if (Signals.stop || pos.is_draw() || ss->ply > MAX_PLY) return DrawValue[pos.side_to_move()]; // Step 3. Mate distance pruning. Even if we mate at the next move our score @@ -1109,7 +1109,7 @@ split_point_start: // At split points actual search starts from here ss->ply = (ss-1)->ply + 1; // Check for an instant draw or maximum ply reached - if (pos.is_draw() || ss->ply > MAX_PLY) + if (pos.is_draw() || ss->ply > MAX_PLY) return DrawValue[pos.side_to_move()]; // Transposition table lookup. At PV nodes, we don't use the TT for @@ -1516,7 +1516,7 @@ void RootMove::extract_pv_from_tt(Position& pos) { && pos.is_pseudo_legal(m = tte->move()) // Local copy, TT could change && pos.pl_move_is_legal(m, pos.pinned_pieces()) && ply < MAX_PLY - && (!pos.is_draw() || ply < 2)); + && (!pos.is_draw() || ply < 2)); pv.push_back(MOVE_NONE); // Must be zero-terminating