mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-22 12:47:08 +00:00
Merge commit 'd47aa639bd614b37a59f87e6ab68496580f0cf3e' into cluster
This is the last commit before there are more conflicts.
This commit is contained in:
@@ -31,6 +31,9 @@ jobs:
|
||||
- name: Run under valgrind-thread
|
||||
make_option: ""
|
||||
instrumented_option: valgrind-thread
|
||||
- name: Run non-instrumented
|
||||
make_option: ""
|
||||
instrumented_option: none
|
||||
defaults:
|
||||
run:
|
||||
working-directory: src
|
||||
@@ -55,6 +58,14 @@ jobs:
|
||||
- name: Check git
|
||||
run: git --version
|
||||
|
||||
# Since Linux Kernel 6.5 we are getting false positives from the ci,
|
||||
# lower the ALSR entropy to disable ALSR, which works as a temporary workaround.
|
||||
# https://github.com/google/sanitizers/issues/1716
|
||||
# https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2056762
|
||||
|
||||
- name: Lower ALSR entropy
|
||||
run: sudo sysctl -w vm.mmap_rnd_bits=28
|
||||
|
||||
# Sanitizers
|
||||
|
||||
- name: ${{ matrix.sanitizers.name }}
|
||||
|
||||
@@ -227,8 +227,7 @@ class FeatureTransformer {
|
||||
|
||||
static constexpr void order_packs([[maybe_unused]] uint64_t* v) {
|
||||
#if defined(USE_AVX512) // _mm512_packs_epi16 ordering
|
||||
uint64_t tmp0, tmp1;
|
||||
tmp0 = v[2], tmp1 = v[3];
|
||||
uint64_t tmp0 = v[2], tmp1 = v[3];
|
||||
v[2] = v[8], v[3] = v[9];
|
||||
v[8] = v[4], v[9] = v[5];
|
||||
v[4] = tmp0, v[5] = tmp1;
|
||||
@@ -244,8 +243,7 @@ class FeatureTransformer {
|
||||
|
||||
static constexpr void inverse_order_packs([[maybe_unused]] uint64_t* v) {
|
||||
#if defined(USE_AVX512) // Inverse _mm512_packs_epi16 ordering
|
||||
uint64_t tmp0, tmp1;
|
||||
tmp0 = v[2], tmp1 = v[3];
|
||||
uint64_t tmp0 = v[2], tmp1 = v[3];
|
||||
v[2] = v[4], v[3] = v[5];
|
||||
v[4] = v[8], v[5] = v[9];
|
||||
v[8] = tmp0, v[9] = tmp1;
|
||||
|
||||
+5
-5
@@ -1012,11 +1012,11 @@ moves_loop: // When in check, search starts here
|
||||
if (!givesCheck && lmrDepth < 7 && !ss->inCheck)
|
||||
{
|
||||
Piece capturedPiece = pos.piece_on(move.to_sq());
|
||||
int futilityEval =
|
||||
ss->staticEval + 287 + 277 * lmrDepth + PieceValue[capturedPiece]
|
||||
Value futilityValue =
|
||||
ss->staticEval + 288 + 277 * lmrDepth + PieceValue[capturedPiece]
|
||||
+ thisThread->captureHistory[movedPiece][move.to_sq()][type_of(capturedPiece)]
|
||||
/ 7;
|
||||
if (futilityEval < alpha)
|
||||
if (futilityValue <= alpha)
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1439,7 +1439,7 @@ Value Search::Worker::qsearch(Position& pos, Stack* ss, Value alpha, Value beta,
|
||||
Key posKey;
|
||||
Move ttMove, move, bestMove;
|
||||
Depth ttDepth;
|
||||
Value bestValue, value, ttValue, futilityValue, futilityBase;
|
||||
Value bestValue, value, ttValue, futilityBase;
|
||||
bool pvHit, givesCheck, capture;
|
||||
int moveCount;
|
||||
Color us = pos.side_to_move();
|
||||
@@ -1569,7 +1569,7 @@ Value Search::Worker::qsearch(Position& pos, Stack* ss, Value alpha, Value beta,
|
||||
if (moveCount > 2)
|
||||
continue;
|
||||
|
||||
futilityValue = futilityBase + PieceValue[pos.piece_on(move.to_sq())];
|
||||
Value futilityValue = futilityBase + PieceValue[pos.piece_on(move.to_sq())];
|
||||
|
||||
// If static eval + value of piece we are going to capture is much lower
|
||||
// than alpha we can prune this move. (~2 Elo)
|
||||
|
||||
+3
-8
@@ -40,7 +40,8 @@ void TTEntry::save(
|
||||
move16 = m;
|
||||
|
||||
// Overwrite less valuable entries (cheapest checks first)
|
||||
if (b == BOUND_EXACT || uint16_t(k) != key16 || d - DEPTH_OFFSET + 2 * pv > depth8 - 4)
|
||||
if (b == BOUND_EXACT || uint16_t(k) != key16 || d - DEPTH_OFFSET + 2 * pv > depth8 - 4
|
||||
|| relative_age(generation8))
|
||||
{
|
||||
assert(d > DEPTH_OFFSET);
|
||||
assert(d < 256 + DEPTH_OFFSET);
|
||||
@@ -123,13 +124,7 @@ TTEntry* TranspositionTable::probe(const Key key, bool& found) const {
|
||||
|
||||
for (int i = 0; i < ClusterSize; ++i)
|
||||
if (tte[i].key16 == key16 || !tte[i].depth8)
|
||||
{
|
||||
constexpr uint8_t lowerBits = GENERATION_DELTA - 1;
|
||||
|
||||
// Refresh with new generation, keeping the lower bits the same.
|
||||
tte[i].genBound8 = uint8_t(generation8 | (tte[i].genBound8 & lowerBits));
|
||||
return found = bool(tte[i].depth8), &tte[i];
|
||||
}
|
||||
return found = bool(tte[i].depth8), &tte[i];
|
||||
|
||||
// Find an entry to be replaced according to the replacement strategy
|
||||
TTEntry* replace = tte;
|
||||
|
||||
+2
-2
@@ -336,8 +336,8 @@ WinRateParams win_rate_params(const Position& pos) {
|
||||
double m = std::clamp(material, 10, 78) / 58.0;
|
||||
|
||||
// Return a = p_a(material) and b = p_b(material), see github.com/official-stockfish/WDL_model
|
||||
constexpr double as[] = {-185.71965483, 504.85014385, -438.58295743, 474.04604627};
|
||||
constexpr double bs[] = {89.23542728, -137.02141296, 73.28669021, 47.53376190};
|
||||
constexpr double as[] = {-150.77043883, 394.96159472, -321.73403766, 406.15850091};
|
||||
constexpr double bs[] = {62.33245393, -91.02264855, 45.88486850, 51.63461272};
|
||||
|
||||
double a = (((as[0] * m + as[1]) * m + as[2]) * m) + as[3];
|
||||
double b = (((bs[0] * m + bs[1]) * m + bs[2]) * m) + bs[3];
|
||||
|
||||
+109
-14
@@ -8,27 +8,20 @@ error()
|
||||
}
|
||||
trap 'error ${LINENO}' ERR
|
||||
|
||||
# Since Linux Kernel 6.5 we are getting false positives from the ci,
|
||||
# lower the ALSR entropy to disable ALSR, which works as a temporary workaround.
|
||||
# https://github.com/google/sanitizers/issues/1716
|
||||
# https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2056762
|
||||
sudo sysctl -w vm.mmap_rnd_bits=28
|
||||
|
||||
|
||||
# define suitable post and prefixes for testing options
|
||||
case $1 in
|
||||
--valgrind)
|
||||
echo "valgrind testing started"
|
||||
prefix=''
|
||||
exeprefix='valgrind --error-exitcode=42 --errors-for-leak-kinds=all --leak-check=full'
|
||||
postfix='1>/dev/null'
|
||||
postfix=''
|
||||
threads="1"
|
||||
;;
|
||||
--valgrind-thread)
|
||||
echo "valgrind-thread testing started"
|
||||
prefix=''
|
||||
exeprefix='valgrind --fair-sched=try --error-exitcode=42'
|
||||
postfix='1>/dev/null'
|
||||
postfix=''
|
||||
threads="2"
|
||||
;;
|
||||
--sanitizer-undefined)
|
||||
@@ -112,7 +105,12 @@ diff $network verify.nnue
|
||||
# more general testing, following an uci protocol exchange
|
||||
cat << EOF > game.exp
|
||||
set timeout 240
|
||||
# to correctly catch eof we need the following line
|
||||
# expect_before timeout { exit 2 } eof { exit 3 }
|
||||
expect_before timeout { exit 2 }
|
||||
|
||||
spawn $exeprefix ./stockfish
|
||||
expect "Stockfish"
|
||||
|
||||
send "uci\n"
|
||||
expect "uciok"
|
||||
@@ -125,27 +123,101 @@ cat << EOF > game.exp
|
||||
send "go nodes 1000\n"
|
||||
expect "bestmove"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position startpos moves e2e4 e7e6\n"
|
||||
send "go nodes 1000\n"
|
||||
expect "bestmove"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 5rk1/1K4p1/8/8/3B4/8/8/8 b - - 0 1\n"
|
||||
send "go depth 10\n"
|
||||
expect "bestmove"
|
||||
|
||||
send "setoption name UCI_ShowWDL value true\n"
|
||||
send "position startpos\n"
|
||||
send "ucinewgame\n"
|
||||
send "position fen 5rk1/1K4p1/8/8/3B4/8/8/8 b - - 0 1\n"
|
||||
send "flip\n"
|
||||
send "go depth 5\n"
|
||||
send "go depth 10\n"
|
||||
expect "bestmove"
|
||||
|
||||
send "setoption name Skill Level value 10\n"
|
||||
send "ucinewgame\n"
|
||||
send "position startpos\n"
|
||||
send "go depth 5\n"
|
||||
expect -re {info depth \d+ seldepth \d+ multipv \d+ score cp \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect "bestmove"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "setoption name UCI_ShowWDL value true\n"
|
||||
send "position startpos\n"
|
||||
send "go depth 9\n"
|
||||
expect -re {info depth 1 seldepth \d+ multipv \d+ score cp \d+ wdl \d+ \d+ \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect -re {info depth 2 seldepth \d+ multipv \d+ score cp \d+ wdl \d+ \d+ \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect -re {info depth 3 seldepth \d+ multipv \d+ score cp \d+ wdl \d+ \d+ \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect -re {info depth 4 seldepth \d+ multipv \d+ score cp \d+ wdl \d+ \d+ \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect -re {info depth 5 seldepth \d+ multipv \d+ score cp \d+ wdl \d+ \d+ \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect -re {info depth 6 seldepth \d+ multipv \d+ score cp \d+ wdl \d+ \d+ \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect -re {info depth 7 seldepth \d+ multipv \d+ score cp \d+ wdl \d+ \d+ \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect -re {info depth 8 seldepth \d+ multipv \d+ score cp \d+ wdl \d+ \d+ \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect -re {info depth 9 seldepth \d+ multipv \d+ score cp \d+ wdl \d+ \d+ \d+ nodes \d+ nps \d+ hashfull \d+ tbhits \d+ time \d+ pv}
|
||||
expect "bestmove"
|
||||
|
||||
send "setoption name Clear Hash\n"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 5K2/8/2qk4/2nPp3/3r4/6B1/B7/3R4 w - e6\n"
|
||||
send "go depth 18\n"
|
||||
expect "score mate 1"
|
||||
expect "pv d5e6"
|
||||
expect "bestmove d5e6"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 2brrb2/8/p7/Q7/1p1kpPp1/1P1pN1K1/3P4/8 b - -\n"
|
||||
send "go depth 18\n"
|
||||
expect "score mate -1"
|
||||
expect "bestmove"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 8/5R2/2K1P3/4k3/8/b1PPpp1B/5p2/8 w - -\n"
|
||||
send "go depth 18\n"
|
||||
expect "score mate 2 * pv c6d7 * f7f5"
|
||||
expect "bestmove c6d7"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 8/5R2/2K1P3/4k3/8/b1PPpp1B/5p2/8 w - -\n"
|
||||
send "go mate 2\n"
|
||||
expect "score mate 2 * pv c6d7"
|
||||
expect "bestmove c6d7"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 8/5R2/2K1P3/4k3/8/b1PPpp1B/5p2/8 w - -\n"
|
||||
send "go nodes 10000\n"
|
||||
expect "score mate 2 * pv c6d7 * f7f5"
|
||||
expect "bestmove c6d7"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 1NR2B2/5p2/5p2/1p1kpp2/1P2rp2/2P1pB2/2P1P1K1/8 b - - \n"
|
||||
send "go depth 18\n"
|
||||
expect "score mate -2"
|
||||
expect "pv d5e6 c8d8"
|
||||
expect "bestmove d5e6"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 8/5R2/2K1P3/4k3/8/b1PPpp1B/5p2/8 w - - moves c6d7 f2f1q\n"
|
||||
send "go depth 18\n"
|
||||
expect "score mate 1 * pv f7f5"
|
||||
expect "bestmove f7f5"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 8/5R2/2K1P3/4k3/8/b1PPpp1B/5p2/8 w - -\n"
|
||||
send "go depth 18 searchmoves c6d7\n"
|
||||
expect "score mate 2 * pv c6d7 * f7f5"
|
||||
expect "bestmove c6d7"
|
||||
|
||||
send "ucinewgame\n"
|
||||
send "position fen 8/5R2/2K1P3/4k3/8/b1PPpp1B/5p2/8 w - - moves c6d7\n"
|
||||
send "go depth 18 searchmoves e3e2\n"
|
||||
expect "score mate -1 * pv e3e2 f7f5"
|
||||
expect "bestmove e3e2"
|
||||
|
||||
send "setoption name EvalFile value verify.nnue\n"
|
||||
send "position startpos\n"
|
||||
send "go depth 5\n"
|
||||
@@ -154,6 +226,13 @@ cat << EOF > game.exp
|
||||
send "setoption name MultiPV value 4\n"
|
||||
send "position startpos\n"
|
||||
send "go depth 5\n"
|
||||
expect "bestmove"
|
||||
|
||||
send "setoption name Skill Level value 10\n"
|
||||
send "position startpos\n"
|
||||
send "go depth 5\n"
|
||||
expect "bestmove"
|
||||
send "setoption name Skill Level value 20\n"
|
||||
|
||||
send "quit\n"
|
||||
expect eof
|
||||
@@ -171,17 +250,30 @@ fi
|
||||
|
||||
cat << EOF > syzygy.exp
|
||||
set timeout 240
|
||||
# to correctly catch eof we need the following line
|
||||
# expect_before timeout { exit 2 } eof { exit 3 }
|
||||
expect_before timeout { exit 2 }
|
||||
spawn $exeprefix ./stockfish
|
||||
expect "Stockfish"
|
||||
send "uci\n"
|
||||
send "setoption name SyzygyPath value ../tests/syzygy/\n"
|
||||
expect "info string Found 35 tablebases" {} timeout {exit 1}
|
||||
expect "info string Found 35 tablebases"
|
||||
send "bench 128 1 8 default depth\n"
|
||||
expect "Nodes searched :"
|
||||
send "ucinewgame\n"
|
||||
send "position fen 4k3/PP6/8/8/8/8/8/4K3 w - - 0 1\n"
|
||||
send "go depth 5\n"
|
||||
expect -re {score cp 20000|score mate}
|
||||
expect "bestmove"
|
||||
send "ucinewgame\n"
|
||||
send "position fen 8/1P6/2B5/8/4K3/8/6k1/8 w - - 0 1\n"
|
||||
send "go depth 5\n"
|
||||
expect -re {score cp 20000|score mate}
|
||||
expect "bestmove"
|
||||
send "ucinewgame\n"
|
||||
send "position fen 8/1P6/2B5/8/4K3/8/6k1/8 b - - 0 1\n"
|
||||
send "go depth 5\n"
|
||||
expect -re {score cp -20000|score mate}
|
||||
expect "bestmove"
|
||||
send "quit\n"
|
||||
expect eof
|
||||
@@ -194,6 +286,9 @@ EOF
|
||||
for exp in game.exp syzygy.exp
|
||||
do
|
||||
|
||||
echo "======== $exp =============="
|
||||
cat $exp
|
||||
echo "============================"
|
||||
echo "$prefix expect $exp $postfix"
|
||||
eval "$prefix expect $exp $postfix"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user