From e371d133a7cbb08c0ce2cb83788f8f9145769890 Mon Sep 17 00:00:00 2001 From: Tomasz Sobczyk Date: Mon, 5 Apr 2021 17:10:16 +0200 Subject: [PATCH] Fix grouping and do dedup in registry. --- src/learn/stats.cpp | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/src/learn/stats.cpp b/src/learn/stats.cpp index 3a8b4454..d899090e 100644 --- a/src/learn/stats.cpp +++ b/src/learn/stats.cpp @@ -45,6 +45,8 @@ namespace Learner::Stats template struct StatisticGathererFactory : StatisticGathererFactoryBase { + static inline std::string name = T::name; + [[nodiscard]] std::unique_ptr create() const override { return std::make_unique(); @@ -52,7 +54,7 @@ namespace Learner::Stats [[nodiscard]] const std::string& get_name() const override { - return T::name; + return name; } }; @@ -139,17 +141,29 @@ namespace Learner::Stats } } - template - void add(const std::string& group) + template + void add(const ArgsTs&... group) { - m_gatherers_by_group[group].emplace_back(std::make_unique>()); - - // Always add to the special group "all". - m_gatherers_by_group["all"].emplace_back(std::make_unique>()); + auto dummy = {(add_single(group), 0)...}; + (void)dummy; + add_single("all"); } private: std::map>> m_gatherers_by_group; + std::map> m_gatherers_names_by_group; + + template + void add_single(const ArgT& group) + { + using FactoryT = StatisticGathererFactory; + + if (m_gatherers_names_by_group[group].count(FactoryT::name) == 0) + { + m_gatherers_by_group[group].emplace_back(std::make_unique()); + m_gatherers_names_by_group[group].insert(FactoryT::name); + } + } }; /* @@ -442,7 +456,7 @@ namespace Learner::Stats void reset() override { for (int i = 0; i < SQUARE_NB; ++i) - m_num_pieces[i] = 0; + m_piece_count_hist[i] = 0; } [[nodiscard]] const std::string& get_name() const override @@ -527,16 +541,14 @@ namespace Learner::Stats reg.add("position_count"); - reg.add("king"); - reg.add("king_square_count"); + reg.add("king", "king_square_count"); - reg.add("move"); - reg.add("move_from_count"); - reg.add("move_to_count"); - reg.add("move_type"); - reg.add("moved_piece_type"); + reg.add("move", "move_from_count"); + reg.add("move", "move_to_count"); + reg.add("move", "move_type"); + reg.add("move", "moved_piece_type"); - reg.add("piece_count") + reg.add("piece_count"); return reg; }();