- /// Variables
-
- MovePicker::MovegenPhase PhaseTable[32];
- int MainSearchPhaseIndex;
- int EvasionsPhaseIndex;
- int QsearchWithChecksPhaseIndex;
- int QsearchNoCapturesPhaseIndex;
- int QsearchWithoutChecksPhaseIndex;
- int NoMovesPhaseIndex;
-
-}
-
-
-
-////
-//// Functions
-////
-
-
-/// Constructor for the MovePicker class. Apart from the position for which
-/// it is asked to pick legal moves, MovePicker also wants some information
-/// to help it to return the presumably good moves first, to decide which
-/// moves to return (in the quiescence search, for instance, we only want to
-/// search captures, promotions and some checks) and about how important good
-/// move ordering is at the current node.
-
-MovePicker::MovePicker(const Position& p, bool pv, Move ttm,
- const SearchStack& ss, Depth d, EvalInfo* ei) : pos(p) {
- pvNode = pv;
- ttMove = ttm;
- mateKiller = (ss.mateKiller == ttm)? MOVE_NONE : ss.mateKiller;
- killer1 = ss.killers[0];
- killer2 = ss.killers[1];
- depth = d;
- movesPicked = 0;
- numOfMoves = 0;
- numOfBadCaptures = 0;
-
- // With EvalInfo we are able to know how many captures are possible before
- // generating them. So avoid generating in case we know are zero.
- Color us = pos.side_to_move();
- Color them = opposite_color(us);
- bool noCaptures = ei
- && (ei->attackedBy[us][0] & pos.pieces_of_color(them)) == 0
- && !ei->mi->specialized_eval_exists()
- && (pos.ep_square() == SQ_NONE)
- && !pos.has_pawn_on_7th(us);
-
- if (p.is_check())
- phaseIndex = EvasionsPhaseIndex;
- else if (depth > Depth(0))
- phaseIndex = MainSearchPhaseIndex;
- else if (depth == Depth(0))
- phaseIndex = (noCaptures ? QsearchNoCapturesPhaseIndex : QsearchWithChecksPhaseIndex);
- else
- phaseIndex = (noCaptures ? NoMovesPhaseIndex : QsearchWithoutChecksPhaseIndex);
-
- dc = p.discovered_check_candidates(us);
- pinned = p.pinned_pieces(p.side_to_move());
-
- finished = false;
-}
-
-
-/// MovePicker::get_next_move() is the most important method of the MovePicker
-/// class. It returns a new legal move every time it is called, until there
-/// are no more moves left of the types we are interested in.
-
-Move MovePicker::get_next_move() {
+ enum Stages {
+ MAIN_TT, CAPTURE_INIT, GOOD_CAPTURE, REFUTATION, QUIET_INIT, QUIET, BAD_CAPTURE,
+ EVASION_TT, EVASION_INIT, EVASION,
+ PROBCUT_TT, PROBCUT_INIT, PROBCUT,
+ QSEARCH_TT, QCAPTURE_INIT, QCAPTURE, QCHECK_INIT, QCHECK
+ };