Skip to content

Commit bac46d6

Browse files
authored
Merge pull request #596 from petrelharp/check_flags
more flags to check integrity
2 parents df12dd9 + 651b261 commit bac46d6

File tree

3 files changed

+334
-6
lines changed

3 files changed

+334
-6
lines changed

c/tests/test_tables.c

Lines changed: 316 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2898,6 +2898,320 @@ test_column_overflow(void)
28982898
tsk_table_collection_free(&tables);
28992899
}
29002900

2901+
static void
2902+
test_table_collection_check_integrity(void)
2903+
{
2904+
int ret;
2905+
tsk_table_collection_t tables;
2906+
2907+
ret = tsk_table_collection_init(&tables, 0);
2908+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2909+
tables.sequence_length = 1;
2910+
2911+
/* nodes */
2912+
ret = tsk_node_table_add_row(
2913+
&tables.nodes, TSK_NODE_IS_SAMPLE, INFINITY, TSK_NULL, TSK_NULL, NULL, 0);
2914+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2915+
ret = tsk_table_collection_check_integrity(&tables, 0);
2916+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_TIME_NONFINITE);
2917+
2918+
ret = tsk_node_table_clear(&tables.nodes);
2919+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2920+
ret = tsk_node_table_add_row(
2921+
&tables.nodes, TSK_NODE_IS_SAMPLE, 0.0, 0, TSK_NULL, NULL, 0);
2922+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2923+
ret = tsk_table_collection_check_integrity(&tables, TSK_NO_CHECK_POPULATION_REFS);
2924+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2925+
ret = tsk_table_collection_check_integrity(&tables, 0);
2926+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_POPULATION_OUT_OF_BOUNDS);
2927+
2928+
ret = tsk_node_table_clear(&tables.nodes);
2929+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2930+
ret = tsk_node_table_add_row(
2931+
&tables.nodes, TSK_NODE_IS_SAMPLE, 0.0, TSK_NULL, 0, NULL, 0);
2932+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2933+
ret = tsk_table_collection_check_integrity(&tables, 0);
2934+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_INDIVIDUAL_OUT_OF_BOUNDS);
2935+
2936+
ret = tsk_node_table_clear(&tables.nodes);
2937+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2938+
ret = tsk_node_table_add_row(
2939+
&tables.nodes, TSK_NODE_IS_SAMPLE, 0.0, TSK_NULL, TSK_NULL, NULL, 0);
2940+
CU_ASSERT_FATAL(ret >= 0);
2941+
ret = tsk_node_table_add_row(
2942+
&tables.nodes, TSK_NODE_IS_SAMPLE, 1.0, TSK_NULL, TSK_NULL, NULL, 0);
2943+
CU_ASSERT_FATAL(ret >= 0);
2944+
ret = tsk_table_collection_check_integrity(&tables, 0);
2945+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2946+
2947+
/* edges */
2948+
ret = tsk_edge_table_add_row(&tables.edges, 0.0, 1.0, TSK_NULL, 0, NULL, 0);
2949+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2950+
ret = tsk_table_collection_check_integrity(&tables, 0);
2951+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NULL_PARENT);
2952+
2953+
ret = tsk_edge_table_clear(&tables.edges);
2954+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2955+
ret = tsk_edge_table_add_row(&tables.edges, 0.0, 1.0, 2, 0, NULL, 0);
2956+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2957+
ret = tsk_table_collection_check_integrity(&tables, 0);
2958+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
2959+
2960+
ret = tsk_edge_table_clear(&tables.edges);
2961+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2962+
ret = tsk_edge_table_add_row(&tables.edges, 0.0, 1.0, 1, TSK_NULL, NULL, 0);
2963+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2964+
ret = tsk_table_collection_check_integrity(&tables, 0);
2965+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NULL_CHILD);
2966+
2967+
ret = tsk_edge_table_clear(&tables.edges);
2968+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2969+
ret = tsk_edge_table_add_row(&tables.edges, 0.0, 1.0, 1, 2, NULL, 0);
2970+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2971+
ret = tsk_table_collection_check_integrity(&tables, 0);
2972+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
2973+
2974+
ret = tsk_edge_table_clear(&tables.edges);
2975+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2976+
ret = tsk_edge_table_add_row(&tables.edges, 0.0, INFINITY, 1, 0, NULL, 0);
2977+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2978+
ret = tsk_table_collection_check_integrity(&tables, 0);
2979+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_GENOME_COORDS_NONFINITE);
2980+
2981+
ret = tsk_edge_table_clear(&tables.edges);
2982+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2983+
ret = tsk_edge_table_add_row(&tables.edges, -1.0, 1.0, 1, 0, NULL, 0);
2984+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2985+
ret = tsk_table_collection_check_integrity(&tables, 0);
2986+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_LEFT_LESS_ZERO);
2987+
2988+
ret = tsk_edge_table_clear(&tables.edges);
2989+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2990+
ret = tsk_edge_table_add_row(&tables.edges, 0.0, 1.1, 1, 0, NULL, 0);
2991+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2992+
ret = tsk_table_collection_check_integrity(&tables, 0);
2993+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_RIGHT_GREATER_SEQ_LENGTH);
2994+
2995+
ret = tsk_edge_table_clear(&tables.edges);
2996+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2997+
ret = tsk_edge_table_add_row(&tables.edges, 0.5, 0.1, 1, 0, NULL, 0);
2998+
CU_ASSERT_EQUAL_FATAL(ret, 0);
2999+
ret = tsk_table_collection_check_integrity(&tables, 0);
3000+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_EDGE_INTERVAL);
3001+
3002+
ret = tsk_edge_table_clear(&tables.edges);
3003+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3004+
ret = tsk_edge_table_add_row(&tables.edges, 0.0, 0.5, 0, 1, NULL, 0);
3005+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3006+
ret = tsk_table_collection_check_integrity(&tables, 0);
3007+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_NODE_TIME_ORDERING);
3008+
3009+
ret = tsk_edge_table_clear(&tables.edges);
3010+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3011+
3012+
/* sites */
3013+
ret = tsk_site_table_add_row(&tables.sites, INFINITY, "A", 1, NULL, 0);
3014+
CU_ASSERT_FATAL(ret >= 0);
3015+
ret = tsk_table_collection_check_integrity(&tables, 0);
3016+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_SITE_POSITION);
3017+
3018+
ret = tsk_site_table_clear(&tables.sites);
3019+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3020+
ret = tsk_site_table_add_row(&tables.sites, -0.5, "A", 1, NULL, 0);
3021+
CU_ASSERT_FATAL(ret >= 0);
3022+
ret = tsk_table_collection_check_integrity(&tables, 0);
3023+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_SITE_POSITION);
3024+
3025+
ret = tsk_site_table_clear(&tables.sites);
3026+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3027+
ret = tsk_site_table_add_row(&tables.sites, 1.5, "A", 1, NULL, 0);
3028+
CU_ASSERT_FATAL(ret >= 0);
3029+
ret = tsk_table_collection_check_integrity(&tables, 0);
3030+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_SITE_POSITION);
3031+
3032+
ret = tsk_site_table_clear(&tables.sites);
3033+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3034+
ret = tsk_site_table_add_row(&tables.sites, 0.5, "A", 1, NULL, 0);
3035+
CU_ASSERT_FATAL(ret >= 0);
3036+
ret = tsk_site_table_add_row(&tables.sites, 0.5, "A", 1, NULL, 0);
3037+
CU_ASSERT_FATAL(ret >= 0);
3038+
ret = tsk_table_collection_check_integrity(&tables, 0);
3039+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3040+
ret = tsk_table_collection_check_integrity(&tables, TSK_CHECK_SITE_DUPLICATES);
3041+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_DUPLICATE_SITE_POSITION);
3042+
3043+
ret = tsk_site_table_clear(&tables.sites);
3044+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3045+
ret = tsk_site_table_add_row(&tables.sites, 0.5, "A", 1, NULL, 0);
3046+
CU_ASSERT_FATAL(ret >= 0);
3047+
ret = tsk_site_table_add_row(&tables.sites, 0.4, "A", 1, NULL, 0);
3048+
CU_ASSERT_FATAL(ret >= 0);
3049+
ret = tsk_table_collection_check_integrity(&tables, 0);
3050+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3051+
ret = tsk_table_collection_check_integrity(&tables, TSK_CHECK_SITE_ORDERING);
3052+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_UNSORTED_SITES);
3053+
3054+
ret = tsk_site_table_clear(&tables.sites);
3055+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3056+
ret = tsk_site_table_add_row(&tables.sites, 0.5, "A", 1, NULL, 0);
3057+
CU_ASSERT_FATAL(ret >= 0);
3058+
ret = tsk_site_table_add_row(&tables.sites, 0.6, "A", 1, NULL, 0);
3059+
CU_ASSERT_FATAL(ret >= 0);
3060+
3061+
/* mutations */
3062+
ret = tsk_mutation_table_add_row(
3063+
&tables.mutations, 2, 0, TSK_NULL, NULL, 0, NULL, 0);
3064+
CU_ASSERT_FATAL(ret >= 0);
3065+
ret = tsk_table_collection_check_integrity(&tables, 0);
3066+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_SITE_OUT_OF_BOUNDS);
3067+
3068+
ret = tsk_mutation_table_clear(&tables.mutations);
3069+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3070+
ret = tsk_mutation_table_add_row(
3071+
&tables.mutations, 0, 2, TSK_NULL, NULL, 0, NULL, 0);
3072+
CU_ASSERT_FATAL(ret >= 0);
3073+
ret = tsk_table_collection_check_integrity(&tables, 0);
3074+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
3075+
3076+
ret = tsk_mutation_table_clear(&tables.mutations);
3077+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3078+
ret = tsk_mutation_table_add_row(&tables.mutations, 0, 1, 2, NULL, 0, NULL, 0);
3079+
CU_ASSERT_FATAL(ret >= 0);
3080+
ret = tsk_table_collection_check_integrity(&tables, 0);
3081+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_MUTATION_OUT_OF_BOUNDS);
3082+
3083+
ret = tsk_mutation_table_clear(&tables.mutations);
3084+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3085+
ret = tsk_mutation_table_add_row(&tables.mutations, 0, 1, 0, NULL, 0, NULL, 0);
3086+
CU_ASSERT_FATAL(ret >= 0);
3087+
ret = tsk_table_collection_check_integrity(&tables, 0);
3088+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_MUTATION_PARENT_EQUAL);
3089+
3090+
ret = tsk_mutation_table_clear(&tables.mutations);
3091+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3092+
ret = tsk_mutation_table_add_row(&tables.mutations, 0, 1, 1, NULL, 0, NULL, 0);
3093+
CU_ASSERT_FATAL(ret >= 0);
3094+
ret = tsk_mutation_table_add_row(
3095+
&tables.mutations, 0, 1, TSK_NULL, NULL, 0, NULL, 0);
3096+
CU_ASSERT_FATAL(ret >= 0);
3097+
ret = tsk_table_collection_check_integrity(&tables, 0);
3098+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3099+
ret = tsk_table_collection_check_integrity(&tables, TSK_CHECK_MUTATION_ORDERING);
3100+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_MUTATION_PARENT_AFTER_CHILD);
3101+
ret = tsk_table_collection_check_integrity(
3102+
&tables, TSK_CHECK_MUTATION_ORDERING | TSK_NO_CHECK_MUTATION_PARENTS);
3103+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3104+
3105+
ret = tsk_mutation_table_clear(&tables.mutations);
3106+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3107+
ret = tsk_mutation_table_add_row(
3108+
&tables.mutations, 0, 1, TSK_NULL, NULL, 0, NULL, 0);
3109+
CU_ASSERT_FATAL(ret >= 0);
3110+
ret = tsk_mutation_table_add_row(&tables.mutations, 1, 1, 0, NULL, 0, NULL, 0);
3111+
CU_ASSERT_FATAL(ret >= 0);
3112+
ret = tsk_table_collection_check_integrity(&tables, 0);
3113+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3114+
ret = tsk_table_collection_check_integrity(&tables, TSK_CHECK_MUTATION_ORDERING);
3115+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_MUTATION_PARENT_DIFFERENT_SITE);
3116+
ret = tsk_table_collection_check_integrity(&tables, TSK_NO_CHECK_MUTATION_PARENTS);
3117+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3118+
3119+
ret = tsk_mutation_table_clear(&tables.mutations);
3120+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3121+
ret = tsk_mutation_table_add_row(
3122+
&tables.mutations, 1, 1, TSK_NULL, NULL, 0, NULL, 0);
3123+
CU_ASSERT_FATAL(ret >= 0);
3124+
ret = tsk_mutation_table_add_row(
3125+
&tables.mutations, 0, 1, TSK_NULL, NULL, 0, NULL, 0);
3126+
CU_ASSERT_FATAL(ret >= 0);
3127+
ret = tsk_table_collection_check_integrity(&tables, 0);
3128+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3129+
ret = tsk_table_collection_check_integrity(&tables, TSK_CHECK_MUTATION_ORDERING);
3130+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_UNSORTED_MUTATIONS);
3131+
3132+
ret = tsk_mutation_table_clear(&tables.mutations);
3133+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3134+
3135+
ret = tsk_population_table_add_row(&tables.populations, NULL, 0);
3136+
CU_ASSERT_FATAL(ret >= 0);
3137+
ret = tsk_population_table_add_row(&tables.populations, NULL, 0);
3138+
CU_ASSERT_FATAL(ret >= 0);
3139+
3140+
/* migrations */
3141+
ret = tsk_migration_table_add_row(
3142+
&tables.migrations, 0.0, 0.5, 2, 0, 1, 1.5, NULL, 0);
3143+
CU_ASSERT_FATAL(ret >= 0);
3144+
ret = tsk_table_collection_check_integrity(&tables, 0);
3145+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
3146+
3147+
/* migrations */
3148+
ret = tsk_migration_table_clear(&tables.migrations);
3149+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3150+
ret = tsk_migration_table_add_row(
3151+
&tables.migrations, 0.0, 0.5, 2, 0, 1, 1.5, NULL, 0);
3152+
CU_ASSERT_FATAL(ret >= 0);
3153+
ret = tsk_table_collection_check_integrity(&tables, 0);
3154+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
3155+
3156+
ret = tsk_migration_table_clear(&tables.migrations);
3157+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3158+
ret = tsk_migration_table_add_row(
3159+
&tables.migrations, 0.0, 0.5, 1, 2, 1, 1.5, NULL, 0);
3160+
CU_ASSERT_FATAL(ret >= 0);
3161+
ret = tsk_table_collection_check_integrity(&tables, 0);
3162+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_POPULATION_OUT_OF_BOUNDS);
3163+
3164+
ret = tsk_migration_table_clear(&tables.migrations);
3165+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3166+
ret = tsk_migration_table_add_row(
3167+
&tables.migrations, 0.0, 0.5, 1, 0, 2, 1.5, NULL, 0);
3168+
CU_ASSERT_FATAL(ret >= 0);
3169+
ret = tsk_table_collection_check_integrity(&tables, 0);
3170+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_POPULATION_OUT_OF_BOUNDS);
3171+
3172+
ret = tsk_migration_table_clear(&tables.migrations);
3173+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3174+
ret = tsk_migration_table_add_row(
3175+
&tables.migrations, 0.0, 0.5, 1, 0, 1, INFINITY, NULL, 0);
3176+
CU_ASSERT_FATAL(ret >= 0);
3177+
ret = tsk_table_collection_check_integrity(&tables, 0);
3178+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_TIME_NONFINITE);
3179+
3180+
ret = tsk_migration_table_clear(&tables.migrations);
3181+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3182+
ret = tsk_migration_table_add_row(
3183+
&tables.migrations, 0.0, INFINITY, 1, 0, 1, 1.5, NULL, 0);
3184+
CU_ASSERT_FATAL(ret >= 0);
3185+
ret = tsk_table_collection_check_integrity(&tables, 0);
3186+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_GENOME_COORDS_NONFINITE);
3187+
3188+
ret = tsk_migration_table_clear(&tables.migrations);
3189+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3190+
ret = tsk_migration_table_add_row(
3191+
&tables.migrations, -0.3, 0.5, 1, 0, 1, 1.5, NULL, 0);
3192+
CU_ASSERT_FATAL(ret >= 0);
3193+
ret = tsk_table_collection_check_integrity(&tables, 0);
3194+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_LEFT_LESS_ZERO);
3195+
3196+
ret = tsk_migration_table_clear(&tables.migrations);
3197+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3198+
ret = tsk_migration_table_add_row(
3199+
&tables.migrations, 0.0, 1.5, 1, 0, 1, 1.5, NULL, 0);
3200+
CU_ASSERT_FATAL(ret >= 0);
3201+
ret = tsk_table_collection_check_integrity(&tables, 0);
3202+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_RIGHT_GREATER_SEQ_LENGTH);
3203+
3204+
ret = tsk_migration_table_clear(&tables.migrations);
3205+
CU_ASSERT_EQUAL_FATAL(ret, 0);
3206+
ret = tsk_migration_table_add_row(
3207+
&tables.migrations, 0.6, 0.5, 1, 0, 1, 1.5, NULL, 0);
3208+
CU_ASSERT_FATAL(ret >= 0);
3209+
ret = tsk_table_collection_check_integrity(&tables, 0);
3210+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_EDGE_INTERVAL);
3211+
3212+
tsk_table_collection_free(&tables);
3213+
}
3214+
29013215
int
29023216
main(int argc, char **argv)
29033217
{
@@ -2941,6 +3255,8 @@ main(int argc, char **argv)
29413255
{ "test_load_reindex", test_load_reindex },
29423256
{ "test_table_overflow", test_table_overflow },
29433257
{ "test_column_overflow", test_column_overflow },
3258+
{ "test_table_collection_check_integrity",
3259+
test_table_collection_check_integrity },
29443260
{ NULL, NULL },
29453261
};
29463262

