mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 00:33:09 +00:00
Convert killers to a vector
Add infrastructure to threat killer moves as a vector, this will allow us to easily parametrize the number of killer moves, instead of hardcode this value to two as is now. This patch just add the infrastructure, no functional change. Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
parent
a7227ac26f
commit
93bc05cf69
6 changed files with 64 additions and 50 deletions
|
@ -66,12 +66,12 @@ namespace {
|
||||||
/// move ordering is at the current node.
|
/// move ordering is at the current node.
|
||||||
|
|
||||||
MovePicker::MovePicker(const Position& p, bool pv, Move ttm,
|
MovePicker::MovePicker(const Position& p, bool pv, Move ttm,
|
||||||
Move mk, Move k1, Move k2, Depth d, EvalInfo* ei) : pos(p) {
|
const SearchStack& ss, Depth d, EvalInfo* ei) : pos(p) {
|
||||||
pvNode = pv;
|
pvNode = pv;
|
||||||
ttMove = ttm;
|
ttMove = ttm;
|
||||||
mateKiller = (mk == ttm)? MOVE_NONE : mk;
|
mateKiller = (ss.mateKiller == ttm)? MOVE_NONE : ss.mateKiller;
|
||||||
killer1 = k1;
|
killer1 = ss.killers[0];
|
||||||
killer2 = k2;
|
killer2 = ss.killers[0];
|
||||||
depth = d;
|
depth = d;
|
||||||
movesPicked = 0;
|
movesPicked = 0;
|
||||||
numOfMoves = 0;
|
numOfMoves = 0;
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "depth.h"
|
#include "depth.h"
|
||||||
#include "lock.h"
|
#include "lock.h"
|
||||||
#include "position.h"
|
#include "position.h"
|
||||||
|
#include "search.h"
|
||||||
|
|
||||||
|
|
||||||
////
|
////
|
||||||
|
@ -62,7 +63,7 @@ public:
|
||||||
PH_STOP
|
PH_STOP
|
||||||
};
|
};
|
||||||
|
|
||||||
MovePicker(const Position& p, bool pvnode, Move ttm, Move mk, Move k1, Move k2, Depth d, EvalInfo* ei = NULL);
|
MovePicker(const Position& p, bool pvnode, Move ttm, const SearchStack& ss, Depth d, EvalInfo* ei = NULL);
|
||||||
Move get_next_move();
|
Move get_next_move();
|
||||||
Move get_next_move(Lock &lock);
|
Move get_next_move(Lock &lock);
|
||||||
int number_of_moves() const;
|
int number_of_moves() const;
|
||||||
|
|
|
@ -1914,8 +1914,7 @@ bool Position::is_mate() {
|
||||||
|
|
||||||
if (is_check())
|
if (is_check())
|
||||||
{
|
{
|
||||||
MovePicker mp = MovePicker(*this, false, MOVE_NONE, MOVE_NONE,
|
MovePicker mp = MovePicker(*this, false, MOVE_NONE, EmptySearchStack, Depth(0));
|
||||||
MOVE_NONE, MOVE_NONE, Depth(0));
|
|
||||||
return mp.get_next_move() == MOVE_NONE;
|
return mp.get_next_move() == MOVE_NONE;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -154,8 +154,7 @@ const std::string move_to_san(Position &pos, Move m) {
|
||||||
Move move_from_san(Position &pos, const std::string &movestr) {
|
Move move_from_san(Position &pos, const std::string &movestr) {
|
||||||
assert(pos.is_ok());
|
assert(pos.is_ok());
|
||||||
|
|
||||||
MovePicker mp = MovePicker(pos, false, MOVE_NONE, MOVE_NONE, MOVE_NONE,
|
MovePicker mp = MovePicker(pos, false, MOVE_NONE, EmptySearchStack, OnePly);
|
||||||
MOVE_NONE, OnePly);
|
|
||||||
|
|
||||||
// Castling moves
|
// Castling moves
|
||||||
if(movestr == "O-O-O") {
|
if(movestr == "O-O-O") {
|
||||||
|
@ -350,8 +349,7 @@ namespace {
|
||||||
if(type_of_piece(pc) == KING)
|
if(type_of_piece(pc) == KING)
|
||||||
return AMBIGUITY_NONE;
|
return AMBIGUITY_NONE;
|
||||||
|
|
||||||
MovePicker mp = MovePicker(pos, false, MOVE_NONE, MOVE_NONE, MOVE_NONE,
|
MovePicker mp = MovePicker(pos, false, MOVE_NONE, EmptySearchStack, OnePly);
|
||||||
MOVE_NONE, OnePly);
|
|
||||||
Move mv, moveList[8];
|
Move mv, moveList[8];
|
||||||
int i, j, n;
|
int i, j, n;
|
||||||
|
|
||||||
|
|
|
@ -238,6 +238,7 @@ namespace {
|
||||||
Depth depth, int ply, int threadID);
|
Depth depth, int ply, int threadID);
|
||||||
void sp_search(SplitPoint *sp, int threadID);
|
void sp_search(SplitPoint *sp, int threadID);
|
||||||
void sp_search_pv(SplitPoint *sp, int threadID);
|
void sp_search_pv(SplitPoint *sp, int threadID);
|
||||||
|
void init_search_stack(SearchStack ss);
|
||||||
void init_search_stack(SearchStack ss[]);
|
void init_search_stack(SearchStack ss[]);
|
||||||
void init_node(const Position &pos, SearchStack ss[], int ply, int threadID);
|
void init_node(const Position &pos, SearchStack ss[], int ply, int threadID);
|
||||||
void update_pv(SearchStack ss[], int ply);
|
void update_pv(SearchStack ss[], int ply);
|
||||||
|
@ -298,6 +299,9 @@ Lock IOLock;
|
||||||
|
|
||||||
History H; // Should be made local?
|
History H; // Should be made local?
|
||||||
|
|
||||||
|
// The empty search stack
|
||||||
|
SearchStack EmptySearchStack;
|
||||||
|
|
||||||
|
|
||||||
////
|
////
|
||||||
//// Functions
|
//// Functions
|
||||||
|
@ -562,6 +566,9 @@ void init_threads() {
|
||||||
// Wait until the thread has finished launching:
|
// Wait until the thread has finished launching:
|
||||||
while (!Threads[i].running);
|
while (!Threads[i].running);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Init also the empty search stack
|
||||||
|
init_search_stack(EmptySearchStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -938,8 +945,7 @@ namespace {
|
||||||
|
|
||||||
// Initialize a MovePicker object for the current position, and prepare
|
// Initialize a MovePicker object for the current position, and prepare
|
||||||
// to search all moves
|
// to search all moves
|
||||||
MovePicker mp = MovePicker(pos, true, ttMove, ss[ply].mateKiller,
|
MovePicker mp = MovePicker(pos, true, ttMove, ss[ply], depth);
|
||||||
ss[ply].killer1, ss[ply].killer2, depth);
|
|
||||||
|
|
||||||
Move move, movesSearched[256];
|
Move move, movesSearched[256];
|
||||||
int moveCount = 0;
|
int moveCount = 0;
|
||||||
|
@ -992,8 +998,8 @@ namespace {
|
||||||
&& !move_promotion(move)
|
&& !move_promotion(move)
|
||||||
&& !moveIsPassedPawnPush
|
&& !moveIsPassedPawnPush
|
||||||
&& !move_is_castle(move)
|
&& !move_is_castle(move)
|
||||||
&& move != ss[ply].killer1
|
&& move != ss[ply].killers[0]
|
||||||
&& move != ss[ply].killer2)
|
&& move != ss[ply].killers[1])
|
||||||
{
|
{
|
||||||
ss[ply].reduction = OnePly;
|
ss[ply].reduction = OnePly;
|
||||||
value = -search(pos, ss, -alpha, newDepth-OnePly, ply+1, true, threadID);
|
value = -search(pos, ss, -alpha, newDepth-OnePly, ply+1, true, threadID);
|
||||||
|
@ -1075,10 +1081,10 @@ namespace {
|
||||||
if (ok_to_history(pos, m)) // Only non capture moves are considered
|
if (ok_to_history(pos, m)) // Only non capture moves are considered
|
||||||
{
|
{
|
||||||
update_history(pos, m, depth, movesSearched, moveCount);
|
update_history(pos, m, depth, movesSearched, moveCount);
|
||||||
if (m != ss[ply].killer1)
|
if (m != ss[ply].killers[0])
|
||||||
{
|
{
|
||||||
ss[ply].killer2 = ss[ply].killer1;
|
ss[ply].killers[1] = ss[ply].killers[0];
|
||||||
ss[ply].killer1 = m;
|
ss[ply].killers[0] = m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TT.store(pos, value_to_tt(bestValue, ply), depth, m, VALUE_TYPE_LOWER);
|
TT.store(pos, value_to_tt(bestValue, ply), depth, m, VALUE_TYPE_LOWER);
|
||||||
|
@ -1197,8 +1203,7 @@ namespace {
|
||||||
|
|
||||||
// Initialize a MovePicker object for the current position, and prepare
|
// Initialize a MovePicker object for the current position, and prepare
|
||||||
// to search all moves:
|
// to search all moves:
|
||||||
MovePicker mp = MovePicker(pos, false, ttMove, ss[ply].mateKiller,
|
MovePicker mp = MovePicker(pos, false, ttMove, ss[ply], depth);
|
||||||
ss[ply].killer1, ss[ply].killer2, depth);
|
|
||||||
|
|
||||||
Move move, movesSearched[256];
|
Move move, movesSearched[256];
|
||||||
int moveCount = 0;
|
int moveCount = 0;
|
||||||
|
@ -1267,8 +1272,8 @@ namespace {
|
||||||
&& !move_promotion(move)
|
&& !move_promotion(move)
|
||||||
&& !moveIsPassedPawnPush
|
&& !moveIsPassedPawnPush
|
||||||
&& !move_is_castle(move)
|
&& !move_is_castle(move)
|
||||||
&& move != ss[ply].killer1
|
&& move != ss[ply].killers[0]
|
||||||
&& move != ss[ply].killer2)
|
&& move != ss[ply].killers[1])
|
||||||
{
|
{
|
||||||
ss[ply].reduction = OnePly;
|
ss[ply].reduction = OnePly;
|
||||||
value = -search(pos, ss, -(beta-1), newDepth-OnePly, ply+1, true, threadID);
|
value = -search(pos, ss, -(beta-1), newDepth-OnePly, ply+1, true, threadID);
|
||||||
|
@ -1327,10 +1332,10 @@ namespace {
|
||||||
if (ok_to_history(pos, m)) // Only non capture moves are considered
|
if (ok_to_history(pos, m)) // Only non capture moves are considered
|
||||||
{
|
{
|
||||||
update_history(pos, m, depth, movesSearched, moveCount);
|
update_history(pos, m, depth, movesSearched, moveCount);
|
||||||
if (m != ss[ply].killer1)
|
if (m != ss[ply].killers[0])
|
||||||
{
|
{
|
||||||
ss[ply].killer2 = ss[ply].killer1;
|
ss[ply].killers[1] = ss[ply].killers[0];
|
||||||
ss[ply].killer1 = m;
|
ss[ply].killers[0] = m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TT.store(pos, value_to_tt(bestValue, ply), depth, m, VALUE_TYPE_LOWER);
|
TT.store(pos, value_to_tt(bestValue, ply), depth, m, VALUE_TYPE_LOWER);
|
||||||
|
@ -1388,8 +1393,7 @@ namespace {
|
||||||
// Initialize a MovePicker object for the current position, and prepare
|
// Initialize a MovePicker object for the current position, and prepare
|
||||||
// to search the moves. Because the depth is <= 0 here, only captures,
|
// to search the moves. Because the depth is <= 0 here, only captures,
|
||||||
// queen promotions and checks (only if depth == 0) will be generated.
|
// queen promotions and checks (only if depth == 0) will be generated.
|
||||||
MovePicker mp = MovePicker(pos, false, MOVE_NONE, MOVE_NONE, MOVE_NONE,
|
MovePicker mp = MovePicker(pos, false, MOVE_NONE, EmptySearchStack, depth, &ei);
|
||||||
MOVE_NONE, depth, &ei);
|
|
||||||
Move move;
|
Move move;
|
||||||
int moveCount = 0;
|
int moveCount = 0;
|
||||||
Bitboard dcCandidates = mp.discovered_check_candidates();
|
Bitboard dcCandidates = mp.discovered_check_candidates();
|
||||||
|
@ -1478,10 +1482,10 @@ namespace {
|
||||||
{
|
{
|
||||||
// Wrong to update history when depth is <= 0
|
// Wrong to update history when depth is <= 0
|
||||||
|
|
||||||
if (m != ss[ply].killer1)
|
if (m != ss[ply].killers[0])
|
||||||
{
|
{
|
||||||
ss[ply].killer2 = ss[ply].killer1;
|
ss[ply].killers[1] = ss[ply].killers[0];
|
||||||
ss[ply].killer1 = m;
|
ss[ply].killers[0] = m;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return bestValue;
|
return bestValue;
|
||||||
|
@ -1552,8 +1556,8 @@ namespace {
|
||||||
&& !moveIsPassedPawnPush
|
&& !moveIsPassedPawnPush
|
||||||
&& !move_promotion(move)
|
&& !move_promotion(move)
|
||||||
&& !move_is_castle(move)
|
&& !move_is_castle(move)
|
||||||
&& move != ss[sp->ply].killer1
|
&& move != ss[sp->ply].killers[0]
|
||||||
&& move != ss[sp->ply].killer2)
|
&& move != ss[sp->ply].killers[1])
|
||||||
{
|
{
|
||||||
ss[sp->ply].reduction = OnePly;
|
ss[sp->ply].reduction = OnePly;
|
||||||
value = -search(pos, ss, -(sp->beta-1), newDepth - OnePly, sp->ply+1, true, threadID);
|
value = -search(pos, ss, -(sp->beta-1), newDepth - OnePly, sp->ply+1, true, threadID);
|
||||||
|
@ -1660,8 +1664,8 @@ namespace {
|
||||||
&& !moveIsPassedPawnPush
|
&& !moveIsPassedPawnPush
|
||||||
&& !move_promotion(move)
|
&& !move_promotion(move)
|
||||||
&& !move_is_castle(move)
|
&& !move_is_castle(move)
|
||||||
&& move != ss[sp->ply].killer1
|
&& move != ss[sp->ply].killers[0]
|
||||||
&& move != ss[sp->ply].killer2)
|
&& move != ss[sp->ply].killers[1])
|
||||||
{
|
{
|
||||||
ss[sp->ply].reduction = OnePly;
|
ss[sp->ply].reduction = OnePly;
|
||||||
value = -search(pos, ss, -sp->alpha, newDepth - OnePly, sp->ply+1, true, threadID);
|
value = -search(pos, ss, -sp->alpha, newDepth - OnePly, sp->ply+1, true, threadID);
|
||||||
|
@ -1892,17 +1896,28 @@ namespace {
|
||||||
|
|
||||||
// init_search_stack() initializes a search stack at the beginning of a
|
// init_search_stack() initializes a search stack at the beginning of a
|
||||||
// new search from the root.
|
// new search from the root.
|
||||||
|
void init_search_stack(SearchStack ss) {
|
||||||
|
|
||||||
|
ss.pv[0] = MOVE_NONE;
|
||||||
|
ss.pv[1] = MOVE_NONE;
|
||||||
|
ss.currentMove = MOVE_NONE;
|
||||||
|
ss.threatMove = MOVE_NONE;
|
||||||
|
ss.reduction = Depth(0);
|
||||||
|
for (int j = 0; j < KILLER_MAX; j++)
|
||||||
|
ss.killers[j] = MOVE_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
void init_search_stack(SearchStack ss[]) {
|
void init_search_stack(SearchStack ss[]) {
|
||||||
for(int i = 0; i < 3; i++) {
|
|
||||||
|
for (int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
ss[i].pv[i] = MOVE_NONE;
|
ss[i].pv[i] = MOVE_NONE;
|
||||||
ss[i].pv[i+1] = MOVE_NONE;
|
ss[i].pv[i+1] = MOVE_NONE;
|
||||||
ss[i].currentMove = MOVE_NONE;
|
ss[i].currentMove = MOVE_NONE;
|
||||||
ss[i].mateKiller = MOVE_NONE;
|
|
||||||
ss[i].killer1 = MOVE_NONE;
|
|
||||||
ss[i].killer2 = MOVE_NONE;
|
|
||||||
ss[i].threatMove = MOVE_NONE;
|
ss[i].threatMove = MOVE_NONE;
|
||||||
ss[i].reduction = Depth(0);
|
ss[i].reduction = Depth(0);
|
||||||
|
for (int j = 0; j < KILLER_MAX; j++)
|
||||||
|
ss[i].killers[j] = MOVE_NONE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1929,7 +1944,7 @@ namespace {
|
||||||
|
|
||||||
ss[ply].pv[ply] = ss[ply].pv[ply+1] = ss[ply].currentMove = MOVE_NONE;
|
ss[ply].pv[ply] = ss[ply].pv[ply+1] = ss[ply].currentMove = MOVE_NONE;
|
||||||
ss[ply+2].mateKiller = MOVE_NONE;
|
ss[ply+2].mateKiller = MOVE_NONE;
|
||||||
ss[ply+2].killer1 = ss[ply+2].killer2 = MOVE_NONE;
|
ss[ply+2].killers[0] = ss[ply+2].killers[1] = MOVE_NONE;
|
||||||
ss[ply].threatMove = MOVE_NONE;
|
ss[ply].threatMove = MOVE_NONE;
|
||||||
ss[ply].reduction = Depth(0);
|
ss[ply].reduction = Depth(0);
|
||||||
ss[ply].currentMoveCaptureValue = Value(0);
|
ss[ply].currentMoveCaptureValue = Value(0);
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
|
|
||||||
const int PLY_MAX = 100;
|
const int PLY_MAX = 100;
|
||||||
const int PLY_MAX_PLUS_2 = 102;
|
const int PLY_MAX_PLUS_2 = 102;
|
||||||
|
const int KILLER_MAX = 4;
|
||||||
|
|
||||||
|
|
||||||
////
|
////
|
||||||
|
@ -56,8 +57,9 @@ struct SearchStack {
|
||||||
Move pv[PLY_MAX];
|
Move pv[PLY_MAX];
|
||||||
Move currentMove;
|
Move currentMove;
|
||||||
Value currentMoveCaptureValue;
|
Value currentMoveCaptureValue;
|
||||||
Move mateKiller, killer1, killer2;
|
Move mateKiller;
|
||||||
Move threatMove;
|
Move threatMove;
|
||||||
|
Move killers[KILLER_MAX];
|
||||||
Depth reduction;
|
Depth reduction;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -66,10 +68,9 @@ struct SearchStack {
|
||||||
//// Global variables
|
//// Global variables
|
||||||
////
|
////
|
||||||
|
|
||||||
|
extern SearchStack EmptySearchStack;
|
||||||
extern TranspositionTable TT;
|
extern TranspositionTable TT;
|
||||||
|
|
||||||
extern int ActiveThreads;
|
extern int ActiveThreads;
|
||||||
|
|
||||||
extern Lock SMPLock;
|
extern Lock SMPLock;
|
||||||
|
|
||||||
// Perhaps better to make H local, and pass as parameter to MovePicker?
|
// Perhaps better to make H local, and pass as parameter to MovePicker?
|
||||||
|
|
Loading…
Add table
Reference in a new issue