]> git.sesse.net Git - stockfish/commitdiff
Add an UCI level command "export_net".
authorTomasz Sobczyk <tomasz.sobczyk1997@gmail.com>
Sun, 2 May 2021 16:50:09 +0000 (18:50 +0200)
committerJoost VandeVondele <Joost.VandeVondele@gmail.com>
Fri, 7 May 2021 07:45:08 +0000 (09:45 +0200)
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
src/evaluate.cpp
src/evaluate.h
src/uci.cpp

index bc34ee1321a158ac16a1f81183c1fbddbea75f20..013d4b32caafaeaaab44be436f7b30d65fcea2cd 100644 (file)
--- 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
index 0fb9abdf2404ff3a6edc775238c885e1b129f604..f0784e8f915e113f414ba85e2496c9e7eab66156 100644 (file)
@@ -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<const char*>(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() {
 
index 6210bd5816b8be77b7223f0c1b1b4eaab715b411..b7525aab8bbed6d92b72ff376e61348962f91b07 100644 (file)
@@ -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
index 051ff2e02f4a16f4fe2cb777a1c76746428b88fc..64bb7a7cb59b41f2093c1ef66de6d5b7f8d7d6ae 100644 (file)
@@ -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;