26
26
#include < util/make_unique.h>
27
27
28
28
#include < goto-programs/goto_model.h>
29
+ #include < util/options.h>
29
30
30
31
// forward reference
31
32
class ai_baset ;
@@ -139,6 +140,19 @@ class ai_domain_baset
139
140
140
141
};
141
142
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
+
142
156
// don't use me -- I am just a base class
143
157
// use ait instead
144
158
class ai_baset
@@ -147,14 +161,9 @@ class ai_baset
147
161
typedef ai_domain_baset statet;
148
162
typedef goto_programt::const_targett locationt;
149
163
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)
157
165
{
166
+ last_progress_output = std::chrono::system_clock::now ();
158
167
}
159
168
160
169
virtual ~ai_baset ()
@@ -298,20 +307,12 @@ class ai_baset
298
307
return output_xml (ns, goto_function.body , " " );
299
308
}
300
309
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
-
309
310
protected:
310
311
// we do not use the existing error(), progress(), etc. streams as we want to
311
312
// be able to print progress output just for the ai framework
312
313
std::ostream &progress () const
313
314
{
314
- return progress_output_stream ;
315
+ return std::clog ;
315
316
}
316
317
317
318
// we collect progress data irrespective of whether printing progress data is
@@ -344,15 +345,11 @@ class ai_baset
344
345
345
346
void print_progress () const ;
346
347
347
- const std::chrono::duration<float > min_progress_interval;
348
-
349
- // default-constructed time points have the epoch as value
350
348
mutable std::chrono::system_clock::time_point last_progress_output;
351
349
352
350
void print_progress_interval () const ;
353
351
354
- bool periodic_task;
355
-
352
+ const ai_configt config;
356
353
// overload to add a factory
357
354
virtual void initialize (const goto_programt &);
358
355
virtual void initialize (const goto_functionst::goto_functiont &);
@@ -455,11 +452,11 @@ class ait:public ai_baset
455
452
{
456
453
public:
457
454
// 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{} )
463
460
{
464
461
}
465
462
@@ -570,11 +567,7 @@ class concurrency_aware_ait:public ait<domainT>
570
567
typedef typename ait<domainT>::statet statet;
571
568
572
569
// 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)
578
571
{
579
572
}
580
573
0 commit comments