Skip to content

Commit 1fbcbf5

Browse files
Merge pull request diffblue#227 from hannes-steffenhagen-diffblue/feature-domain_summary-flag-rebase-rebase
Feature domain summary flag
2 parents c6ec14f + 0844ad7 commit 1fbcbf5

9 files changed

+172
-69
lines changed

src/analyses/ai.cpp

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ bool ai_baset::visit(
369369
const code_function_callt &code=
370370
to_code_function_call(l->code);
371371

372-
if(periodic_task)
372+
if(config.periodic_task)
373373
{
374374
goto_functionst::function_mapt::const_iterator f_it =
375375
goto_functions.function_map.find(goto_functionst::entry_point());
@@ -515,15 +515,15 @@ bool ai_baset::do_function_call(
515515
progress_data.max_stack_depth
516516
= std::max(progress_data.max_stack_depth, progress_data.stack.size());
517517

518-
print_progress_interval();
518+
print_progress_interval(ns);
519519

520520
fixedpoint(goto_function.body, goto_functions, ns);
521521

522522
progress_data.functions_returned.insert(id);
523523
progress_data.num_functions_returned++;
524524
progress_data.stack.pop_front();
525525

526-
print_progress_interval();
526+
print_progress_interval(ns);
527527
}
528528
}
529529

@@ -756,19 +756,59 @@ void ai_baset::print_progress() const
756756
progress() << std::flush;
757757
}
758758

759-
void ai_baset::print_progress_interval() const
759+
void ai_baset::print_progress_interval(const namespacet &ns) const
760760
{
761761
using namespace std::chrono;
762762

763763
system_clock::time_point now = system_clock::now();
764764
auto diff = now - last_progress_output;
765-
766-
if(diff >= min_progress_interval)
765+
if(diff >= config.progress_interval)
767766
{
768-
print_progress();
769767
last_progress_output = now;
768+
if(config.print_progress)
769+
{
770+
print_progress();
771+
}
772+
if(config.print_memory_usage)
773+
{
774+
print_memory_usage(ns);
775+
}
776+
}
777+
}
778+
779+
void ai_baset::print_memory_usage(const namespacet &ns) const
780+
{
781+
}
782+
783+
ai_configt ai_configt::from_options(const optionst &options)
784+
{
785+
ai_configt result = {};
786+
result.print_progress = options.get_bool_option("vs-progress");
787+
if(options.is_set("vs-progress-interval"))
788+
{
789+
result.progress_interval = ai_configt::secondst(
790+
std::stof(options.get_option("vs-progress-interval")));
770791
}
792+
result.print_memory_usage =
793+
options.get_bool_option("vs-progress-memory-usage");
794+
return result;
795+
}
796+
797+
ai_configt &ai_configt::with_print_progress(bool print_progress)
798+
{
799+
this->print_progress = print_progress;
800+
return *this;
771801
}
772802

773-
ai_baset::null_streamt ai_baset::null_stream;
774-
std::ostream ai_baset::null_output_stream(&ai_baset::null_stream);
803+
ai_configt &
804+
ai_configt::with_progress_interval(ai_configt::secondst progress_interval)
805+
{
806+
this->progress_interval = progress_interval;
807+
return *this;
808+
}
809+
810+
ai_configt &ai_configt::with_periodic_task(bool periodic_task)
811+
{
812+
this->periodic_task = periodic_task;
813+
return *this;
814+
}

src/analyses/ai.h

Lines changed: 50 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Author: Daniel Kroening, [email protected]
2626
#include <util/make_unique.h>
2727

2828
#include <goto-programs/goto_model.h>
29+
#include <util/options.h>
2930

3031
// forward reference
3132
class ai_baset;
@@ -139,6 +140,21 @@ class ai_domain_baset
139140

140141
};
141142

143+
struct ai_configt
144+
{
145+
using secondst = std::chrono::duration<float>;
146+
bool print_progress = false;
147+
bool print_memory_usage = false;
148+
149+
secondst progress_interval = secondst(0.0f);
150+
bool periodic_task = false;
151+
152+
ai_configt &with_print_progress(bool print_progress);
153+
ai_configt &with_progress_interval(secondst progress_interval);
154+
ai_configt &with_periodic_task(bool periodic_task);
155+
static ai_configt from_options(const optionst &);
156+
};
157+
142158
// don't use me -- I am just a base class
143159
// use ait instead
144160
class ai_baset
@@ -147,14 +163,9 @@ class ai_baset
147163
typedef ai_domain_baset statet;
148164
typedef goto_programt::const_targett locationt;
149165

