def test_chains_per_parameter_read_correctly(): """The chains per parameter option should take effect when passed.""" d = {k: v for k,v in MCMC_RUN_DICT.items()} d['mcmc']['chains_per_parameter'] = 6 parsed_settings = get_run_settings(d) assert parsed_settings['mcmc']['chains_per_parameter'] == 6 d['mcmc']['chains_per_parameter'] = 5 with pytest.raises(ValueError): get_run_settings(d)
def test_correct_defaults_are_applied_from_minimal_specification(): """A minimal run should generate several default settings for i/o and optional settings.""" # parameters are popped off in order to assert that no additional parameters # are added and none are not tested. d = get_run_settings(FULL_RUN_DICT) assert d.get('output') is not None assert d['output'].pop('verbosity') == 0 assert d['output'].pop('output_db') == 'out.tdb' assert d['output'].pop('logfile') == None assert d['output'].pop('tracefile') == 'trace.npy' assert d['output'].pop('probfile') == 'lnprob.npy' assert len(d['output']) == 0 assert d['generate_parameters'].pop('ridge_alpha') == None assert d['generate_parameters'].pop('aicc_penalty_factor') == None assert len(d['generate_parameters']) == 2 assert d['mcmc'].pop('save_interval') == 1 assert d['mcmc'].pop('scheduler') == 'dask' assert d['mcmc'].pop('chains_per_parameter') == 2 assert d['mcmc'].pop('chain_std_deviation') == 0.1 assert d['mcmc'].pop('deterministic') == True assert d['mcmc'].pop('data_weights') == { 'ACR': 1.0, 'CPM': 1.0, 'HM': 1.0, 'SM': 1.0, 'ZPF': 1.0 } assert d['mcmc'].pop('prior') == {'name': 'zero'} assert len(d['mcmc']) == 1
def test_nullable_arguments_are_all_nullable(): nullable_dict = yaml.safe_load(NULL_OUTPUTS_YAML) null_settings = get_run_settings(nullable_dict) assert null_settings['output']['tracefile'] is None assert null_settings['output']['logfile'] is None assert null_settings['output']['probfile'] is None assert null_settings['mcmc']['scheduler'] is None
def test_correct_defaults_are_applied_from_minimal_specification(): """A minimal run should generate several default settings for i/o and optional settings.""" d = get_run_settings(FULL_RUN_DICT) assert d.get('output') is not None assert d['output']['verbosity'] == 0 assert d['output']['output_db'] == 'out.tdb' assert d['output']['tracefile'] == 'trace.npy' assert d['output']['probfile'] == 'lnprob.npy' assert d['mcmc']['save_interval'] == 1 assert d['mcmc']['scheduler'] == 'dask' assert d['mcmc']['chains_per_parameter'] == 2 assert d['mcmc']['chain_std_deviation'] == 0.1 assert d['mcmc']['deterministic'] == True
def test_input_yaml_valid_for_generate_parameters_only(): """A minimal generate parameters only input file should validate""" d = get_run_settings(GEN_PARAMS_DICT) assert d.get('mcmc') is None
def test_input_yaml_valid_for_full_run(): """A minimal full run input file should validate""" d = get_run_settings(FULL_RUN_DICT)
def test_SR2016_refdata(): d = {k: v for k,v in GEN_PARAMS_DICT.items()} d['generate_parameters']['ref_state'] = 'SR2016' parsed_settings = get_run_settings(d) assert parsed_settings['generate_parameters']['ref_state'] == 'SR2016'
def test_input_yaml_invalid_for_mcmc_when_input_is_overspecified(): """An MCMC run must get input from only generate_parameters or an input tdb (w/ or w/o a restart).""" with pytest.raises(ValueError): get_run_settings(MCMC_OVERSPECIFIED_INPUT_DICT)
def test_input_yaml_invalid_for_mcmc_when_input_not_defined(): """An MCMC run must get input from generate_parameters, an input tdb, or a restart and input tdb.""" with pytest.raises(ValueError): get_run_settings(MCMC_NO_INPUT_DICT)
def test_input_yaml_valid_for_mcmc_from_restart(): """A minimal mcmc run from a restart should validate""" d = get_run_settings(MCMC_RESTART_DICT) assert d.get('generate_parameters') is None
def test_input_yaml_valid_for_mcmc_from_tdb(): """A minimal mcmc run from tdb input file should validate""" d = get_run_settings(MCMC_RUN_DICT) assert d.get('generate_parameters') is None