EVASION, EVASIONS_S2,
QSEARCH_0, CAPTURES_S3, QUIET_CHECKS_S3,
QSEARCH_1, CAPTURES_S4,
- PROBCUT, CAPTURES_S5,
+ MULTICUT, CAPTURES_S5,
RECAPTURE, CAPTURES_S6,
STOP
};
assert(!pos.checkers());
- stage = PROBCUT;
+ stage = MULTICUT;
- // In ProbCut we generate only captures that are better than the parent's
+ // In MultiCut we generate only captures that are better than the parent's
// captured piece.
captureThreshold = PieceValue[MG][pt];
ttMove = (ttm && pos.pseudo_legal(ttm) ? ttm : MOVE_NONE);
}
-/// generate_next() generates, scores and sorts the next bunch of moves, when
-/// there are no more moves to try for the current phase.
+/// generate_next_stage() generates, scores and sorts the next bunch of moves,
+/// when there are no more moves to try for the current stage.
-void MovePicker::generate_next() {
+void MovePicker::generate_next_stage() {
cur = moves;
killers[2].move = killers[3].move = MOVE_NONE;
killers[4].move = killers[5].move = MOVE_NONE;
+ // Please note that following code is racy and could yield to rare (less
+ // than 1 out of a million) duplicated entries in SMP case. This is harmless.
+
// Be sure countermoves are different from killers
for (int i = 0; i < 2; ++i)
if ( countermoves[i] != (cur+0)->move
&& countermoves[i] != (cur+1)->move)
(end++)->move = countermoves[i];
- if (countermoves[1] && countermoves[1] == countermoves[0]) // Due to SMP races
- killers[3].move = MOVE_NONE;
-
// Be sure followupmoves are different from killers and countermoves
for (int i = 0; i < 2; ++i)
if ( followupmoves[i] != (cur+0)->move
&& followupmoves[i] != (cur+2)->move
&& followupmoves[i] != (cur+3)->move)
(end++)->move = followupmoves[i];
-
- if (followupmoves[1] && followupmoves[1] == followupmoves[0]) // Due to SMP races
- (--end)->move = MOVE_NONE;
-
return;
case QUIETS_1_S1:
end = generate<QUIET_CHECKS>(pos, moves);
return;
- case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: case RECAPTURE:
+ case EVASION: case QSEARCH_0: case QSEARCH_1: case MULTICUT: case RECAPTURE:
stage = STOP;
case STOP:
end = cur + 1; // Avoid another next_phase() call
while (true)
{
while (cur == end)
- generate_next();
+ generate_next_stage();
switch (stage) {
- case MAIN_SEARCH: case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT:
+ case MAIN_SEARCH: case EVASION: case QSEARCH_0: case QSEARCH_1: case MULTICUT:
++cur;
return ttMove;