def test_mcmc_drag_results(): info: InputDict = yaml_load(yaml_drag) info['likelihood'] = { 'g1': { 'external': GaussLike }, 'g2': { 'external': GaussLike2 } } updated_info, sampler = run(info) products = sampler.products() from getdist.mcsamples import MCSamplesFromCobaya products["sample"] = mpi.allgather(products["sample"]) gdample = MCSamplesFromCobaya(updated_info, products["sample"], ignore_rows=0.2) assert abs(gdample.mean('a') - 0.2) < 0.03 assert abs(gdample.mean('b')) < 0.03 assert abs(gdample.std('a') - 0.293) < 0.03 assert abs(gdample.std('b') - 0.4) < 0.03
def test_post_likelihood(): """ Swaps likelihood "gaussian" for "target". It also tests aggregated chi2's by removing and adding a likelihood to an existing type. """ # Generate original chain orig_interval = OutputOptions.output_inteveral_s try: OutputOptions.output_inteveral_s = 0 info_params_local = deepcopy(info_params) info_params_local["dummy"] = 0 dummy_loglike_add = 0.1 dummy_loglike_remove = 0.01 info = { "output": None, "force": True, "params": info_params_local, "sampler": info_sampler, "likelihood": { "gaussian": { "external": sampled_pdf, "type": "A" }, "dummy": { "external": lambda dummy: 1, "type": "BB" }, "dummy_remove": { "external": lambda dummy: dummy_loglike_add, "type": "BB" } } } info_out, sampler = run(info) samples_in = mpi.gather(sampler.products()["sample"]) if mpi.is_main_process(): mcsamples_in = MCSamplesFromCobaya(info_out, samples_in) else: mcsamples_in = None info_out.update({ "post": { "suffix": "foo", "remove": { "likelihood": { "gaussian": None, "dummy_remove": None } }, "add": { "likelihood": { "target": { "external": target_pdf, "type": "A", "output_params": ["cprime"] }, "dummy_add": { "external": lambda dummy: dummy_loglike_remove, "type": "BB" } } } } }) info_post_out, products_post = post(info_out, sampler.products()["sample"]) samples = mpi.gather(products_post["sample"]) # Load with GetDist and compare if mcsamples_in: target_mean, target_cov = mpi.share(_get_targets(mcsamples_in)) mcsamples = MCSamplesFromCobaya(info_post_out, samples, name_tag="sample") new_mean = mcsamples.mean(["a", "b"]) new_cov = mcsamples.getCovMat().matrix mpi.share((new_mean, new_cov)) else: target_mean, target_cov = mpi.share() new_mean, new_cov = mpi.share() assert np.allclose(new_mean, target_mean) assert np.allclose(new_cov, target_cov) assert allclose(products_post["sample"]["chi2__A"], products_post["sample"]["chi2__target"]) assert allclose( products_post["sample"]["chi2__BB"], products_post["sample"]["chi2__dummy"] + products_post["sample"]["chi2__dummy_add"]) finally: OutputOptions.output_inteveral_s = orig_interval
def test_cosmo_run_resume_post(tmpdir, packages_path=None): # only vary As, so fast chain. Chain does not need to converge (tested elsewhere). info['output'] = os.path.join(tmpdir, 'testchain') if packages_path: info["packages_path"] = process_packages_path(packages_path) run(info, force=True) # note that continuing from files leads to text-file precision at read in, so a mix of # precision in the output SampleCollection returned from run run(info, resume=True, override={'sampler': {'mcmc': {'Rminus1_stop': 0.2}}}) updated_info, sampler = run(info['output'] + '.updated' + Extension.dill, resume=True, override={'sampler': {'mcmc': {'Rminus1_stop': 0.05}}}) results = mpi.allgather(sampler.products()["sample"]) samp = MCSamplesFromCobaya(updated_info, results, ignore_rows=0.2) assert np.isclose(samp.mean('As100'), 100 * samp.mean('As')) # post-processing info_post: PostDict = {'add': {'params': {'h': None}, "likelihood": {"test_likelihood2": likelihood2}}, 'remove': {'likelihood': ["test_likelihood"]}, 'suffix': 'testpost', 'skip': 0.2, 'thin': 4 } output_info, products = run(updated_info, override={'post': info_post}, force=True) results2 = mpi.allgather(products["sample"]) samp2 = MCSamplesFromCobaya(output_info, results2) samp_test = samp.copy() samp_test.weighted_thin(4) sigma8 = samp_test.getParams().sigma8 samp_test.reweightAddingLogLikes(-(sigma8 - 0.7) ** 2 / 0.1 ** 2 + (sigma8 - 0.75) ** 2 / 0.07 ** 2) assert np.isclose(samp_test.mean('sigma8'), samp2.mean('sigma8')) # from getdist-format chain files root = os.path.join(tmpdir, 'getdist_format') if mpi.is_main_process(): samp.saveChainsAsText(root) mpi.sync_processes() from_txt = dict(updated_info, output=root) post_from_text = dict(info_post, skip=0) # getdist already skipped output_info, products = run(from_txt, override={'post': post_from_text}, force=True) samp_getdist = MCSamplesFromCobaya(output_info, mpi.allgather(products["sample"])) assert not products["stats"]["points_removed"] assert samp2.numrows == samp_getdist.numrows assert np.isclose(samp2.mean('sigma8'), samp_getdist.mean('sigma8')) # again with inferred-inputs for params info_conv = cosmomc_root_to_cobaya_info_dict(root) # have to manually add consistent likelihoods if re-computing info_conv['likelihood'] = info['likelihood'] info_conv['theory'] = info['theory'] post_from_text = dict(info_post, skip=0, suffix='getdist2') # getdist already skipped output_info, products = run(info_conv, override={'post': post_from_text}, output=False) samp_getdist2 = MCSamplesFromCobaya(output_info, mpi.allgather(products["sample"])) assert np.isclose(samp2.mean('sigma8'), samp_getdist2.mean('sigma8')) # from save info, no output info_post['output'] = None output_info, products = run({'output': info['output'], 'post': info_post}, force=True) results3 = mpi.allgather(products["sample"]) samp3 = MCSamplesFromCobaya(output_info, results3) assert np.isclose(samp3.mean("sigma8"), samp2.mean("sigma8")) assert np.isclose(samp3.mean("joint"), samp2.mean("joint")) samps4 = loadMCSamples(info['output'] + '.post.testpost') assert np.isclose(samp3.mean("joint"), samps4.mean("joint")) # test recover original answer swapping likelihoods back info_revert = {'add': {'likelihood': info['likelihood']}, 'remove': {'likelihood': ["test_likelihood2"]}, 'suffix': 'revert', 'skip': 0, 'thin': 1, 'output': None } output_info, products = run({'output': info['output'] + '.post.testpost', 'post': info_revert}, force=True) results_revert = mpi.allgather(products["sample"]) samp_revert = MCSamplesFromCobaya(output_info, results_revert) samp_thin = MCSamplesFromCobaya(updated_info, results, ignore_rows=0.2) samp_thin.weighted_thin(4) assert samp_thin.numrows == samp_revert.numrows + products["stats"]["points_removed"] if not products["stats"]["points_removed"]: assert np.isclose(samp_revert.mean("sigma8"), samp_thin.mean("sigma8")) else: assert abs(samp_revert.mean("sigma8") - samp_thin.mean("sigma8")) < 0.01 assert not products["stats"]["points_removed"] # no remove info_post = { 'add': {'params': {'h': None}, "likelihood": {"test_likelihood2": likelihood2}}, 'suffix': 'test2', 'skip': 0.2, 'thin': 4} output_info, products = run(updated_info, override={'post': info_post}, force=True) results2 = mpi.allgather(products["sample"]) samp2 = MCSamplesFromCobaya(output_info, results2) assert "chi2__type1" in samp2.paramNames.list() # check what has been saved to disk is consistent samps4 = loadMCSamples(updated_info['output'] + '.post.test2') assert samp2.paramNames.list() == samps4.paramNames.list() assert np.isclose(samp2.mean("sigma8"), samps4.mean("sigma8")) # adding new theory derived info_post['add']['theory'] = {'new_param_theory': BTheory} output_info, products = run(updated_info, override={'post': info_post}, output=False) results3 = mpi.allgather(products["sample"]) samp3 = MCSamplesFromCobaya(output_info, results3) assert np.isclose(samp3.mean("sigma8"), samp2.mean("sigma8")) assert np.isclose(samp3.mean("As1000"), samp2.mean("As") * 1000) info_post['add']['theory'] = {'new_param_theory': CTheory} with pytest.raises(LoggedError) as e, NoLogging(logging.ERROR): run(updated_info, override={'post': info_post}, output=False) assert 'Parameter AsX no known value' in str(e)