1 #ifndef _STATS_HPP_LCDSJIOSA
2 #define _STATS_HPP_LCDSJIOSA
3
4 #include "library/vec1.hpp"
5 #include <ostream>
6 #include <iostream>
7 #include <map>
8
9 namespace Stats
10 {
11 struct Sort
12 {
13 int len;
14 int types;
15 bool success;
16
SortStats::Sort17 Sort(int _len, int _types, bool _success)
18 : len(_len), types(_types), success(_success)
19 { }
20
operator <<(std::ostream & o,const Sort & s)21 friend std::ostream& operator<<(std::ostream& o, const Sort& s)
22 {
23 return o << "(" << s.len << "," << s.types << "," << s.success << ")";
24 }
25
operator <(const Sort & s1,const Sort & s2)26 friend bool operator<(const Sort& s1, const Sort& s2)
27 {
28 return std::make_pair(s1.len, std::make_pair(s1.types, s1.success)) <
29 std::make_pair(s2.len, std::make_pair(s2.types, s2.success));
30 }
31 };
32
33 // Keep the following data enum and strings in sync!
34 enum ConstraintType {
35 CON_ListStab,
36 CON_OverlappingSetSetStab,
37 CON_PermGroup,
38 CON_SetSetStab,
39 CON_SlowGraph,
40 CON_EdgeGraph,
41 CON_StabChain_PermGroup,
42 CON_END
43 };
44
45 namespace {
46 const std::string names[] = {
47 "ListStab", "OverlappingSetSetStab", "PermGroup",
48 "SetSetStab", "SlowGraph", "EdgeGraph", "StabChain_PermGroup"};
49 };
50
51 struct Container
52 {
53 std::map<Sort, int> sortStats;
54 int node_count;
55 int bad_leaves;
56 int bad_internal_nodes;
57
58 std::vector<int> constraint_invokes;
59
60 vec1<std::pair<int, int> > rBase_fixed_points;
61
62 vec1<int> rBase_value_ordering;
63
ContainerStats::Container64 Container() : node_count(0), bad_leaves(0), bad_internal_nodes(0),
65 constraint_invokes(CON_END, 0)
66 { }
67
getConstraintCallsStats::Container68 std::map<std::string, int> getConstraintCalls() const
69 {
70 std::map<std::string, int> ret;
71 for(int i = 0; i < CON_END; ++i)
72 {
73 ret[names[i]] = constraint_invokes[i];
74 }
75 return ret;
76 }
77
addConstraintCallStats::Container78 void addConstraintCall(ConstraintType t)
79 { constraint_invokes[t]++; }
80
addSortStatStats::Container81 void addSortStat(Sort ss)
82 { sortStats[ss]++; }
83
dumpStatsStats::Container84 void dumpStats()
85 {
86 for(const auto& m : sortStats)
87 {
88 std::cerr << m.first << " : " << m.second << "\n";
89 }
90 }
91 };
92
container()93 inline Container& container()
94 {
95 static thread_local Container c;
96 return c;
97 }
98
reset()99 inline void reset()
100 {
101 container() = Container();
102 }
103
104 inline
ConstraintInvoke(Stats::ConstraintType t)105 void ConstraintInvoke(Stats::ConstraintType t)
106 { Stats::container().addConstraintCall(t); }
107
108 }
109
110 //#define STATS
111
112
113 #ifdef STATS
114 #define RECORD_STATS(x) Stats::container().x
115 #else
116 #define RECORD_STATS(x)
117 #endif
118
119
120 #endif
121