Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SPSA tune search, king safety, and history update #687

Merged
merged 3 commits into from
Oct 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/evaluate.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,9 @@ const int Mobility[4][28] = {
};

// KingSafety [pt-2]
const int AttackPower[4] = { 35, 20, 40, 80 };
const int CheckPower[4] = { 100, 35, 65, 65 };
const int CountModifier[8] = { 0, 0, 64, 96, 113, 120, 124, 128 };
const int AttackPower[4] = { 35, 18, 31, 81 };
const int CheckPower[4] = { 85, 39, 72, 68 };
const int CountModifier[8] = { 0, 0, 65, 124, 96, 124, 123, 128 };


// Evaluates pawns
Expand Down
8 changes: 4 additions & 4 deletions src/history.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,17 @@
#define NoisyEntry(move) (&thread->captureHistory[piece(move)][toSq(move)][PieceTypeOf(capturing(move))])
#define ContEntry(offset, move) (&(*(ss-offset)->continuation)[piece(move)][toSq(move)])

#define QuietHistoryUpdate(move, bonus) (HistoryBonus(QuietEntry(move), bonus, 8192))
#define NoisyHistoryUpdate(move, bonus) (HistoryBonus(NoisyEntry(move), bonus, 16384))
#define ContHistoryUpdate(offset, move, bonus) (HistoryBonus(ContEntry(offset, move), bonus, 16384))
#define QuietHistoryUpdate(move, bonus) (HistoryBonus(QuietEntry(move), bonus, 6000))
#define NoisyHistoryUpdate(move, bonus) (HistoryBonus(NoisyEntry(move), bonus, 16900))
#define ContHistoryUpdate(offset, move, bonus) (HistoryBonus(ContEntry(offset, move), bonus, 21250))


INLINE void HistoryBonus(int16_t *cur, int bonus, int div) {
*cur += bonus - *cur * abs(bonus) / div;
}

INLINE int Bonus(Depth depth) {
return MIN(2100, 350 * depth - 350);
return MIN(2135, 400 * depth - 280);
}

INLINE void UpdateContHistories(Stack *ss, Move move, int bonus) {
Expand Down
4 changes: 2 additions & 2 deletions src/movepicker.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,8 @@ Move NextMove(MovePicker *mp) {
case NOISY_GOOD:
// Save seemingly bad noisy moves for later
while ((move = PickNextMove(mp)))
if ( mp->list.moves[mp->list.next-1].score > 12000
|| (mp->list.moves[mp->list.next-1].score > -8000 && SEE(pos, move, mp->threshold)))
if ( mp->list.moves[mp->list.next-1].score > 13450
|| (mp->list.moves[mp->list.next-1].score > -9000 && SEE(pos, move, mp->threshold)))
return move;
else
mp->list.moves[mp->bads++].move = move;
Expand Down
28 changes: 14 additions & 14 deletions src/search.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ static int Reductions[2][32][32];
CONSTR(1) InitReductions() {
for (int depth = 1; depth < 32; ++depth)
for (int moves = 1; moves < 32; ++moves)
Reductions[0][depth][moves] = 0.00 + log(depth) * log(moves) / 3.25, // capture
Reductions[1][depth][moves] = 1.50 + log(depth) * log(moves) / 1.75; // quiet
Reductions[0][depth][moves] = 0.10 + log(depth) * log(moves) / 3.00, // capture
Reductions[1][depth][moves] = 1.50 + log(depth) * log(moves) / 2.10; // quiet
}

// Checks if the move is in the list of searchmoves if any were given
Expand Down Expand Up @@ -307,7 +307,7 @@ static int AlphaBeta(Thread *thread, Stack *ss, int alpha, int beta, Depth depth
if (pvNode && depth >= 4 && !ttMove)
depth--;

if (cutnode && depth >= 7 && !ttMove)
if (cutnode && depth >= 8 && !ttMove)
depth--;

// Skip pruning in check, pv nodes, early iterations, when proving singularity, looking for terminal scores, or after a null move
Expand All @@ -317,18 +317,18 @@ static int AlphaBeta(Thread *thread, Stack *ss, int alpha, int beta, Depth depth
// Reverse Futility Pruning
if ( depth < 7
&& eval >= beta
&& eval - 100 * depth - (ss-1)->histScore / 400 >= beta
&& (!ttMove || GetHistory(thread, ss, ttMove) > 10000))
&& eval - 100 * depth - (ss-1)->histScore / 300 >= beta
&& (!ttMove || GetHistory(thread, ss, ttMove) > 7700))
return eval;

// Null Move Pruning
if ( eval >= beta
&& eval >= ss->eval
&& ss->eval >= beta + 120 - 15 * depth
&& (ss-1)->histScore < 35000
&& ss->eval >= beta + 140 - 15 * depth
&& (ss-1)->histScore < 26000
&& pos->nonPawnCount[sideToMove] > (depth > 8)) {

Depth reduction = 3 + depth / 5 + MIN(3, (eval - beta) / 256);
Depth reduction = 3 + depth / 4 + MIN(3, (eval - beta) / 256);

// Remember who last null-moved
Color nullMoverTemp = thread->nullMover;
Expand All @@ -348,7 +348,7 @@ static int AlphaBeta(Thread *thread, Stack *ss, int alpha, int beta, Depth depth
return score >= TBWIN_IN_MAX ? beta : score;
}

int probCutBeta = beta + 200;
int probCutBeta = beta + 180;

// ProbCut
if ( depth >= 5
Expand Down Expand Up @@ -376,7 +376,7 @@ static int AlphaBeta(Thread *thread, Stack *ss, int alpha, int beta, Depth depth

// Cut if the reduced depth search beats the threshold
if (score >= probCutBeta)
return score - 100;
return score - 115;
}
}

Expand Down Expand Up @@ -421,7 +421,7 @@ static int AlphaBeta(Thread *thread, Stack *ss, int alpha, int beta, Depth depth
continue;

// SEE pruning
if (lmrDepth < 7 && !SEE(pos, move, quiet ? -50 * depth : -90 * depth))
if (lmrDepth < 8 && !SEE(pos, move, quiet ? -50 * depth : -95 * depth))
continue;
}

Expand Down Expand Up @@ -510,7 +510,7 @@ static int AlphaBeta(Thread *thread, Stack *ss, int alpha, int beta, Depth depth

// Research with the same window at full depth if the reduced search failed high
if (score > alpha && lmrDepth < newDepth) {
bool deeper = score > bestScore + 70 + 12 * (newDepth - lmrDepth);
bool deeper = score > bestScore + 55 + 13 * (newDepth - lmrDepth);

newDepth += deeper;

Expand Down Expand Up @@ -597,12 +597,12 @@ static void AspirationWindow(Thread *thread, Stack *ss) {

int prevScore = thread->rootMoves[multiPV].score;

int delta = 12 + prevScore * prevScore / 16384;
int delta = 10 + prevScore * prevScore / 16384;

int alpha = MAX(prevScore - delta, -INFINITE);
int beta = MIN(prevScore + delta, INFINITE);

int x = CLAMP(prevScore / 2, -35, 35);
int x = CLAMP(prevScore / 2, -33, 33);
pos->trend = sideToMove == WHITE ? S(x, x/2) : -S(x, x/2);

// Repeatedly search and adjust the window until the score is inside the window
Expand Down