32 #include <boost/optional.hpp>
48 #include "utility/command.hpp"
62 uint64_t
step()
const override {
return step_; }
80 return static_cast<double>(
step_width().count()) /
static_cast<double>(cycle_time_.count());
119 double realtime_factor_{1.0};
128 using TimePoint = std::chrono::steady_clock::time_point;
131 std::string stage{
""};
132 std::string message{
"initializing engine"};
135 size_t initialization_n;
136 size_t initialization_k;
142 double report_granularity_p{0.1};
144 double execution_report_p;
145 TimePoint execution_report_t;
148 void init_begin(
size_t n) {
149 message =
"initializing";
150 initialization.
begin();
151 initialization_n = n;
152 initialization_k = 0;
155 void init(
const std::string& what) {
157 message =
"initializing " + what;
159 double p =
static_cast<double>(initialization_k) /
static_cast<double>(initialization_n);
165 assert(initialization_k == initialization_n);
166 initialization.
end();
168 message =
"initialization done";
171 bool is_init_ended()
const {
return initialization.
is_ended(); }
174 if (is_init_ended()) {
177 return initialization.
elapsed();
182 stage =
"simulation";
183 message =
"executing simulation";
184 execution_report_p = 0;
185 execution_report_t = std::chrono::steady_clock::now();
189 void exec_update(
double p) { execution.
update_safe(p); }
193 double now_d =
static_cast<double>(now.count());
194 double eta_d =
static_cast<double>(execution_eta.count());
195 exec_update(now_d / eta_d);
201 message =
"simulation done";
205 bool is_exec_ended()
const {
return execution.
is_ended(); }
214 if (execution_report_p == 1.0) {
224 auto now = std::chrono::steady_clock::now();
227 execution_report_p = 1.0;
228 execution_report_t = now;
230 }
else if (execution.
percent() - execution_report_p > report_granularity_p) {
232 execution_report_p = execution.
percent();
233 execution_report_t = now;
235 }
else if (cast_duration(now - execution_report_t) > report_granularity_d) {
237 execution_report_p = execution.
percent();
238 execution_report_t = now;
247 {
"message", p.message},
248 {
"initialization", p.initialization},
251 j[
"execution"] = p.execution;
253 j[
"execution"] =
nullptr;
267 engine_time_ms.
reset();
268 cycle_time_ms.
reset();
269 simulator_time_ms.
reset();
270 controller_time_ms.
reset();
271 padding_time_ms.
reset();
272 controller_retries.
reset();
277 {
"engine_time_ms", s.engine_time_ms}, {
"simulator_time_ms", s.simulator_time_ms},
278 {
"controller_time_ms", s.controller_time_ms}, {
"padding_time_ms", s.padding_time_ms},
279 {
"cycle_time_ms", s.cycle_time_ms}, {
"controller_retries", s.controller_retries},
299 #define EXIT_OUTCOME_SUCCESS EXIT_SUCCESS
300 #define EXIT_OUTCOME_UNKNOWN EXIT_FAILURE
301 #define EXIT_OUTCOME_NOSTART 4
302 #define EXIT_OUTCOME_STOPPED 8
303 #define EXIT_OUTCOME_FAILURE 9
304 #define EXIT_OUTCOME_ABORTED 16
308 {SimulationOutcome::Aborted,
"aborted"},
309 {SimulationOutcome::NoStart,
"no-start"},
310 {SimulationOutcome::Failure,
"failure"},
311 {SimulationOutcome::Success,
"success"},
312 {SimulationOutcome::Stopped,
"stopped"},
336 std::unique_ptr<Server> server;
337 std::shared_ptr<Coordinator> coordinator;
338 std::shared_ptr<Registrar> registrar;
339 std::unique_ptr<CommandExecuter> commander;
344 bool report_progress{
false};
351 std::map<std::string, std::unique_ptr<cloe::Simulator>> simulators;
352 std::map<std::string, std::shared_ptr<cloe::Vehicle>> vehicles;
353 std::map<std::string, std::unique_ptr<cloe::Controller>> controllers;
354 boost::optional<SimulationOutcome> outcome;
356 bool pause_execution{
false};
359 std::shared_ptr<events::LoopCallback> callback_loop;
360 std::shared_ptr<events::PauseCallback> callback_pause;
361 std::shared_ptr<events::ResumeCallback> callback_resume;
362 std::shared_ptr<events::StartCallback> callback_start;
363 std::shared_ptr<events::StopCallback> callback_stop;
364 std::shared_ptr<events::SuccessCallback> callback_success;
365 std::shared_ptr<events::FailureCallback> callback_failure;
366 std::shared_ptr<events::ResetCallback> callback_reset;
367 std::shared_ptr<events::TimeCallback> callback_time;
370 std::string version()
const;
372 std::shared_ptr<cloe::Registrar> simulation_registrar();
374 std::vector<std::string> model_ids()
const;
375 std::vector<std::string> simulator_ids()
const;
376 std::vector<std::string> controller_ids()
const;
377 std::vector<std::string> vehicle_ids()
const;
378 std::vector<std::string> plugin_ids()
const;
380 bool foreach_model(std::function<
bool(
cloe::Model&,
const char* type)> f);
381 bool foreach_model(std::function<
bool(
const cloe::Model&,
const char* type)> f)
const;
383 bool foreach_simulator(std::function<
bool(
const cloe::Simulator&)> f)
const;
385 bool foreach_controller(std::function<
bool(
const cloe::Controller&)> f)
const;
387 bool foreach_vehicle(std::function<
bool(
const cloe::Vehicle&)> f)
const;
Definition: controller.hpp:126
Definition: model.hpp:203
Definition: simulator.hpp:139
Definition: stack.hpp:901
Definition: vehicle.hpp:106
Definition: statistics.hpp:110
void reset()
Definition: statistics.hpp:119
Definition: progress.hpp:35
void update_safe(double p)
Definition: progress.hpp:94
double percent() const
Definition: progress.hpp:106
Duration elapsed() const
Definition: progress.hpp:116
void update(double p)
Definition: progress.hpp:73
void end()
Definition: progress.hpp:59
bool is_ended() const
Definition: progress.hpp:68
void begin()
Definition: progress.hpp:50
Definition: simulation_context.hpp:127
bool exec_report()
Definition: simulation_context.hpp:212
Definition: simulation_context.hpp:57
double realtime_factor() const override
Definition: simulation_context.hpp:73
double achievable_realtime_factor() const override
Definition: simulation_context.hpp:79
cloe::Duration step_width() const override
Definition: simulation_context.hpp:63
cloe::Duration time() const override
Definition: simulation_context.hpp:64
cloe::Duration eta() const override
Definition: simulation_context.hpp:65
void increment_step()
Definition: simulation_context.hpp:91
void set_realtime_factor(double s)
Definition: simulation_context.hpp:100
uint64_t step() const override
Definition: simulation_context.hpp:62
std::chrono::nanoseconds Duration
Definition: cloe_fwd.hpp:36
#define ENUM_SERIALIZATION(xType, xMap)
Definition: enum.hpp:51
#define DEFINE_NIL_EVENT(xName, xname, xdescription)
Definition: nil_event.hpp:57
SimulationOutcome
Definition: simulation_context.hpp:287
@ Success
Simulation explicitly concluded with success.
@ Aborted
Simulation aborted due to technical problems or interrupt.
@ Stopped
Simulation concluded, but without valuation.
@ Failure
Simulation explicitly concluded with failure.
@ NoStart
Simulation unable to start.
Definition: simulation_context.hpp:334
Definition: simulation_context.hpp:258