10 #include "spdlog/spdlog.h" 13 #include "core/OutputStreamHandler.h" 16 #include "master/AbstractMaster.h" 18 #include "smc_weight.h" 19 #include "sample_population.h" 21 #include "ABCSMCController.h" 25 m_epsilons(input_obj.epsilons),
26 m_parameter_names(input_obj.parameter_names),
27 m_population_size(input_obj.population_size),
28 m_simulator(input_obj.simulator),
29 m_prior_sampler(input_obj.prior_sampler),
30 m_prior_pdf(input_obj.prior_pdf),
31 m_perturber(input_obj.perturber),
32 m_perturbation_pdf(input_obj.perturbation_pdf),
33 m_generator(input_obj.seed),
34 m_distribution(0.0, 1.0),
35 m_prmtr_accepted_old(input_obj.population_size),
36 m_weights_old(input_obj.population_size)
50 spdlog::info(
"Computing generation {}, epsilon = {}", m_t,
51 m_epsilons[m_t].str());
57 assert(m_t < m_epsilons.size());
61 && m_prmtr_accepted_new.size() < m_population_size)
64 assert(!m_prior_pdf_pending.empty());
79 std::string raw_parameter;
85 std::getline(input_sstrm, raw_parameter);
88 std::getline(input_sstrm, raw_parameter);
91 m_prmtr_accepted_new.push_back(std::move(raw_parameter));
94 m_prior_pdf_accepted.push_back(m_prior_pdf_pending.front());
100 std::runtime_error e(
"Task finished with error!");
108 m_prior_pdf_pending.pop();
112 for (
int i = m_weights_new.size(); i < m_prmtr_accepted_new.size(); i++)
113 m_weights_new.push_back(smc_weight(
115 m_prior_pdf_accepted[i],
117 m_prmtr_accepted_old,
119 m_prmtr_accepted_new[i]));
125 if (m_prmtr_accepted_new.size() == m_population_size)
128 spdlog::info(
"Accepted/simulated: {}/{} ({:5.2f}%)",
129 m_population_size, m_number_simulated,
130 (100.0 * m_population_size / (
double) m_number_simulated));
131 m_number_simulated = 0;
137 if (m_t == m_epsilons.size())
141 m_parameter_names, m_prmtr_accepted_new);
150 std::swap(m_weights_old, m_weights_new);
151 std::swap(m_prmtr_accepted_old, m_prmtr_accepted_new);
154 m_weights_cumsum.resize(m_weights_old.size());
155 normalize(m_weights_old);
156 cumsum(m_weights_old, m_weights_cumsum);
159 m_weights_new.clear();
160 m_prmtr_accepted_new.clear();
161 m_prior_pdf_accepted.clear();
168 while (!m_prior_pdf_pending.empty())
169 m_prior_pdf_pending.pop();
172 spdlog::info(
"Computing generation {}, epsilon = {}", m_t,
173 m_epsilons[m_t].str());
182 m_epsilons[m_t].str(), sampleParameter()));
192 Parameter ABCSMCController::sampleParameter()
198 m_prior_pdf_pending.push(0.0);
207 double sampled_prior_pdf = 0.0;
211 int idx = sample_population(m_weights_cumsum, m_distribution,
213 Parameter source_parameter = m_prmtr_accepted_old[idx];
220 sampled_prior_pdf =
get_prior_pdf(m_prior_pdf, sampled_parameter);
221 }
while (sampled_prior_pdf == 0.0);
224 m_prior_pdf_pending.push(sampled_prior_pdf);
226 return sampled_parameter;
virtual Command getSimulator() const override
std::string format_simulator_input(const Epsilon &epsilon, const Parameter ¶meter)
std::string getOutputString() const
ABCSMCController(const Input &input_obj)
Parameter sample_from_prior(const Command &prior_sampler)
virtual void iterate() override
Parameter perturb_parameter(const Command &perturber, int t, Parameter source_parameter)
static OutputStreamHandler * instance()
void write_parameters(std::ostream &ostrm, const std::vector< ParameterName > ¶meter_names, const std::vector< Parameter > ¶meters)
std::string getInputString() const
double get_prior_pdf(const Command &prior_pdf, Parameter parameter)
bool didErrorOccur() const
std::shared_ptr< AbstractMaster > m_p_master
bool parse_simulator_output(const std::string &simulator_output)