General Search Improvement
Diffstat:
6 files changed, 14 insertions(+), 35 deletions(-)
@@ -3,7 +3,7 @@
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
project(
Stellar
VERSION 0.0.25
VERSION 0.0.26
DESCRIPTION "Chess engine written in C"
HOMEPAGE_URL https://git.dimitrijedobrota.com/stellar.git
LANGUAGES C CXX
@@ -11,13 +11,6 @@
target_link_libraries(engine
PRIVATE utils
)
stellar_target_precompile_headers(board
PRIVATE "board.hpp"
PRIVATE "move.hpp"
PRIVATE "movelist.hpp"
PRIVATE "piece.hpp"
)
set_target_properties(engine PROPERTIES
VERSION ${PROJECT_VERSION}
SOVERSION ${PROJECT_VERSION_MAJOR}
@@ -98,22 +98,19 @@
U32 inline move_list_score(Move move) {
return history[piece::get_index(type, board.get_side())][to_underlying(move.target())];
}
Move move_list_best_move;
void move_list_sort(MoveList &list, std::vector<int> &index, bool bestCheck = true) {
std::vector<int> move_list_sort(MoveList &list, const Move best) {
static std::vector<int> score(256);
bool best = false;
bool best_found = false;
for (int i = 0; i < list.size(); i++) {
score[i] = move_list_score(list[i]);
index[i] = i;
if (bestCheck && list[i] == move_list_best_move) {
if (list[i] == best) {
score[i] = 30000;
bestCheck = false;
best = true;
best_found = true;
}
}
if (!best && ply && follow_pv) {
if (!best_found && ply && follow_pv) {
follow_pv = false;
for (int i = 0; i < list.size(); i++) {
if (list[i] == pv_table[0][ply]) {
@@ -124,7 +121,10 @@
void move_list_sort(MoveList &list, std::vector<int> &index, bool bestCheck = tr
}
}
sort(index.begin(), index.begin() + list.size(), [&](int a, int b) { return score[a] > score[b]; });
std::vector<int> index(list.size());
std::iota(begin(index), end(index), 0);
sort(begin(index), end(index), [&](int a, int b) { return score[a] > score[b]; });
return index;
}
int evaluate(const Board &board) {
@@ -200,9 +200,7 @@
int quiescence(int16_t alpha, int16_t beta) {
Board copy;
MoveList list(board);
std::vector<int> index(list.size());
move_list_sort(list, index, false);
for (int idx : index) {
for (int idx : move_list_sort(list, Move())) {
if (!stats_move_make(copy, list[idx], 1)) continue;
score = -quiescence(-beta, -alpha);
stats_move_unmake(copy);
@@ -300,11 +298,8 @@
int negamax(int16_t alpha, int16_t beta, uint8_t depth, bool null) {
int legal_moves = 0;
int searched = 0;
move_list_best_move = bestMove;
MoveList list(board);
std::vector<int> index(list.size());
move_list_sort(list, index);
for (int idx : index) {
for (int idx : move_list_sort(list, bestMove)) {
const Move move = list[idx];
if (!stats_move_make(copy, move, 0)) continue;
legal_moves++;
@@ -380,7 +375,7 @@
void search_position(const uci::Settings &settingsr) {
settings = &settingsr;
if (settings->newgame) {
ttable = TTable(C64(0x400000));
ttable = TTable(C64(0x1000000));
}
ply = 0;
@@ -26,7 +26,7 @@
struct Move {
PCQUEEN,
};
Move() = default;
Move() : source_i(0), target_i(0), flags_i(0) {}
Move(Square source, Square target, Flag flags)
: source_i(to_underlying(source)), target_i(to_underlying(target)), flags_i(flags) {}
@@ -10,17 +10,9 @@
((color == Color::BLACK && source >= Square::a7 && source <= Square::h7) || \
(color == Color::WHITE && source >= Square::a2 && source <= Square::h2))
using piece::Type::BISHOP;
using piece::Type::KING;
using piece::Type::KNIGHT;
using piece::Type::NONE;
using piece::Type::PAWN;
using piece::Type::QUEEN;
using piece::Type::ROOK;
void MoveList::generate(const Board &board) {
this->clear();
uint8_t src_i, tgt_i;
Color color = board.get_side();
@@ -29,7 +29,6 @@
class MoveList {
private:
void generate(const Board &board);
void clear() { list.clear(); }
list_t list;
};