From 921cd38c4ee7df9211ba294f07ff96db8349a549 Mon Sep 17 00:00:00 2001 From: Ben Jeffery Date: Mon, 1 Feb 2021 14:34:02 +0000 Subject: [PATCH] Bump versions for individual parents and add LWT tests --- c/CHANGELOG.rst | 5 +++++ c/tskit/core.h | 2 +- python/CHANGELOG.rst | 3 +++ python/lwt_interface/CHANGELOG.rst | 6 ++++++ python/lwt_interface/dict_encoding_testlib.py | 17 +++++++++++++++-- python/lwt_interface/tskit_lwt_interface.h | 2 +- python/tests/test_file_format.py | 2 +- python/tskit/tables.py | 2 +- 8 files changed, 33 insertions(+), 6 deletions(-) diff --git a/c/CHANGELOG.rst b/c/CHANGELOG.rst index 4dee47c12e..aba42781e5 100644 --- a/c/CHANGELOG.rst +++ b/c/CHANGELOG.rst @@ -4,8 +4,13 @@ **Features** +- Add ``parents`` to the individual table to enable recording of pedigrees + (:user:`ivan-krukov`, :user:`benjeffery`, :issue:`852`, :pr:`1125`, :pr:`866`, :pr:`1153`, :pr:`1177`). + **Breaking changes** +- Method ``tsk_individual_table_add_row`` has an extra arguments ``parents`` and ``parents_length``. + **Bugfixes** ---------------------- diff --git a/c/tskit/core.h b/c/tskit/core.h index 2fe72d46b4..93dafaddce 100644 --- a/c/tskit/core.h +++ b/c/tskit/core.h @@ -144,7 +144,7 @@ to the API or ABI are introduced, i.e., internal refactors of bugfixes. #define TSK_FILE_FORMAT_NAME "tskit.trees" #define TSK_FILE_FORMAT_NAME_LENGTH 11 #define TSK_FILE_FORMAT_VERSION_MAJOR 12 -#define TSK_FILE_FORMAT_VERSION_MINOR 3 +#define TSK_FILE_FORMAT_VERSION_MINOR 4 /** @defgroup GENERAL_ERROR_GROUP General errors. diff --git a/python/CHANGELOG.rst b/python/CHANGELOG.rst index bc0831ad9f..25d099e01f 100644 --- a/python/CHANGELOG.rst +++ b/python/CHANGELOG.rst @@ -4,6 +4,9 @@ **Features** +- Add ``parents`` column to the individual table to allow recording of pedigrees + (:user:`ivan-krukov`, :user:`benjeffery`, :issue:`852`, :pr:`1125`, :pr:`866`, :pr:`1153`, :pr:`1177`). + - Added ``Tree.generate_random_binary`` static method to create random binary trees (:user:`hyanwong`, :user:`jeromekelleher`, :pr:`1037`). diff --git a/python/lwt_interface/CHANGELOG.rst b/python/lwt_interface/CHANGELOG.rst index 2fbf607ac3..81b01b88fe 100644 --- a/python/lwt_interface/CHANGELOG.rst +++ b/python/lwt_interface/CHANGELOG.rst @@ -1,3 +1,9 @@ +-------------------- +[0.1.3] - 2021-02-01 +-------------------- + +- Added optional ``parents`` to individual table. + -------------------- [0.1.2] - 2020-10-22 -------------------- diff --git a/python/lwt_interface/dict_encoding_testlib.py b/python/lwt_interface/dict_encoding_testlib.py index 44d92efdbc..eac873a79c 100644 --- a/python/lwt_interface/dict_encoding_testlib.py +++ b/python/lwt_interface/dict_encoding_testlib.py @@ -114,7 +114,7 @@ def test_check_ts_full(tmp_path, full_ts): class TestEncodingVersion: def test_version(self): lwt = lwt_module.LightweightTableCollection() - assert lwt.asdict()["encoding_version"] == (1, 2) + assert lwt.asdict()["encoding_version"] == (1, 3) class TestRoundTrip: @@ -141,7 +141,9 @@ def test_individuals(self): ts = msprime.simulate(n, mutation_rate=1, random_seed=2) tables = ts.dump_tables() for j in range(n): - tables.individuals.add_row(flags=j, location=(j, j), metadata=b"x" * j) + tables.individuals.add_row( + flags=j, location=(j, j), parents=(j, j), metadata=b"x" * j + ) self.verify(tables) def test_sequence_length(self): @@ -473,10 +475,21 @@ def test_individuals(self, tables): self.verify_offset_pair( tables, len(tables.individuals), "individuals", "location" ) + self.verify_offset_pair( + tables, len(tables.individuals), "individuals", "parents" + ) self.verify_offset_pair( tables, len(tables.individuals), "individuals", "metadata" ) self.verify_metadata_schema(tables, "individuals") + # Verify optional parents column + d = tables.asdict() + d["individuals"]["parents"] = None + d["individuals"]["parents_offset"] = None + lwt = lwt_module.LightweightTableCollection() + lwt.fromdict(d) + out = lwt.asdict() + assert all(val == [] for val in out["individuals"]["parents"]) def test_nodes(self, tables): self.verify_offset_pair(tables, len(tables.nodes), "nodes", "metadata") diff --git a/python/lwt_interface/tskit_lwt_interface.h b/python/lwt_interface/tskit_lwt_interface.h index a40b0675bf..9fcd19e18f 100644 --- a/python/lwt_interface/tskit_lwt_interface.h +++ b/python/lwt_interface/tskit_lwt_interface.h @@ -1695,7 +1695,7 @@ dump_tables_dict(tsk_table_collection_t *tables) } /* Dict representation version */ - val = Py_BuildValue("ll", 1, 2); + val = Py_BuildValue("ll", 1, 3); if (val == NULL) { goto out; } diff --git a/python/tests/test_file_format.py b/python/tests/test_file_format.py index 454f1896de..6dfc3d43d7 100644 --- a/python/tests/test_file_format.py +++ b/python/tests/test_file_format.py @@ -41,7 +41,7 @@ CURRENT_FILE_MAJOR = 12 -CURRENT_FILE_MINOR = 3 +CURRENT_FILE_MINOR = 4 test_data_dir = os.path.join(os.path.dirname(__file__), "data") diff --git a/python/tskit/tables.py b/python/tskit/tables.py index f020126dd5..a6974e09d3 100644 --- a/python/tskit/tables.py +++ b/python/tskit/tables.py @@ -2233,7 +2233,7 @@ def asdict(self): map of table names to the tables themselves was returned. """ ret = { - "encoding_version": (1, 2), + "encoding_version": (1, 3), "sequence_length": self.sequence_length, "metadata_schema": repr(self.metadata_schema), "metadata": self.metadata_schema.encode_row(self.metadata),