mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Extra thinking before accepting draw PVs.
If the PV leads to a draw (3-fold / 50-moves) position and we're ahead of time, think a little longer, possibly finding a better way. As this is most likely effective at higher draw rates, tried speculative LTC after a yellow STC: STC: http://tests.stockfishchess.org/tests/view/59eb173a0ebc590ccbb8975d LLR: -2.95 (-2.94,2.94) [0.00,5.00] Total: 56095 W: 10013 L: 9902 D: 36180 elo = 0.688 +- 1.711 LOS: 78.425% LTC: http://tests.stockfishchess.org/tests/view/59eba1670ebc590ccbb897b4 LLR: 2.95 (-2.94,2.94) [0.00,5.00] Total: 59579 W: 7577 L: 7273 D: 44729 elo = 1.773 +- 1.391 LOS: 99.381% bench: 5234652
This commit is contained in:
parent
287e2e2f74
commit
e50af36a00
1 changed files with 27 additions and 2 deletions
|
@ -149,6 +149,7 @@ namespace {
|
|||
void update_pv(Move* pv, Move move, Move* childPv);
|
||||
void update_continuation_histories(Stack* ss, Piece pc, Square to, int bonus);
|
||||
void update_stats(const Position& pos, Stack* ss, Move move, Move* quiets, int quietsCnt, int bonus);
|
||||
bool pv_is_draw(Position& pos);
|
||||
|
||||
// perft() is our utility to verify move generation. All the leaf nodes up
|
||||
// to the given depth are generated and counted, and the sum is returned.
|
||||
|
@ -475,11 +476,17 @@ void Thread::search() {
|
|||
// from the previous search and just did a fast verification.
|
||||
const int F[] = { mainThread->failedLow,
|
||||
bestValue - mainThread->previousScore };
|
||||
|
||||
int improvingFactor = std::max(229, std::min(715, 357 + 119 * F[0] - 6 * F[1]));
|
||||
double unstablePvFactor = 1 + mainThread->bestMoveChanges;
|
||||
|
||||
Color us = rootPos.side_to_move();
|
||||
bool thinkHard = DrawValue[us] == bestValue
|
||||
&& Limits.time[us] - Time.elapsed() > Limits.time[~us]
|
||||
&& ::pv_is_draw(rootPos);
|
||||
|
||||
double unstablePvFactor = 1 + mainThread->bestMoveChanges + thinkHard;
|
||||
|
||||
bool doEasyMove = rootMoves[0].pv[0] == easyMove
|
||||
&& !thinkHard
|
||||
&& mainThread->bestMoveChanges < 0.03
|
||||
&& Time.elapsed() > Time.optimum() * 5 / 44;
|
||||
|
||||
|
@ -1427,6 +1434,24 @@ moves_loop: // When in check search starts from here
|
|||
}
|
||||
|
||||
|
||||
// Is the PV leading to a draw position? Assumes all pv moves are legal
|
||||
bool pv_is_draw(Position& pos) {
|
||||
|
||||
StateInfo st[MAX_PLY];
|
||||
auto& pv = pos.this_thread()->rootMoves[0].pv;
|
||||
|
||||
for (size_t i = 0; i < pv.size(); ++i)
|
||||
pos.do_move(pv[i], st[i]);
|
||||
|
||||
bool isDraw = pos.is_draw(pv.size());
|
||||
|
||||
for (size_t i = pv.size(); i > 0; --i)
|
||||
pos.undo_move(pv[i-1]);
|
||||
|
||||
return isDraw;
|
||||
}
|
||||
|
||||
|
||||
// When playing with strength handicap, choose best move among a set of RootMoves
|
||||
// using a statistical rule dependent on 'level'. Idea by Heinz van Saanen.
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue