Skip to content

Commit d911160

Browse files
authored
Merge pull request #1226 from petrelharp/subset_indivs
make subset and canonicalise deal with individual parents
2 parents fbba717 + f48a9ee commit d911160

File tree

8 files changed

+707
-157
lines changed

8 files changed

+707
-157
lines changed

c/tests/test_tables.c

Lines changed: 77 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4122,6 +4122,9 @@ test_sort_tables_canonical_errors(void)
41224122
ret = tsk_table_collection_init(&tables, 0);
41234123
CU_ASSERT_EQUAL_FATAL(ret, 0);
41244124
tables.sequence_length = 1;
4125+
tsk_id_t null_p[] = { -1 };
4126+
tsk_id_t zero_p[] = { 0 };
4127+
tsk_id_t one_p[] = { 1 };
41254128

41264129
ret = tsk_node_table_add_row(&tables.nodes, 0, 0.0, TSK_NULL, TSK_NULL, NULL, 0);
41274130
CU_ASSERT_FATAL(ret >= 0);
@@ -4140,7 +4143,7 @@ test_sort_tables_canonical_errors(void)
41404143
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_MUTATION_PARENT_INCONSISTENT);
41414144

41424145
ret = tsk_mutation_table_clear(&tables.mutations);
4143-
CU_ASSERT_FATAL(ret >= 0);
4146+
CU_ASSERT_FATAL(ret == 0);
41444147
ret = tsk_mutation_table_add_row(&tables.mutations, 0, 0, 2, 0.0, "a", 1, NULL, 0);
41454148
CU_ASSERT_FATAL(ret >= 0);
41464149
ret = tsk_mutation_table_add_row(&tables.mutations, 0, 0, 3, 0.0, "b", 1, NULL, 0);
@@ -4153,6 +4156,44 @@ test_sort_tables_canonical_errors(void)
41534156
ret = tsk_table_collection_canonicalise(&tables, 0);
41544157
CU_ASSERT_EQUAL_FATAL(ret, 0);
41554158

4159+
ret = tsk_node_table_add_row(&tables.nodes, 0, 0.0, TSK_NULL, 0, NULL, 0);
4160+
CU_ASSERT_FATAL(ret >= 0);
4161+
ret = tsk_node_table_add_row(&tables.nodes, 0, 0.0, TSK_NULL, 1, NULL, 0);
4162+
CU_ASSERT_FATAL(ret >= 0);
4163+
ret = tsk_individual_table_add_row(
4164+
&tables.individuals, 0, NULL, 0, one_p, 1, NULL, 0);
4165+
CU_ASSERT_FATAL(ret >= 0);
4166+
ret = tsk_individual_table_add_row(
4167+
&tables.individuals, 0, NULL, 0, zero_p, 1, NULL, 0);
4168+
CU_ASSERT_FATAL(ret >= 0);
4169+
4170+
ret = tsk_table_collection_canonicalise(&tables, 0);
4171+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_INDIVIDUAL_PARENT_CYCLE);
4172+
4173+
ret = tsk_individual_table_clear(&tables.individuals);
4174+
CU_ASSERT_FATAL(ret == 0);
4175+
ret = tsk_individual_table_add_row(
4176+
&tables.individuals, 0, NULL, 0, zero_p, 1, NULL, 0);
4177+
CU_ASSERT_FATAL(ret >= 0);
4178+
ret = tsk_individual_table_add_row(
4179+
&tables.individuals, 0, NULL, 0, zero_p, 1, NULL, 0);
4180+
CU_ASSERT_FATAL(ret >= 0);
4181+
4182+
ret = tsk_table_collection_canonicalise(&tables, 0);
4183+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_INDIVIDUAL_SELF_PARENT);
4184+
4185+
ret = tsk_individual_table_clear(&tables.individuals);
4186+
CU_ASSERT_FATAL(ret == 0);
4187+
ret = tsk_individual_table_add_row(
4188+
&tables.individuals, 0, NULL, 0, null_p, 1, NULL, 0);
4189+
CU_ASSERT_FATAL(ret >= 0);
4190+
ret = tsk_individual_table_add_row(
4191+
&tables.individuals, 0, NULL, 0, zero_p, 1, NULL, 0);
4192+
CU_ASSERT_FATAL(ret >= 0);
4193+
4194+
ret = tsk_table_collection_canonicalise(&tables, 0);
4195+
CU_ASSERT_EQUAL_FATAL(ret, 0);
4196+
41564197
tsk_table_collection_free(&tables);
41574198
}
41584199

@@ -4169,10 +4210,10 @@ test_sort_tables_canonical(void)
41694210
"0 1 2 -1\n"
41704211
"0 2 -1 2\n"
41714212
"0 3 -1 -1\n";
4172-
const char *individuals = "0 0.0\n"
4173-
"0 1.0\n"
4174-
"0 2.0\n"
4175-
"0 3.0\n";
4213+
const char *individuals = "0 0.0 1\n"
4214+
"0 1.0 -1\n"
4215+
"0 2.0 1,3\n"
4216+
"0 3.0 -1,1\n";
41764217
const char *sites = "0 0\n"
41774218
"0.2 0\n"
41784219
"0.1 0\n";
@@ -4192,9 +4233,9 @@ test_sort_tables_canonical(void)
41924233
"0 1 0 -1\n"
41934234
"0 2 -1 2\n"
41944235
"0 3 -1 -1\n";
4195-
const char *individuals_sorted = "0 1.0\n"
4196-
"0 3.0\n"
4197-
"0 2.0\n";
4236+
const char *individuals_sorted = "0 1.0 -1\n"
4237+
"0 3.0 -1,0\n"
4238+
"0 2.0 0,1\n";
41984239
const char *sites_sorted = "0 0\n"
41994240
"0.1 0\n"
42004241
"0.2 0\n";
@@ -4207,10 +4248,10 @@ test_sort_tables_canonical(void)
42074248
"2 1 4 4 0.5\n"
42084249
"2 1 5 6 0.5\n"
42094250
"2 1 6 6 0.5\n";
4210-
const char *individuals_sorted_kept = "0 1.0\n"
4211-
"0 3.0\n"
4212-
"0 2.0\n"
4213-
"0 0.0\n";
4251+
const char *individuals_sorted_kept = "0 1.0 -1\n"
4252+
"0 3.0 -1,0\n"
4253+
"0 2.0 0,1\n"
4254+
"0 0.0 0\n";
42144255

42154256
ret = tsk_table_collection_init(&t1, 0);
42164257
CU_ASSERT_EQUAL_FATAL(ret, 0);
@@ -5338,6 +5379,8 @@ test_table_collection_subset_with_options(tsk_flags_t options)
53385379
tsk_table_collection_t tables_copy;
53395380
int k;
53405381
tsk_id_t nodes[4];
5382+
tsk_id_t zero_p[] = { 0 };
5383+
tsk_id_t one_p[] = { 1 };
53415384

53425385
ret = tsk_table_collection_init(&tables, options);
53435386
CU_ASSERT_EQUAL_FATAL(ret, 0);
@@ -5360,15 +5403,18 @@ test_table_collection_subset_with_options(tsk_flags_t options)
53605403
ret = tsk_node_table_add_row(
53615404
&tables.nodes, TSK_NODE_IS_SAMPLE, 0.0, TSK_NULL, 1, NULL, 0);
53625405
CU_ASSERT_FATAL(ret >= 0);
5406+
// unused individual who is the parent of others
53635407
ret = tsk_individual_table_add_row(
53645408
&tables.individuals, 0, NULL, 0, NULL, 0, NULL, 0);
5409+
ret = tsk_individual_table_add_row(
5410+
&tables.individuals, 0, NULL, 0, zero_p, 1, NULL, 0);
53655411
CU_ASSERT_FATAL(ret >= 0);
53665412
ret = tsk_individual_table_add_row(
5367-
&tables.individuals, 0, NULL, 0, NULL, 0, NULL, 0);
5413+
&tables.individuals, 0, NULL, 0, one_p, 1, NULL, 0);
53685414
CU_ASSERT_FATAL(ret >= 0);
53695415
// unused individual
53705416
ret = tsk_individual_table_add_row(
5371-
&tables.individuals, 0, NULL, 0, NULL, 0, NULL, 0);
5417+
&tables.individuals, 0, NULL, 0, one_p, 1, NULL, 0);
53725418
CU_ASSERT_FATAL(ret >= 0);
53735419
ret = tsk_population_table_add_row(&tables.populations, NULL, 0);
53745420
CU_ASSERT_FATAL(ret >= 0);
@@ -5425,7 +5471,8 @@ test_table_collection_subset_with_options(tsk_flags_t options)
54255471
ret = tsk_table_collection_subset(&tables_copy, NULL, 0, TSK_KEEP_UNREFERENCED);
54265472
CU_ASSERT_EQUAL_FATAL(ret, 0);
54275473
CU_ASSERT_EQUAL_FATAL(tables_copy.nodes.num_rows, 0);
5428-
CU_ASSERT_EQUAL_FATAL(tables_copy.individuals.num_rows, 3);
5474+
CU_ASSERT_FATAL(
5475+
tsk_individual_table_equals(&tables.individuals, &tables_copy.individuals, 0));
54295476
CU_ASSERT_EQUAL_FATAL(tables_copy.populations.num_rows, 2);
54305477
CU_ASSERT_EQUAL_FATAL(tables_copy.mutations.num_rows, 0);
54315478
CU_ASSERT_FATAL(tsk_site_table_equals(&tables.sites, &tables_copy.sites, 0));
@@ -5437,13 +5484,14 @@ test_table_collection_subset_with_options(tsk_flags_t options)
54375484
&tables_copy, NULL, 0, TSK_KEEP_UNREFERENCED | TSK_NO_CHANGE_POPULATIONS);
54385485
CU_ASSERT_EQUAL_FATAL(ret, 0);
54395486
CU_ASSERT_EQUAL_FATAL(tables_copy.nodes.num_rows, 0);
5440-
CU_ASSERT_EQUAL_FATAL(tables_copy.individuals.num_rows, 3);
5487+
CU_ASSERT_FATAL(
5488+
tsk_individual_table_equals(&tables.individuals, &tables_copy.individuals, 0));
54415489
CU_ASSERT_EQUAL_FATAL(tables_copy.mutations.num_rows, 0);
54425490
CU_ASSERT_FATAL(
54435491
tsk_population_table_equals(&tables.populations, &tables_copy.populations, 0));
54445492
CU_ASSERT_FATAL(tsk_site_table_equals(&tables.sites, &tables_copy.sites, 0));
54455493

