mirror of
https://github.com/sockspls/badfish
synced 2025-07-12 12:09:14 +00:00
Use less time on recaptures
Credit for the idea goes to peregrine on discord. Passed STC 10+0.1: https://tests.stockfishchess.org/tests/view/662652623fe04ce4cefc48cf LLR: 2.95 (-2.94,2.94) <0.00,2.00> Total: 75712 W: 19793 L: 19423 D: 36496 Ptnml(0-2): 258, 8487, 20023, 8803, 285 Passed LTC 60+0.6: https://tests.stockfishchess.org/tests/view/6627495e3fe04ce4cefc59b6 LLR: 2.94 (-2.94,2.94) <0.50,2.50> Total: 49788 W: 12743 L: 12404 D: 24641 Ptnml(0-2): 29, 5141, 14215, 5480, 29 The code was updated slightly and tested for non-regression against the original code at STC: LLR: 2.94 (-2.94,2.94) <-1.75,0.25> Total: 41952 W: 10912 L: 10698 D: 20342 Ptnml(0-2): 133, 4825, 10835, 5061, 122 https://tests.stockfishchess.org/tests/view/662d84f56115ff6764c7e438 closes https://github.com/official-stockfish/Stockfish/pull/5189 Bench: 1836777
This commit is contained in:
parent
49ef4c935a
commit
886ed90ec3
4 changed files with 23 additions and 11 deletions
|
@ -53,6 +53,7 @@ Engine::Engine(std::string path) :
|
||||||
NN::NetworkBig({EvalFileDefaultNameBig, "None", ""}, NN::EmbeddedNNUEType::BIG),
|
NN::NetworkBig({EvalFileDefaultNameBig, "None", ""}, NN::EmbeddedNNUEType::BIG),
|
||||||
NN::NetworkSmall({EvalFileDefaultNameSmall, "None", ""}, NN::EmbeddedNNUEType::SMALL))) {
|
NN::NetworkSmall({EvalFileDefaultNameSmall, "None", ""}, NN::EmbeddedNNUEType::SMALL))) {
|
||||||
pos.set(StartFEN, false, &states->back());
|
pos.set(StartFEN, false, &states->back());
|
||||||
|
capSq = SQ_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::uint64_t Engine::perft(const std::string& fen, Depth depth, bool isChess960) {
|
std::uint64_t Engine::perft(const std::string& fen, Depth depth, bool isChess960) {
|
||||||
|
@ -61,9 +62,10 @@ std::uint64_t Engine::perft(const std::string& fen, Depth depth, bool isChess960
|
||||||
return Benchmark::perft(fen, depth, isChess960);
|
return Benchmark::perft(fen, depth, isChess960);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::go(const Search::LimitsType& limits) {
|
void Engine::go(Search::LimitsType& limits) {
|
||||||
assert(limits.perft == 0);
|
assert(limits.perft == 0);
|
||||||
verify_networks();
|
verify_networks();
|
||||||
|
limits.capSq = capSq;
|
||||||
|
|
||||||
threads.start_thinking(options, pos, states, limits);
|
threads.start_thinking(options, pos, states, limits);
|
||||||
}
|
}
|
||||||
|
@ -102,6 +104,7 @@ void Engine::set_position(const std::string& fen, const std::vector<std::string>
|
||||||
states = StateListPtr(new std::deque<StateInfo>(1));
|
states = StateListPtr(new std::deque<StateInfo>(1));
|
||||||
pos.set(fen, options["UCI_Chess960"], &states->back());
|
pos.set(fen, options["UCI_Chess960"], &states->back());
|
||||||
|
|
||||||
|
capSq = SQ_NONE;
|
||||||
for (const auto& move : moves)
|
for (const auto& move : moves)
|
||||||
{
|
{
|
||||||
auto m = UCIEngine::to_move(pos, move);
|
auto m = UCIEngine::to_move(pos, move);
|
||||||
|
@ -111,6 +114,11 @@ void Engine::set_position(const std::string& fen, const std::vector<std::string>
|
||||||
|
|
||||||
states->emplace_back();
|
states->emplace_back();
|
||||||
pos.do_move(m, states->back());
|
pos.do_move(m, states->back());
|
||||||
|
|
||||||
|
capSq = SQ_NONE;
|
||||||
|
DirtyPiece& dp = states->back().dirtyPiece;
|
||||||
|
if (dp.dirty_num > 1 && dp.to[1] == SQ_NONE)
|
||||||
|
capSq = m.to_sq();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,24 +20,26 @@
|
||||||
#define ENGINE_H_INCLUDED
|
#define ENGINE_H_INCLUDED
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <cstdint>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cstdint>
|
|
||||||
|
|
||||||
#include "nnue/network.h"
|
#include "nnue/network.h"
|
||||||
#include "position.h"
|
#include "position.h"
|
||||||
#include "search.h"
|
#include "search.h"
|
||||||
|
#include "syzygy/tbprobe.h" // for Stockfish::Depth
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "tt.h"
|
#include "tt.h"
|
||||||
#include "ucioption.h"
|
#include "ucioption.h"
|
||||||
#include "syzygy/tbprobe.h" // for Stockfish::Depth
|
|
||||||
|
|
||||||
namespace Stockfish {
|
namespace Stockfish {
|
||||||
|
|
||||||
|
enum Square : int;
|
||||||
|
|
||||||
class Engine {
|
class Engine {
|
||||||
public:
|
public:
|
||||||
using InfoShort = Search::InfoShort;
|
using InfoShort = Search::InfoShort;
|
||||||
|
@ -50,7 +52,7 @@ class Engine {
|
||||||
std::uint64_t perft(const std::string& fen, Depth depth, bool isChess960);
|
std::uint64_t perft(const std::string& fen, Depth depth, bool isChess960);
|
||||||
|
|
||||||
// non blocking call to start searching
|
// non blocking call to start searching
|
||||||
void go(const Search::LimitsType&);
|
void go(Search::LimitsType&);
|
||||||
// non blocking call to stop searching
|
// non blocking call to stop searching
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
|
@ -92,6 +94,7 @@ class Engine {
|
||||||
|
|
||||||
Position pos;
|
Position pos;
|
||||||
StateListPtr states;
|
StateListPtr states;
|
||||||
|
Square capSq;
|
||||||
|
|
||||||
OptionsMap options;
|
OptionsMap options;
|
||||||
ThreadPool threads;
|
ThreadPool threads;
|
||||||
|
|
|
@ -54,8 +54,8 @@ using namespace Search;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
static constexpr double EvalLevel[10] = {1.043, 1.017, 0.952, 1.009, 0.971,
|
static constexpr double EvalLevel[10] = {0.981, 0.956, 0.895, 0.949, 0.913,
|
||||||
1.002, 0.992, 0.947, 1.046, 1.001};
|
0.942, 0.933, 0.890, 0.984, 0.941};
|
||||||
|
|
||||||
// Futility margin
|
// Futility margin
|
||||||
Value futility_margin(Depth d, bool noTtCutNode, bool improving, bool oppWorsening) {
|
Value futility_margin(Depth d, bool noTtCutNode, bool improving, bool oppWorsening) {
|
||||||
|
@ -446,9 +446,10 @@ void Search::Worker::iterative_deepening() {
|
||||||
double reduction = (1.48 + mainThread->previousTimeReduction) / (2.17 * timeReduction);
|
double reduction = (1.48 + mainThread->previousTimeReduction) / (2.17 * timeReduction);
|
||||||
double bestMoveInstability = 1 + 1.88 * totBestMoveChanges / threads.size();
|
double bestMoveInstability = 1 + 1.88 * totBestMoveChanges / threads.size();
|
||||||
int el = std::clamp((bestValue + 750) / 150, 0, 9);
|
int el = std::clamp((bestValue + 750) / 150, 0, 9);
|
||||||
|
double recapture = limits.capSq == rootMoves[0].pv[0].to_sq() ? 0.955 : 1.005;
|
||||||
|
|
||||||
double totalTime = mainThread->tm.optimum() * fallingEval * reduction
|
double totalTime = mainThread->tm.optimum() * fallingEval * reduction
|
||||||
* bestMoveInstability * EvalLevel[el];
|
* bestMoveInstability * EvalLevel[el] * recapture;
|
||||||
|
|
||||||
// Cap used time in case of a single legal move for a better viewer experience
|
// Cap used time in case of a single legal move for a better viewer experience
|
||||||
if (rootMoves.size() == 1)
|
if (rootMoves.size() == 1)
|
||||||
|
|
|
@ -109,8 +109,7 @@ struct RootMove {
|
||||||
using RootMoves = std::vector<RootMove>;
|
using RootMoves = std::vector<RootMove>;
|
||||||
|
|
||||||
|
|
||||||
// LimitsType struct stores information sent by GUI about available time to
|
// LimitsType struct stores information sent by the caller about the analysis required.
|
||||||
// search the current move, maximum depth/time, or if we are in analysis mode.
|
|
||||||
struct LimitsType {
|
struct LimitsType {
|
||||||
|
|
||||||
// Init explicitly due to broken value-initialization of non POD in MSVC
|
// Init explicitly due to broken value-initialization of non POD in MSVC
|
||||||
|
@ -128,6 +127,7 @@ struct LimitsType {
|
||||||
int movestogo, depth, mate, perft, infinite;
|
int movestogo, depth, mate, perft, infinite;
|
||||||
uint64_t nodes;
|
uint64_t nodes;
|
||||||
bool ponderMode;
|
bool ponderMode;
|
||||||
|
Square capSq;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue