cprover
Toggle main menu visibility
Loading...
Searching...
No Matches
interval_template.h
Go to the documentation of this file.
1
/*******************************************************************\
2
3
Module:
4
5
Author: Daniel Kroening, kroening@kroening.com
6
7
\*******************************************************************/
8
9
10
#ifndef CPROVER_UTIL_INTERVAL_TEMPLATE_H
11
#define CPROVER_UTIL_INTERVAL_TEMPLATE_H
12
13
#include <algorithm>
14
#include <iosfwd>
15
#include <ostream>
16
17
#include "
threeval.h
"
18
19
template
<
class
T>
class
interval_templatet
20
{
21
public
:
22
interval_templatet
():
lower_set
(false),
upper_set
(false)
23
{
24
// this is 'top'
25
}
26
27
explicit
interval_templatet
(
const
T &x):
28
lower_set
(true),
29
upper_set
(true),
30
lower
(x),
31
upper
(x)
32
{
33
}
34
35
explicit
interval_templatet
(
const
T &l,
const
T &u):
36
lower_set
(true),
37
upper_set
(true),
38
lower
(l),
39
upper
(u)
40
{
41
}
42
43
bool
lower_set
,
upper_set
;
44
T
lower
,
upper
;
45
46
const
T &
get_lower
()
const
47
{
48
return
lower
;
49
}
50
51
const
T &
get_upper
()
const
52
{
53
return
upper
;
54
}
55
56
bool
empty
()
const
57
{
58
return
upper_set
&&
lower_set
&&
lower
>
upper
;
59
}
60
61
bool
is_bottom
() const
// equivalent to 'false'
62
{
63
return
empty
();
64
}
65
66
bool
is_top
() const
// equivalent to 'true'
67
{
68
return
!
lower_set
&& !
upper_set
;
69
}
70
71
bool
singleton
()
const
72
{
73
return
upper_set
&&
lower_set
&&
lower
==
upper
;
74
}
75
76
// constraints
77
void
make_le_than
(
const
T &v)
// add upper bound
78
{
79
if
(
upper_set
)
80
{
81
if
(
upper
>v)
82
upper
=v;
83
}
84
else
85
{
86
upper_set
=
true
;
87
upper
=v;
88
}
89
}
90
91
void
make_ge_than
(
const
T &v)
// add lower bound
92
{
93
if
(
lower_set
)
94
{
95
if
(
lower
<v)
96
lower
=v;
97
}
98
else
99
{
100
lower_set
=
true
;
101
lower
=v;
102
}
103
}
104
105
// Union or disjunction
106
void
join
(
const
interval_templatet<T>
&i)
107
{
108
approx_union_with
(i);
109
}
110
111
// Intersection or conjunction
112
void
meet
(
const
interval_templatet<T>
&i)
113
{
114
intersect_with
(i);
115
}
116
117
void
intersect_with
(
const
interval_templatet
&i)
118
{
119
if
(i.
lower_set
)
120
{
121
if
(
lower_set
)
122
{
123
lower
=std::max(
lower
, i.
lower
);
124
}
125
else
126
{
127
lower_set
=
true
;
128
lower
=i.
lower
;
129
}
130
}
131
132
if
(i.
upper_set
)
133
{
134
if
(
upper_set
)
135
{
136
upper
=std::min(
upper
, i.
upper
);
137
}
138
else
139
{
140
upper_set
=
true
;
141
upper
=i.
upper
;
142
}
143
}
144
}
145
146
void
make_bottom
()
147
{
148
lower_set
=
upper_set
=
true
;
149
upper
= T();
150
lower
=
upper
+ 1;
151
}
152
153
void
make_less_than_eq
(
interval_templatet
&i)
154
{
155
if
(
upper_set
&& i.
upper_set
)
156
upper
= std::min(
upper
, i.
upper
);
157
if
(
lower_set
&& i.
lower_set
)
158
i.
lower
= std::max(
lower
, i.
lower
);
159
}
160
161
void
make_less_than
(
interval_templatet
&i)
162
{
163
make_less_than_eq
(i);
164
if
(
singleton
() && i.
singleton
() &&
lower
== i.
lower
)
165
{
166
make_bottom
();
167
i.
make_bottom
();
168
}
169
}
170
171
bool
is_less_than_eq
(
const
interval_templatet
&i)
172
{
173
// Empty intervals are less than or equal to any interval
174
if
(
empty
() || i.
empty
())
175
return
true
;
176
if
(i.
lower_set
&&
upper_set
&&
upper
<= i.
lower
)
177
return
true
;
178
else
179
return
false
;
180
}
181
182
bool
is_less_than
(
const
interval_templatet
&i)
183
{
184
// Empty intervals are less than any interval
185
if
(
empty
() || i.
empty
())
186
return
true
;
187
if
(i.
lower_set
&&
upper_set
&&
upper
< i.
lower
)
188
return
true
;
189
else
190
return
false
;
191
}
192
193
void
approx_union_with
(
const
interval_templatet
&i)
194
{
195
// If i is empty, union is just this interval
196
if
(i.
empty
())
197
return
;
198
199
// If this interval is empty, union is just i
200
if
(
empty
())
201
{
202
*
this
= i;
203
return
;
204
}
205
206
if
(i.
lower_set
&&
lower_set
)
207
lower
=std::min(
lower
, i.
lower
);
208
else
if
(!i.
lower_set
&&
lower_set
)
209
lower_set
=
false
;
210
211
if
(i.
upper_set
&&
upper_set
)
212
upper
=std::max(
upper
, i.
upper
);
213
else
if
(!i.
upper_set
&&
upper_set
)
214
upper_set
=
false
;
215
}
216
};
217
218
template
<
class
T>
219
tvt
operator<=
(
const
interval_templatet<T>
&a,
const
interval_templatet<T>
&b)
220
{
221
// Empty sets compare as less than or equal
222
if
(a.
empty
() || b.
empty
())
223
return
tvt
(
true
);
224
if
(a.
upper_set
&& b.
lower_set
&& a.
upper
<=b.
lower
)
225
return
tvt
(
true
);
226
if
(a.
lower_set
&& b.
upper_set
&& a.
lower
>b.
upper
)
227
return
tvt
(
false
);
228
229
return
tvt::unknown
();
230
}
231
232
template
<
class
T>
233
tvt
operator>=
(
const
interval_templatet<T>
&a,
const
interval_templatet<T>
&b)
234
{
235
return
b<=a;
236
}
237
238
template
<
class
T>
239
tvt
operator<
(
const
interval_templatet<T>
&a,
const
interval_templatet<T>
&b)
240
{
241
return
!(a>=b);
242
}
243
244
template
<
class
T>
245
tvt
operator>
(
const
interval_templatet<T>
&a,
const
interval_templatet<T>
&b)
246
{
247
return
!(a<=b);
248
}
249
250
template
<
class
T>
251
bool
operator==
(
const
interval_templatet<T>
&a,
const
interval_templatet<T>
&b)
252
{
253
// Empty sets are always equal
254
if
(a.
empty
() && b.
empty
())
255
return
true
;
256
257
if
(a.
lower_set
!=b.
lower_set
)
258
return
false
;
259
if
(a.
upper_set
!=b.
upper_set
)
260
return
false
;
261
262
if
(a.
lower_set
&& a.
lower
!=b.
lower
)
263
return
false
;
264
if
(a.
upper_set
&& a.
upper
!=b.
upper
)
265
return
false
;
266
267
return
true
;
268
}
269
270
template
<
class
T>
271
bool
operator!=
(
const
interval_templatet<T>
&a,
const
interval_templatet<T>
&b)
272
{
273
return
!(a==b);
274
}
275
276
template
<
class
T>
277
interval_templatet<T>
upper_interval
(
const
T &u)
278
{
279
interval_templatet<T>
i;
280
i.
upper_set
=
true
;
281
i.
upper
=u;
282
return
i;
283
}
284
285
template
<
class
T>
286
interval_templatet<T>
lower_interval
(
const
T &l)
287
{
288
interval_templatet<T>
i;
289
i.
lower_set
=
true
;
290
i.
lower
=l;
291
return
i;
292
}
293
294
template
<
class
T>
295
std::ostream &
operator <<
(std::ostream &out,
const
interval_templatet<T>
&i)
296
{
297
if
(i.
lower_set
)
298
out <<
'['
<< i.
lower
;
299
else
300
out <<
")-INF"
;
301
302
out <<
','
;
303
304
if
(i.
upper_set
)
305
out << i.
upper
<<
']'
;
306
else
307
out <<
"+INF("
;
308
309
return
out;
310
}
311
312
#endif
// CPROVER_UTIL_INTERVAL_TEMPLATE_H
interval_templatet
Definition
interval_template.h:20
interval_templatet< ieee_float_valuet >::lower_set
bool lower_set
Definition
interval_template.h:43
interval_templatet::interval_templatet
interval_templatet()
Definition
interval_template.h:22
interval_templatet< ieee_float_valuet >::lower
ieee_float_valuet lower
Definition
interval_template.h:44
interval_templatet::is_less_than
bool is_less_than(const interval_templatet &i)
Definition
interval_template.h:182
interval_templatet::is_top
bool is_top() const
Definition
interval_template.h:66
interval_templatet::make_bottom
void make_bottom()
Definition
interval_template.h:146
interval_templatet::is_less_than_eq
bool is_less_than_eq(const interval_templatet &i)
Definition
interval_template.h:171
interval_templatet::make_le_than
void make_le_than(const T &v)
Definition
interval_template.h:77
interval_templatet::interval_templatet
interval_templatet(const T &x)
Definition
interval_template.h:27
interval_templatet::get_lower
const T & get_lower() const
Definition
interval_template.h:46
interval_templatet< ieee_float_valuet >::upper
ieee_float_valuet upper
Definition
interval_template.h:44
interval_templatet< ieee_float_valuet >::upper_set
bool upper_set
Definition
interval_template.h:43
interval_templatet::join
void join(const interval_templatet< T > &i)
Definition
interval_template.h:106
interval_templatet::make_ge_than
void make_ge_than(const T &v)
Definition
interval_template.h:91
interval_templatet::empty
bool empty() const
Definition
interval_template.h:56
interval_templatet::make_less_than
void make_less_than(interval_templatet &i)
Definition
interval_template.h:161
interval_templatet::meet
void meet(const interval_templatet< T > &i)
Definition
interval_template.h:112
interval_templatet::is_bottom
bool is_bottom() const
Definition
interval_template.h:61
interval_templatet::interval_templatet
interval_templatet(const T &l, const T &u)
Definition
interval_template.h:35
interval_templatet::approx_union_with
void approx_union_with(const interval_templatet &i)
Definition
interval_template.h:193
interval_templatet::intersect_with
void intersect_with(const interval_templatet &i)
Definition
interval_template.h:117
interval_templatet::get_upper
const T & get_upper() const
Definition
interval_template.h:51
interval_templatet::make_less_than_eq
void make_less_than_eq(interval_templatet &i)
Definition
interval_template.h:153
interval_templatet::singleton
bool singleton() const
Definition
interval_template.h:71
tvt
Definition
threeval.h:20
tvt::unknown
static tvt unknown()
Definition
threeval.h:33
lower_interval
interval_templatet< T > lower_interval(const T &l)
Definition
interval_template.h:286
operator<=
tvt operator<=(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition
interval_template.h:219
operator>
tvt operator>(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition
interval_template.h:245
operator<<
std::ostream & operator<<(std::ostream &out, const interval_templatet< T > &i)
Definition
interval_template.h:295
operator==
bool operator==(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition
interval_template.h:251
upper_interval
interval_templatet< T > upper_interval(const T &u)
Definition
interval_template.h:277
operator!=
bool operator!=(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition
interval_template.h:271
operator<
tvt operator<(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition
interval_template.h:239
operator>=
tvt operator>=(const interval_templatet< T > &a, const interval_templatet< T > &b)
Definition
interval_template.h:233
threeval.h
util
interval_template.h
Generated by
1.17.0