]> git.sesse.net Git - stockfish/commitdiff
Restore NPS output for Perft
authorDisservin <disservin.social@gmail.com>
Mon, 22 Apr 2024 17:24:10 +0000 (19:24 +0200)
committerDisservin <disservin.social@gmail.com>
Wed, 24 Apr 2024 16:20:55 +0000 (18:20 +0200)
Previously it was possible to also get the node counter after running a bench with perft, i.e.
`./stockfish bench 1 1 5 current perft`, caused by a small regression from the uci refactoring.

```
Nodes searched: 4865609

===========================
Total time (ms) : 18
Nodes searched  : 4865609
Nodes/second    : 270311611
````

closes https://github.com/official-stockfish/Stockfish/pull/5188

No functional change

src/benchmark.cpp
src/benchmark.h
src/engine.cpp
src/engine.h
src/perft.h
src/uci.cpp
src/uci.h

index 267a6b4b2a9a6b0488c2f66beec41ee209eb0a4b..3622ac8afc88cf7516e20a1dd7481c3da53964db 100644 (file)
@@ -93,7 +93,7 @@ const std::vector<std::string> Defaults = {
 
 }  // namespace
 
-namespace Stockfish {
+namespace Stockfish::Benchmark {
 
 // Builds a list of UCI commands to be run by bench. There
 // are five parameters: TT size in MB, number of search threads that
index 8905fcb182583f93194c8b6c6e0e4b4f7488dd6b..b1eba40f38bc6825b5f3cc8bb25132c602b7f2a8 100644 (file)
@@ -23,7 +23,7 @@
 #include <string>
 #include <vector>
 
-namespace Stockfish {
+namespace Stockfish::Benchmark {
 
 std::vector<std::string> setup_bench(const std::string&, std::istream&);
 
index 325b971ea4612306b76a5c7cf5fbef84f7193597..4625e00a816373795b04b2133c7b980a78ee42c2 100644 (file)
@@ -26,6 +26,7 @@
 #include <vector>
 #include <sstream>
 #include <iosfwd>
+#include <cassert>
 
 #include "evaluate.h"
 #include "misc.h"
@@ -54,14 +55,15 @@ Engine::Engine(std::string path) :
     pos.set(StartFEN, false, &states->back());
 }
 
-void Engine::go(const Search::LimitsType& limits) {
+std::uint64_t Engine::perft(const std::string& fen, Depth depth, bool isChess960) {
     verify_networks();
 
-    if (limits.perft)
-    {
-        perft(pos.fen(), limits.perft, options["UCI_Chess960"]);
-        return;
-    }
+    return Benchmark::perft(fen, depth, isChess960);
+}
+
+void Engine::go(const Search::LimitsType& limits) {
+    assert(limits.perft == 0);
+    verify_networks();
 
     threads.start_thinking(options, pos, states, limits);
 }
index 7122ee59d0b7f6df31665b05a796ab1581e8faac..041f567858549f339860e2a1e0e5f9eb19da279b 100644 (file)
@@ -26,6 +26,7 @@
 #include <string_view>
 #include <utility>
 #include <vector>
+#include <cstdint>
 
 #include "nnue/network.h"
 #include "position.h"
@@ -33,6 +34,7 @@
 #include "thread.h"
 #include "tt.h"
 #include "ucioption.h"
+#include "syzygy/tbprobe.h"  // for Stockfish::Depth
 
 namespace Stockfish {
 
@@ -45,6 +47,8 @@ class Engine {
     Engine(std::string path = "");
     ~Engine() { wait_for_search_finished(); }
 
+    std::uint64_t perft(const std::string& fen, Depth depth, bool isChess960);
+
     // non blocking call to start searching
     void go(const Search::LimitsType&);
     // non blocking call to stop searching
index 2dbab828a18a69848fe0e1a560d2b253cd64df61..e907742da05708c7aaca3aa9df6fb35e6cdbfb73 100644 (file)
@@ -26,7 +26,7 @@
 #include "types.h"
 #include "uci.h"
 
-namespace Stockfish {
+namespace Stockfish::Benchmark {
 
 // Utility to verify move generation. All the leaf nodes up
 // to the given depth are generated and counted, and the sum is returned.
@@ -56,13 +56,12 @@ uint64_t perft(Position& pos, Depth depth) {
     return nodes;
 }
 
-inline void perft(const std::string& fen, Depth depth, bool isChess960) {
+inline uint64_t perft(const std::string& fen, Depth depth, bool isChess960) {
     StateListPtr states(new std::deque<StateInfo>(1));
     Position     p;
     p.set(fen, isChess960, &states->back());
 
-    uint64_t nodes = perft<true>(p, depth);
-    sync_cout << "\nNodes searched: " << nodes << "\n" << sync_endl;
+    return perft<true>(p, depth);
 }
 }
 
index c707f6dc4039bfb404415dcdefcce69b24b57818..cb686a027db4b6b48c25bdcbafba868af8f42f1b 100644 (file)
@@ -219,7 +219,11 @@ Search::LimitsType UCIEngine::parse_limits(std::istream& is) {
 void UCIEngine::go(std::istringstream& is) {
 
     Search::LimitsType limits = parse_limits(is);
-    engine.go(limits);
+
+    if (limits.perft)
+        perft(limits);
+    else
+        engine.go(limits);
 }
 
 void UCIEngine::bench(std::istream& args) {
@@ -233,7 +237,7 @@ void UCIEngine::bench(std::istream& args) {
         on_update_full(i, options["UCI_ShowWDL"]);
     });
 
-    std::vector<std::string> list = setup_bench(engine.fen(), args);
+    std::vector<std::string> list = Benchmark::setup_bench(engine.fen(), args);
 
     num = count_if(list.begin(), list.end(),
                    [](const std::string& s) { return s.find("go ") == 0 || s.find("eval") == 0; });
@@ -251,8 +255,16 @@ void UCIEngine::bench(std::istream& args) {
                       << std::endl;
             if (token == "go")
             {
-                go(is);
-                engine.wait_for_search_finished();
+                Search::LimitsType limits = parse_limits(is);
+
+                if (limits.perft)
+                    nodes = perft(limits);
+                else
+                {
+                    engine.go(limits);
+                    engine.wait_for_search_finished();
+                }
+
                 nodes += nodesSearched;
                 nodesSearched = 0;
             }
@@ -288,6 +300,12 @@ void UCIEngine::setoption(std::istringstream& is) {
     engine.get_options().setoption(is);
 }
 
+std::uint64_t UCIEngine::perft(const Search::LimitsType& limits) {
+    auto nodes = engine.perft(engine.fen(), limits.perft, engine.get_options()["UCI_Chess960"]);
+    sync_cout << "\nNodes searched: " << nodes << "\n" << sync_endl;
+    return nodes;
+}
+
 void UCIEngine::position(std::istringstream& is) {
     std::string token, fen;
 
index ee8c2814aee52362f6d5cdd2d3eab608df3c605a..55d580f9727d69883a6b7e1776dd306a73bdb757 100644 (file)
--- a/src/uci.h
+++ b/src/uci.h
@@ -22,6 +22,7 @@
 #include <iostream>
 #include <string>
 #include <string_view>
+#include <cstdint>
 
 #include "engine.h"
 #include "misc.h"
@@ -57,10 +58,11 @@ class UCIEngine {
     Engine      engine;
     CommandLine cli;
 
-    void go(std::istringstream& is);
-    void bench(std::istream& args);
-    void position(std::istringstream& is);
-    void setoption(std::istringstream& is);
+    void          go(std::istringstream& is);
+    void          bench(std::istream& args);
+    void          position(std::istringstream& is);
+    void          setoption(std::istringstream& is);
+    std::uint64_t perft(const Search::LimitsType&);
 
     static void on_update_no_moves(const Engine::InfoShort& info);
     static void on_update_full(const Engine::InfoFull& info, bool showWDL);