# file : test/test_determinism.py # project : Salis-VM # author : Paul Oliver # # This test ensures simulator produces deterministic results. # Resulting save, eva and DB files must be exactly the same for all simulations, # whenever the same seed value is used. import hashlib import os from test_general import SalisTest class TestDeterminism(SalisTest): SIM_OPTS = { "anc": "55a", "anc_path": "anc", "name": "determinism.sim", "ui_path": "test/ui", "vm_arch": "v1", } SIM_OPTS_ASA4 = SIM_OPTS | {"ui": "asa4"} SIM_OPTS_PUSH = SIM_OPTS | {"ui": "push"} def get_asa4_sums(self): self.run_ui_test(**self.SIM_OPTS_ASA4, clones=2, cores=2, mvec_pow=16, seed=8765432, data_push_pow=20, sync_pow=16, auto_save_pow=20) sim_path = f"{self.tempdir.name}/{self.SIM_OPTS["name"]}" auto_saves = sorted(f"{sim_path}/{f}" for f in os.listdir(sim_path)) auto_saves = filter(lambda f: f.startswith(f"{sim_path}/{self.SIM_OPTS["name"]}-"), auto_saves) auto_saves = list(auto_saves)[:4] evas = sorted(f"{sim_path}/evas/{f}" for f in os.listdir(f"{sim_path}/evas")) evas = list(evas)[:4] return {f: hashlib.md5(open(f, "rb").read()).hexdigest() for f in auto_saves + evas} def get_db_sums(self): self.run_ui_test(**self.SIM_OPTS_PUSH, clones=2, cores=2, mvec_pow=16, seed=8765432, data_push_pow=20, sync_pow=16, auto_save_pow=20) sim_path = f"{self.tempdir.name}/{self.SIM_OPTS["name"]}" db_path = f"{sim_path}/{self.SIM_OPTS["name"]}.sqlite3" return hashlib.md5(open(db_path, "rb").read()).hexdigest() def test_deterministic_saves_and_evas(self): sums_1 = self.get_asa4_sums() sums_2 = self.get_asa4_sums() self.assertEqual(sums_1, sums_2) def test_deterministic_db(self): sum_1 = self.get_db_sums() sum_2 = self.get_db_sums() self.assertEqual(sum_1, sum_2)