def test_decode_errors(self): with self.assertRaises(ValueError): pyslim.decode_mutation(2.0) with self.assertRaises(ValueError): pyslim.decode_mutation([2.0, 3.0]) with self.assertRaises(ValueError): pyslim.decode_node(2.0) with self.assertRaises(ValueError): pyslim.decode_node([1, 2]) with self.assertRaises(ValueError): pyslim.decode_individual(3.0) with self.assertRaises(ValueError): pyslim.decode_individual([1, 2]) with self.assertRaises(ValueError): pyslim.decode_population(1.0) with self.assertRaises(ValueError): pyslim.decode_population([2, 3])
def test_population_derived_info(self): for ts in self.get_slim_examples(): for j, pop in enumerate(ts.populations()): a = ts.tables.populations.metadata_offset[j] b = ts.tables.populations.metadata_offset[j+1] raw_md = ts.tables.populations.metadata[a:b] md = pyslim.decode_population(raw_md) self.assertEqual(pop.metadata, md) self.assertEqual(ts.population(j).metadata, md)
def test_legacy_errors(self): defaults = pyslim.default_slim_metadata with self.assertRaisesRegex(ValueError, "legacy"): pyslim.decode_mutation(defaults('mutation')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.decode_population(defaults('population')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.decode_individual(defaults('individual')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.decode_node(defaults('node')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.encode_mutation(defaults('mutation')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.encode_population(defaults('population')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.encode_individual(defaults('individual')) with self.assertRaisesRegex(ValueError, "legacy"): pyslim.encode_node(defaults('node'))
def test_decode_already_population(self): m = pyslim.PopulationMetadata(slim_id=1, selfing_fraction=0.2, female_cloning_fraction=0.3, male_cloning_fraction=0.4, sex_ratio=0.5, bounds_x0=0, bounds_x1=10, bounds_y0=2, bounds_y1=20, bounds_z0=3, bounds_z1=30, migration_records=[]) dm = pyslim.decode_population(m) self.assertEqual(m, dm)
def test_population_metadata(self): mrs = [pyslim.PopulationMigrationMetadata(source_subpop=j, migration_rate=0.2) for j in range(3)] for mr_list in [[], mrs]: md = pyslim.PopulationMetadata( slim_id=1, selfing_fraction=0.75, female_cloning_fraction=0.2, male_cloning_fraction=0.8, sex_ratio=0.6, bounds_x0=-1.0, bounds_x1=2.0, bounds_y0=0.0, bounds_y1=0.0, bounds_z0=0.0, bounds_z1=1.0, migration_records=mr_list) md_bytes = pyslim.encode_population(md) new_md = pyslim.decode_population(md_bytes) self.assertEqual(md, new_md)
def test_annotate_populations(self): for ts in self.get_slim_examples(): tables = ts.tables new_tables = ts.tables metadata = [] for md in tskit.unpack_bytes(tables.populations.metadata, tables.populations.metadata_offset): dm = pyslim.decode_population(md) edm = pyslim.encode_population(dm) self.assertEqual(md, edm) metadata.append(dm) pyslim.annotate_population_metadata(new_tables, metadata) self.assertEqual(tables, new_tables)
pyslim.annotate_nodes(tables, node_metadata) # individuals individual_metadata = [] for md in msprime.unpack_bytes(tables.individuals.metadata, tables.individuals.metadata_offset): di = pyslim.decode_individual(md) edi = pyslim.encode_individual(di) assert (md == edi) individual_metadata.append(di) pyslim.annotate_individuals(tables, individual_metadata) # populations population_metadata = [] for md in msprime.unpack_bytes(tables.populations.metadata, tables.populations.metadata_offset): if len(md) > 0: dp = pyslim.decode_population(md) edp = pyslim.encode_population(dp) assert (md == edp) else: dp = None population_metadata.append(dp) pyslim.annotate_populations(tables, population_metadata) print(tables)