-
Notifications
You must be signed in to change notification settings - Fork 1.5k
/
Copy pathquantifier_stat.h
154 lines (119 loc) · 4.07 KB
/
quantifier_stat.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*++
Copyright (c) 2006 Microsoft Corporation
Module Name:
quantifier_stat.h
Abstract:
<abstract>
Author:
Leonardo de Moura (leonardo) 2008-02-20.
Revision History:
--*/
#pragma once
#include "ast/ast.h"
#include "util/obj_hashtable.h"
#include "util/approx_nat.h"
#include "util/region.h"
namespace q {
/**
\brief Store statistics for quantifiers. This information is
used to implement heuristics for quantifier instantiation.
*/
class quantifier_stat {
unsigned m_size;
unsigned m_depth;
unsigned m_generation;
unsigned m_case_split_factor; //!< the product of the size of the clauses created by this quantifier.
unsigned m_num_nested_quantifiers;
unsigned m_num_instances;
unsigned m_num_instances_checker_sat;
unsigned m_num_instances_simplify_true;
unsigned m_num_instances_curr_search;
unsigned m_num_instances_curr_branch; //!< only updated if QI_TRACK_INSTANCES is true
unsigned m_max_generation; //!< max. generation of an instance
float m_max_cost;
friend class quantifier_stat_gen;
quantifier_stat(unsigned generation);
public:
unsigned get_size() const {
return m_size;
}
unsigned get_depth() const {
return m_depth;
}
unsigned get_generation() const {
return m_generation;
}
unsigned get_case_split_factor() const {
return m_case_split_factor;
}
unsigned get_num_nested_quantifiers() const {
return m_num_nested_quantifiers;
}
unsigned get_num_instances() const {
return m_num_instances;
}
unsigned get_num_instances_simplify_true() const {
return m_num_instances_simplify_true;
}
unsigned get_num_instances_checker_sat() const {
return m_num_instances_checker_sat;
}
unsigned get_num_instances_curr_search() const {
return m_num_instances_curr_search;
}
unsigned & get_num_instances_curr_branch() {
return m_num_instances_curr_branch;
}
void inc_num_instances_simplify_true() {
m_num_instances_simplify_true++;
}
void inc_num_instances_checker_sat() {
m_num_instances_checker_sat++;
}
void inc_num_instances() {
m_num_instances++;
m_num_instances_curr_search++;
}
void inc_num_instances_curr_branch() {
m_num_instances_curr_branch++;
}
void reset_num_instances_curr_search() {
m_num_instances_curr_search = 0;
}
void update_max_generation(unsigned g) {
if (m_max_generation < g)
m_max_generation = g;
}
unsigned get_max_generation() const {
return m_max_generation;
}
void update_max_cost(float c) {
if (m_max_cost < c)
m_max_cost = c;
}
float get_max_cost() const {
return m_max_cost;
}
};
/**
\brief Functor used to generate quantifier statistics.
*/
class quantifier_stat_gen {
struct entry {
expr * m_expr;
unsigned m_depth:31;
bool m_depth_only:1; //!< track only the depth of this entry.
entry():m_expr(nullptr), m_depth(0), m_depth_only(false) {}
entry(expr * n, unsigned depth = 0, bool depth_only = false):m_expr(n), m_depth(depth), m_depth_only(depth_only) {}
};
ast_manager & m_manager;
region & m_region;
obj_map<expr, unsigned> m_already_found; // expression to the max. depth it was reached.
svector<entry> m_todo;
approx_nat m_case_split_factor;
void reset();
public:
quantifier_stat_gen(ast_manager & m, region & r);
quantifier_stat * operator()(quantifier * q, unsigned generation);
};
};