]> git.sesse.net Git - stockfish/commitdiff
Move perft out of search
authorDisservin <disservin.social@gmail.com>
Sat, 13 Jan 2024 23:21:46 +0000 (00:21 +0100)
committerDisservin <disservin.social@gmail.com>
Fri, 26 Jan 2024 19:52:26 +0000 (20:52 +0100)
This splits the logic of search and perft. Before, threads were started,
which then constructed a search object, which then started perft and
returned immediately. All of this is unnecessary, instead uci should
start perft right away.

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

No functional change

src/Makefile
src/perft.h [new file with mode: 0644]
src/search.cpp
src/uci.cpp

index 9680ca7feff269accd529270de4d502dea3a7bb7..907b615502855b9e9ccebb42427ad2472ff28569 100644 (file)
@@ -63,7 +63,7 @@ HEADERS = benchmark.h bitboard.h evaluate.h misc.h movegen.h movepick.h \
                nnue/layers/sqr_clipped_relu.h nnue/nnue_accumulator.h nnue/nnue_architecture.h \
                nnue/nnue_common.h nnue/nnue_feature_transformer.h position.h \
                search.h syzygy/tbprobe.h thread.h thread_win32_osx.h timeman.h \
-               tt.h tune.h types.h uci.h ucioption.h 
+               tt.h tune.h types.h uci.h ucioption.h perft.h
 
 OBJS = $(notdir $(SRCS:.cpp=.o))
 
diff --git a/src/perft.h b/src/perft.h
new file mode 100644 (file)
index 0000000..2edc3ad
--- /dev/null
@@ -0,0 +1,69 @@
+/*
+  Stockfish, a UCI chess playing engine derived from Glaurung 2.1
+  Copyright (C) 2004-2024 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/>.
+*/
+
+#ifndef PERFT_H_INCLUDED
+#define PERFT_H_INCLUDED
+
+#include <cstdint>
+
+#include "movegen.h"
+#include "position.h"
+#include "types.h"
+#include "uci.h"
+
+namespace Stockfish {
+
+// Utility to verify move generation. All the leaf nodes up
+// to the given depth are generated and counted, and the sum is returned.
+template<bool Root>
+uint64_t perft(Position& pos, Depth depth) {
+
+    StateInfo st;
+    ASSERT_ALIGNED(&st, Eval::NNUE::CacheLineSize);
+
+    uint64_t   cnt, nodes = 0;
+    const bool leaf = (depth == 2);
+
+    for (const auto& m : MoveList<LEGAL>(pos))
+    {
+        if (Root && depth <= 1)
+            cnt = 1, nodes++;
+        else
+        {
+            pos.do_move(m, st);
+            cnt = leaf ? MoveList<LEGAL>(pos).size() : perft<false>(pos, depth - 1);
+            nodes += cnt;
+            pos.undo_move(m);
+        }
+        if (Root)
+            sync_cout << UCI::move(m, pos.is_chess960()) << ": " << cnt << sync_endl;
+    }
+    return nodes;
+}
+
+inline void 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;
+}
+}
+
+#endif  // PERFT_H_INCLUDED
index f4b372536c99952c382ba874717dda0b6b800874..086bff340292e835508f37ba05e134c0c9fe59d2 100644 (file)
@@ -122,37 +122,8 @@ void update_all_stats(const Position& pos,
                       int             captureCount,
                       Depth           depth);
 
-// Utility to verify move generation. All the leaf nodes up
-// to the given depth are generated and counted, and the sum is returned.
-template<bool Root>
-uint64_t perft(Position& pos, Depth depth) {
-
-    StateInfo st;
-    ASSERT_ALIGNED(&st, Eval::NNUE::CacheLineSize);
-
-    uint64_t   cnt, nodes = 0;
-    const bool leaf = (depth == 2);
-
-    for (const auto& m : MoveList<LEGAL>(pos))
-    {
-        if (Root && depth <= 1)
-            cnt = 1, nodes++;
-        else
-        {
-            pos.do_move(m, st);
-            cnt = leaf ? MoveList<LEGAL>(pos).size() : perft<false>(pos, depth - 1);
-            nodes += cnt;
-            pos.undo_move(m);
-        }
-        if (Root)
-            sync_cout << UCI::move(m, pos.is_chess960()) << ": " << cnt << sync_endl;
-    }
-    return nodes;
-}
-
 }  // namespace
 
-
 Search::Worker::Worker(SharedState&                    sharedState,
                        std::unique_ptr<ISearchManager> sm,
                        size_t                          thread_id) :
@@ -173,13 +144,6 @@ void Search::Worker::start_searching() {
         return;
     }
 
-    if (limits.perft)
-    {
-        nodes = perft<true>(rootPos, limits.perft);
-        sync_cout << "\nNodes searched: " << nodes << "\n" << sync_endl;
-        return;
-    }
-
     main_manager()->tm.init(limits, rootPos.side_to_move(), rootPos.game_ply(), options);
     tt.new_search();
 
index 2a55fbfab0a154fad2e9fb4239025f9ce80ac67e..e6107d4713a7b7542ef5991dfcb1a6c71f902e3c 100644 (file)
@@ -39,6 +39,7 @@
 #include "syzygy/tbprobe.h"
 #include "types.h"
 #include "ucioption.h"
+#include "perft.h"
 
 namespace Stockfish {
 
@@ -172,7 +173,6 @@ void UCI::loop() {
 
 void UCI::go(Position& pos, std::istringstream& is, StateListPtr& states) {
 
-
     Search::LimitsType limits;
     std::string        token;
     bool               ponderMode = false;
@@ -211,6 +211,12 @@ void UCI::go(Position& pos, std::istringstream& is, StateListPtr& states) {
 
     Eval::NNUE::verify(options, evalFiles);
 
+    if (limits.perft)
+    {
+        perft(pos.fen(), limits.perft, options["UCI_Chess960"]);
+        return;
+    }
+
     threads.start_thinking(options, pos, states, limits, ponderMode);
 }