mirror of
https://github.com/sockspls/badfish
synced 2025-05-02 17:49:35 +00:00
Cleanup comments and some code reorg.
passed STC: https://tests.stockfishchess.org/tests/view/6536dc7dcc309ae83955b04d LLR: 2.93 (-2.94,2.94) <-1.75,0.25> Total: 58048 W: 14693 L: 14501 D: 28854 Ptnml(0-2): 200, 6399, 15595, 6669, 161 closes https://github.com/official-stockfish/Stockfish/pull/4846 No functional change
This commit is contained in:
parent
d6a5c2b085
commit
ec02714b62
8 changed files with 43 additions and 36 deletions
|
@ -123,11 +123,11 @@ void NNUE::verify() {
|
||||||
std::string msg1 =
|
std::string msg1 =
|
||||||
"Network evaluation parameters compatible with the engine must be available.";
|
"Network evaluation parameters compatible with the engine must be available.";
|
||||||
std::string msg2 = "The network file " + eval_file + " was not loaded successfully.";
|
std::string msg2 = "The network file " + eval_file + " was not loaded successfully.";
|
||||||
std::string msg3 =
|
std::string msg3 = "The UCI option EvalFile might need to specify the full path, "
|
||||||
"The UCI option EvalFile might need to specify the full path, including the directory name, to the network file.";
|
"including the directory name, to the network file.";
|
||||||
std::string msg4 =
|
std::string msg4 = "The default net can be downloaded from: "
|
||||||
"The default net can be downloaded from: https://tests.stockfishchess.org/api/nn/"
|
"https://tests.stockfishchess.org/api/nn/"
|
||||||
+ std::string(EvalFileDefaultName);
|
+ std::string(EvalFileDefaultName);
|
||||||
std::string msg5 = "The engine will be terminated now.";
|
std::string msg5 = "The engine will be terminated now.";
|
||||||
|
|
||||||
sync_cout << "info string ERROR: " << msg1 << sync_endl;
|
sync_cout << "info string ERROR: " << msg1 << sync_endl;
|
||||||
|
|
|
@ -263,11 +263,9 @@ top:
|
||||||
|
|
||||||
case GOOD_CAPTURE :
|
case GOOD_CAPTURE :
|
||||||
if (select<Next>([&]() {
|
if (select<Next>([&]() {
|
||||||
return pos.see_ge(*cur, Value(-cur->value))
|
// Move losing capture to endBadCaptures to be tried later
|
||||||
?
|
return pos.see_ge(*cur, Value(-cur->value)) ? true
|
||||||
// Move losing capture to endBadCaptures to be tried later
|
: (*endBadCaptures++ = *cur, false);
|
||||||
true
|
|
||||||
: (*endBadCaptures++ = *cur, false);
|
|
||||||
}))
|
}))
|
||||||
return *(cur - 1);
|
return *(cur - 1);
|
||||||
|
|
||||||
|
|
|
@ -407,8 +407,8 @@ bool save_eval(const std::optional<std::string>& filename) {
|
||||||
{
|
{
|
||||||
if (currentEvalFileName != EvalFileDefaultName)
|
if (currentEvalFileName != EvalFileDefaultName)
|
||||||
{
|
{
|
||||||
msg =
|
msg = "Failed to export a net. "
|
||||||
"Failed to export a net. A non-embedded net can only be saved if the filename is specified";
|
"A non-embedded net can only be saved if the filename is specified";
|
||||||
|
|
||||||
sync_cout << msg << sync_endl;
|
sync_cout << msg << sync_endl;
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -256,7 +256,8 @@ class AffineTransform {
|
||||||
else if constexpr (OutputDimensions == 1)
|
else if constexpr (OutputDimensions == 1)
|
||||||
{
|
{
|
||||||
|
|
||||||
// We cannot use AVX512 for the last layer because there's only 32 inputs and the buffer is not padded to 64 elements.
|
// We cannot use AVX512 for the last layer because there are only 32 inputs
|
||||||
|
// and the buffer is not padded to 64 elements.
|
||||||
#if defined(USE_AVX2)
|
#if defined(USE_AVX2)
|
||||||
using vec_t = __m256i;
|
using vec_t = __m256i;
|
||||||
#define vec_setzero _mm256_setzero_si256
|
#define vec_setzero _mm256_setzero_si256
|
||||||
|
|
|
@ -113,8 +113,8 @@ struct Network {
|
||||||
ac_1.propagate(buffer.fc_1_out, buffer.ac_1_out);
|
ac_1.propagate(buffer.fc_1_out, buffer.ac_1_out);
|
||||||
fc_2.propagate(buffer.ac_1_out, buffer.fc_2_out);
|
fc_2.propagate(buffer.ac_1_out, buffer.fc_2_out);
|
||||||
|
|
||||||
// buffer.fc_0_out[FC_0_OUTPUTS] is such that 1.0 is equal to 127*(1<<WeightScaleBits) in quantized form
|
// buffer.fc_0_out[FC_0_OUTPUTS] is such that 1.0 is equal to 127*(1<<WeightScaleBits) in
|
||||||
// but we want 1.0 to be equal to 600*OutputScale
|
// quantized form, but we want 1.0 to be equal to 600*OutputScale
|
||||||
std::int32_t fwdOut =
|
std::int32_t fwdOut =
|
||||||
int(buffer.fc_0_out[FC_0_OUTPUTS]) * (600 * OutputScale) / (127 * (1 << WeightScaleBits));
|
int(buffer.fc_0_out[FC_0_OUTPUTS]) * (600 * OutputScale) / (127 * (1 << WeightScaleBits));
|
||||||
std::int32_t outputValue = buffer.fc_2_out[0] + fwdOut;
|
std::int32_t outputValue = buffer.fc_2_out[0] + fwdOut;
|
||||||
|
|
|
@ -338,8 +338,10 @@ class FeatureTransformer {
|
||||||
|
|
||||||
// NOTE: The parameter states_to_update is an array of position states, ending with nullptr.
|
// NOTE: The parameter states_to_update is an array of position states, ending with nullptr.
|
||||||
// All states must be sequential, that is states_to_update[i] must either be reachable
|
// All states must be sequential, that is states_to_update[i] must either be reachable
|
||||||
// by repeatedly applying ->previous from states_to_update[i+1] or states_to_update[i] == nullptr.
|
// by repeatedly applying ->previous from states_to_update[i+1] or
|
||||||
// computed_st must be reachable by repeatedly applying ->previous on states_to_update[0], if not nullptr.
|
// states_to_update[i] == nullptr.
|
||||||
|
// computed_st must be reachable by repeatedly applying ->previous on
|
||||||
|
// states_to_update[0], if not nullptr.
|
||||||
template<Color Perspective, size_t N>
|
template<Color Perspective, size_t N>
|
||||||
void update_accumulator_incremental(const Position& pos,
|
void update_accumulator_incremental(const Position& pos,
|
||||||
StateInfo* computed_st,
|
StateInfo* computed_st,
|
||||||
|
|
|
@ -379,8 +379,8 @@ void Thread::search() {
|
||||||
int failedHighCnt = 0;
|
int failedHighCnt = 0;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// Adjust the effective depth searched, but ensure at least one effective increment for every
|
// Adjust the effective depth searched, but ensure at least one effective increment
|
||||||
// four searchAgain steps (see issue #2717).
|
// for every four searchAgain steps (see issue #2717).
|
||||||
Depth adjustedDepth =
|
Depth adjustedDepth =
|
||||||
std::max(1, rootDepth - failedHighCnt - 3 * (searchAgainCounter + 1) / 4);
|
std::max(1, rootDepth - failedHighCnt - 3 * (searchAgainCounter + 1) / 4);
|
||||||
bestValue = Stockfish::search<Root>(rootPos, ss, alpha, beta, adjustedDepth, false);
|
bestValue = Stockfish::search<Root>(rootPos, ss, alpha, beta, adjustedDepth, false);
|
||||||
|
@ -633,7 +633,8 @@ Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, boo
|
||||||
if (!ttCapture)
|
if (!ttCapture)
|
||||||
update_quiet_stats(pos, ss, ttMove, stat_bonus(depth));
|
update_quiet_stats(pos, ss, ttMove, stat_bonus(depth));
|
||||||
|
|
||||||
// Extra penalty for early quiet moves of the previous ply (~0 Elo on STC, ~2 Elo on LTC)
|
// Extra penalty for early quiet moves of
|
||||||
|
// the previous ply (~0 Elo on STC, ~2 Elo on LTC).
|
||||||
if (prevSq != SQ_NONE && (ss - 1)->moveCount <= 2 && !priorCapture)
|
if (prevSq != SQ_NONE && (ss - 1)->moveCount <= 2 && !priorCapture)
|
||||||
update_continuation_histories(ss - 1, pos.piece_on(prevSq), prevSq,
|
update_continuation_histories(ss - 1, pos.piece_on(prevSq), prevSq,
|
||||||
-stat_bonus(depth + 1));
|
-stat_bonus(depth + 1));
|
||||||
|
@ -715,7 +716,8 @@ Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, boo
|
||||||
}
|
}
|
||||||
else if (excludedMove)
|
else if (excludedMove)
|
||||||
{
|
{
|
||||||
// Providing the hint that this node's accumulator will be used often brings significant Elo gain (~13 Elo)
|
// Providing the hint that this node's accumulator will be used often
|
||||||
|
// brings significant Elo gain (~13 Elo).
|
||||||
Eval::NNUE::hint_common_parent_position(pos);
|
Eval::NNUE::hint_common_parent_position(pos);
|
||||||
eval = ss->staticEval;
|
eval = ss->staticEval;
|
||||||
}
|
}
|
||||||
|
@ -817,8 +819,9 @@ Value search(Position& pos, Stack* ss, Value alpha, Value beta, Depth depth, boo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Step 10. If the position doesn't have a ttMove, decrease depth by 2
|
// Step 10. If the position doesn't have a ttMove, decrease depth by 2,
|
||||||
// (or by 4 if the TT entry for the current position was hit and the stored depth is greater than or equal to the current depth).
|
// or by 4 if the TT entry for the current position was hit and
|
||||||
|
// the stored depth is greater than or equal to the current depth.
|
||||||
// Use qsearch if depth is equal or below zero (~9 Elo)
|
// Use qsearch if depth is equal or below zero (~9 Elo)
|
||||||
if (PvNode && !ttMove)
|
if (PvNode && !ttMove)
|
||||||
depth -= 2 + 2 * (ss->ttHit && tte->depth() >= depth);
|
depth -= 2 + 2 * (ss->ttHit && tte->depth() >= depth);
|
||||||
|
@ -967,13 +970,15 @@ moves_loop: // When in check, search starts here
|
||||||
if (capture || givesCheck)
|
if (capture || givesCheck)
|
||||||
{
|
{
|
||||||
// Futility pruning for captures (~2 Elo)
|
// Futility pruning for captures (~2 Elo)
|
||||||
if (!givesCheck && lmrDepth < 7 && !ss->inCheck
|
if (!givesCheck && lmrDepth < 7 && !ss->inCheck)
|
||||||
&& ss->staticEval + 188 + 206 * lmrDepth + PieceValue[pos.piece_on(to_sq(move))]
|
{
|
||||||
+ captureHistory[movedPiece][to_sq(move)]
|
Piece capturedPiece = pos.piece_on(to_sq(move));
|
||||||
[type_of(pos.piece_on(to_sq(move)))]
|
int futilityEval =
|
||||||
/ 7
|
ss->staticEval + 188 + 206 * lmrDepth + PieceValue[capturedPiece]
|
||||||
< alpha)
|
+ captureHistory[movedPiece][to_sq(move)][type_of(capturedPiece)] / 7;
|
||||||
continue;
|
if (futilityEval < alpha)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// SEE based pruning for captures and checks (~11 Elo)
|
// SEE based pruning for captures and checks (~11 Elo)
|
||||||
if (!pos.see_ge(move, Value(-185) * depth))
|
if (!pos.see_ge(move, Value(-185) * depth))
|
||||||
|
@ -1018,9 +1023,9 @@ moves_loop: // When in check, search starts here
|
||||||
// that depth margin and singularBeta margin are known for having non-linear
|
// that depth margin and singularBeta margin are known for having non-linear
|
||||||
// scaling. Their values are optimized to time controls of 180+1.8 and longer
|
// scaling. Their values are optimized to time controls of 180+1.8 and longer
|
||||||
// so changing them requires tests at this type of time controls.
|
// so changing them requires tests at this type of time controls.
|
||||||
if (!rootNode
|
// Recursive singular search is avoided.
|
||||||
|
if (!rootNode && move == ttMove && !excludedMove
|
||||||
&& depth >= 4 - (thisThread->completedDepth > 24) + 2 * (PvNode && tte->is_pv())
|
&& depth >= 4 - (thisThread->completedDepth > 24) + 2 * (PvNode && tte->is_pv())
|
||||||
&& move == ttMove && !excludedMove // Avoid recursive singular search
|
|
||||||
&& abs(ttValue) < VALUE_TB_WIN_IN_MAX_PLY && (tte->bound() & BOUND_LOWER)
|
&& abs(ttValue) < VALUE_TB_WIN_IN_MAX_PLY && (tte->bound() & BOUND_LOWER)
|
||||||
&& tte->depth() >= depth - 3)
|
&& tte->depth() >= depth - 3)
|
||||||
{
|
{
|
||||||
|
@ -1053,7 +1058,7 @@ moves_loop: // When in check, search starts here
|
||||||
else if (singularBeta >= beta)
|
else if (singularBeta >= beta)
|
||||||
return singularBeta;
|
return singularBeta;
|
||||||
|
|
||||||
// If the eval of ttMove is greater than beta, we reduce it (negative extension) (~7 Elo)
|
// If the eval of ttMove is greater than beta, reduce it (negative extension) (~7 Elo)
|
||||||
else if (ttValue >= beta)
|
else if (ttValue >= beta)
|
||||||
extension = -2 - !PvNode;
|
extension = -2 - !PvNode;
|
||||||
|
|
||||||
|
@ -1061,7 +1066,7 @@ moves_loop: // When in check, search starts here
|
||||||
else if (cutNode)
|
else if (cutNode)
|
||||||
extension = depth < 19 ? -2 : -1;
|
extension = depth < 19 ? -2 : -1;
|
||||||
|
|
||||||
// If the eval of ttMove is less than value, we reduce it (negative extension) (~1 Elo)
|
// If the eval of ttMove is less than value, reduce it (negative extension) (~1 Elo)
|
||||||
else if (ttValue <= value)
|
else if (ttValue <= value)
|
||||||
extension = -1;
|
extension = -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -178,8 +178,9 @@ void bench(Position& pos, std::istream& args, StateListPtr& states) {
|
||||||
uint64_t num, nodes = 0, cnt = 1;
|
uint64_t num, nodes = 0, cnt = 1;
|
||||||
|
|
||||||
std::vector<std::string> list = setup_bench(pos, args);
|
std::vector<std::string> list = setup_bench(pos, args);
|
||||||
num = count_if(list.begin(), list.end(),
|
|
||||||
[](const std::string& s) { return s.find("go ") == 0 || s.find("eval") == 0; });
|
num = count_if(list.begin(), list.end(),
|
||||||
|
[](const std::string& s) { return s.find("go ") == 0 || s.find("eval") == 0; });
|
||||||
|
|
||||||
TimePoint elapsed = now();
|
TimePoint elapsed = now();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue