14 template<
typename VirtualMachineState_t>
20 out.
addmass(vms.get_output(), vms.lp);
23 assert(
false &&
"*** You should not be computing marginal outcomes with VMS states that didn't complete.");
41 template<
typename VirtualMachineState_t>
51 struct compare_VirtualMachineState_t_prt {
52 bool operator()(
const VirtualMachineState_t* lhs,
const VirtualMachineState_t* rhs) {
return lhs->lp < rhs->lp; }
57 typedef typename VirtualMachineState_t::output_t
output_t;
58 typedef typename VirtualMachineState_t::input_t
input_t;
66 std::priority_queue<VirtualMachineState_t*, std::vector<VirtualMachineState_t*>, VirtualMachinePool::compare_VirtualMachineState_t_prt>
Q;
81 while(not Q.empty()) {
82 VirtualMachineState_t* vms = Q.top(); Q.pop();
99 (Q.size() + total_vms_steps <= MAX_STEPS or lp >
worst_lp);
106 void push(VirtualMachineState_t* o) {
109 worst_lp = std::min(worst_lp, o->lp);
127 auto s =
new VirtualMachineState_t(*x);
128 s->template push<T>(v);
147 s->template push<T>(v);
170 VirtualMachineState_t* vms = Q.top(); Q.pop();
174 assert(vms->lp >=
MIN_LP);
183 total_instruction_count += vms->runtime_counter.total;
188 total_instruction_count += vms->runtime_counter.total;
210 std::vector<VirtualMachineState_t>
run_vms() {
212 std::vector<VirtualMachineState_t> out;
215 while(total_vms_steps <
MAX_STEPS && !Q.empty()) {
217 VirtualMachineState_t* vms = Q.top(); Q.pop();
219 assert(vms->lp >=
MIN_LP);
227 total_instruction_count += vms->runtime_counter.total;
231 total_instruction_count += vms->runtime_counter.total;
static unsigned long MAX_STEPS
Definition: VirtualMachineControl.h:30
Definition: VirtualMachineControl.h:13
void push(VirtualMachineState_t *o)
Add the VirtualMachineState_t o to this pool (but again checking if I'd add)
Definition: VirtualMachinePool.h:106
VirtualMachinePool()
Definition: VirtualMachinePool.h:69
DiscreteDistribution< output_t > run()
This runs and adds up the probability mass for everything, returning a dictionary outcomes->log_proba...
Definition: VirtualMachinePool.h:163
std::priority_queue< VirtualMachineState_t *, std::vector< VirtualMachineState_t * >, VirtualMachinePool::compare_VirtualMachineState_t_prt > Q
Definition: VirtualMachinePool.h:66
virtual void clear()
Remove everything and reset my values.
Definition: VirtualMachinePool.h:80
Definition: DiscreteDistribution.h:25
static double MIN_LP
Definition: VirtualMachineControl.h:36
static unsigned long MAX_OUTPUTS
Definition: VirtualMachineControl.h:33
bool copy_increment_push(const VirtualMachineState_t *x, T v, double lpinc)
This is an important opimization where we will make a copy of x, push v into it's stack...
Definition: VirtualMachinePool.h:124
constexpr double infinity
Definition: Numerics.h:20
void addmass(T x, double v)
Definition: DiscreteDistribution.h:91
unsigned long total_vms_steps
Definition: VirtualMachinePool.h:62
bool increment_push(VirtualMachineState_t *s, T v, double lpinc)
Same as copy_increment_push, but does not make a copy – just add.
Definition: VirtualMachinePool.h:144
std::vector< VirtualMachineState_t > run_vms()
Run but return a vector of completed virtual machines instead of marginalizing outputs. You might want this if you needed to separate execution paths, or wanted to access runtime counts. This also can get joint distributions on outputs by running a VirtualMachineState multiple times.
Definition: VirtualMachinePool.h:210
VirtualMachineState_t::output_t output_t
Definition: VirtualMachinePool.h:57
This stores a distribution from values of T to log probabilities. It is used as the return value from...
bool wouldIadd(double lp)
Returns true if I would add something with this lp, given my MAX_STEPS and the stack. This lets us speed up by checking if we would add before copying/constructing a VMS.
Definition: VirtualMachinePool.h:95
unsigned long total_instruction_count
Definition: VirtualMachinePool.h:64
size_t size() const
Definition: DiscreteDistribution.h:202
double worst_lp
Definition: VirtualMachinePool.h:63
virtual ~VirtualMachinePool()
Definition: VirtualMachinePool.h:73
DiscreteDistribution< typename VirtualMachineState_t::output_t > marginal_vms_output(std::vector< VirtualMachineState_t > &v)
Compute the marginal output of a collection of VirtualMachineStates (as we might get from run_vms) ...
Definition: VirtualMachinePool.h:15
VirtualMachineState_t::input_t input_t
Definition: VirtualMachinePool.h:58
Definition: VirtualMachinePool.h:42