diff options
| -rwxr-xr-x | perft.bash (renamed from perft.sh) | 13 | ||||
| -rw-r--r-- | src/main.cpp | 54 | ||||
| -rw-r--r-- | src/uci.cpp | 25 |
3 files changed, 61 insertions, 31 deletions
@@ -5,14 +5,21 @@ testPerft() { local depth="$2" local expected="$3" - printf "position fen %s\nperft %s\nquit\n" "$fen" "$depth" | ./build/mono - echo "Expected: $expected" + result=$(./build/mono "perft" $depth "$fen") + count=$(echo $result | jq -r '.result') + if [ "$count" = "$expected" ]; then + echo "Results match" + else + echo "Results dont match" + echo "Expected: $expected" + echo "Got: $count" + fi echo "-------------------" } configs=( # starting pos - "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1|1|20" + "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1|1|1" "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1|2|400" "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1|3|8902" "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1|4|197281" diff --git a/src/main.cpp b/src/main.cpp index 4469e40..a2af33f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,13 +1,61 @@ +#include <cassert> +#include <chrono> +#include <cstdint> +#include <cstdlib> +#include <iostream> +#include <sstream> +#include <string> + +#include "board/board.hpp" #include "misc.hpp" #include "uci.hpp" #include "zobrist.hpp" -#include <iostream> -int main() { +static void perft(int argc, char *argv[]) { + if (argc != 4 || std::string(argv[1]) != "perft") { + std::cout << "Usage: ./mono\n"; + std::cout << " ./mono perft <non-negative depth> <fen>\n"; + exit(1); + } + + int depth = -1; + try { + depth = std::stoi(argv[2]); + } catch (const std::exception &) { + std::cout << "info string usage: ./mono perft <non-negative depth>\n"; + exit(1); + } + + if (depth < 0) { + std::cout << "info string usage: ./mono perft <non-negative depth>\n"; + exit(1); + } + + std::string fen = argv[3]; + + auto start = std::chrono::steady_clock::now(); + + Game game = initBoard(fen, nullptr); + uint64_t count = MoveGenTest(depth, &game); + + auto end = std::chrono::steady_clock::now(); + auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - start) + .count(); + std::ostringstream oss; + oss << "{\"ms\": " << ms << ", \"result\": " << count << "}"; + + std::cout << oss.str() << std::endl; +} + +int main(int argc, char *argv[]) { InitZobrist(); - std::cout << engine_info(); + if (argc != 1) { + perft(argc, argv); + return 0; + } + std::cout << engine_info(); Uci(); return 0; } diff --git a/src/uci.cpp b/src/uci.cpp index 0805c6c..1854019 100644 --- a/src/uci.cpp +++ b/src/uci.cpp @@ -286,31 +286,6 @@ void Uci() { MakeMove(move, &game); } - } else if (cmd.starts_with("perft")) { - std::istringstream iss(cmd); - - std::string word; - int depth = -1; - - if (!(iss >> word >> depth) || word != "perft" || depth < 0) { - cout << "info string usage: perft <non-negative depth>\n"; - cout.flush(); - continue; - } - - auto start = std::chrono::steady_clock::now(); - - uint64_t count = MoveGenTest(depth, &game); - - auto end = std::chrono::steady_clock::now(); - auto ms = - std::chrono::duration_cast<std::chrono::milliseconds>(end - start) - .count(); - std::ostringstream oss; - oss << "{\"ms\": " << ms << ", \"result\": " << count << "}"; - std::string json = oss.str(); - - std::cout << json << std::endl; } } } |
