def main(): """ Multi-Core Markov-chain Monte Carlo (MC3) wrapper for the command line Notes ----- To display the full list of arguments, run from the prompt: mc3 -h Command-line arguments overwrite the config-file arguments if the argument is defined twice. """ parser = parse() # Parse command-line args (right now, just interested in the config file): args, unknown = parser.parse_known_args() # Parse configuration file to a dictionary: if args.cfile is not None and not os.path.isfile(args.cfile): print("Configuration file: '{:s}' not found.".format(args.cfile)) sys.exit(0) if args.cfile: config = configparser.ConfigParser() config.read([args.cfile]) defaults = dict(config.items("MCMC")) else: defaults = {} # Set defaults from the configuration-file values: parser.set_defaults(**defaults) # Overwrite defaults with the command-line arguments: args, unknown = parser.parse_known_args() delattr(args, 'cfile') # Call MCMC driver: mc3.sample(**vars(args))
def test_mcmc_sampler_error(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), indparams=[x], pstep=pstep, nsamples=1e4, burnin=100) captured = capsys.readouterr() assert output is None assert "'sampler' is a required argument." in captured.out
def test_mcmc_nsamples_error(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, burnin=100) captured = capsys.readouterr() assert output is None assert "'nsamples' is a required argument for MCMC runs." in captured.out
def test_mcmc_samples_error(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=2000) captured = capsys.readouterr() assert output is None assert "The number of burned-in samples (2000) is greater" in captured.out
def test_mcmc_deprecation_full_output(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], stepsize=pstep, nsamples=1e3, burnin=2, ncpu=7, full_output=True) captured = capsys.readouterr() assert output is not None assert "full_output argument is deprecated." in captured.out
def test_mcmc_deprecation_walk(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), walk=sampler, indparams=[x], stepsize=pstep, nsamples=1e3, burnin=2, ncpu=7) captured = capsys.readouterr() assert output is not None assert "walk argument is deprecated. Use sampler instead." in captured.out
def test_mcmc_shared(): output = mc3.sample(data1, uncert1, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=[0.03, -1, 0.05], nsamples=1e4, burnin=100) assert output is not None assert output['bestp'][1] == output['bestp'][0]
def test_mcmc_func_error(capsys): output = mc3.sample(data=data, uncert=uncert, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100) captured = capsys.readouterr() assert output is None assert "'func' must be either a callable or an iterable" in captured.out
def test_mcmc_gr(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100, grtest=True) captured = capsys.readouterr() assert output is not None assert "Gelman-Rubin statistics for free parameters:" in captured.out
def test_mcmc_leastsq_error(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, leastsq='invalid', nsamples=1e4, burnin=100) captured = capsys.readouterr() assert output is None assert "Invalid 'leastsq' input (invalid). Must select from " \ "['lm', 'trf']." in captured.out
def test_mcmc_deprecation_parname(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e3, burnin=2, parname=pnames) captured = capsys.readouterr() assert output is not None assert "parname argument is deprecated. Use pnames instead." \ in captured.out
def test_mcmc_gr_break_iterations(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100, grtest=True, grbreak=1.1, grnmin=5000.0) captured = capsys.readouterr() assert output is not None assert "All parameters satisfy the GR convergence threshold of 1.1" \ in captured.out
def test_mcmc_func_as_strings(tmp_path): p = tmp_path / "quadratic.py" CONTENT = u'def quad(p, x):\n y = p[0] + p[1]*x + p[2]*x**2.0\n return y' p.write_text(CONTENT) output = mc3.sample(func=('quad', 'quadratic', str(tmp_path)), params=np.copy(params), data=data, uncert=uncert, indparams=[x], pstep=pstep, sampler=sampler, nsamples=1e4, burnin=100) assert output is not None
def test_mcmc_optimize(capsys, leastsq): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100, leastsq=leastsq) captured = capsys.readouterr() assert output is not None assert "Least-squares best-fitting parameters:" in captured.out np.testing.assert_allclose(output['bestp'], np.array([4.28263253, -2.40781859, 0.49534411]), rtol=1e-7)
def test_mcmc_pnames_texnames(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100, pnames=pnames, texnames=texnames) captured = capsys.readouterr() assert output is not None assert "constant" in captured.out assert "linear" in captured.out assert "quadratic" in captured.out
def test_mcmc_texnames(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100, texnames=texnames) captured = capsys.readouterr() assert output is not None assert "$\\alpha$" in captured.out assert "$\\log(\\beta" in captured.out assert "quadratic" in captured.out
def test_mcmc_savefile(capsys, tmp_path): os.chdir(str(tmp_path)) output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100, savefile='MCMC.npz') captured = capsys.readouterr() assert output is not None assert "'MCMC.npz'" in captured.out assert "MCMC.npz" in os.listdir(".")
def test_mcmc_priors_gauss(): prior = np.array([ 4.5, 0.0, 0.0]) priorlow = np.array([ 0.1, 0.0, 0.0]) priorup = np.array([ 0.1, 0.0, 0.0]) output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100, prior=prior, priorlow=priorlow, priorup=priorup) assert output is not None assert -2*output['best_log_post'] > output['best_chisq'] assert np.all(-2*output['log_post'] > output['chisq'])
def test_mcmc_fixed(): pars = np.copy(params) pars[0] = p0[0] output = mc3.sample(data, uncert, func=quad, params=np.copy(pars), sampler=sampler, indparams=[x], pstep=[0, 0.03, 0.05], nsamples=1e4, burnin=100) assert output is not None assert len(output['bestp']) == len(params) assert output['bestp'][0] == pars[0] assert output['CRlo'][0] == 0 assert output['CRhi'][0] == 0 assert output['stdp'][0] == 0
def test_dynesty_pmax_error(capsys): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, pmin=pmin) captured = capsys.readouterr() assert output is None assert "Parameter space must be constrained by pmin and pmax." \ in captured.out
def test_dynesty_minimal(): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), indparams=[x], pmin=pmin, pmax=pmax, pstep=pstep, sampler=sampler, maxiter=5000) # No error? that's a pass. assert output is not None
def test_dynesty_ncpu(): output = mc3.sample(data, uncert, func=quad, params=np.copy(params), indparams=[x], pmin=pmin, pmax=pmax, ncpu=8, pstep=pstep, sampler=sampler, maxiter=5000) assert output is not None
def test_dynesty_shared(): output = mc3.sample(data1, uncert1, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pmin=pmin, pmax=pmax, pstep=[0.03, -1, 0.05], maxiter=5000) assert output is not None assert output['bestp'][1] == output['bestp'][0]
def test_mcmc_optimize_chisqscale(capsys): unc = np.copy(uncert) output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100, leastsq='lm', chisqscale=True) captured = capsys.readouterr() assert output is not None assert "Least-squares best-fitting parameters (rescaled chisq):" \ in captured.out assert "Reduced chi-squared: 1.0000" in captured.out # Assert that uncert has not mutated: np.testing.assert_equal(uncert, unc)
def test_mcmc_plots(capsys, tmp_path): os.chdir(str(tmp_path)) output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pstep=pstep, nsamples=1e4, burnin=100, plots=True) captured = capsys.readouterr() assert output is not None assert "snooker_trace.png" in captured.out assert "snooker_pairwise.png" in captured.out assert "snooker_posterior.png" in captured.out assert "snooker_model.png" in captured.out assert "snooker_trace.png" in os.listdir(".") assert "snooker_pairwise.png" in os.listdir(".") assert "snooker_posterior.png" in os.listdir(".") assert "snooker_model.png" in os.listdir(".")
def test_dynesty_log(capsys, tmp_path): os.chdir(str(tmp_path)) output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pmin=pmin, pmax=pmax, pstep=pstep, maxiter=5000, log='NS.log') captured = capsys.readouterr() assert output is not None assert "NS.log" in captured.out assert "NS.log" in os.listdir(".")
def test_mcmc_deprecation_leastsq(capsys, lm, leastsq): if leastsq is True and lm is False: ls = 'trf' elif leastsq in [True, 'lm']: ls = 'lm' else: ls = None output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], stepsize=pstep, nsamples=1e3, burnin=2, ncpu=7, leastsq=leastsq, lm=lm) captured = capsys.readouterr() assert output is not None if isinstance(leastsq, bool): assert "leastsq as boolean is deprecated. See docs for new usage. " \ "Set\nleastsq={}".format(repr(ls)) in captured.out if isinstance(lm, bool): assert "lm argument is deprecated. See new usage of leastsq. " \ "Set\nleastsq={}".format(repr(ls)) in captured.out
def test_dynesty_fixed(): pars = np.copy(params) pars[0] = p0[0] output = mc3.sample(data, uncert, func=quad, params=np.copy(pars), sampler=sampler, indparams=[x], pmin=pmin, pmax=pmax, pstep=[0, 0.03, 0.05], maxiter=5000) assert output is not None assert len(output['bestp']) == len(params) assert output['bestp'][0] == pars[0] assert output['CRlo'][0] == 0 assert output['CRhi'][0] == 0 assert output['stdp'][0] == 0
def MCMC(dfs_dict): # dfoutput = pd.DataFrame(columns = ['peak_L1635','width_L1635','L1635_amplitude','peak_G1515', # 'std_G1515','G1515_amplitude','peak_G1430', 'std_G1430', 'std_G1430']) # Run the MCMC: for files, data in dfs_dict.items(): spec = data['Absorbance'].to_numpy() uncert = np.ones_like(spec)*0.01 mc3_output = mc3.sample(data=spec, uncert=uncert, func=func, params=params, indparams=indparams, pstep=pstep, pmin=pmin, pmax=pmax, priorlow=priorlow, priorup=priorup, pnames=pnames, texnames=texnames, sampler=sampler, nsamples=nsamples, nchains=nchains, ncpu=ncpu, burnin=burnin, thinning=thinning, leastsq=leastsq, chisqscale=chisqscale, grtest=grtest, grbreak=grbreak, grnmin=grnmin, hsize=hsize, kickoff=kickoff, wlike=wlike, log=log, plots=plots, savefile=savefile, rms=rms)
def test_dynesty_priors_gauss(): prior = np.array([4.5, 0.0, 0.0]) priorlow = np.array([0.1, 0.0, 0.0]) priorup = np.array([0.1, 0.0, 0.0]) output = mc3.sample(data, uncert, func=quad, params=np.copy(params), sampler=sampler, indparams=[x], pmin=pmin, pmax=pmax, pstep=pstep, maxiter=5000, prior=prior, priorlow=priorlow, priorup=priorup) assert output is not None assert -2 * output['best_log_post'] > output['best_chisq'] assert np.all(-2 * output['log_post'] > output['chisq'])