def example_model(): """Create an example model.""" ui.create_model_component('const1d', 'cpt') cpt = ui.get_model_component('cpt') cpt.c0 = 35 return cpt
def test_thaw_model(string, clean_ui): """Can we thaw a model? We use a model with an alwaysfrozen parameter. """ mdl = ui.create_model_component("logparabola", "mdl") ui.set_source(mdl) mdl.c1.freeze() mdl.ampl.freeze() assert mdl.ref.frozen assert mdl.c1.frozen assert not mdl.c2.frozen assert mdl.ampl.frozen assert ui.get_num_par_thawed() == 1 assert ui.get_num_par_frozen() == 3 if string: ui.thaw("mdl") else: ui.thaw(mdl) assert mdl.ref.frozen assert not mdl.c1.frozen assert not mdl.c2.frozen assert not mdl.ampl.frozen assert ui.get_num_par_thawed() == 3 assert ui.get_num_par_frozen() == 1
def setup_err_estimate_multi_ids(strings=False): """Create the environment used in test_err_estimate_xxx tests. The model being fit is polynom1d with c0=50 c1=-2 and was evaluated and passed through sherpa.utils.poisson_noise to create the datasets. Since we can have string or integer ids we allow either, but do not try to mix them. """ if strings: id1 = "1" id2 = "2" id3 = "3" else: id1 = 1 id2 = 2 id3 = 3 ui.load_arrays(id1, [1, 3, 7, 12], [50, 40, 27, 20]) ui.load_arrays(id2, [-3, 4, 5], [55, 34, 37]) ui.load_arrays(id3, [10, 12, 20], [24, 26, 7]) # NOTE: dataset "not-used" is not used in the fit and is not # drawn from the distributino used to create the other datasets. # ui.load_arrays("not-used", [2000, 2010, 2020], [10, 12, 14]) mdl = ui.create_model_component("polynom1d", "mdl") mdl.c1.thaw() ui.set_source(id1, mdl) ui.set_source(id2, mdl) ui.set_source(id3, mdl) # apply the model to dataset not-used just so we can check we # don't end up using it mdl_not_used = ui.create_model_component("scale1d", "mdl_not_used") ui.set_source("not-used", mdl + mdl_not_used) # use cstat so we have an approximate goodness-of-fit just to # check we are getting sensible results. # ui.set_stat("cstat") ui.set_method("simplex")
def test_err_estimate_model(strings, idval, otherids, clean_ui): """Ensure we can use model with conf/proj/covar. This is test_err_estimate_multi_ids but - added an extra model to each source (that evaluates to 0) - we include the model expression in the call. The fit and error analysis should be the same however the ordering is done. """ # This is a bit ugly if strings: idval = str(idval) if type(otherids) == tuple: otherids = (str(otherids[0]), str(otherids[1])) else: otherids = [str(otherids[0]), str(otherids[1])] datasets = tuple([idval] + list(otherids)) setup_err_estimate_multi_ids(strings=strings) zero = ui.create_model_component("scale1d", "zero") zero.c0 = 0 zero.c0.freeze() for id in datasets: # In this case we have # orig == mdl # but let's be explicit in case the code changes # orig = ui.get_source(id) ui.set_source(id, orig + zero) ui.fit(idval, *otherids) res = ui.get_fit_results() assert res.datasets == datasets assert res.numpoints == 10 assert res.statval == pytest.approx(3.379367979541458) assert ui.calc_stat() == pytest.approx(4255.615602052843) assert mdl.c0.val == pytest.approx(46.046607302070015) assert mdl.c1.val == pytest.approx(-1.9783953989993386) # I wanted to have zero.co thawed at this stage, but then we can not # use the ERR_EST_C0/1_xxx values as the fit has changed (and mdl.c0 # and zero.c0 are degenerate to boot). # ui.conf(*datasets, mdl) res = ui.get_conf_results() assert res.datasets == datasets assert res.parnames == ("mdl.c0", "mdl.c1") assert res.parmins == pytest.approx([ERR_EST_C0_MIN, ERR_EST_C1_MIN]) assert res.parmaxes == pytest.approx([ERR_EST_C0_MAX, ERR_EST_C1_MAX])
def test_freeze_no_arguments(clean_ui): """This is a no-op""" mdl = ui.create_model_component("logparabola", "mdl") ui.set_source(mdl) assert ui.get_num_par_thawed() == 3 assert ui.get_num_par_frozen() == 1 ui.freeze() assert ui.get_num_par_thawed() == 3 assert ui.get_num_par_frozen() == 1
def test_freeze_multi_arguments(string, clean_ui): """Check we can combine model and parameters""" mdl1 = ui.create_model_component("logparabola", "mdl1") mdl2 = ui.create_model_component("polynom1d", "mdl2") ui.set_source(mdl1 + mdl2) assert not mdl1.c2.frozen assert not mdl2.c0.frozen assert ui.get_num_par_thawed() == 4 assert ui.get_num_par_frozen() == 10 if string: ui.freeze("mdl2", "mdl1.c2") else: ui.freeze(mdl2, mdl1.c2) assert mdl1.c2.frozen assert mdl2.c0.frozen assert ui.get_num_par_thawed() == 2 assert ui.get_num_par_frozen() == 12
def test_thaw_invalid_arguments(string, clean_ui): """We error out with an invalid argument""" mdl = ui.create_model_component("logparabola", "mdl") ui.set_source(mdl) with pytest.raises(ArgumentTypeErr) as ae: if string: ui.thaw("1") else: ui.thaw(1) assert str( ae.value ) == "'par' must be a parameter or model object or expression string"
def test_thaw_thawed_parameter(string, clean_ui): """Can we thaw a thawed parameter? String argument""" mdl = ui.create_model_component("polynom1d", "mdl") ui.set_source(mdl) assert not mdl.c0.frozen assert ui.get_num_par_thawed() == 1 assert ui.get_num_par_frozen() == 9 if string: ui.thaw("mdl.c0") else: ui.thaw(mdl.c0) assert not mdl.c0.frozen assert ui.get_num_par_thawed() == 1 assert ui.get_num_par_frozen() == 9
def test_freeze_frozen_parameter(string, clean_ui): """Can we freeze a frozen_parameter?""" mdl = ui.create_model_component("polynom1d", "mdl") ui.set_source(mdl) assert mdl.c1.frozen assert ui.get_num_par_thawed() == 1 assert ui.get_num_par_frozen() == 9 if string: ui.freeze("mdl.c1") else: ui.freeze(mdl.c1) assert mdl.c1.frozen assert ui.get_num_par_thawed() == 1 assert ui.get_num_par_frozen() == 9
def test_freeze_parameter(string, clean_ui): """Can we freeze a parameter?""" mdl = ui.create_model_component("logparabola", "mdl") ui.set_source(mdl) assert not mdl.c1.frozen assert ui.get_num_par_thawed() == 3 assert ui.get_num_par_frozen() == 1 if string: ui.freeze("mdl.c1") else: ui.freeze(mdl.c1) assert mdl.c1.frozen assert ui.get_num_par_thawed() == 2 assert ui.get_num_par_frozen() == 2
def test_freeze_alwaysfrozen_parameter(string, clean_ui): """Can we freeze an always-frozen parameter?""" mdl = ui.create_model_component("logparabola", "mdl") ui.set_source(mdl) assert mdl.ref.alwaysfrozen assert mdl.ref.frozen assert ui.get_num_par_thawed() == 3 assert ui.get_num_par_frozen() == 1 if string: ui.freeze("mdl.ref") else: ui.freeze(mdl.ref) assert mdl.ref.frozen assert ui.get_num_par_thawed() == 3 assert ui.get_num_par_frozen() == 1
def test_thaw_alwaysfrozen_parameter(string, clean_ui): """Can we thaw an always-frozen parameter?""" mdl = ui.create_model_component("logparabola", "mdl") ui.set_source(mdl) assert mdl.ref.alwaysfrozen assert mdl.ref.frozen assert ui.get_num_par_thawed() == 3 assert ui.get_num_par_frozen() == 1 with pytest.raises(ParameterErr) as pe: if string: ui.thaw("mdl.ref") else: ui.thaw(mdl.ref) assert mdl.ref.frozen assert ui.get_num_par_thawed() == 3 assert ui.get_num_par_frozen() == 1 assert str( pe.value) == "parameter mdl.ref is always frozen and cannot be thawed"