def test_NestedSamples_importance_sample(): np.random.seed(3) ns0 = NestedSamples(root='./tests/example_data/pc') pi0 = ns0.set_beta(0) NS0 = ns0.ns_output(nsamples=2000) with pytest.raises(NotImplementedError): ns0.importance_sample(ns0.logL, action='spam') ns_masked = ns0.importance_sample(ns0.logL, action='replace') assert_array_equal(ns0.logL, ns_masked.logL) assert_array_equal(ns0.logL_birth, ns_masked.logL_birth) assert_array_equal(ns0.weights, ns_masked.weights) ns_masked = ns0.importance_sample(np.zeros_like(ns0.logL), action='add') assert_array_equal(ns0.logL, ns_masked.logL) assert_array_equal(ns0.logL_birth, ns_masked.logL_birth) assert_array_equal(ns0.weights, ns_masked.weights) mask = ((ns0.x0 > -0.3) & (ns0.x2 > 0.2) & (ns0.x4 < 3.5)).to_numpy() ns_masked = merge_nested_samples((ns0[mask], )) V_prior = pi0[mask].weights.sum() / pi0.weights.sum() V_posterior = ns0[mask].weights.sum() / ns0.weights.sum() ns1 = ns0.importance_sample(mask, action='mask') assert_array_equal(ns_masked.logL, ns1.logL) assert_array_equal(ns_masked.logL_birth, ns1.logL_birth) assert_array_equal(ns_masked.weights, ns1.weights) logL_new = np.where(mask, 0, -np.inf) ns1 = ns0.importance_sample(logL_new) NS1 = ns1.ns_output(nsamples=2000) assert_array_equal(ns1, ns_masked) logZ_V = NS0.logZ.mean() + np.log(V_posterior) - np.log(V_prior) assert abs(NS1.logZ.mean() - logZ_V) < 1.5 * NS1.logZ.std() logL_new = np.where(mask, 0, -1e30) ns1 = ns0.importance_sample(logL_new) NS1 = ns1.ns_output(nsamples=2000) logZ_V = NS0.logZ.mean() + np.log(V_posterior) assert abs(NS1.logZ.mean() - logZ_V) < 1.5 * NS1.logZ.std() ns0.importance_sample(logL_new, inplace=True) assert type(ns0) is NestedSamples assert_array_equal(ns0, ns1) assert ns0.tex == ns1.tex assert ns0.limits == ns1.limits assert ns0.root == ns1.root assert ns0.label == ns1.label assert ns0.beta == ns1.beta assert ns0 is not ns1 assert ns0.tex is not ns1.tex assert ns0.limits is not ns1.limits
def test_logzero_mask_likelihood_level(): np.random.seed(3) ns0 = NestedSamples(root='./tests/example_data/pc') NS0 = ns0.ns_output(nsamples=2000) mask = ((ns0.x0 > -0.3) & (ns0.x2 > 0.2) & (ns0.x4 < 3.5)).to_numpy() V_posterior = ns0[mask].weights.sum() / ns0.weights.sum() logZ_V = NS0.logZ.mean() + np.log(V_posterior) ns1 = NestedSamples(root='./tests/example_data/pc') ns1.logL = np.where(mask, ns1.logL, -1e30) ns1 = merge_nested_samples((ns1[ns1.logL > ns1.logL_birth],)) NS1 = ns1.ns_output(nsamples=2000) assert abs(NS1.logZ.mean() - logZ_V) < 1.5 * NS1.logZ.std()
def test_logzero_mask_prior_level(): np.random.seed(3) ns0 = NestedSamples(root='./tests/example_data/pc') pi0 = ns0.set_beta(0) NS0 = ns0.ns_output(nsamples=2000) mask = ((ns0.x0 > -0.3) & (ns0.x2 > 0.2) & (ns0.x4 < 3.5)).to_numpy() V_prior = pi0[mask].weights.sum() / pi0.weights.sum() V_posterior = ns0[mask].weights.sum() / ns0.weights.sum() logZ_V = NS0.logZ.mean() + np.log(V_posterior) - np.log(V_prior) ns1 = merge_nested_samples((ns0[mask],)) NS1 = ns1.ns_output(nsamples=2000) assert abs(NS1.logZ.mean() - logZ_V) < 1.5 * NS1.logZ.std()
def test_merging(): numpy.random.seed(3) samples_1 = NestedSamples(root='./tests/example_data/pc') samples_2 = NestedSamples(root='./tests/example_data/pc_250') samples = merge_nested_samples([samples_1, samples_2]) nlive_1 = samples_1.nlive.mode()[0] nlive_2 = samples_2.nlive.mode()[0] nlive = samples.nlive.mode()[0] assert nlive_1 == 125 assert nlive_2 == 250 assert nlive == nlive_1 + nlive_2 assert (samples.logZ() < samples_1.logZ() and samples.logZ() > samples_2.logZ() or samples.logZ() > samples_1.logZ() and samples.logZ() < samples_2.logZ())