From: Marco Costalba Date: Fri, 26 Oct 2012 09:08:06 +0000 (+0200) Subject: Extend full 3 fold detection to PvNodes X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=c594b989c0a7ff37002a4720e5bb667da70bb476 Extend full 3 fold detection to PvNodes And restore old behaviour of not returning from a RootNode without updating RootMoves[]. Also renamed is_draw() template parameters to reflect a 'positive' logic (Check instead of Skip) that is easier to follow. New bench: 5312693 --- diff --git a/src/position.cpp b/src/position.cpp index feaeee22..40ea30f7 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -1467,39 +1467,31 @@ 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 && (!in_check() || MoveList(*this).size())) return true; - // Draw by repetition? - if (!SkipRepetition) + if (CheckRepetition) { - int i = 4, e = std::min(st->rule50, st->pliesFromNull), rep_count=0; + int i = 4, e = std::min(st->rule50, st->pliesFromNull); if (i <= e) { StateInfo* stp = st->previous->previous; - do { + for (int cnt = 0; i <= e; i += 2) + { stp = stp->previous->previous; - if (stp->key == st->key) - { - if(SkipThreeFoldCheck) return true; - else if(++rep_count>=2) return true; - } - - i +=2; - - } while (i <= e); + if (stp->key == st->key && (!CheckThreeFold || ++cnt >= 2)) + return true; + } } } @@ -1507,8 +1499,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; diff --git a/src/position.h b/src/position.h index ce636fe3..3014b235 100644 --- a/src/position.h +++ b/src/position.h @@ -183,7 +183,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 9980dcf9..2edaff8c 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -524,7 +524,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 @@ -538,10 +538,6 @@ namespace { if (alpha >= beta) return alpha; } - else - { - if(pos.is_draw()) return DrawValue[pos.side_to_move()]; - } // Step 4. Transposition table lookup // We don't want the score of a partial search to overwrite a previous full search @@ -1107,7 +1103,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 @@ -1556,7 +1552,7 @@ void RootMove::extract_pv_from_tt(Position& pos) { && pos.is_pseudo_legal(m) && 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(m); pos.do_move(m, *st++);