@@ -4420,6 +4420,192 @@ test_internal_sample_sample_sets(void)
44204420}
44214421
44224422
4423+
4424+ /*=======================================================
4425+ * KC Distance tests.
4426+ *=======================================================*/
4427+
4428+ static void
4429+ test_single_tree_kc (void )
4430+ {
4431+ int ret ;
4432+ tsk_treeseq_t ts ;
4433+ tsk_tree_t t , other_t ;
4434+ double result = 0 ;
4435+
4436+ tsk_treeseq_from_text (& ts , 1 , single_tree_ex_nodes , single_tree_ex_edges ,
4437+ NULL , NULL , NULL , NULL , NULL );
4438+ ret = tsk_tree_init (& t , & ts , 0 );
4439+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4440+ ret = tsk_tree_first (& t );
4441+ CU_ASSERT_EQUAL_FATAL (ret , 1 );
4442+ ret = tsk_tree_init (& other_t , & ts , 0 );
4443+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4444+ ret = tsk_tree_first (& other_t );
4445+ CU_ASSERT_EQUAL_FATAL (ret , 1 );
4446+ ret = tsk_tree_copy (& t , & other_t , TSK_NO_INIT );
4447+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4448+ check_trees_identical (& t , & other_t );
4449+ ret = tsk_tree_kc_distance (& t , & other_t , 0 , & result );
4450+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4451+ CU_ASSERT_EQUAL_FATAL (result , 0 );
4452+ tsk_treeseq_free (& ts );
4453+ tsk_tree_free (& t );
4454+ tsk_tree_free (& other_t );
4455+ }
4456+
4457+ static void
4458+ test_two_trees_kc (void )
4459+ {
4460+ const char * nodes =
4461+ "1 0 0\n"
4462+ "1 0 0\n"
4463+ "1 0 0\n"
4464+ "0 2 0\n"
4465+ "0 3 0\n" ;
4466+ const char * nodes_other =
4467+ "1 0 0\n"
4468+ "1 0 0\n"
4469+ "1 0 0\n"
4470+ "0 4 0\n"
4471+ "0 6 0\n" ;
4472+ const char * edges =
4473+ "0 1 3 0,1\n"
4474+ "0 1 4 2,3\n" ;
4475+ int ret ;
4476+ tsk_treeseq_t ts , other_ts ;
4477+ tsk_tree_t t , other_t ;
4478+ double result = 0 ;
4479+
4480+ tsk_treeseq_from_text (& ts , 1 , nodes , edges , NULL , NULL , NULL , NULL , NULL );
4481+ ret = tsk_tree_init (& t , & ts , 0 );
4482+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4483+ ret = tsk_tree_first (& t );
4484+ CU_ASSERT_EQUAL_FATAL (ret , 1 );
4485+ tsk_treeseq_from_text (& other_ts , 1 , nodes_other , edges , NULL , NULL , NULL , NULL , NULL );
4486+ ret = tsk_tree_init (& other_t , & other_ts , 0 );
4487+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4488+ ret = tsk_tree_first (& other_t );
4489+ CU_ASSERT_EQUAL_FATAL (ret , 1 );
4490+ ret = tsk_tree_kc_distance (& t , & other_t , 0 , & result );
4491+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4492+ CU_ASSERT_EQUAL_FATAL (result , 0 );
4493+ ret = tsk_tree_kc_distance (& t , & other_t , 1 , & result );
4494+ CU_ASSERT_DOUBLE_EQUAL_FATAL (result , 4.243 , 1e-2 );
4495+ tsk_treeseq_free (& ts );
4496+ tsk_treeseq_free (& other_ts );
4497+ tsk_tree_free (& t );
4498+ tsk_tree_free (& other_t );
4499+ }
4500+
4501+ static void
4502+ test_empty_tree_kc (void )
4503+ {
4504+ tsk_treeseq_t ts ;
4505+ tsk_table_collection_t tables ;
4506+ tsk_tree_t t ;
4507+ tsk_id_t v ;
4508+ int ret ;
4509+ double result = 0 ;
4510+
4511+ ret = tsk_table_collection_init (& tables , 0 );
4512+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4513+ ret = tsk_treeseq_init (& ts , & tables , TSK_BUILD_INDEXES );
4514+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_BAD_SEQUENCE_LENGTH );
4515+ tsk_treeseq_free (& ts );
4516+ tables .sequence_length = 1.0 ;
4517+ ret = tsk_treeseq_init (& ts , & tables , TSK_BUILD_INDEXES );
4518+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4519+
4520+ verify_empty_tree_sequence (& ts , 1.0 );
4521+
4522+ ret = tsk_tree_init (& t , & ts , 0 );
4523+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4524+ ret = tsk_tree_first (& t );
4525+ CU_ASSERT_EQUAL_FATAL (ret , 1 );
4526+ CU_ASSERT_EQUAL_FATAL (t .left_root , TSK_NULL );
4527+ CU_ASSERT_EQUAL_FATAL (t .left , 0 );
4528+ CU_ASSERT_EQUAL_FATAL (t .right , 1 );
4529+ CU_ASSERT_EQUAL_FATAL (tsk_tree_get_parent (& t , 0 , & v ), TSK_ERR_NODE_OUT_OF_BOUNDS );
4530+
4531+ ret = tsk_tree_kc_distance (& t , & t , 0 , & result );
4532+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_BAD_PARAM_VALUE );
4533+
4534+ tsk_tree_free (& t );
4535+ tsk_treeseq_free (& ts );
4536+ tsk_table_collection_free (& tables );
4537+ }
4538+
4539+ static void
4540+ test_nonbinary_tree_kc (void )
4541+ {
4542+ const char * nodes =
4543+ "1 0 0\n"
4544+ "1 0 0\n"
4545+ "1 0 0\n"
4546+ "1 0 0\n"
4547+ "0 1 0" ;
4548+ const char * edges =
4549+ "0 1 4 0,1,2,3\n" ;
4550+ tsk_treeseq_t ts ;
4551+ tsk_tree_t t ;
4552+ int ret ;
4553+ double result = 0 ;
4554+
4555+ tsk_treeseq_from_text (& ts , 1 , nodes , edges , NULL , NULL , NULL , NULL , NULL );
4556+ ret = tsk_tree_init (& t , & ts , 0 );
4557+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4558+ ret = tsk_tree_first (& t );
4559+ CU_ASSERT_EQUAL_FATAL (ret , 1 );
4560+ tsk_tree_kc_distance (& t , & t , 0 , & result );
4561+ CU_ASSERT_EQUAL_FATAL (result , 0 );
4562+ tsk_treeseq_free (& ts );
4563+ tsk_tree_free (& t );
4564+ }
4565+
4566+ static void
4567+ test_unequal_samples_kc (void )
4568+ {
4569+ const char * nodes =
4570+ "1 0 0\n"
4571+ "1 0 0\n"
4572+ "1 0 0\n"
4573+ "0 2 0\n"
4574+ "0 3 0\n" ;
4575+ const char * nodes_other =
4576+ "1 0 0\n"
4577+ "1 0 0\n"
4578+ "0 1 0\n" ;
4579+ const char * edges =
4580+ "0 1 3 0,1\n"
4581+ "0 1 4 2,3\n" ;
4582+ const char * edges_other =
4583+ "0 1 2 0,1\n" ;
4584+ int ret ;
4585+ tsk_treeseq_t ts , other_ts ;
4586+ tsk_tree_t t , other_t ;
4587+ double result = 0 ;
4588+
4589+ tsk_treeseq_from_text (& ts , 1 , nodes , edges , NULL , NULL , NULL , NULL , NULL );
4590+ ret = tsk_tree_init (& t , & ts , 0 );
4591+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4592+ ret = tsk_tree_first (& t );
4593+ CU_ASSERT_EQUAL_FATAL (ret , 1 );
4594+ tsk_treeseq_from_text (& other_ts , 1 , nodes_other , edges_other , NULL , NULL , NULL , NULL , NULL );
4595+ ret = tsk_tree_init (& other_t , & other_ts , 0 );
4596+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4597+ ret = tsk_tree_first (& other_t );
4598+ CU_ASSERT_EQUAL_FATAL (ret , 1 );
4599+ ret = tsk_tree_kc_distance (& t , & other_t , 0 , & result );
4600+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_BAD_PARAM_VALUE );
4601+ tsk_treeseq_free (& ts );
4602+ tsk_treeseq_free (& other_ts );
4603+ tsk_tree_free (& t );
4604+ tsk_tree_free (& other_t );
4605+ }
4606+
4607+
4608+
44234609/*=======================================================
44244610 * Miscellaneous tests.
44254611 *======================================================*/
@@ -5108,6 +5294,13 @@ main(int argc, char **argv)
51085294 {"test_nonbinary_sample_sets" , test_nonbinary_sample_sets },
51095295 {"test_internal_sample_sample_sets" , test_internal_sample_sample_sets },
51105296
5297+ /*KC_Distance tests */
5298+ {"test_single_tree_kc" , test_single_tree_kc },
5299+ {"test_two_trees_kc" , test_two_trees_kc },
5300+ {"test_empty_tree_kc" , test_empty_tree_kc },
5301+ {"test_nonbinary_tree_kc" , test_nonbinary_tree_kc },
5302+ {"test_unequal_samples_kc" , test_unequal_samples_kc },
5303+
51115304 /* Misc */
51125305 {"test_tree_errors" , test_tree_errors },
51135306 {"test_tree_copy_flags" , test_tree_copy_flags },
0 commit comments