def forward(self): mu = self.marsaglia(self.prior_mean, self.prior_stddev) likelihood = Normal(mu, self.likelihood_stddev) pyprob.tag(mu, name='mu') pyprob.observe(likelihood, name='obs0') pyprob.observe(likelihood, name='obs1') return mu
def forward(self): uniform = Uniform(0, 1) val = pyprob.sample(uniform) val = pyprob.sample(uniform) val = pyprob.sample(uniform, control=False) val = pyprob.sample(uniform, control=False) val = pyprob.sample(uniform, control=False) pyprob.tag(value=val, name='val') pyprob.observe(uniform, 0.5) pyprob.observe(uniform, 0.5) pyprob.observe(uniform, 0.5) pyprob.observe(uniform, 0.5) return val
def marsaglia(self, mean, stddev): uniform = Uniform(-1, 1) s = 1 i = 0 while True: # x = pyprob.sample(uniform, replace=self.replace) # y = pyprob.sample(uniform, replace=self.replace) x = pyprob.sample(uniform) y = pyprob.sample(uniform) s = x * x + y * y i += 1 if float(s) < 1: pyprob.tag(x, name='x_accepted') pyprob.tag(y, name='y_accepted') pyprob.tag(s, name='s_accepted') break else: pyprob.tag(x, name='x_rejected') pyprob.tag(y, name='y_rejected') pyprob.tag(s, name='s_rejected') pyprob.tag(i, name='iterations') return mean + stddev * (x * torch.sqrt(-2 * torch.log(s) / s))