mirror of
https://github.com/official-stockfish/Stockfish.git
synced 2026-07-23 13:17:12 +00:00
Fixes problems with non-ASCII characters in paths. Fixes #3424. Changes - Bump the minimum supported Clang version to 11 to support std::filesystem - Use std::optional for empty values instead of string sentinels like "None" - Remove the FixedString class - Move the EvalFile network path from the network struct to the engine - Simplify parts of the command-line handling - Remove the old dual-net logic from export_net - And ofc we now support non-ascii paths for windows Behavior Change - Because the EvalFile is no longer part of the network, it won't be included in the hashing, thus the network sharing is no longer dependent on the EvalFile path - As a result, if the binary version and network are the same, changing only the EvalFile location will now reuse the same shared network This also fixes a master bug where: ``` export_net None setoption name EvalFile value None export_net None Failed to export a net ``` would fail on the second export. With this patch, the second export succeeds. Quick Fishtest Check that nets load like normal. https://tests.stockfishchess.org/tests/view/6a455593f97ff95f787954da <img width="833" height="1137" alt="image" src="https://github.com/user-attachments/assets/fffee63b-c63a-4d5e-b13d-87d58bc28c88" /> closes https://github.com/official-stockfish/Stockfish/pull/6937 No functional change Co-authored-by: anematode <timothy.herchen@gmail.com>
101 lines
3.0 KiB
C++
101 lines
3.0 KiB
C++
/*
|
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
|
Copyright (C) 2004-2026 The Stockfish developers (see AUTHORS file)
|
|
|
|
Stockfish is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
Stockfish is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
// Code for calculating NNUE evaluation function
|
|
|
|
#include "nnue_misc.h"
|
|
|
|
#include <cmath>
|
|
#include <cstdlib>
|
|
#include <iomanip>
|
|
#include <iosfwd>
|
|
#include <iostream>
|
|
#include <memory>
|
|
#include <sstream>
|
|
|
|
#include "../position.h"
|
|
#include "../misc.h"
|
|
#include "../types.h"
|
|
#include "../uci.h"
|
|
#include "network.h"
|
|
#include "nnue_accumulator.h"
|
|
|
|
namespace Stockfish::Eval::NNUE {
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
// Converts a Value into pawns, always keeping two decimals
|
|
void format_cp_aligned_dot(Value v, std::stringstream& stream, const Position& pos) {
|
|
|
|
const double pawns = std::abs(0.01 * UCIEngine::to_cp(v, pos));
|
|
|
|
stream << (v < 0 ? '-'
|
|
: v > 0 ? '+'
|
|
: ' ')
|
|
<< std::setiosflags(std::ios::fixed) << std::setw(6) << std::setprecision(2) << pawns;
|
|
}
|
|
}
|
|
|
|
|
|
// Returns a string with the value of each piece on a board,
|
|
// and a table for (PSQT, Layers) values bucket by bucket.
|
|
std::string
|
|
trace(Position& pos, const Eval::NNUE::Network& network, Eval::NNUE::AccumulatorCaches& caches) {
|
|
|
|
std::stringstream ss;
|
|
|
|
auto accumulators = std::make_unique<AccumulatorStack>();
|
|
accumulators->reset();
|
|
|
|
auto t = network.trace_evaluate(pos, *accumulators, caches);
|
|
|
|
ss << "NNUE network contributions (Normalized, "
|
|
<< (pos.side_to_move() == WHITE ? "White to move)" : "Black to move)") << std::endl
|
|
<< "+------------+------------+------------+------------+\n"
|
|
<< "| Bucket | Material | Positional | Total |\n"
|
|
<< "| | (PSQT) | (Layers) | |\n"
|
|
<< "+------------+------------+------------+------------+\n";
|
|
|
|
for (usize bucket = 0; bucket < LayerStacks; ++bucket)
|
|
{
|
|
ss << "| " << bucket << " " //
|
|
<< " | ";
|
|
format_cp_aligned_dot(t.psqt[bucket], ss, pos);
|
|
ss << " " //
|
|
<< " | ";
|
|
format_cp_aligned_dot(t.positional[bucket], ss, pos);
|
|
ss << " " //
|
|
<< " | ";
|
|
format_cp_aligned_dot(t.psqt[bucket] + t.positional[bucket], ss, pos);
|
|
ss << " " //
|
|
<< " |";
|
|
if (bucket == t.correctBucket)
|
|
ss << " <-- this bucket is used";
|
|
ss << '\n';
|
|
}
|
|
|
|
ss << "+------------+------------+------------+------------+\n";
|
|
|
|
return ss.str();
|
|
}
|
|
|
|
|
|
} // namespace Stockfish::Eval::NNUE
|