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:
parent
5c3aeae566
commit
d004ec924d
3 changed files with 12 additions and 10 deletions
|
@ -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;
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Reference in a new issue