-/// MovePicker::score_captures(), MovePicker::score_noncaptures(),
-/// MovePicker::score_evasions() and MovePicker::score_qcaptures() assign a
-/// numerical move ordering score to each move in a move list. The moves
-/// with highest scores will be picked first by pick_move_from_list().
+/// MovePicker::go_next_phase() generates, scores and sorts the next bunch
+/// of moves when there are no more moves to try for the current phase.
+
+void MovePicker::go_next_phase() {
+
+ curMove = moves;
+ phase = *(++phasePtr);
+ switch (phase) {
+
+ case PH_TT_MOVE:
+ lastMove = curMove + 1;
+ return;
+
+ case PH_GOOD_CAPTURES:
+ case PH_GOOD_PROBCUT:
+ lastMove = generate<MV_CAPTURE>(pos, moves);
+ score_captures();
+ return;
+
+ case PH_KILLERS:
+ curMove = killers;
+ lastMove = curMove + 2;
+ return;
+
+ case PH_NONCAPTURES_1:
+ lastNonCapture = lastMove = generate<MV_NON_CAPTURE>(pos, moves);
+ score_noncaptures();
+ lastMove = std::partition(curMove, lastMove, has_positive_score);
+ sort<MoveStack>(curMove, lastMove);
+ return;
+
+ case PH_NONCAPTURES_2:
+ curMove = lastMove;
+ lastMove = lastNonCapture;
+ if (depth >= 3 * ONE_PLY)
+ sort<MoveStack>(curMove, lastMove);
+ return;
+
+ case PH_BAD_CAPTURES:
+ // Bad captures SEE value is already calculated so just pick
+ // them in order to get SEE move ordering.
+ curMove = badCaptures;
+ lastMove = moves + MAX_MOVES;
+ return;
+
+ case PH_EVASIONS:
+ assert(pos.in_check());
+ lastMove = generate<MV_EVASION>(pos, moves);
+ score_evasions();
+ return;
+
+ case PH_QCAPTURES:
+ lastMove = generate<MV_CAPTURE>(pos, moves);
+ score_captures();
+ return;
+
+ case PH_QRECAPTURES:
+ lastMove = generate<MV_CAPTURE>(pos, moves);
+ return;
+
+ case PH_QCHECKS:
+ lastMove = generate<MV_NON_CAPTURE_CHECK>(pos, moves);
+ return;
+
+ case PH_STOP:
+ lastMove = curMove + 1; // Avoid another go_next_phase() call
+ return;
+
+ default:
+ assert(false);
+ return;
+ }
+}
+
+
+/// MovePicker::score_captures(), MovePicker::score_noncaptures() and
+/// MovePicker::score_evasions() assign a numerical move ordering score
+/// to each move in a move list. The moves with highest scores will be
+/// picked first by next_move().