From ca250e969c9d235b2d8be1d5d088b8834aa374b9 Mon Sep 17 00:00:00 2001 From: Tomasz Sobczyk Date: Sun, 2 May 2021 18:50:09 +0200 Subject: [PATCH] Add an UCI level command "export_net". This command writes the embedded net to the file `EvalFileDefaultName`. If there is no embedded net the command does nothing. fixes #3453 closes https://github.com/official-stockfish/Stockfish/pull/3454 No functional change --- README.md | 16 ++++++++++------ src/evaluate.cpp | 11 +++++++++++ src/evaluate.h | 1 + src/uci.cpp | 1 + 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index bc34ee13..013d4b32 100644 --- a/README.md +++ b/README.md @@ -143,22 +143,26 @@ For users, the following UCI options, which can typically be set via a GUI, are For developers the following non-standard commands might be of interest, mainly useful for debugging: - * #### compiler - Give information about the compiler and environment used for building a binary. - - * #### flip - Flips the side to move. - * #### bench ttSize threads limit fenFile limitType evalType Performs a standard benchmark using various options. The signature or standard node count is obtained using all defaults. `bench` is currently `bench 16 1 13 default depth mixed`. + * #### compiler + Give information about the compiler and environment used for building a binary. + * #### d Display the current position, with ascii art and fen. * #### eval Return the evaluation of the current position. + * #### export_net + If the binary contains an embedded net, save it in a file (named according to the default value of EvalFile). + + * #### flip + Flips the side to move. + + ## A note on classical evaluation versus NNUE evaluation Both approaches assign a value to a position that is used in alpha-beta (PVS) search diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 0fb9abdf..f0784e8f 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -47,7 +47,9 @@ // Note that this does not work in Microsoft Visual Studio. #if !defined(_MSC_VER) && !defined(NNUE_EMBEDDING_OFF) INCBIN(EmbeddedNNUE, EvalFileDefaultName); + constexpr bool gHasEmbeddedNet = true; #else + constexpr bool gHasEmbeddedNet = false; const unsigned char gEmbeddedNNUEData[1] = {0x0}; const unsigned char *const gEmbeddedNNUEEnd = &gEmbeddedNNUEData[1]; const unsigned int gEmbeddedNNUESize = 1; @@ -114,6 +116,15 @@ namespace Eval { } } + void NNUE::export_net() { + if constexpr (gHasEmbeddedNet) { + ofstream stream(EvalFileDefaultName, std::ios_base::binary); + stream.write(reinterpret_cast(gEmbeddedNNUEData), gEmbeddedNNUESize); + } else { + sync_cout << "No embedded network file." << sync_endl; + } + } + /// NNUE::verify() verifies that the last net used was loaded successfully void NNUE::verify() { diff --git a/src/evaluate.h b/src/evaluate.h index 6210bd58..b7525aab 100644 --- a/src/evaluate.h +++ b/src/evaluate.h @@ -45,6 +45,7 @@ namespace Eval { Value evaluate(const Position& pos); bool load_eval(std::string name, std::istream& stream); void init(); + void export_net(); void verify(); } // namespace NNUE diff --git a/src/uci.cpp b/src/uci.cpp index 051ff2e0..64bb7a7c 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -277,6 +277,7 @@ void UCI::loop(int argc, char* argv[]) { else if (token == "d") sync_cout << pos << sync_endl; else if (token == "eval") trace_eval(pos); else if (token == "compiler") sync_cout << compiler_info() << sync_endl; + else if (token == "export_net") Eval::NNUE::export_net(); else if (!token.empty() && token[0] != '#') sync_cout << "Unknown command: " << cmd << sync_endl; -- 2.39.2