/*
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
- Copyright (C) 2004-2021 The Stockfish developers (see AUTHORS file)
+ Copyright (C) 2004-2022 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
#include <type_traits>
#include <vector>
+namespace Stockfish {
+
typedef std::pair<int, int> Range; // Option's min-max values
typedef Range (RangeFun) (int);
#define SetDefaultRange SetRange(default_range)
-/// BoolConditions struct is used to tune boolean conditions in the
-/// code by toggling them on/off according to a probability that
-/// depends on the value of a tuned integer parameter: for high
-/// values of the parameter condition is always disabled, for low
-/// values is always enabled, otherwise it is enabled with a given
-/// probability that depnends on the parameter under tuning.
-
-struct BoolConditions {
- void init(size_t size) { values.resize(size, defaultValue), binary.resize(size, 0); }
- void set();
-
- std::vector<int> binary, values;
- int defaultValue = 465, variance = 40, threshold = 500;
- SetRange range = SetRange(0, 1000);
-};
-
-extern BoolConditions Conditions;
-
-inline void set_conditions() { Conditions.set(); }
-
-
/// Tune class implements the 'magic' code that makes the setup of a fishtest
/// tuning session as easy as it can be. Mainly you have just to remove const
/// qualifiers from the variables you want to tune and flag them for tuning, so
static Tune& instance() { static Tune t; return t; } // Singleton
- // Use polymorphism to accomodate Entry of different types in the same vector
+ // Use polymorphism to accommodate Entry of different types in the same vector
struct EntryBase {
virtual ~EntryBase() = default;
virtual void init_option() = 0;
SetRange range;
};
- // Our facilty to fill the container, each Entry corresponds to a parameter to tune.
- // We use variadic templates to deal with an unspecified number of entries, each one
- // of a possible different type.
+ // Our facility to fill the container, each Entry corresponds to a parameter
+ // to tune. We use variadic templates to deal with an unspecified number of
+ // entries, each one of a possible different type.
static std::string next(std::string& names, bool pop = true);
int add(const SetRange&, std::string&&) { return 0; }
return add(value, (next(names), std::move(names)), args...);
}
- // Template specialization for BoolConditions
- template<typename... Args>
- int add(const SetRange& range, std::string&& names, BoolConditions& cond, Args&&... args) {
- for (size_t size = cond.values.size(), i = 0; i < size; i++)
- add(cond.range, next(names, i == size - 1) + "_" + std::to_string(i), cond.values[i]);
- return add(range, std::move(names), args...);
- }
-
std::vector<std::unique_ptr<EntryBase>> list;
public:
#define UPDATE_ON_LAST() bool UNIQUE(p, __LINE__) = Tune::update_on_last = true
-// Some macro to tune toggling of boolean conditions
-#define CONDITION(x) (Conditions.binary[__COUNTER__] || (x))
-#define TUNE_CONDITIONS() int UNIQUE(c, __LINE__) = (Conditions.init(__COUNTER__), 0); \
- TUNE(Conditions, set_conditions)
+} // namespace Stockfish
#endif // #ifndef TUNE_H_INCLUDED