]> git.sesse.net Git - stockfish/blobdiff - src/search.cpp
Use MovePicker's move ordering also at root
[stockfish] / src / search.cpp
index 59025fba1215d78525890a6e56b44251281bbf0a..68b19cd34b116bf229e26e9e1dee9c1de7d728aa 100644 (file)
@@ -117,7 +117,7 @@ namespace {
 
   struct RootMove {
 
-    RootMove() { nodes = cumulativeNodes = ourBeta = theirBeta = 0ULL; }
+    RootMove() { mp_score = 0; nodes = cumulativeNodes = ourBeta = theirBeta = 0ULL; }
 
     // RootMove::operator<() is the comparison function used when
     // sorting the moves. A move m1 is considered to be better
@@ -125,11 +125,12 @@ namespace {
     // have equal score but m1 has the higher beta cut-off count.
     bool operator<(const RootMove& m) const {
 
-        return score != m.score ? score < m.score : theirBeta <= m.theirBeta;
+        return score != m.score ? score < m.score : mp_score <= m.mp_score;
     }
 
     Move move;
     Value score;
+    int mp_score;
     int64_t nodes, cumulativeNodes, ourBeta, theirBeta;
     Move pv[PLY_MAX_PLUS_2];
   };
@@ -143,6 +144,8 @@ namespace {
   public:
     RootMoveList(Position& pos, Move searchMoves[]);
 
+    void set_mp_scores(const Position &pos);
+
     int move_count() const { return count; }
     Move get_move(int moveNum) const { return moves[moveNum].move; }
     Value get_move_score(int moveNum) const { return moves[moveNum].score; }
@@ -739,6 +742,7 @@ namespace {
     while (1)
     {
         // Sort the moves before to (re)search
+        rml.set_mp_scores(pos);
         rml.sort();
 
         // Step 10. Loop through all moves in the root move list
@@ -1179,7 +1183,7 @@ namespace {
                            && tte
                            && tte->move()
                            && !excludedMove // Do not allow recursive singular extension search
-                           && is_lower_bound(tte->type())
+                           && (tte->type() & VALUE_TYPE_LOWER)
                            && tte->depth() >= depth - 3 * ONE_PLY;
 
     // Step 10. Loop through moves
@@ -1957,8 +1961,8 @@ namespace {
               || v >= Max(value_mate_in(PLY_MAX), beta)
               || v < Min(value_mated_in(PLY_MAX), beta))
 
-          && (   (is_lower_bound(tte->type()) && v >= beta)
-              || (is_upper_bound(tte->type()) && v < beta));
+          && (   ((tte->type() & VALUE_TYPE_LOWER) && v >= beta)
+              || ((tte->type() & VALUE_TYPE_UPPER) && v < beta));
   }
 
 
@@ -1971,8 +1975,8 @@ namespace {
 
       Value v = value_from_tt(tte->value(), ply);
 
-      if (   (is_lower_bound(tte->type()) && v >= defaultEval)
-          || (is_upper_bound(tte->type()) && v < defaultEval))
+      if (   ((tte->type() & VALUE_TYPE_LOWER) && v >= defaultEval)
+          || ((tte->type() & VALUE_TYPE_UPPER) && v < defaultEval))
           return v;
 
       return defaultEval;
@@ -2777,6 +2781,26 @@ namespace {
   }
 
 
+  void RootMoveList::set_mp_scores(const Position &pos)
+  {
+      MovePicker mp = MovePicker(pos, MOVE_NONE, ONE_PLY, H);
+      Move move;
+
+      int moveCount = 0;
+      while ((move = mp.get_next_move()) != MOVE_NONE)
+      {
+          moveCount++;
+          for (int i = 0; i < count; i++)
+          {
+              if (moves[i].move == move)
+              {
+                  moves[i].mp_score = 512 - moveCount;
+                  break;
+              }
+          }
+      }
+  }
+
   // RootMoveList simple methods definitions
 
   void RootMoveList::set_move_nodes(int moveNum, int64_t nodes) {