Try bad captures before non-captures
authorMarco Costalba <mcostalba@gmail.com>
Sat, 27 Feb 2010 16:09:07 +0000 (17:09 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 28 Feb 2010 22:35:51 +0000 (23:35 +0100)
Consider sligtly negative captures as good if at low
depth and far from beta.

After 999 games at 1+0
Mod vs Orig +169 =694 -136  +11 ELO

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/movepick.cpp
src/movepick.h
src/search.cpp

index 6bb5c31..03344db 100644 (file)
@@ -71,10 +71,11 @@ namespace {
 /// move ordering is at the current node.
 
 MovePicker::MovePicker(const Position& p, Move ttm, Depth d,
-                       const History& h, SearchStack* ss) : pos(p), H(h) {
+                       const History& h, SearchStack* ss, Value beta) : pos(p), H(h) {
   int searchTT = ttm;
   ttMoves[0].move = ttm;
   lastBadCapture = badCaptures;
+  badCaptureThreshold = 0;
 
   pinned = p.pinned_pieces(pos.side_to_move());
 
@@ -90,8 +91,14 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d,
   if (p.is_check())
       phasePtr = EvasionsPhaseTable;
   else if (d > Depth(0))
+  {
+      // Consider sligtly negative captures as good if at low
+      // depth and far from beta.
+      if (ss && ss->eval < beta - PawnValueMidgame && d < 3 * OnePly)
+          badCaptureThreshold = -PawnValueMidgame;
+
       phasePtr = MainSearchPhaseTable;
-  else if (d == Depth(0))
+  else if (d == Depth(0))
       phasePtr = QsearchWithChecksPhaseTable;
   else
   {
@@ -290,7 +297,7 @@ Move MovePicker::get_next_move() {
               {
                   // Check for a non negative SEE now
                   int seeValue = pos.see_sign(move);
-                  if (seeValue >= 0)
+                  if (seeValue >= badCaptureThreshold)
                       return move;
 
                   // Losing capture, move it to the badCaptures[] array, note
index 69cf6ff..9e81e21 100644 (file)
@@ -49,7 +49,7 @@ class MovePicker {
   MovePicker& operator=(const MovePicker&); // silence a warning under MSVC
 
 public:
-  MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss = NULL);
+  MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss = NULL, Value beta = -VALUE_INFINITE);
   Move get_next_move();
   int number_of_evasions() const;
 
@@ -62,7 +62,7 @@ private:
   const Position& pos;
   const History& H;
   MoveStack ttMoves[2], killers[2];
-  int phase;
+  int badCaptureThreshold, phase;
   const uint8_t* phasePtr;
   MoveStack *curMove, *lastMove, *lastGoodNonCapture, *lastBadCapture;
   Bitboard pinned;
index 4fd1c03..c369bac 100644 (file)
@@ -1440,7 +1440,7 @@ namespace {
     // Loop through all legal moves until no moves remain or a beta cutoff occurs
 
     // Initialize a MovePicker object for the current position
-    MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]);
+    MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply], beta);
     CheckInfo ci(pos);
 
     while (   bestValue < beta