1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 16:23:09 +00:00

Fix errouneus reset of ss->threatMove

After we set ss->threatMove we could go under a IID step that
resets SearchStack ss and so also ss->threatMove.

When later we use that field in futility pruning we have this
set to MOVE_NONE !

The fix is to use a local variable and add threatMove to SplitPoint
to pass this move to slaves.

Spotted by Ralph Stoesser, fix suggested by Richard Vida.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-07-23 02:26:10 +01:00
parent 5c3aeae566
commit d004ec924d
3 changed files with 12 additions and 10 deletions

View file

@ -90,7 +90,7 @@ namespace {
template <bool Fake> template <bool Fake>
void split(const Position& pos, SearchStack* ss, int ply, Value* alpha, const Value beta, Value* bestValue, void split(const Position& pos, SearchStack* ss, int ply, Value* alpha, const Value beta, Value* bestValue,
Depth depth, bool mateThreat, int* moveCount, MovePicker* mp, bool pvNode); Depth depth, Move threatMove, bool mateThreat, int* moveCount, MovePicker* mp, bool pvNode);
private: private:
friend void poll(); friend void poll();
@ -364,7 +364,7 @@ void init_search() {
// Called at the beginning of search() when starting to examine a new node. // Called at the beginning of search() when starting to examine a new node.
void SearchStack::init() { void SearchStack::init() {
currentMove = threatMove = bestMove = MOVE_NONE; currentMove = bestMove = MOVE_NONE;
} }
// SearchStack::initKillers() initializes killers for a search stack entry // SearchStack::initKillers() initializes killers for a search stack entry
@ -1026,6 +1026,7 @@ namespace {
bool mateThreat = false; bool mateThreat = false;
int moveCount = 0; int moveCount = 0;
int threadID = pos.thread(); int threadID = pos.thread();
Move threatMove = MOVE_NONE;
refinedValue = bestValue = value = -VALUE_INFINITE; refinedValue = bestValue = value = -VALUE_INFINITE;
oldAlpha = alpha; oldAlpha = alpha;
@ -1190,10 +1191,10 @@ namespace {
if (nullValue == value_mated_in(ply + 2)) if (nullValue == value_mated_in(ply + 2))
mateThreat = true; mateThreat = true;
ss->threatMove = (ss+1)->currentMove; threatMove = (ss+1)->currentMove;
if ( depth < ThreatDepth if ( depth < ThreatDepth
&& (ss-1)->reduction && (ss-1)->reduction
&& connected_moves(pos, (ss-1)->currentMove, ss->threatMove)) && connected_moves(pos, (ss-1)->currentMove, threatMove))
return beta - 1; return beta - 1;
} }
} }
@ -1282,7 +1283,7 @@ namespace {
{ {
// Move count based pruning // Move count based pruning
if ( moveCount >= futility_move_count(depth) if ( moveCount >= futility_move_count(depth)
&& !(ss->threatMove && connected_threat(pos, move, ss->threatMove)) && !(threatMove && connected_threat(pos, move, threatMove))
&& bestValue > value_mated_in(PLY_MAX)) && bestValue > value_mated_in(PLY_MAX))
continue; continue;
@ -1390,7 +1391,7 @@ namespace {
&& !TM.thread_should_stop(threadID) && !TM.thread_should_stop(threadID)
&& Iteration <= 99) && Iteration <= 99)
TM.split<FakeSplit>(pos, ss, ply, &alpha, beta, &bestValue, depth, TM.split<FakeSplit>(pos, ss, ply, &alpha, beta, &bestValue, depth,
mateThreat, &moveCount, &mp, PvNode); threatMove, mateThreat, &moveCount, &mp, PvNode);
} }
// Step 19. Check for mate and stalemate // Step 19. Check for mate and stalemate
@ -1664,7 +1665,7 @@ namespace {
{ {
// Move count based pruning // Move count based pruning
if ( moveCount >= futility_move_count(sp->depth) if ( moveCount >= futility_move_count(sp->depth)
&& !(ss->threatMove && connected_threat(pos, move, ss->threatMove)) && !(sp->threatMove && connected_threat(pos, move, sp->threatMove))
&& sp->bestValue > value_mated_in(PLY_MAX)) && sp->bestValue > value_mated_in(PLY_MAX))
{ {
lock_grab(&(sp->lock)); lock_grab(&(sp->lock));
@ -2640,8 +2641,8 @@ namespace {
template <bool Fake> template <bool Fake>
void ThreadsManager::split(const Position& p, SearchStack* ss, int ply, Value* alpha, void ThreadsManager::split(const Position& p, SearchStack* ss, int ply, Value* alpha,
const Value beta, Value* bestValue, Depth depth, bool mateThreat, const Value beta, Value* bestValue, Depth depth, Move threatMove,
int* moveCount, MovePicker* mp, bool pvNode) { bool mateThreat, int* moveCount, MovePicker* mp, bool pvNode) {
assert(p.is_ok()); assert(p.is_ok());
assert(ply > 0 && ply < PLY_MAX); assert(ply > 0 && ply < PLY_MAX);
assert(*bestValue >= -VALUE_INFINITE); assert(*bestValue >= -VALUE_INFINITE);
@ -2674,6 +2675,7 @@ namespace {
splitPoint.stopRequest = false; splitPoint.stopRequest = false;
splitPoint.ply = ply; splitPoint.ply = ply;
splitPoint.depth = depth; splitPoint.depth = depth;
splitPoint.threatMove = threatMove;
splitPoint.mateThreat = mateThreat; splitPoint.mateThreat = mateThreat;
splitPoint.alpha = *alpha; splitPoint.alpha = *alpha;
splitPoint.beta = beta; splitPoint.beta = beta;

View file

@ -51,7 +51,6 @@ struct EvalInfo;
struct SearchStack { struct SearchStack {
Move currentMove; Move currentMove;
Move mateKiller; Move mateKiller;
Move threatMove;
Move excludedMove; Move excludedMove;
Move bestMove; Move bestMove;
Move killers[2]; Move killers[2];

View file

@ -55,6 +55,7 @@ struct SplitPoint {
bool pvNode, mateThreat; bool pvNode, mateThreat;
Value beta; Value beta;
int ply; int ply;
Move threatMove;
SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2]; SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2];
// Const pointers to shared data // Const pointers to shared data