simulator<ControlModel, ObservationModel, Controller, Sensor> ::simulator (boost::program_options::variables_map& options, unsigned int seed, const typename ControlModel::builder& control_model_builder, const typename ObservationModel::builder& observation_model_builder, Controller& controller, const Sensor& sensor) { const unsigned int sensor_skip = options["sensor-skip"].as<unsigned int>(); const double dt = options["dt"].as<double>(); random_source random (seed); { auto& map = this->get_feature_map(); for (size_t i = 0; i < sensor.num_features(); ++i) { map.emplace_hint (map.end(), i, sensor.get_feature(i)); } } this->set_initial_state (controller.initial_state()); state_type state; auto current_state = [&]() { return this->get_initial_state() + state; }; auto sense = [&]() { using namespace std::placeholders; sensor.template sense<ObservationModel> (observation_model_builder, random, current_state(), std::bind (&simulator::add_observation_now, this, _1, _2)); }; sense(); while (!controller.finished()) { const auto control = controller.template control<ControlModel> (current_state(), dt); this->add_control (dt, control); state += control_model_builder(control, dt).proposal()(random); this->get_trajectory().push_back_accumulated (state); if (this->current_timestep() % sensor_skip == 0) sense(); } }