@@ -4554,19 +4554,6 @@ tsk_tree_position_prev(tsk_tree_position_t *self)
45544554 return self -> index != -1 ;
45554555}
45564556
4557- bool
4558- tsk_tree_position_step (tsk_tree_position_t * self , int direction )
4559- {
4560- bool ret = false;
4561-
4562- if (direction == TSK_DIR_FORWARD ) {
4563- ret = tsk_tree_position_next (self );
4564- } else if (direction == TSK_DIR_REVERSE ) {
4565- ret = tsk_tree_position_prev (self );
4566- }
4567- return ret ;
4568- }
4569-
45704557int TSK_WARN_UNUSED
45714558tsk_tree_position_seek_forward (tsk_tree_position_t * self , tsk_id_t index )
45724559{
@@ -5674,18 +5661,20 @@ tsk_tree_next(tsk_tree_t *self)
56745661 const tsk_id_t * restrict edge_parent = tables -> edges .parent ;
56755662 const tsk_id_t * restrict edge_child = tables -> edges .child ;
56765663 tsk_id_t j , e ;
5664+ tsk_tree_position_t tree_pos ;
56775665 bool valid ;
56785666
56795667 valid = tsk_tree_position_next (& self -> tree_pos );
5668+ tree_pos = self -> tree_pos ;
56805669
56815670 if (valid ) {
5682- for (j = self -> tree_pos .out .start ; j != self -> tree_pos .out .stop ; j ++ ) {
5683- e = self -> tree_pos .out .order [j ];
5671+ for (j = tree_pos .out .start ; j != tree_pos .out .stop ; j ++ ) {
5672+ e = tree_pos .out .order [j ];
56845673 tsk_tree_remove_edge (self , edge_parent [e ], edge_child [e ]);
56855674 }
56865675
5687- for (j = self -> tree_pos .in .start ; j != self -> tree_pos .in .stop ; j ++ ) {
5688- e = self -> tree_pos .in .order [j ];
5676+ for (j = tree_pos .in .start ; j != tree_pos .in .stop ; j ++ ) {
5677+ e = tree_pos .in .order [j ];
56895678 tsk_tree_insert_edge (self , edge_parent [e ], edge_child [e ], e );
56905679 }
56915680 ret = TSK_TREE_OK ;
@@ -5704,18 +5693,20 @@ tsk_tree_prev(tsk_tree_t *self)
57045693 const tsk_id_t * restrict edge_parent = tables -> edges .parent ;
57055694 const tsk_id_t * restrict edge_child = tables -> edges .child ;
57065695 tsk_id_t j , e ;
5696+ tsk_tree_position_t tree_pos ;
57075697 bool valid ;
57085698
57095699 valid = tsk_tree_position_prev (& self -> tree_pos );
5700+ tree_pos = self -> tree_pos ;
57105701
57115702 if (valid ) {
5712- for (j = self -> tree_pos .out .start ; j != self -> tree_pos .out .stop ; j -- ) {
5713- e = self -> tree_pos .out .order [j ];
5703+ for (j = tree_pos .out .start ; j != tree_pos .out .stop ; j -- ) {
5704+ e = tree_pos .out .order [j ];
57145705 tsk_tree_remove_edge (self , edge_parent [e ], edge_child [e ]);
57155706 }
57165707
5717- for (j = self -> tree_pos .in .start ; j != self -> tree_pos .in .stop ; j -- ) {
5718- e = self -> tree_pos .in .order [j ];
5708+ for (j = tree_pos .in .start ; j != tree_pos .in .stop ; j -- ) {
5709+ e = tree_pos .in .order [j ];
57195710 tsk_tree_insert_edge (self , edge_parent [e ], edge_child [e ], e );
57205711 }
57215712 ret = TSK_TREE_OK ;
@@ -5741,12 +5732,12 @@ tsk_tree_seek_from_null(tsk_tree_t *self, double x, tsk_flags_t TSK_UNUSED(optio
57415732 const tsk_id_t * restrict edge_child = tables -> edges .child ;
57425733 const double * restrict edge_left = tables -> edges .left ;
57435734 const double * restrict edge_right = tables -> edges .right ;
5744- double interval_left = self -> interval .left ;
5745- double interval_right = self -> interval .right ;
5735+ double interval_left , interval_right ;
57465736 const double * restrict breakpoints = self -> tree_sequence -> breakpoints ;
57475737 const tsk_size_t num_trees = self -> tree_sequence -> num_trees ;
57485738 const double L = tsk_treeseq_get_sequence_length (self -> tree_sequence );
57495739 tsk_id_t j , e , index ;
5740+ tsk_tree_position_t tree_pos ;
57505741
57515742 index = (tsk_id_t ) tsk_search_sorted (breakpoints , num_trees + 1 , x );
57525743 if (breakpoints [index ] > x ) {
@@ -5758,9 +5749,11 @@ tsk_tree_seek_from_null(tsk_tree_t *self, double x, tsk_flags_t TSK_UNUSED(optio
57585749 if (ret != 0 ) {
57595750 goto out ;
57605751 }
5761- interval_left = self -> tree_pos .interval .left ;
5762- for (j = self -> tree_pos .in .start ; j != self -> tree_pos .in .stop ; j ++ ) {
5763- e = self -> tree_pos .in .order [j ];
5752+ // Since we are seeking from null, there are no edges to remove
5753+ tree_pos = self -> tree_pos ;
5754+ interval_left = tree_pos .interval .left ;
5755+ for (j = tree_pos .in .start ; j != tree_pos .in .stop ; j ++ ) {
5756+ e = tree_pos .in .order [j ];
57645757 if (edge_left [e ] <= interval_left && interval_left < edge_right [e ]) {
57655758 tsk_tree_insert_edge (self , edge_parent [e ], edge_child [e ], e );
57665759 }
@@ -5770,9 +5763,10 @@ tsk_tree_seek_from_null(tsk_tree_t *self, double x, tsk_flags_t TSK_UNUSED(optio
57705763 if (ret != 0 ) {
57715764 goto out ;
57725765 }
5773- interval_right = self -> tree_pos .interval .right ;
5774- for (j = self -> tree_pos .in .start ; j != self -> tree_pos .in .stop ; j -- ) {
5775- e = self -> tree_pos .in .order [j ];
5766+ tree_pos = self -> tree_pos ;
5767+ interval_right = tree_pos .interval .right ;
5768+ for (j = tree_pos .in .start ; j != tree_pos .in .stop ; j -- ) {
5769+ e = tree_pos .in .order [j ];
57765770 if (edge_right [e ] >= interval_right && interval_right > edge_left [e ]) {
57775771 tsk_tree_insert_edge (self , edge_parent [e ], edge_child [e ], e );
57785772 }
@@ -6962,23 +6956,19 @@ update_kc_subtree_state(
69626956}
69636957
69646958static int
6965- update_kc_incremental (
6966- tsk_tree_t * tree , kc_vectors * kc , tsk_tree_position_t * tree_pos , tsk_size_t * depths )
6959+ update_kc_incremental (tsk_tree_t * tree , kc_vectors * kc , tsk_size_t * depths )
69676960{
69686961 int ret = 0 ;
69696962 tsk_id_t u , v , e , j ;
69706963 double root_time , time ;
69716964 const double * restrict times = tree -> tree_sequence -> tables -> nodes .time ;
69726965 const tsk_id_t * restrict edges_child = tree -> tree_sequence -> tables -> edges .child ;
69736966 const tsk_id_t * restrict edges_parent = tree -> tree_sequence -> tables -> edges .parent ;
6974-
6975- tsk_bug_assert (tree_pos -> index == tree -> index );
6976- tsk_bug_assert (tree_pos -> interval .left == tree -> interval .left );
6977- tsk_bug_assert (tree_pos -> interval .right == tree -> interval .right );
6967+ tsk_tree_position_t tree_pos = tree -> tree_pos ;
69786968
69796969 /* Update state of detached subtrees */
6980- for (j = tree_pos -> out .stop - 1 ; j >= tree_pos -> out .start ; j -- ) {
6981- e = tree_pos -> out .order [j ];
6970+ for (j = tree_pos . out .stop - 1 ; j >= tree_pos . out .start ; j -- ) {
6971+ e = tree_pos . out .order [j ];
69826972 u = edges_child [e ];
69836973 depths [u ] = 0 ;
69846974
@@ -6992,8 +6982,8 @@ update_kc_incremental(
69926982 }
69936983
69946984 /* Propagate state change down into reattached subtrees. */
6995- for (j = tree_pos -> in .stop - 1 ; j >= tree_pos -> in .start ; j -- ) {
6996- e = tree_pos -> in .order [j ];
6985+ for (j = tree_pos . in .stop - 1 ; j >= tree_pos . in .start ; j -- ) {
6986+ e = tree_pos . in .order [j ];
69976987 u = edges_child [e ];
69986988 v = edges_parent [e ];
69996989
@@ -7026,17 +7016,11 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
70267016 const tsk_treeseq_t * treeseqs [2 ] = { self , other };
70277017 tsk_tree_t trees [2 ];
70287018 kc_vectors kcs [2 ];
7029- /* TODO the tree_pos here is redundant because we should be using this interally
7030- * in the trees to do the advancing. Once we have converted the tree over to using
7031- * tree_pos internally, we can get rid of these tree_pos variables and use
7032- * the values stored in the trees themselves */
7033- tsk_tree_position_t tree_pos [2 ];
70347019 tsk_size_t * depths [2 ];
70357020 int ret = 0 ;
70367021
70377022 for (i = 0 ; i < 2 ; i ++ ) {
70387023 tsk_memset (& trees [i ], 0 , sizeof (trees [i ]));
7039- tsk_memset (& tree_pos [i ], 0 , sizeof (tree_pos [i ]));
70407024 tsk_memset (& kcs [i ], 0 , sizeof (kcs [i ]));
70417025 depths [i ] = NULL ;
70427026 }
@@ -7052,10 +7036,6 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
70527036 if (ret != 0 ) {
70537037 goto out ;
70547038 }
7055- ret = tsk_tree_position_init (& tree_pos [i ], treeseqs [i ], 0 );
7056- if (ret != 0 ) {
7057- goto out ;
7058- }
70597039 ret = kc_vectors_alloc (& kcs [i ], n );
70607040 if (ret != 0 ) {
70617041 goto out ;
@@ -7079,10 +7059,8 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
70797059 if (ret != 0 ) {
70807060 goto out ;
70817061 }
7082- tsk_tree_position_next (& tree_pos [0 ]);
7083- tsk_bug_assert (tree_pos [0 ].index == 0 );
70847062
7085- ret = update_kc_incremental (& trees [0 ], & kcs [0 ], & tree_pos [ 0 ], depths [0 ]);
7063+ ret = update_kc_incremental (& trees [0 ], & kcs [0 ], depths [0 ]);
70867064 if (ret != 0 ) {
70877065 goto out ;
70887066 }
@@ -7091,17 +7069,11 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
70917069 if (ret != 0 ) {
70927070 goto out ;
70937071 }
7094- tsk_tree_position_next (& tree_pos [1 ]);
7095- tsk_bug_assert (tree_pos [1 ].index != -1 );
70967072
7097- ret = update_kc_incremental (& trees [1 ], & kcs [1 ], & tree_pos [ 1 ], depths [1 ]);
7073+ ret = update_kc_incremental (& trees [1 ], & kcs [1 ], depths [1 ]);
70987074 if (ret != 0 ) {
70997075 goto out ;
71007076 }
7101- tsk_bug_assert (trees [0 ].interval .left == tree_pos [0 ].interval .left );
7102- tsk_bug_assert (trees [0 ].interval .right == tree_pos [0 ].interval .right );
7103- tsk_bug_assert (trees [1 ].interval .left == tree_pos [1 ].interval .left );
7104- tsk_bug_assert (trees [1 ].interval .right == tree_pos [1 ].interval .right );
71057077 while (trees [0 ].interval .right < trees [1 ].interval .right ) {
71067078 span = trees [0 ].interval .right - left ;
71077079 total += norm_kc_vectors (& kcs [0 ], & kcs [1 ], lambda_ ) * span ;
@@ -7113,9 +7085,7 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
71137085 if (ret != 0 ) {
71147086 goto out ;
71157087 }
7116- tsk_tree_position_next (& tree_pos [0 ]);
7117- tsk_bug_assert (tree_pos [0 ].index != -1 );
7118- ret = update_kc_incremental (& trees [0 ], & kcs [0 ], & tree_pos [0 ], depths [0 ]);
7088+ ret = update_kc_incremental (& trees [0 ], & kcs [0 ], depths [0 ]);
71197089 if (ret != 0 ) {
71207090 goto out ;
71217091 }
@@ -7132,7 +7102,6 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
71327102out :
71337103 for (i = 0 ; i < 2 ; i ++ ) {
71347104 tsk_tree_free (& trees [i ]);
7135- tsk_tree_position_free (& tree_pos [i ]);
71367105 kc_vectors_free (& kcs [i ]);
71377106 tsk_safe_free (depths [i ]);
71387107 }
0 commit comments