mirror of
https://github.com/sockspls/badfish
synced 2025-04-30 08:43:09 +00:00
Expand statistics tools for engine development
This patch adds more debugging slots up to 32 per type and provide tools to calculate standard deviation and Pearson's correlation coefficient. However, due to slot being 0 at default, dbg_hit_on(c, b) has to be removed. Initial idea from snicolet/Stockfish@d8ab604 closes https://github.com/official-stockfish/Stockfish/pull/4354 No functional change
This commit is contained in:
parent
da8513f0ea
commit
5a30b087c3
2 changed files with 88 additions and 13 deletions
94
src/misc.cpp
94
src/misc.cpp
|
@ -41,6 +41,7 @@ typedef WORD(*fun5_t)();
|
|||
}
|
||||
#endif
|
||||
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
|
@ -299,21 +300,94 @@ std::string compiler_info() {
|
|||
|
||||
|
||||
/// Debug functions used mainly to collect run-time statistics
|
||||
static std::atomic<int64_t> hits[2], means[2];
|
||||
constexpr int MaxDebugSlots = 32;
|
||||
|
||||
void dbg_hit_on(bool b) { ++hits[0]; if (b) ++hits[1]; }
|
||||
void dbg_hit_on(bool c, bool b) { if (c) dbg_hit_on(b); }
|
||||
void dbg_mean_of(int v) { ++means[0]; means[1] += v; }
|
||||
namespace {
|
||||
|
||||
template<size_t N>
|
||||
struct DebugInfo {
|
||||
std::atomic<int64_t> data[N] = { 0 };
|
||||
|
||||
constexpr inline std::atomic<int64_t>& operator[](int index) { return data[index]; }
|
||||
};
|
||||
|
||||
DebugInfo<2> hit[MaxDebugSlots];
|
||||
DebugInfo<2> mean[MaxDebugSlots];
|
||||
DebugInfo<3> stdev[MaxDebugSlots];
|
||||
DebugInfo<6> correl[MaxDebugSlots];
|
||||
|
||||
} // namespace
|
||||
|
||||
void dbg_hit_on(bool cond, int slot) {
|
||||
|
||||
++hit[slot][0];
|
||||
if (cond)
|
||||
++hit[slot][1];
|
||||
}
|
||||
|
||||
void dbg_mean_of(int64_t value, int slot) {
|
||||
|
||||
++mean[slot][0];
|
||||
mean[slot][1] += value;
|
||||
}
|
||||
|
||||
void dbg_stdev_of(int64_t value, int slot) {
|
||||
|
||||
++stdev[slot][0];
|
||||
stdev[slot][1] += value;
|
||||
stdev[slot][2] += value * value;
|
||||
}
|
||||
|
||||
void dbg_correl_of(int64_t value1, int64_t value2, int slot) {
|
||||
|
||||
++correl[slot][0];
|
||||
correl[slot][1] += value1;
|
||||
correl[slot][2] += value1 * value1;
|
||||
correl[slot][3] += value2;
|
||||
correl[slot][4] += value2 * value2;
|
||||
correl[slot][5] += value1 * value2;
|
||||
}
|
||||
|
||||
void dbg_print() {
|
||||
|
||||
if (hits[0])
|
||||
cerr << "Total " << hits[0] << " Hits " << hits[1]
|
||||
<< " hit rate (%) " << 100 * hits[1] / hits[0] << endl;
|
||||
int64_t n;
|
||||
auto E = [&n](int64_t x) { return double(x) / n; };
|
||||
auto sqr = [](double x) { return x * x; };
|
||||
|
||||
if (means[0])
|
||||
cerr << "Total " << means[0] << " Mean "
|
||||
<< (double)means[1] / means[0] << endl;
|
||||
for (int i = 0; i < MaxDebugSlots; ++i)
|
||||
if ((n = hit[i][0]))
|
||||
std::cerr << "Hit #" << i
|
||||
<< ": Total " << n << " Hits " << hit[i][1]
|
||||
<< " Hit Rate (%) " << 100.0 * E(hit[i][1])
|
||||
<< std::endl;
|
||||
|
||||
for (int i = 0; i < MaxDebugSlots; ++i)
|
||||
if ((n = mean[i][0]))
|
||||
{
|
||||
std::cerr << "Mean #" << i
|
||||
<< ": Total " << n << " Mean " << E(mean[i][1])
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
for (int i = 0; i < MaxDebugSlots; ++i)
|
||||
if ((n = stdev[i][0]))
|
||||
{
|
||||
double r = sqrtl(E(stdev[i][2]) - sqr(E(stdev[i][1])));
|
||||
std::cerr << "Stdev #" << i
|
||||
<< ": Total " << n << " Stdev " << r
|
||||
<< std::endl;
|
||||
}
|
||||
|
||||
for (int i = 0; i < MaxDebugSlots; ++i)
|
||||
if ((n = correl[i][0]))
|
||||
{
|
||||
double r = (E(correl[i][5]) - E(correl[i][1]) * E(correl[i][3]))
|
||||
/ ( sqrtl(E(correl[i][2]) - sqr(E(correl[i][1])))
|
||||
* sqrtl(E(correl[i][4]) - sqr(E(correl[i][3]))));
|
||||
std::cerr << "Correl. #" << i
|
||||
<< ": Total " << n << " Coefficient " << r
|
||||
<< std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -39,9 +39,10 @@ void std_aligned_free(void* ptr);
|
|||
void* aligned_large_pages_alloc(size_t size); // memory aligned by page size, min alignment: 4096 bytes
|
||||
void aligned_large_pages_free(void* mem); // nop if mem == nullptr
|
||||
|
||||
void dbg_hit_on(bool b);
|
||||
void dbg_hit_on(bool c, bool b);
|
||||
void dbg_mean_of(int v);
|
||||
void dbg_hit_on(bool cond, int slot = 0);
|
||||
void dbg_mean_of(int64_t value, int slot = 0);
|
||||
void dbg_stdev_of(int64_t value, int slot = 0);
|
||||
void dbg_correl_of(int64_t value1, int64_t value2, int slot = 0);
|
||||
void dbg_print();
|
||||
|
||||
typedef std::chrono::milliseconds::rep TimePoint; // A value in milliseconds
|
||||
|
|
Loading…
Add table
Reference in a new issue