Skip to content

Commit e0e1c33

Browse files
Move ai configuration to separate config object
This lets us reuse the logic of getting the ait configuration from command line options. Also, this includes a small simplification of the printing logic
1 parent e468915 commit e0e1c33

File tree

6 files changed

+72
-60
lines changed

6 files changed

+72
-60
lines changed

src/analyses/ai.cpp

Lines changed: 32 additions & 4 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());
@@ -763,12 +763,40 @@ void ai_baset::print_progress_interval() const
763763
system_clock::time_point now = system_clock::now();
764764
auto diff = now - last_progress_output;
765765

766-
if(diff >= min_progress_interval)
766+
if(config.print_progress && diff >= config.progress_interval)
767767
{
768768
print_progress();
769769
last_progress_output = now;
770770
}
771771
}
772772

773-
ai_baset::null_streamt ai_baset::null_stream;
774-
std::ostream ai_baset::null_output_stream(&ai_baset::null_stream);
773+
ai_configt ai_configt::from_options(const optionst &options)
774+
{
775+
ai_configt result = {};
776+
result.print_progress = options.get_bool_option("vs-progress");
777+
if(options.is_set("vs-progress-interval"))
778+
{
779+
result.progress_interval = ai_configt::secondst(
780+
std::stof(options.get_option("vs-progress-interval")));
781+
}
782+
return result;
783+
}
784+
785+
ai_configt &ai_configt::with_print_progress(bool print_progress)
786+
{
787+
this->print_progress = print_progress;
788+
return *this;
789+
}
790+
791+
ai_configt &
792+
ai_configt::with_progress_interval(ai_configt::secondst progress_interval)
793+
{
794+
this->progress_interval = progress_interval;
795+
return *this;
796+
}
797+
798+
ai_configt &ai_configt::with_periodic_task(bool periodic_task)
799+
{
800+
this->periodic_task = periodic_task;
801+
return *this;
802+
}

src/analyses/ai.h

Lines changed: 24 additions & 31 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,19 @@ 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+
secondst progress_interval = secondst(0.0f);
148+
bool periodic_task = false;
149+
150+
ai_configt &with_print_progress(bool print_progress);
151+
ai_configt &with_progress_interval(secondst progress_interval);
152+
ai_configt &with_periodic_task(bool periodic_task);
153+
static ai_configt from_options(const optionst &);
154+
};
155+
142156
// don't use me -- I am just a base class
143157
// use ait instead
144158
class ai_baset
@@ -147,14 +161,9 @@ class ai_baset
147161
typedef ai_domain_baset statet;
148162
typedef goto_programt::const_targett locationt;
149163

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)
164+
ai_baset(ai_configt config) : config(config)
157165
{
166+
last_progress_output = std::chrono::system_clock::now();
158167
}
159168

160169
virtual ~ai_baset()
@@ -298,20 +307,12 @@ class ai_baset
298307
return output_xml(ns, goto_function.body, "");
299308
}
300309

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-
309310
protected:
310311
// we do not use the existing error(), progress(), etc. streams as we want to
311312
// be able to print progress output just for the ai framework
312313
std::ostream &progress() const
313314
{
314-
return progress_output_stream;
315+
return std::clog;
315316
}
316317

317318
// we collect progress data irrespective of whether printing progress data is
@@ -344,15 +345,11 @@ class ai_baset
344345

345346
void print_progress() const;
346347

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

352350
void print_progress_interval() const;
353351

354-
bool periodic_task;
355-
352+
const ai_configt config;
356353
// overload to add a factory
357354
virtual void initialize(const goto_programt &);
358355
virtual void initialize(const goto_functionst::goto_functiont &);
@@ -455,11 +452,11 @@ class ait:public ai_baset
455452
{
456453
public:
457454
// 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)
455+
ait(ai_configt config) : ai_baset(config)
456+
{
457+
}
458+
459+
ait() : ai_baset(ai_configt{})
463460
{
464461
}
465462

@@ -570,11 +567,7 @@ class concurrency_aware_ait:public ait<domainT>
570567
typedef typename ait<domainT>::statet statet;
571568

572569
// 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)
570+
concurrency_aware_ait(const ai_configt &config) : ait<domainT>(config)
578571
{
579572
}
580573

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/goto-analyzer/goto_analyzer_parse_options.cpp

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -407,19 +407,13 @@ ai_baset *goto_analyzer_parse_optionst::build_analyzer(
407407
#endif
408408
else if(options.get_bool_option("variable-sensitivity"))
409409
{
410-
domain=new ait<variable_sensitivity_domaint>(
411-
options.get_bool_option("vs-progress"),
412-
options.is_set("vs-progress-interval") ?
413-
std::stof(options.get_option("vs-progress-interval")) : 0);
410+
domain = new ait<variable_sensitivity_domaint>(
411+
ai_configt::from_options(options));
414412
}
415413
else if(options.get_bool_option("dependence-graph-vs"))
416414
{
417-
domain=new variable_sensitivity_dependence_grapht(
418-
goto_model.goto_functions,
419-
ns,
420-
options.get_bool_option("vs-progress"),
421-
options.is_set("vs-progress-interval") ?
422-
std::stof(options.get_option("vs-progress-interval")) : 0);
415+
domain = new variable_sensitivity_dependence_grapht(
416+
goto_model.goto_functions, ns, ai_configt::from_options(options));
423417
}
424418
}
425419
else if(options.get_bool_option("concurrent"))

0 commit comments

Comments
 (0)