mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 08:43:09 +00:00
Small tweaks in movepick.cpp
No functional change.
This commit is contained in:
parent
21120288a3
commit
0dc6f16992
1 changed files with 33 additions and 33 deletions
|
@ -35,7 +35,7 @@ namespace {
|
||||||
STOP
|
STOP
|
||||||
};
|
};
|
||||||
|
|
||||||
// Our insertion sort, which is guaranteed (and also needed) to be stable
|
// Our insertion sort, which is guaranteed to be stable, as it should be
|
||||||
void insertion_sort(ExtMove* begin, ExtMove* end)
|
void insertion_sort(ExtMove* begin, ExtMove* end)
|
||||||
{
|
{
|
||||||
ExtMove tmp, *p, *q;
|
ExtMove tmp, *p, *q;
|
||||||
|
@ -49,14 +49,15 @@ namespace {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Picks the best move in the range (begin, end) and moves it to the front.
|
// pick_best() finds the best move in the range (begin, end) and moves it to
|
||||||
// It's faster than sorting all the moves in advance when there are few
|
// the front. It's faster than sorting all the moves in advance when there
|
||||||
// moves e.g. possible captures.
|
// are few moves e.g. the possible captures.
|
||||||
inline ExtMove* pick_best(ExtMove* begin, ExtMove* end)
|
inline Move pick_best(ExtMove* begin, ExtMove* end)
|
||||||
{
|
{
|
||||||
std::swap(*begin, *std::max_element(begin, end));
|
std::swap(*begin, *std::max_element(begin, end));
|
||||||
return begin;
|
return begin->move;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
|
@ -196,7 +197,7 @@ void MovePicker::generate_next_stage() {
|
||||||
case CAPTURES_S1: case CAPTURES_S3: case CAPTURES_S4: case CAPTURES_S5: case CAPTURES_S6:
|
case CAPTURES_S1: case CAPTURES_S3: case CAPTURES_S4: case CAPTURES_S5: case CAPTURES_S6:
|
||||||
endMoves = generate<CAPTURES>(pos, moves);
|
endMoves = generate<CAPTURES>(pos, moves);
|
||||||
score<CAPTURES>();
|
score<CAPTURES>();
|
||||||
return;
|
break;
|
||||||
|
|
||||||
case KILLERS_S1:
|
case KILLERS_S1:
|
||||||
cur = killers;
|
cur = killers;
|
||||||
|
@ -207,53 +208,52 @@ void MovePicker::generate_next_stage() {
|
||||||
killers[2].move = killers[3].move = MOVE_NONE;
|
killers[2].move = killers[3].move = MOVE_NONE;
|
||||||
killers[4].move = killers[5].move = MOVE_NONE;
|
killers[4].move = killers[5].move = MOVE_NONE;
|
||||||
|
|
||||||
// Please note that following code is racy and could yield to rare (less
|
// In SMP case countermoves[] and followupmoves[] could have duplicated entries
|
||||||
// than 1 out of a million) duplicated entries in SMP case. This is harmless.
|
// in rare cases (less than 1 out of a million). This is harmless.
|
||||||
|
|
||||||
// Be sure countermoves are different from killers
|
// Be sure countermoves and followupmoves are different from killers
|
||||||
for (int i = 0; i < 2; ++i)
|
for (int i = 0; i < 2; ++i)
|
||||||
if ( countermoves[i] != (cur+0)->move
|
if ( countermoves[i] != killers[0].move
|
||||||
&& countermoves[i] != (cur+1)->move)
|
&& countermoves[i] != killers[1].move)
|
||||||
(endMoves++)->move = countermoves[i];
|
(endMoves++)->move = countermoves[i];
|
||||||
|
|
||||||
// Be sure followupmoves are different from killers and countermoves
|
|
||||||
for (int i = 0; i < 2; ++i)
|
for (int i = 0; i < 2; ++i)
|
||||||
if ( followupmoves[i] != (cur+0)->move
|
if ( followupmoves[i] != killers[0].move
|
||||||
&& followupmoves[i] != (cur+1)->move
|
&& followupmoves[i] != killers[1].move
|
||||||
&& followupmoves[i] != (cur+2)->move
|
&& followupmoves[i] != killers[2].move
|
||||||
&& followupmoves[i] != (cur+3)->move)
|
&& followupmoves[i] != killers[3].move)
|
||||||
(endMoves++)->move = followupmoves[i];
|
(endMoves++)->move = followupmoves[i];
|
||||||
return;
|
break;
|
||||||
|
|
||||||
case QUIETS_1_S1:
|
case QUIETS_1_S1:
|
||||||
endQuiets = endMoves = generate<QUIETS>(pos, moves);
|
endQuiets = endMoves = generate<QUIETS>(pos, moves);
|
||||||
score<QUIETS>();
|
score<QUIETS>();
|
||||||
endMoves = std::partition(cur, endMoves, [](const ExtMove& m) { return m.value > VALUE_ZERO; });
|
endMoves = std::partition(cur, endMoves, [](const ExtMove& m) { return m.value > VALUE_ZERO; });
|
||||||
insertion_sort(cur, endMoves);
|
insertion_sort(cur, endMoves);
|
||||||
return;
|
break;
|
||||||
|
|
||||||
case QUIETS_2_S1:
|
case QUIETS_2_S1:
|
||||||
cur = endMoves;
|
cur = endMoves;
|
||||||
endMoves = endQuiets;
|
endMoves = endQuiets;
|
||||||
if (depth >= 3 * ONE_PLY)
|
if (depth >= 3 * ONE_PLY)
|
||||||
insertion_sort(cur, endMoves);
|
insertion_sort(cur, endMoves);
|
||||||
return;
|
break;
|
||||||
|
|
||||||
case BAD_CAPTURES_S1:
|
case BAD_CAPTURES_S1:
|
||||||
// Just pick them in reverse order to get MVV/LVA ordering
|
// Just pick them in reverse order to get MVV/LVA ordering
|
||||||
cur = moves + MAX_MOVES - 1;
|
cur = moves + MAX_MOVES - 1;
|
||||||
endMoves = endBadCaptures;
|
endMoves = endBadCaptures;
|
||||||
return;
|
break;
|
||||||
|
|
||||||
case EVASIONS_S2:
|
case EVASIONS_S2:
|
||||||
endMoves = generate<EVASIONS>(pos, moves);
|
endMoves = generate<EVASIONS>(pos, moves);
|
||||||
if (endMoves > moves + 1)
|
if (endMoves - moves > 1)
|
||||||
score<EVASIONS>();
|
score<EVASIONS>();
|
||||||
return;
|
break;
|
||||||
|
|
||||||
case QUIET_CHECKS_S3:
|
case QUIET_CHECKS_S3:
|
||||||
endMoves = generate<QUIET_CHECKS>(pos, moves);
|
endMoves = generate<QUIET_CHECKS>(pos, moves);
|
||||||
return;
|
break;
|
||||||
|
|
||||||
case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: case RECAPTURE:
|
case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: case RECAPTURE:
|
||||||
stage = STOP;
|
stage = STOP;
|
||||||
|
@ -261,7 +261,7 @@ void MovePicker::generate_next_stage() {
|
||||||
|
|
||||||
case STOP:
|
case STOP:
|
||||||
endMoves = cur + 1; // Avoid another next_phase() call
|
endMoves = cur + 1; // Avoid another next_phase() call
|
||||||
return;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
assert(false);
|
assert(false);
|
||||||
|
@ -290,7 +290,7 @@ Move MovePicker::next_move<false>() {
|
||||||
return ttMove;
|
return ttMove;
|
||||||
|
|
||||||
case CAPTURES_S1:
|
case CAPTURES_S1:
|
||||||
move = pick_best(cur++, endMoves)->move;
|
move = pick_best(cur++, endMoves);
|
||||||
if (move != ttMove)
|
if (move != ttMove)
|
||||||
{
|
{
|
||||||
if (pos.see_sign(move) >= VALUE_ZERO)
|
if (pos.see_sign(move) >= VALUE_ZERO)
|
||||||
|
@ -302,7 +302,7 @@ Move MovePicker::next_move<false>() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case KILLERS_S1:
|
case KILLERS_S1:
|
||||||
move = (cur++)->move;
|
move = *cur++;
|
||||||
if ( move != MOVE_NONE
|
if ( move != MOVE_NONE
|
||||||
&& move != ttMove
|
&& move != ttMove
|
||||||
&& pos.pseudo_legal(move)
|
&& pos.pseudo_legal(move)
|
||||||
|
@ -311,7 +311,7 @@ Move MovePicker::next_move<false>() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QUIETS_1_S1: case QUIETS_2_S1:
|
case QUIETS_1_S1: case QUIETS_2_S1:
|
||||||
move = (cur++)->move;
|
move = *cur++;
|
||||||
if ( move != ttMove
|
if ( move != ttMove
|
||||||
&& move != killers[0].move
|
&& move != killers[0].move
|
||||||
&& move != killers[1].move
|
&& move != killers[1].move
|
||||||
|
@ -323,28 +323,28 @@ Move MovePicker::next_move<false>() {
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BAD_CAPTURES_S1:
|
case BAD_CAPTURES_S1:
|
||||||
return (cur--)->move;
|
return *cur--;
|
||||||
|
|
||||||
case EVASIONS_S2: case CAPTURES_S3: case CAPTURES_S4:
|
case EVASIONS_S2: case CAPTURES_S3: case CAPTURES_S4:
|
||||||
move = pick_best(cur++, endMoves)->move;
|
move = pick_best(cur++, endMoves);
|
||||||
if (move != ttMove)
|
if (move != ttMove)
|
||||||
return move;
|
return move;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CAPTURES_S5:
|
case CAPTURES_S5:
|
||||||
move = pick_best(cur++, endMoves)->move;
|
move = pick_best(cur++, endMoves);
|
||||||
if (move != ttMove && pos.see(move) > captureThreshold)
|
if (move != ttMove && pos.see(move) > captureThreshold)
|
||||||
return move;
|
return move;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CAPTURES_S6:
|
case CAPTURES_S6:
|
||||||
move = pick_best(cur++, endMoves)->move;
|
move = pick_best(cur++, endMoves);
|
||||||
if (to_sq(move) == recaptureSquare)
|
if (to_sq(move) == recaptureSquare)
|
||||||
return move;
|
return move;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QUIET_CHECKS_S3:
|
case QUIET_CHECKS_S3:
|
||||||
move = (cur++)->move;
|
move = *cur++;
|
||||||
if (move != ttMove)
|
if (move != ttMove)
|
||||||
return move;
|
return move;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Reference in a new issue