]> git.sesse.net Git - stockfish/blobdiff - src/movepick.cpp
Introduce update_gains() and refactor some code
[stockfish] / src / movepick.cpp
index b96b799542556a7f461e29d7b1472bf631689eab..8d8060b55571f9b4420ba29a674e791ce48f58e9 100644 (file)
@@ -74,7 +74,6 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d,
                        const History& h, SearchStack* ss) : pos(p), H(h) {
   int searchTT = ttm;
   ttMoves[0].move = ttm;
-  finished = false;
   lastBadCapture = badCaptures;
 
   pinned = p.pinned_pieces(pos.side_to_move());
@@ -142,7 +141,7 @@ void MovePicker::go_next_phase() {
   case PH_EVASIONS:
       assert(pos.is_check());
       lastMove = generate_evasions(pos, moves);
-      score_evasions();
+      score_evasions_or_checks();
       return;
 
   case PH_QCAPTURES:
@@ -151,12 +150,12 @@ void MovePicker::go_next_phase() {
       return;
 
   case PH_QCHECKS:
-      // Perhaps we should order moves move here?  FIXME
       lastMove = generate_non_capture_checks(pos, moves);
+      score_evasions_or_checks();
       return;
 
   case PH_STOP:
-      lastMove = curMove + 1; // hack to be friendly for get_next_move()
+      lastMove = curMove + 1; // Avoids another go_next_phase() call
       return;
 
   default:
@@ -221,11 +220,11 @@ void MovePicker::score_noncaptures() {
           hs += 1000;
 
       // pst based scoring
-      cur->score = hs + pos.pst_delta<Position::MidGame>(piece, from, to);
+      cur->score = hs + mg_value(pos.pst_delta(piece, from, to));
   }
 }
 
-void MovePicker::score_evasions() {
+void MovePicker::score_evasions_or_checks() {
   // Try good captures ordered by MVV/LVA, then non-captures if
   // destination square is not under attack, ordered by history
   // value, and at the end bad-captures and non-captures with a
@@ -233,6 +232,10 @@ void MovePicker::score_evasions() {
   Move m;
   int seeScore;
 
+  // Skip if we don't have at least two moves to order
+  if (lastMove < moves + 2)
+      return;
+
   for (MoveStack* cur = moves; cur != lastMove; cur++)
   {
       m = cur->move;
@@ -346,14 +349,10 @@ Move MovePicker::get_next_move() {
 Move MovePicker::get_next_move(Lock &lock) {
 
    lock_grab(&lock);
-   if (finished)
-   {
-       lock_release(&lock);
-       return MOVE_NONE;
-   }
+
+   // Note that it is safe to call many times
+   // get_next_move() when phase == PH_STOP
    Move m = get_next_move();
-   if (m == MOVE_NONE)
-       finished = true;
 
    lock_release(&lock);
    return m;