150-
ai_baset(
151-
const bool print_progress,
152-
const float min_progress_interval,
153-
const bool periodic_task) :
154-
progress_output_stream(print_progress ? std::cout : null_output_stream),
155-
min_progress_interval(min_progress_interval),
156-
periodic_task(periodic_task)
166+
ai_baset(ai_configt config) : config(config)
157167
{
168+
last_progress_output = std::chrono::system_clock::now();
158169
}
159170

160171
virtual ~ai_baset()
@@ -298,20 +309,12 @@ class ai_baset
298309
return output_xml(ns, goto_function.body, "");
299310
}
300311

301-
private:
302-
class null_streamt : public std::streambuf {};
303-
304-
static null_streamt null_stream;
305-
static std::ostream null_output_stream;
306-
307-
std::ostream &progress_output_stream;
308-
309312
protected:
310313
// we do not use the existing error(), progress(), etc. streams as we want to
311314
// be able to print progress output just for the ai framework
312315
std::ostream &progress() const
313316
{
314-
return progress_output_stream;
317+
return std::clog;
315318
}
316319

317320
// we collect progress data irrespective of whether printing progress data is
@@ -344,15 +347,11 @@ class ai_baset
344347

345348
void print_progress() const;
346349

347-
const std::chrono::duration<float> min_progress_interval;
348-
349-
// default-constructed time points have the epoch as value
350350
mutable std::chrono::system_clock::time_point last_progress_output;
351351

352-
void print_progress_interval() const;
353-
354-
bool periodic_task;
352+
void print_progress_interval(const namespacet &ns) const;
355353

354+
const ai_configt config;
356355
// overload to add a factory
357356
virtual void initialize(const goto_programt &);
358357
virtual void initialize(const goto_functionst::goto_functiont &);
@@ -447,6 +446,19 @@ class ai_baset
447446
virtual statet &get_state(locationt l)=0;
448447
virtual const statet &find_state(locationt l) const=0;
449448
virtual std::unique_ptr<statet> make_temporary_state(const statet &s)=0;
449+
450+
virtual void print_memory_usage(const namespacet &ns) const;
451+
};
452+
453+
template <typename domainT>
454+
struct get_domain_statisticst
455+
{
456+
void add_entry(const domainT &domain, const namespacet &ns)
457+
{
458+
}
459+
void print(std::ostream &out) const
460+
{
461+
}
450462
};
451463

452464
// domainT is expected to be derived from ai_domain_baseT
@@ -455,11 +467,11 @@ class ait:public ai_baset
455467
{
456468
public:
457469
// constructor
458-
ait(
459-
const bool print_progress = false,
460-
const float min_progress_interval = 0,
461-
const bool periodic_task = false) :
462-
ai_baset(print_progress, min_progress_interval, periodic_task)
470+
ait(ai_configt config) : ai_baset(config)
471+
{
472+
}
473+
474+
ait() : ai_baset(ai_configt{})
463475
{
464476
}
465477

@@ -548,6 +560,16 @@ class ait:public ai_baset
548560
sequential_fixedpoint(goto_functions, ns);
549561
}
550562

563+
void print_memory_usage(const namespacet &ns) const override
564+
{
565+
get_domain_statisticst<domainT> statistics;
566+
for(auto const &state_entry : state_map)
567+
{
568+
statistics.add_entry(state_entry.second, ns);
569+
}
570+
statistics.print(progress());
571+
}
572+
551573
private:
552574
// to enforce that domainT is derived from ai_domain_baset
553575
void dummy(const domainT &s) { const statet &x=s; (void)x; }
@@ -570,11 +592,7 @@ class concurrency_aware_ait:public ait<domainT>
570592
typedef typename ait<domainT>::statet statet;
571593

572594
// constructor
573-
concurrency_aware_ait(
574-
const bool print_progress = false,
575-
const float min_progress_interval = 0,
576-
const bool periodic_task = false):
577-
ait<domainT>(print_progress, min_progress_interval, periodic_task)
595+
concurrency_aware_ait(const ai_configt &config) : ait<domainT>(config)
578596
{
579597
}
580598

src/analyses/dependence_graph.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ class dependence_grapht:
229229
explicit dependence_grapht(
230230
const goto_functionst &goto_functions,
231231
const namespacet &_ns,
232-
bool periodic_task = false):
233-
ait(false, 0, periodic_task),
232+
bool periodic_task = false)
233+
: ait(ai_configt{}.with_periodic_task(periodic_task)),
234234
goto_functions(goto_functions),
235235
ns(_ns),
236236
rd(ns, goto_functions, periodic_task)

