Pakman
ABCRejectionController.cc
1 #include <string>
2 #include <iostream>
3 #include <sstream>
4 #include <stdexcept>
5 
6 #include <assert.h>
7 
8 #include "spdlog/spdlog.h"
9 
10 #include "core/common.h"
11 #include "core/OutputStreamHandler.h"
12 #include "interface/protocols.h"
13 #include "interface/output.h"
14 #include "master/AbstractMaster.h"
15 
16 #include "ABCRejectionController.h"
17 
18 // Constructor
20  m_number_accept(input_obj.number_accept),
21  m_epsilon(input_obj.epsilon),
22  m_prior_sampler(input_obj.prior_sampler),
23  m_parameter_names(input_obj.parameter_names),
24  m_simulator(input_obj.simulator)
25 {
26 }
27 
28 // Iterate function
30 {
31  // This function should never be called recursively
32  assert(!m_entered);
33  m_entered = true;
34 
35  // Check if there are any new accepted parameters
36  while (!m_p_master->finishedTasksEmpty()
37  && m_prmtr_accepted.size() < m_number_accept)
38  {
39  // Increment counter
40  m_number_simulated++;
41 
42  // Get reference to front finished task
43  TaskHandler& task = m_p_master->frontFinishedTask();
44 
45  // Check if error occured
46  if (!task.didErrorOccur())
47  {
48  // Check if parameter was accepted
50  {
51  // Declare raw parameter
52  std::string raw_parameter;
53 
54  // Get input string
55  std::stringstream input_sstrm(task.getInputString());
56 
57  // Discard epsilon
58  std::getline(input_sstrm, raw_parameter);
59 
60  // Read accepted parameter
61  std::getline(input_sstrm, raw_parameter);
62 
63  // Push accepted parameter
64  m_prmtr_accepted.push_back(std::move(raw_parameter));
65  }
66  }
67  // If error occurred, check if g_ignore_errors is set
68  else if (!g_ignore_errors)
69  {
70  std::runtime_error e("Task finished with error!");
71  throw e;
72  }
73 
74  // Pop finished task
75  m_p_master->popFinishedTask();
76  }
77 
78  // If enough parameters have been accepted, print them and terminate Master
79  // and Managers.
80  if (m_prmtr_accepted.size() == m_number_accept)
81  {
82  // Print message
83  spdlog::info("Accepted/simulated: {}/{} ({:5.2f}%)",
84  m_number_accept, m_number_simulated, (100.0 * m_number_accept /
85  (double) m_number_simulated));
86 
87  // Print accepted parameters
89  m_parameter_names, m_prmtr_accepted);
90 
91  // Terminate Master
92  m_p_master->terminate();
93  m_entered = false;
94  return;
95  }
96 
97  // There is still work to be done, so make sure there are as many tasks
98  // queued as there are Managers
99  while (m_p_master->needMorePendingTasks())
100  m_p_master->pushPendingTask(format_simulator_input(m_epsilon.str(),
101  sample_from_prior(m_prior_sampler)));
102 
103  m_entered = false;
104 }
105 
107 {
108  return m_simulator;
109 }
const std::string & str() const
Definition: LineString.cc:45
std::string format_simulator_input(const Epsilon &epsilon, const Parameter &parameter)
Definition: protocols.cc:11
std::string getOutputString() const
Definition: TaskHandler.cc:53
virtual Command getSimulator() const override
Parameter sample_from_prior(const Command &prior_sampler)
Definition: protocols.cc:294
virtual void iterate() override
static OutputStreamHandler * instance()
void write_parameters(std::ostream &ostrm, const std::vector< ParameterName > &parameter_names, const std::vector< Parameter > &parameters)
Definition: output.cc:11
std::string getInputString() const
Definition: TaskHandler.cc:46
bool didErrorOccur() const
Definition: TaskHandler.cc:37
std::shared_ptr< AbstractMaster > m_p_master
bool g_ignore_errors
Definition: main.cc:28
bool parse_simulator_output(const std::string &simulator_output)
Definition: protocols.cc:24
ABCRejectionController(const Input &input_obj)