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