5446-
// the identity transformation, since unused inds/pops are at the end
5494+
// the identity transformation, since unused pops are at the end
54475495
for (k = 0; k < 4; k++) {
54485496
nodes[k] = k;
54495497
}
@@ -5458,14 +5506,16 @@ test_table_collection_subset_with_options(tsk_flags_t options)
54585506
CU_ASSERT_EQUAL_FATAL(ret, 0);
54595507
ret = tsk_table_collection_subset(&tables_copy, nodes, 4, 0);
54605508
CU_ASSERT_EQUAL_FATAL(ret, 0);
5509+
ret = tsk_table_collection_check_integrity(&tables_copy, 0);
5510+
CU_ASSERT_EQUAL_FATAL(ret, 0);
54615511
CU_ASSERT_FATAL(tsk_node_table_equals(&tables.nodes, &tables_copy.nodes, 0));
54625512
CU_ASSERT_EQUAL_FATAL(tables_copy.individuals.num_rows, 2);
54635513
CU_ASSERT_EQUAL_FATAL(tables_copy.populations.num_rows, 1);
54645514
CU_ASSERT_EQUAL_FATAL(tables_copy.sites.num_rows, 2);
54655515
CU_ASSERT_FATAL(
54665516
tsk_mutation_table_equals(&tables.mutations, &tables_copy.mutations, 0));
54675517

5468-
// reverse twice should get back to the start, since unused inds/pops are at the end
5518+
// reverse twice should get back to the start, since unused pops are at the end
54695519
for (k = 0; k < 4; k++) {
54705520
nodes[k] = 3 - k;
54715521
}
@@ -5475,6 +5525,8 @@ test_table_collection_subset_with_options(tsk_flags_t options)
54755525
CU_ASSERT_EQUAL_FATAL(ret, 0);
54765526
ret = tsk_table_collection_subset(&tables_copy, nodes, 4, TSK_KEEP_UNREFERENCED);
54775527
CU_ASSERT_EQUAL_FATAL(ret, 0);
5528+
ret = tsk_table_collection_check_integrity(&tables_copy, 0);
5529+
CU_ASSERT_EQUAL_FATAL(ret, 0);
54785530
CU_ASSERT_FATAL(tsk_table_collection_equals(&tables, &tables_copy, 0));
54795531

54805532
tsk_table_collection_free(&tables_copy);
@@ -5496,6 +5548,7 @@ test_table_collection_subset_unsorted(void)
54965548
tsk_table_collection_t tables_copy;
54975549
int k;
54985550
tsk_id_t nodes[3];
5551+
tsk_id_t one_p[] = { 1 };
54995552

55005553
ret = tsk_table_collection_init(&tables, 0);
55015554
CU_ASSERT_EQUAL_FATAL(ret, 0);
@@ -5508,10 +5561,14 @@ test_table_collection_subset_unsorted(void)
55085561
&tables.nodes, TSK_NODE_IS_SAMPLE, 0.0, TSK_NULL, TSK_NULL, NULL, 0);
55095562
CU_ASSERT_FATAL(ret >= 0);
55105563
ret = tsk_node_table_add_row(
5511-
&tables.nodes, TSK_NODE_IS_SAMPLE, 0.5, TSK_NULL, TSK_NULL, NULL, 0);
5564+
&tables.nodes, TSK_NODE_IS_SAMPLE, 0.5, TSK_NULL, 1, NULL, 0);
55125565
CU_ASSERT_FATAL(ret >= 0);
5513-
ret = tsk_node_table_add_row(&tables.nodes, 0, 1.0, TSK_NULL, TSK_NULL, NULL, 0);
5566+
ret = tsk_node_table_add_row(&tables.nodes, 0, 1.0, TSK_NULL, 0, NULL, 0);
55145567
CU_ASSERT_FATAL(ret >= 0);
5568+
ret = tsk_individual_table_add_row(
5569+
&tables.individuals, 0, NULL, 0, one_p, 1, NULL, 0);
5570+
ret = tsk_individual_table_add_row(
5571+
&tables.individuals, 0, NULL, 0, NULL, 0, NULL, 0);
55155572
ret = tsk_edge_table_add_row(&tables.edges, 0.0, 0.5, 2, 1, NULL, 0);
55165573
CU_ASSERT_FATAL(ret >= 0);
55175574
ret = tsk_edge_table_add_row(&tables.edges, 0.0, 1.0, 1, 0, NULL, 0);

0 commit comments

Comments
 (0)