int MainSearchPhaseIndex;
int EvasionsPhaseIndex;
int QsearchWithChecksPhaseIndex;
- int QsearchNoCapturesPhaseIndex;
int QsearchWithoutChecksPhaseIndex;
- int NoMovesPhaseIndex;
}
-
////
//// Functions
////
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);
-
if (p.is_check())
phaseIndex = EvasionsPhaseIndex;
else if (depth > Depth(0))
else
phaseIndex = QsearchWithoutChecksPhaseIndex;
+ Color us = pos.side_to_move();
+
dc = p.discovered_check_candidates(us);
pinned = p.pinned_pieces(us);
bestIndex = (movesPicked < 4 ? find_best_index() : movesPicked);
move = moves[bestIndex].move;
moves[bestIndex] = moves[movesPicked++];
- // Remember to change the line below if we decide to hash the qsearch!
- // Maybe also postpone the legality check until after futility pruning?
- if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned))
+ // Maybe postpone the legality check until after futility pruning?
+ if ( move != ttMove
+ && pos.pl_move_is_legal(move, pinned))
return move;
}
break;
while (movesPicked < numOfMoves)
{
move = moves[movesPicked++].move;
- // Remember to change the line below if we decide to hash the qsearch!
- if (/* move != ttMove && */ pos.pl_move_is_legal(move, pinned))
+ if ( move != ttMove
+ && pos.pl_move_is_legal(move, pinned))
return move;
}
break;
}
-/// MovePicker::current_move_type() returns the type of the just
-/// picked next move. It can be used in search to further differentiate
-/// according to the current move type: capture, non capture, escape, etc.
-MovePicker::MovegenPhase MovePicker::current_move_type() const {
-
- return PhaseTable[phaseIndex];
-}
-
-
/// MovePicker::init_phase_table() initializes the PhaseTable[],
/// MainSearchPhaseIndex, EvasionPhaseIndex, QsearchWithChecksPhaseIndex
-/// QsearchNoCapturesPhaseIndex, QsearchWithoutChecksPhaseIndex and
-/// NoMovesPhaseIndex variables. It is only called once during program
-/// startup, and never again while the program is running.
+/// and QsearchWithoutChecksPhaseIndex. It is only called once during
+/// program startup, and never again while the program is running.
void MovePicker::init_phase_table() {
// Quiescence search with checks
QsearchWithChecksPhaseIndex = i - 1;
+ PhaseTable[i++] = PH_TT_MOVE;
PhaseTable[i++] = PH_QCAPTURES;
PhaseTable[i++] = PH_QCHECKS;
PhaseTable[i++] = PH_STOP;
- // Quiescence search with checks only and no captures
- QsearchNoCapturesPhaseIndex = i - 1;
- PhaseTable[i++] = PH_QCHECKS;
- PhaseTable[i++] = PH_STOP;
-
// Quiescence search without checks
QsearchWithoutChecksPhaseIndex = i - 1;
+ PhaseTable[i++] = PH_TT_MOVE;
PhaseTable[i++] = PH_QCAPTURES;
PhaseTable[i++] = PH_STOP;
- // Do not generate any move
- NoMovesPhaseIndex = i - 1;
- PhaseTable[i++] = PH_STOP;
}