Skip to content

Commit

Permalink
Extra thinking before accepting draw PVs.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
vondele authored and mcostalba committed Oct 28, 2017
1 parent 287e2e2 commit e50af36
Showing 1 changed file with 27 additions and 2 deletions.
29 changes: 27 additions & 2 deletions src/search.cpp
Expand Up @@ -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.
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -1427,6 +1434,24 @@ namespace {
}


// 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.

Expand Down

1 comment on commit e50af36

@Bernton
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well done!

Please sign in to comment.