Skip to content

Commit

Permalink
Improve on Feedback
Browse files Browse the repository at this point in the history
Bench: 1823302
  • Loading branch information
Disservin committed Apr 3, 2024
1 parent 56060a5 commit 573fe84
Show file tree
Hide file tree
Showing 10 changed files with 180 additions and 51 deletions.
4 changes: 2 additions & 2 deletions src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,15 @@ PGOBENCH = $(WINE_PATH) ./$(EXE) bench
SRCS = benchmark.cpp bitboard.cpp evaluate.cpp main.cpp \
misc.cpp movegen.cpp movepick.cpp position.cpp \
search.cpp thread.cpp timeman.cpp tt.cpp uci.cpp ucioption.cpp tune.cpp syzygy/tbprobe.cpp \
nnue/nnue_misc.cpp nnue/features/half_ka_v2_hm.cpp nnue/network.cpp engine.cpp
nnue/nnue_misc.cpp nnue/features/half_ka_v2_hm.cpp nnue/network.cpp engine.cpp score.cpp

HEADERS = benchmark.h bitboard.h evaluate.h misc.h movegen.h movepick.h \
nnue/nnue_misc.h nnue/features/half_ka_v2_hm.h nnue/layers/affine_transform.h \
nnue/layers/affine_transform_sparse_input.h nnue/layers/clipped_relu.h nnue/layers/simd.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 perft.h nnue/network.h engine.h
tt.h tune.h types.h uci.h ucioption.h perft.h nnue/network.h engine.h score.h

OBJS = $(notdir $(SRCS:.cpp=.o))

Expand Down
11 changes: 4 additions & 7 deletions src/engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

#include "engine.h"

#include <cstdint>
#include <deque>
#include <memory>
#include <ostream>
Expand All @@ -33,7 +32,6 @@
#include "position.h"
#include "search.h"
#include "syzygy/tbprobe.h"
#include "tune.h"
#include "types.h"
#include "uci.h"
#include "ucioption.h"
Expand All @@ -50,7 +48,6 @@ Engine::Engine(std::string path) :
networks(NN::Networks(
NN::NetworkBig({EvalFileDefaultNameBig, "None", ""}, NN::EmbeddedNNUEType::BIG),
NN::NetworkSmall({EvalFileDefaultNameSmall, "None", ""}, NN::EmbeddedNNUEType::SMALL))) {
Tune::init(options);
pos.set(StartFEN, false, &states->back());
}

Expand All @@ -77,19 +74,19 @@ void Engine::search_clear() {
Tablebases::init(options["SyzygyPath"]); // Free mapped files
}

