Allow full repetition detection
authorJean-Francois Romang <jeanfrancois.romang@gmail.com>
Tue, 23 Oct 2012 20:33:45 +0000 (20:33 +0000)
committerJean-Francois Romang <jeanfrancois.romang@gmail.com>
Thu, 25 Oct 2012 06:28:55 +0000 (06:28 +0000)
Based on sshivaji 6ee19aa5389ce60181907ba53bbb50642f2d5657 commit

src/position.cpp
src/position.h
src/search.cpp

index 3f81994..feaeee2 100644 (file)
@@ -1467,7 +1467,7 @@ 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<bool SkipRepetition>
+template<bool SkipRepetition, bool SkipThreeFoldCheck>
 bool Position::is_draw() const {
 
   // Draw by material?
@@ -1482,7 +1482,7 @@ bool Position::is_draw() const {
   // Draw by repetition?
   if (!SkipRepetition)
   {
-      int i = 4, e = std::min(st->rule50, st->pliesFromNull);
+      int i = 4, e = std::min(st->rule50, st->pliesFromNull), rep_count=0;
 
       if (i <= e)
       {
@@ -1492,7 +1492,10 @@ bool Position::is_draw() const {
               stp = stp->previous->previous;
 
               if (stp->key == st->key)
-                  return true;
+              {
+                if(SkipThreeFoldCheck) return true;
+                else if(++rep_count>=2) return true;
+              }
 
               i +=2;
 
@@ -1504,8 +1507,9 @@ bool Position::is_draw() const {
 }
 
 // Explicit template instantiations
-template bool Position::is_draw<false>() const;
-template bool Position::is_draw<true>() const;
+template bool Position::is_draw<false,true>() const;
+template bool Position::is_draw<true,true>() const;
+template bool Position::is_draw<false,false>() const;
 
 
 /// Position::flip() flips position with the white and black sides reversed. This
index fced8e0..ce636fe 100644 (file)
@@ -183,7 +183,7 @@ public:
   Thread* this_thread() const;
   int64_t nodes_searched() const;
   void set_nodes_searched(int64_t n);
-  template<bool SkipRepetition> bool is_draw() const;
+  template<bool SkipRepetition, bool SkipThreeFoldCheck> bool is_draw() const;
 
   // Position consistency check, for debugging
   bool pos_is_ok(int* failedStep = NULL) const;
index 4ac9440..5452363 100644 (file)
@@ -524,7 +524,7 @@ namespace {
     if (!RootNode)
     {
         // Step 2. Check for aborted search and immediate draw
-        if (Signals.stop || pos.is_draw<false>() || ss->ply > MAX_PLY)
+        if (Signals.stop || pos.is_draw<false,true>() || 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
@@ -1103,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<true>() || ss->ply > MAX_PLY)
+    if (pos.is_draw<true,true>() || ss->ply > MAX_PLY)
         return DrawValue[pos.side_to_move()];
 
     // Transposition table lookup. At PV nodes, we don't use the TT for
@@ -1552,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<false>() || ply < 2))
+         && (!pos.is_draw<false,true>() || ply < 2))
   {
       pv.push_back(m);
       pos.do_move(m, *st++);