def test_dist_empirical(self): values = Variable(util.Tensor([1, 2, 3])) log_weights = Variable(util.Tensor([1, 2, 3])) dist_mean_correct = 2.5752103328704834 dist_stddev_correct = 0.6514633893966675 dist_expectation_sin_correct = 0.3921678960323334 dist_map_sin_mean_correct = 0.3921678960323334 dist_min_correct = 1 dist_max_correct = 3 # dist_sample_shape_correct = [] dist = Empirical(values, log_weights) dist_empirical = Empirical([dist.sample() for i in range(empirical_samples)]) dist_mean = float(dist.mean) dist_mean_empirical = float(dist_empirical.mean) dist_stddev = float(dist.stddev) dist_stddev_empirical = float(dist_empirical.stddev) dist_expectation_sin = float(dist.expectation(torch.sin)) dist_map_sin_mean = float(dist.map(torch.sin).mean) dist_min = float(dist.min) dist_max = float(dist.max) dist_sample_shape = list(dist.sample().size()) util.debug('dist_mean', 'dist_mean_empirical', 'dist_mean_correct', 'dist_stddev', 'dist_stddev_empirical', 'dist_stddev_correct', 'dist_expectation_sin', 'dist_expectation_sin_correct', 'dist_map_sin_mean', 'dist_map_sin_mean_correct', 'dist_min', 'dist_min_correct', 'dist_max', 'dist_max_correct') # self.assertEqual(dist_sample_shape, dist_sample_shape_correct) self.assertAlmostEqual(dist_mean, dist_mean_correct, places=1) self.assertAlmostEqual(dist_mean_empirical, dist_mean_correct, places=1) self.assertAlmostEqual(dist_stddev, dist_stddev_correct, places=1) self.assertAlmostEqual(dist_stddev_empirical, dist_stddev_correct, places=1) self.assertAlmostEqual(dist_expectation_sin, dist_expectation_sin_correct, places=1) self.assertAlmostEqual(dist_map_sin_mean, dist_map_sin_mean_correct, places=1) self.assertAlmostEqual(dist_min, dist_min_correct, places=1) self.assertAlmostEqual(dist_max, dist_max_correct, places=1)
def test_model_rmh_posterior_with_stop_and_resume_to_disk(self): file_name = os.path.join(tempfile.mkdtemp(), str(uuid.uuid4())) posterior_num_runs = 50 posterior_num_traces_each_run = 50 posterior_num_traces_correct = posterior_num_traces_each_run * posterior_num_runs true_posterior = Normal(7.25, math.sqrt(1/1.2)) posterior_mean_correct = float(true_posterior.mean) posterior_stddev_correct = float(true_posterior.stddev) prior_mean_correct = 1. prior_stddev_correct = math.sqrt(5) initial_trace = None for i in range(posterior_num_runs): posterior_traces = self._model.posterior_traces(num_traces=posterior_num_traces_each_run, inference_engine=InferenceEngine.RANDOM_WALK_METROPOLIS_HASTINGS, observe={'obs0': 8, 'obs1': 9}, initial_trace=initial_trace, file_name=file_name) initial_trace = posterior_traces[-1] posterior_traces.close() posterior = Empirical(file_name=file_name) posterior.finalize() posterior = posterior.map(lambda trace: trace.result) posterior_num_traces = posterior.length posterior_mean = float(posterior.mean) posterior_mean_unweighted = float(posterior.unweighted().mean) posterior_stddev = float(posterior.stddev) posterior_stddev_unweighted = float(posterior.unweighted().stddev) kl_divergence = float(pyprob.distributions.Distribution.kl_divergence(true_posterior, Normal(posterior.mean, posterior.stddev))) util.eval_print('posterior_num_runs', 'posterior_num_traces_each_run', 'posterior_num_traces', 'posterior_num_traces_correct', 'prior_mean_correct', 'posterior_mean_unweighted', 'posterior_mean', 'posterior_mean_correct', 'prior_stddev_correct', 'posterior_stddev_unweighted', 'posterior_stddev', 'posterior_stddev_correct', 'kl_divergence') self.assertEqual(posterior_num_traces, posterior_num_traces_correct) self.assertAlmostEqual(posterior_mean, posterior_mean_correct, places=0) self.assertAlmostEqual(posterior_stddev, posterior_stddev_correct, places=0) self.assertLess(kl_divergence, 0.25)