def test_full_exp(fileutils): test_dir = fileutils.make_test_dir("gen_full_test") exp = Experiment("gen-test", test_dir, launcher="local") model = exp.create_model("model", run_settings=rs) script = fileutils.get_test_conf_path("sleep.py") model.attach_generator_files(to_copy=script) orc = Orchestrator(6780) params = {"THERMO": [10, 20, 30], "STEPS": [10, 20, 30]} ensemble = exp.create_ensemble("test_ens", params=params, run_settings=rs) config = fileutils.get_test_conf_path("in.atm") ensemble.attach_generator_files(to_configure=config) exp.generate(orc, ensemble, model) # test for ensemble assert osp.isdir(osp.join(test_dir, "test_ens/")) for i in range(9): assert osp.isdir(osp.join(test_dir, "test_ens/test_ens_" + str(i))) # test for orc dir assert osp.isdir(osp.join(test_dir, "database")) # test for model file assert osp.isdir(osp.join(test_dir, "model")) assert osp.isfile(osp.join(test_dir, "model/sleep.py"))
def test_ensemble(fileutils, wlmutils): exp_name = "test-ensemble-launch" exp = Experiment(exp_name, launcher=wlmutils.get_test_launcher()) test_dir = fileutils.make_test_dir(exp_name) script = fileutils.get_test_conf_path("sleep.py") settings = wlmutils.get_run_settings("python", f"{script} --time=5") ensemble = exp.create_ensemble("e1", run_settings=settings, replicas=2) ensemble.set_path(test_dir) exp.start(ensemble, block=True) statuses = exp.get_status(ensemble) assert all([stat == constants.STATUS_COMPLETED for stat in statuses])
def test_ensemble(fileutils): exp = Experiment("gen-test", launcher="local") test_dir = fileutils.get_test_dir("gen_ensemble_test") gen = Generator(test_dir) params = {"THERMO": [10, 20, 30], "STEPS": [10, 20, 30]} ensemble = exp.create_ensemble("test", params=params, run_settings=rs) config = fileutils.get_test_conf_path("in.atm") ensemble.attach_generator_files(to_configure=config) gen.generate_experiment(ensemble) assert len(ensemble) == 9 assert osp.isdir(osp.join(test_dir, "test")) for i in range(9): assert osp.isdir(osp.join(test_dir, "test/test_" + str(i)))
def test_stop_entity_list(fileutils, wlmutils): exp_name = "test-launch-stop-ensemble" exp = Experiment(exp_name, launcher=wlmutils.get_test_launcher()) test_dir = fileutils.make_test_dir(exp_name) script = fileutils.get_test_conf_path("sleep.py") settings = wlmutils.get_run_settings("python", f"{script} --time=10") ensemble = exp.create_ensemble("e1", run_settings=settings, replicas=2) ensemble.set_path(test_dir) exp.start(ensemble, block=False) time.sleep(5) exp.stop(ensemble) statuses = exp.get_status(ensemble) assert all([stat == constants.STATUS_CANCELLED for stat in statuses]) assert all([m.name in exp._control._jobs.completed for m in ensemble])
def test_batch_ensemble_replicas(fileutils, wlmutils): exp_name = "test-slurm-batch-ensemble-replicas" exp = Experiment(exp_name, launcher=wlmutils.get_test_launcher()) test_dir = fileutils.make_test_dir(exp_name) script = fileutils.get_test_conf_path("sleep.py") settings = wlmutils.get_run_settings("python", f"{script} --time=5") batch = SbatchSettings(nodes=2, time="00:01:00") ensemble = exp.create_ensemble( "batch-ens-replicas", batch_settings=batch, run_settings=settings, replicas=2 ) ensemble.set_path(test_dir) exp.start(ensemble, block=True) statuses = exp.get_status(ensemble) assert all([stat == constants.STATUS_COMPLETED for stat in statuses])
def test_ensemble_overwrite_error(fileutils): exp = Experiment("gen-test-overwrite-error", launcher="local") test_dir = fileutils.get_test_dir("test_gen_overwrite_error") gen = Generator(test_dir) params = {"THERMO": [10, 20, 30], "STEPS": [10, 20, 30]} ensemble = exp.create_ensemble("test", params=params, run_settings=rs) config = fileutils.get_test_conf_path("in.atm") ensemble.attach_generator_files(to_configure=[config]) gen.generate_experiment(ensemble) # re generate without overwrite config = fileutils.get_test_conf_path("in.atm") ensemble.attach_generator_files(to_configure=[config]) with pytest.raises(FileExistsError): gen.generate_experiment(ensemble)
def test_batch_ensemble(fileutils, wlmutils): """Test the launch of a manually constructed batch ensemble""" exp_name = "test-slurm-batch-ensemble" exp = Experiment(exp_name, launcher=wlmutils.get_test_launcher()) test_dir = fileutils.make_test_dir(exp_name) script = fileutils.get_test_conf_path("sleep.py") settings = wlmutils.get_run_settings("python", f"{script} --time=5") M1 = exp.create_model("m1", path=test_dir, run_settings=settings) M2 = exp.create_model("m2", path=test_dir, run_settings=settings) batch = SbatchSettings(nodes=2, time="00:01:00") ensemble = exp.create_ensemble("batch-ens", batch_settings=batch) ensemble.add_model(M1) ensemble.add_model(M2) ensemble.set_path(test_dir) exp.start(ensemble, block=True) statuses = exp.get_status(ensemble) assert all([stat == constants.STATUS_COMPLETED for stat in statuses])
def test_dir_files(fileutils): """test the generate of models with files that are directories with subdirectories and files """ test_dir = fileutils.make_test_dir("gen_dir_test") exp = Experiment("gen-test", test_dir, launcher="local") params = {"THERMO": [10, 20, 30], "STEPS": [10, 20, 30]} ensemble = exp.create_ensemble("dir_test", params=params, run_settings=rs) conf_dir = fileutils.get_test_dir_path("test_dir") ensemble.attach_generator_files(to_copy=conf_dir) exp.generate(ensemble) assert osp.isdir(osp.join(test_dir, "dir_test/")) for i in range(9): model_path = osp.join(test_dir, "dir_test/dir_test_" + str(i)) assert osp.isdir(model_path) assert osp.isdir(osp.join(model_path, "test_dir_1")) assert osp.isfile(osp.join(model_path, "test.py"))
def test_launch_pbs_mpmd(): """test the launch of a aprun MPMD workload this test will obtain an allocation as a batch workload. Aprun MPMD workloads share an output file for all processes and they share MPI_COMM_WORLDs. Prior to running this test, hw_mpi.c in test_configs needs to be compiled. #TODO write a script for this. """ exp = Experiment("pbs-test", launcher="pbs") run_args = {"pes": 1, "pes-per-node": 1} aprun = AprunSettings("./hellow", run_args=run_args) aprun2 = AprunSettings("./hellow", run_args=run_args) aprun.make_mpmd(aprun2) model = exp.create_model("hello_world", run_settings=aprun) qsub = QsubBatchSettings(nodes=2, ppn=1, time="1:00:00") ensemble = exp.create_ensemble("ensemble", batch_settings=qsub) ensemble.add_model(model) exp.start(ensemble)
import pytest from smartsim import Experiment from smartsim.database import Orchestrator from smartsim.error import SmartSimError from smartsim.settings import RunSettings from smartsim.utils.entityutils import separate_entities # ---- create entities for testing -------- rs = RunSettings("python", "sleep.py") exp = Experiment("util-test", launcher="local") model = exp.create_model("model_1", run_settings=rs) model_2 = exp.create_model("model_1", run_settings=rs) ensemble = exp.create_ensemble("ensemble", run_settings=rs, replicas=1) orc = Orchestrator() orc_1 = deepcopy(orc) def test_separate(): ent, ent_list, _orc = separate_entities([model, ensemble, orc]) assert ent[0] == model assert ent_list[0] == ensemble assert _orc == orc def test_two_orc(): with pytest.raises(SmartSimError): _, _, _orc = separate_entities([orc, orc_1])
def test_bad_ensemble_init_no_rs_bs(): """ensemble init without run settings or batch settings""" exp = Experiment("test") with pytest.raises(SmartSimError): exp.create_ensemble("name")
def test_bad_ensemble_init_no_params(): """params supplied without run settings""" exp = Experiment("test") with pytest.raises(SmartSimError): exp.create_ensemble("name", run_settings=RunSettings("python"))
def test_bad_ensemble_init_no_rs(): """params supplied without run settings""" exp = Experiment("test") with pytest.raises(SmartSimError): exp.create_ensemble("name", {"param1": 1})