1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-11 11:39:15 +00:00

Small tweaks to search()

No functional change also in faked split mode

To be sure verified in real games with 4 threads TC 2"+0.1
After 11125 games 2497 - 2469 - 6159 ELO +0 (+- 4.4)

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2011-06-25 14:31:57 +01:00
parent f25582d4b8
commit 30ca6935a5
2 changed files with 28 additions and 38 deletions

View file

@ -230,7 +230,7 @@ Score PawnInfo::updateShelter(const Position& pos, Square ksq) {
for (int i = 0; i < 3; i++)
{
r += Shift;
shelter += BitCount8Bit[(pawns >> r) & 0xFF] * (64 >> i);
shelter += BitCount8Bit[(pawns >> r) & 0xFF] << (6 - i);
}
}
kingSquares[Us] = ksq;

View file

@ -776,7 +776,6 @@ namespace {
// TT value, so we use a different position key in case of an excluded move.
excludedMove = ss->excludedMove;
posKey = excludedMove ? pos.get_exclusion_key() : pos.get_key();
tte = TT.probe(posKey);
ttMove = tte ? tte->move() : MOVE_NONE;
@ -976,7 +975,7 @@ split_point_start: // At split points actual search starts from here
if (move == excludedMove)
continue;
// At PV and SpNode nodes we want the moves to be legal
// At PV and SpNode nodes we want all moves to be legal since the beginning
if ((PvNode || SpNode) && !pos.pl_move_is_legal(move, ci.pinned))
continue;
@ -1004,14 +1003,14 @@ split_point_start: // At split points actual search starts from here
cout << "info" << speed_to_uci(pos.nodes_searched()) << endl;
}
// For long searches send to GUI current move
// For long searches send current move info to GUI
if (current_search_time() > 2000)
cout << "info" << depth_to_uci(depth)
<< " currmove " << move << " currmovenumber " << moveCount << endl;
}
// At Root and at first iteration do a PV search on all the moves to score root moves
isPvMove = (PvNode && moveCount <= (RootNode ? depth <= ONE_PLY ? MAX_MOVES : MultiPV : 1));
isPvMove = (PvNode && moveCount <= (!RootNode ? 1 : depth <= ONE_PLY ? MAX_MOVES : MultiPV));
givesCheck = pos.move_gives_check(move, ci);
captureOrPromotion = pos.move_is_capture_or_promotion(move);
@ -1107,13 +1106,12 @@ split_point_start: // At split points actual search starts from here
}
ss->currentMove = move;
if (!SpNode && !captureOrPromotion)
movesSearched[playedMoveCount++] = move;
// Step 14. Make the move
pos.do_move(move, st, ci, givesCheck);
if (!SpNode && !captureOrPromotion)
movesSearched[playedMoveCount++] = move;
// Step extra. pv search (only in PV nodes)
// The first move in list is the expected PV
if (isPvMove)
@ -1124,24 +1122,23 @@ split_point_start: // At split points actual search starts from here
// Step 15. Reduced depth search
// If the move fails high will be re-searched at full depth.
bool doFullDepthSearch = true;
alpha = SpNode ? sp->alpha : alpha;
if ( depth > 3 * ONE_PLY
&& !captureOrPromotion
&& !dangerous
&& !move_is_castle(move)
&& ss->killers[0] != move
&& ss->killers[1] != move)
&& ss->killers[1] != move
&& (ss->reduction = reduction<PvNode>(depth, moveCount)) != DEPTH_ZERO)
{
ss->reduction = reduction<PvNode>(depth, moveCount);
if (ss->reduction)
{
Depth d = newDepth - ss->reduction;
value = d < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
: - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d);
doFullDepthSearch = (value > alpha);
}
ss->reduction = DEPTH_ZERO; // Restore original reduction
Depth d = newDepth - ss->reduction;
alpha = SpNode ? sp->alpha : alpha;
value = d < ONE_PLY ? -qsearch<NonPV>(pos, ss+1, -(alpha+1), -alpha, DEPTH_ZERO)
: - search<NonPV>(pos, ss+1, -(alpha+1), -alpha, d);
ss->reduction = DEPTH_ZERO;
doFullDepthSearch = (value > alpha);
}
// Step 16. Full depth search
@ -1173,29 +1170,23 @@ split_point_start: // At split points actual search starts from here
alpha = sp->alpha;
}
if (value > bestValue && !(SpNode && thread.cutoff_occurred()))
if (value > bestValue)
{
bestValue = value;
ss->bestMove = move;
if (SpNode)
sp->bestValue = value;
if ( !RootNode
&& PvNode
&& value > alpha
&& value < beta) // We want always alpha < beta
alpha = value;
if (!RootNode && value > alpha)
if (SpNode && !thread.cutoff_occurred())
{
if (PvNode && value < beta) // We want always alpha < beta
{
alpha = value;
if (SpNode)
sp->alpha = value;
}
else if (SpNode)
sp->is_betaCutoff = true;
ss->bestMove = move;
if (SpNode)
sp->ss->bestMove = move;
sp->bestValue = value;
sp->ss->bestMove = move;
sp->alpha = alpha;
sp->is_betaCutoff = (value >= beta);
}
}
@ -1216,7 +1207,6 @@ split_point_start: // At split points actual search starts from here
if (isPvMove || value > alpha)
{
// Update PV
ss->bestMove = move;
mp.current().pv_score = value;
mp.current().extract_pv_from_tt(pos);