src/analyses/reaching_definitions.h

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -273,16 +273,14 @@ class reaching_definitions_analysist:
273273
explicit reaching_definitions_analysist(
274274
const namespacet &_ns,
275275
const goto_functionst &goto_functions,
276-
const bool periodic_task = false):
277-
concurrency_aware_ait<rd_range_domaint>(
278-
false,
279-
0,
280-
periodic_task),
281-
ns(_ns),
282-
goto_functions(goto_functions),
283-
value_sets(nullptr),
284-
is_threaded(nullptr),
285-
is_dirty(nullptr)
276+
const bool periodic_task = false)
277+
: concurrency_aware_ait<rd_range_domaint>(
278+
ai_configt{}.with_periodic_task(periodic_task)),
279+
ns(_ns),
280+
goto_functions(goto_functions),
281+
value_sets(nullptr),
282+
is_threaded(nullptr),
283+
is_dirty(nullptr)
286284
{
287285
}
288286

src/analyses/variable-sensitivity/variable_sensitivity_dependence_graph.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,8 @@ class variable_sensitivity_dependence_grapht:
168168
explicit variable_sensitivity_dependence_grapht(
169169
const goto_functionst &goto_functions,
170170
const namespacet &_ns,
171-
const bool print_progress = false,
172-
const float min_progress_interval = 0):
173-
ait<variable_sensitivity_dependence_domaint>(print_progress, min_progress_interval),
171+
const ai_configt &config = {})
172+
: ait<variable_sensitivity_dependence_domaint>(config),
174173
goto_functions(goto_functions),
175174
ns(_ns)
176175
{

src/analyses/variable-sensitivity/variable_sensitivity_domain.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,3 +592,8 @@ void variable_sensitivity_domaint::apply_domain(
592592
abstract_state.assign(symbol, value, ns);
593593
}
594594
}
595+
abstract_object_statisticst
596+
variable_sensitivity_domaint::gather_statistics(const namespacet &ns) const
597+
{
598+
return abstract_state.gather_statistics(ns);
599+
}

src/analyses/variable-sensitivity/variable_sensitivity_domain.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,49 @@ class variable_sensitivity_domaint:public ai_domain_baset
137137
const namespacet &ns);
138138

139139
abstract_environmentt abstract_state;
140+
141+
public:
142+
abstract_object_statisticst gather_statistics(const namespacet &ns) const;
143+
};
144+
145+
template <>
146+
struct get_domain_statisticst<variable_sensitivity_domaint>
147+
{
148+
abstract_object_statisticst total_statistics = {};
149+
void
150+
add_entry(const variable_sensitivity_domaint &domain, const namespacet &ns)
151+
{
152+
auto statistics = domain.gather_statistics(ns);
153+
total_statistics.number_of_interval_abstract_objects +=
154+
statistics.number_of_interval_abstract_objects;
155+
total_statistics.number_of_globals += statistics.number_of_globals;
156+
total_statistics.number_of_single_value_intervals +=
157+
statistics.number_of_single_value_intervals;
158+
total_statistics.number_of_constants += statistics.number_of_constants;
159+
total_statistics.number_of_pointers += statistics.number_of_constants;
160+
total_statistics.number_of_arrays += statistics.number_of_arrays;
161+
total_statistics.number_of_structs += statistics.number_of_arrays;
162+
total_statistics.objects_memory_usage += statistics.objects_memory_usage;
163+
}
164+
165+
void print(std::ostream &out) const
166+
{
167+
out << "<< Begin Variable Sensitivity Domain Statistics >>\n"
168+
<< " Memory Usage: "
169+
<< total_statistics.objects_memory_usage.to_string() << '\n'
170+
<< " Number of structs: " << total_statistics.number_of_structs << '\n'
171+
<< " Number of arrays: " << total_statistics.number_of_arrays << '\n'
172+
<< " Number of pointers: " << total_statistics.number_of_pointers
173+
<< '\n'
174+
<< " Number of constants: " << total_statistics.number_of_constants
175+
<< '\n'
176+
<< " Number of intervals: "
177+
<< total_statistics.number_of_interval_abstract_objects << '\n'
178+
<< " Number of single value intervals: "
179+
<< total_statistics.number_of_single_value_intervals << '\n'
180+
<< " Number of globals: " << total_statistics.number_of_globals << '\n'
181+
<< "<< End Variable Sensitivity Domain Statistics >>\n";
182+
}
140183
};
141184

142185
#endif // CPROVER_ANALYSES_VARIABLE_SENSITIVITY_VARIABLE_SENSITIVITY_DOMAIN_H

0 commit comments

Comments
 (0)