c/tskit/tables.c

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6445,6 +6445,8 @@ tsk_table_collection_check_edge_ordering(tsk_table_collection_t *self)
64456445
* TSK_CHECK_MUTATION_ORDERING Check mutation ordering contraints for a tree sequence.
64466446
* TSK_CHECK_INDEXES Check indexes exist & reference integrity.
64476447
* TSK_CHECK_ALL All above checks.
6448+
* TSK_NO_CHECK_MUTATION_PARENTS Do not check contraints on mutation 'parent' column.
6449+
* TSK_NO_CHECK_POPULATION_REFS Do not check integrity of references to populations.
64486450
*/
64496451
int TSK_WARN_UNUSED
64506452
tsk_table_collection_check_integrity(tsk_table_collection_t *self, tsk_flags_t options)
@@ -6467,6 +6469,10 @@ tsk_table_collection_check_integrity(tsk_table_collection_t *self, tsk_flags_t o
64676469
bool check_site_ordering = !!(options & TSK_CHECK_SITE_ORDERING);
64686470
bool check_site_duplicates = !!(options & TSK_CHECK_SITE_DUPLICATES);
64696471
bool check_mutation_ordering = !!(options & TSK_CHECK_MUTATION_ORDERING);
6472+
bool check_mutation_parents
6473+
= (check_mutation_ordering & !(options & TSK_NO_CHECK_MUTATION_PARENTS));
6474+
bool check_populations = !(options & TSK_NO_CHECK_POPULATION_REFS);
6475+
bool check_indexes = !!(options & TSK_CHECK_INDEXES);
64706476

64716477
if (self->sequence_length <= 0) {
64726478
ret = TSK_ERR_BAD_SEQUENCE_LENGTH;
@@ -6480,10 +6486,12 @@ tsk_table_collection_check_integrity(tsk_table_collection_t *self, tsk_flags_t o
64806486
ret = TSK_ERR_TIME_NONFINITE;
64816487
goto out;
64826488
}
6483-
population = self->nodes.population[j];
6484-
if (population < TSK_NULL || population >= num_populations) {
6485-
ret = TSK_ERR_POPULATION_OUT_OF_BOUNDS;
6486-
goto out;
6489+
if (check_populations) {
6490+
population = self->nodes.population[j];
6491+
if (population < TSK_NULL || population >= num_populations) {
6492+
ret = TSK_ERR_POPULATION_OUT_OF_BOUNDS;
6493+
goto out;
6494+
}
64876495
}
64886496
individual = self->nodes.individual[j];
64896497
if (individual < TSK_NULL || individual >= num_individuals) {
@@ -6582,7 +6590,7 @@ tsk_table_collection_check_integrity(tsk_table_collection_t *self, tsk_flags_t o
65826590
ret = TSK_ERR_MUTATION_PARENT_EQUAL;
65836591
goto out;
65846592
}
6585-
if (check_mutation_ordering) {
6593+
if (check_mutation_parents) {
65866594
if (parent_mut != TSK_NULL) {
65876595
/* Parents must be listed before their children */
65886596
if (parent_mut > (tsk_id_t) j) {
@@ -6594,6 +6602,8 @@ tsk_table_collection_check_integrity(tsk_table_collection_t *self, tsk_flags_t o
65946602
goto out;
65956603
}
65966604
}
6605+
}
6606+
if (check_mutation_ordering) {
65976607
if (j > 0) {
65986608
if (self->mutations.site[j - 1] > self->mutations.site[j]) {
65996609
ret = TSK_ERR_UNSORTED_MUTATIONS;
@@ -6645,7 +6655,7 @@ tsk_table_collection_check_integrity(tsk_table_collection_t *self, tsk_flags_t o
66456655
}
66466656
}
66476657

6648-
if (!!(options & TSK_CHECK_INDEXES)) {
6658+
if (check_indexes) {
66496659
if (!tsk_table_collection_has_index(self, 0)) {
66506660
ret = TSK_ERR_TABLES_NOT_INDEXED;
66516661
goto out;

0 commit comments

Comments
 (0)