void Engine::set_on_update_short(std::function<void(const Engine::InfoShort&)> f) {
void Engine::set_on_update_short(std::function<void(const Engine::InfoShort&)>&& f) {
updateContext.onUpdateShort = std::move(f);
}

void Engine::set_on_update_full(std::function<void(const Engine::InfoFull&)> f) {
void Engine::set_on_update_full(std::function<void(const Engine::InfoFull&)>&& f) {
updateContext.onUpdateFull = std::move(f);
}

void Engine::set_on_iter(std::function<void(const Engine::InfoIter&)> f) {
void Engine::set_on_iter(std::function<void(const Engine::InfoIter&)>&& f) {
updateContext.onIter = std::move(f);
}

void Engine::set_on_bestmove(std::function<void(const std::string&, const std::string&)> f) {
void Engine::set_on_bestmove(std::function<void(const std::string&, const std::string&)>&& f) {
updateContext.onBestmove = std::move(f);
}

Expand Down
11 changes: 6 additions & 5 deletions src/engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@
#define ENGINE_H_INCLUDED

#include <cstddef>
#include <cstdint>
#include <functional>
#include <string>
#include <vector>
#include <optional>
#include <utility>

#include "nnue/network.h"
#include "position.h"
Expand Down Expand Up @@ -61,10 +62,10 @@ class Engine {
// clears the search
void search_clear();

void set_on_update_short(std::function<void(const InfoShort&)>);
void set_on_update_full(std::function<void(const InfoFull&)>);
void set_on_iter(std::function<void(const InfoIter&)>);
void set_on_bestmove(std::function<void(const std::string&, const std::string&)>);
void set_on_update_short(std::function<void(const InfoShort&)>&&);
void set_on_update_full(std::function<void(const InfoFull&)>&&);
void set_on_iter(std::function<void(const InfoIter&)>&&);
void set_on_bestmove(std::function<void(const std::string&, const std::string&)>&&);

// network related

Expand Down
4 changes: 4 additions & 0 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "position.h"
#include "types.h"
#include "uci.h"
#include "tune.h"

using namespace Stockfish;

Expand All @@ -34,6 +35,9 @@ int main(int argc, char* argv[]) {
Position::init();

UCIEngine uci(argc, argv);

Tune::init(uci.engine_options());

uci.loop();

return 0;
Expand Down
48 changes: 48 additions & 0 deletions src/score.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
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/>.
*/

#include "score.h"

#include <cassert>
#include <cmath>
#include <cstdlib>

#include "uci.h"

namespace Stockfish {

Score::Score(Value v, const Position& pos) {
assert(-VALUE_INFINITE < v && v < VALUE_INFINITE);

if (std::abs(v) < VALUE_TB_WIN_IN_MAX_PLY)
{
score = InternalUnits{UCIEngine::to_cp(v, pos)};
}
else if (std::abs(v) <= VALUE_TB)
{
auto distance = VALUE_TB - std::abs(v);
score = (v > 0) ? TBWin{distance} : TBWin{-distance};
}
else
{
auto distance = VALUE_MATE - std::abs(v);
score = (v > 0) ? Mate{distance} : Mate{-distance};
}
}

}
69 changes: 69 additions & 0 deletions src/score.h
Original file line number Diff line number Diff line change
@@ -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 SCORE_H_INCLUDED
#define SCORE_H_INCLUDED

#include <variant>
#include <utility>

#include "types.h"

namespace Stockfish {

class Position;

class Score {
public:
struct Mate {
int plies;
};

struct TBWin {
int plies;
};

struct InternalUnits {
int value;
};

Score() = default;
Score(Value v, const Position& pos);

template<typename T>
bool is() const {
return std::holds_alternative<T>(score);
}

template<typename T>
T get() const {
return std::get<T>(score);
}

template<typename F>
decltype(auto) visit(F&& f) const {
return std::visit(std::forward<F>(f), score);
}

private:
std::variant<Mate, TBWin, InternalUnits> score;
};

}

#endif // #ifndef SCORE_H_INCLUDED
8 changes: 4 additions & 4 deletions src/search.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ void Search::Worker::start_searching() {
{
rootMoves.emplace_back(Move::none());
main_manager()->updates.onUpdateShort(
{0, UCIEngine::to_score(rootPos.checkers() ? -VALUE_MATE : VALUE_DRAW, rootPos)});
{0, {rootPos.checkers() ? -VALUE_MATE : VALUE_DRAW, rootPos}});
}
else
{
Expand Down Expand Up @@ -1909,15 +1909,15 @@ void SearchManager::pv(const Search::Worker& worker,
info.depth = d;
info.selDepth = rootMoves[i].selDepth;
info.multiPV = i + 1;
info.score = UCIEngine::to_score(v, pos);
info.score = {v, pos};

if (worker.options["UCI_ShowWDL"])
info.wdl = UCIEngine::wdl(v, pos);

if (i == pvIdx && !tb && updated) // tablebase- and previous-scores are exact
info.bound = rootMoves[i].scoreLowerbound
? " lowerbound"
: (rootMoves[i].scoreUpperbound ? " upperbound" : "");
? "lowerbound"
: (rootMoves[i].scoreUpperbound ? "upperbound" : "");

info.timeMs = time;
info.nodes = nodes;
Expand Down
5 changes: 3 additions & 2 deletions src/search.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "syzygy/tbprobe.h"
#include "timeman.h"
#include "types.h"
#include "score.h"

namespace Stockfish {

Expand Down Expand Up @@ -157,8 +158,8 @@ class ISearchManager {
};

struct InfoShort {
int depth;
std::string score;
int depth;
Score score;
};

struct InfoFull: InfoShort {
Expand Down
66 changes: 36 additions & 30 deletions src/uci.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,9 @@
#include "uci.h"

#include <algorithm>
#include <cassert>
#include <cctype>
#include <cmath>
#include <cstdint>
#include <cstdlib>
#include <deque>
#include <memory>
#include <optional>
Expand All @@ -37,6 +35,7 @@
#include "movegen.h"
#include "position.h"
#include "search.h"
#include "score.h"
#include "syzygy/tbprobe.h"
#include "types.h"
#include "ucioption.h"
Expand All @@ -46,6 +45,13 @@ namespace Stockfish {
constexpr auto StartFEN = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
constexpr int MaxHashMB = Is64Bit ? 33554432 : 2048;

template<typename... Ts>
struct overload: Ts... {
using Ts::operator()...;
};

template<typename... Ts>
overload(Ts...) -> overload<Ts...>;

UCIEngine::UCIEngine(int argc, char** argv) :
engine(argv[0]),
Expand Down Expand Up @@ -349,22 +355,22 @@ int win_rate_model(Value v, const Position& pos) {
}
}

std::string UCIEngine::to_score(Value v, const Position& pos) {
assert(-VALUE_INFINITE < v && v < VALUE_INFINITE);

std::stringstream ss;

if (std::abs(v) < VALUE_TB_WIN_IN_MAX_PLY)
ss << "cp " << to_cp(v, pos);
else if (std::abs(v) <= VALUE_TB)
{
const int ply = VALUE_TB - std::abs(v); // recompute ss->ply
ss << "cp " << (v > 0 ? 20000 - ply : -20000 + ply);
}
else
ss << "mate " << (v > 0 ? VALUE_MATE - v + 1 : -VALUE_MATE - v) / 2;

return ss.str();
std::string UCIEngine::format_score(const Score& s) {
constexpr int TB_CP = 20000;
constexpr auto format =
overload{[](Score::Mate mate) -> std::string {
auto m = (mate.plies > 0 ? (mate.plies + 1) : -mate.plies) / 2;
return std::string("mate ") + std::to_string(m);
},
[](Score::TBWin tb) -> std::string {
return std::string("cp ")
+ std::to_string((tb.plies > 0 ? TB_CP - tb.plies : -TB_CP + tb.plies));
},
[](Score::InternalUnits units) -> std::string {
return std::string("cp ") + std::to_string(units.value);
}};

return s.visit(format);
}

// Turns a Value to an integer centipawn number,
Expand Down Expand Up @@ -429,28 +435,28 @@ Move UCIEngine::to_move(const Position& pos, std::string str) {
}

void UCIEngine::on_update_short(const Engine::InfoShort& info) {
sync_cout << "info depth" << info.depth << " score " << info.score << sync_endl;
sync_cout << "info depth" << info.depth << " score " << format_score(info.score) << sync_endl;
}

void UCIEngine::on_update_full(const Engine::InfoFull& info, bool showWDL) {
std::stringstream ss;

ss << "info";
ss << " depth " << info.depth //
<< " seldepth " << info.selDepth //
<< " multipv " << info.multiPV //
<< " score " << info.score; //
ss << " depth " << info.depth //
<< " seldepth " << info.selDepth //
<< " multipv " << info.multiPV //
<< " score " << format_score(info.score); //

if (showWDL)
ss << " wdl " << info.wdl;

ss << info.bound //
<< " nodes " << info.nodes //
<< " nps " << info.nps //
<< " hashfull " << info.hashfull //
<< " tbhits " << info.tbHits //
<< " time " << info.timeMs //
<< " pv " << info.pv; //
ss << (!info.bound.empty() ? " " + info.bound : "") //
<< " nodes " << info.nodes //
<< " nps " << info.nps //
<< " hashfull " << info.hashfull //
<< " tbhits " << info.tbHits //
<< " time " << info.timeMs //
<< " pv " << info.pv; //

sync_cout << ss.str() << sync_endl;
}
Expand Down
Loading

0 comments on commit 573fe84

Please sign in to comment.