mirror of
https://github.com/sockspls/badfish
synced 2025-04-29 16:23:09 +00:00

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
68 lines
2 KiB
C++
68 lines
2 KiB
C++
/*
|
|
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::Benchmark {
|
|
|
|
// 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 << UCIEngine::move(m, pos.is_chess960()) << ": " << cnt << sync_endl;
|
|
}
|
|
return nodes;
|
|
}
|
|
|
|
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());
|
|
|
|
return perft<true>(p, depth);
|
|
}
|
|
}
|
|
|
|
#endif // PERFT_H_INCLUDED
|