@@ -4554,19 +4554,6 @@ tsk_tree_position_prev(tsk_tree_position_t *self)
4554
4554
return self -> index != -1 ;
4555
4555
}
4556
4556
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
-
4570
4557
int TSK_WARN_UNUSED
4571
4558
tsk_tree_position_seek_forward (tsk_tree_position_t * self , tsk_id_t index )
4572
4559
{
@@ -5674,18 +5661,20 @@ tsk_tree_next(tsk_tree_t *self)
5674
5661
const tsk_id_t * restrict edge_parent = tables -> edges .parent ;
5675
5662
const tsk_id_t * restrict edge_child = tables -> edges .child ;
5676
5663
tsk_id_t j , e ;
5664
+ tsk_tree_position_t tree_pos ;
5677
5665
bool valid ;
5678
5666
5679
5667
valid = tsk_tree_position_next (& self -> tree_pos );
5668
+ tree_pos = self -> tree_pos ;
5680
5669
5681
5670
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 ];
5684
5673
tsk_tree_remove_edge (self , edge_parent [e ], edge_child [e ]);
5685
5674
}
5686
5675
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 ];
5689
5678
tsk_tree_insert_edge (self , edge_parent [e ], edge_child [e ], e );
5690
5679
}
5691
5680
ret = TSK_TREE_OK ;
@@ -5704,18 +5693,20 @@ tsk_tree_prev(tsk_tree_t *self)
5704
5693
const tsk_id_t * restrict edge_parent = tables -> edges .parent ;
5705
5694
const tsk_id_t * restrict edge_child = tables -> edges .child ;
5706
5695
tsk_id_t j , e ;
5696
+ tsk_tree_position_t tree_pos ;
5707
5697
bool valid ;
5708
5698
5709
5699
valid = tsk_tree_position_prev (& self -> tree_pos );
5700
+ tree_pos = self -> tree_pos ;
5710
5701
5711
5702
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 ];
5714
5705
tsk_tree_remove_edge (self , edge_parent [e ], edge_child [e ]);
5715
5706
}
5716
5707
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 ];
5719
5710
tsk_tree_insert_edge (self , edge_parent [e ], edge_child [e ], e );
5720
5711
}
5721
5712
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
5741
5732
const tsk_id_t * restrict edge_child = tables -> edges .child ;
5742
5733
const double * restrict edge_left = tables -> edges .left ;
5743
5734
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 ;
5746
5736
const double * restrict breakpoints = self -> tree_sequence -> breakpoints ;
5747
5737
const tsk_size_t num_trees = self -> tree_sequence -> num_trees ;
5748
5738
const double L = tsk_treeseq_get_sequence_length (self -> tree_sequence );
5749
5739
tsk_id_t j , e , index ;
5740
+ tsk_tree_position_t tree_pos ;
5750
5741
5751
5742
index = (tsk_id_t ) tsk_search_sorted (breakpoints , num_trees + 1 , x );
5752
5743
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
5758
5749
if (ret != 0 ) {
5759
5750
goto out ;
5760
5751
}
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 ];
5764
5757
if (edge_left [e ] <= interval_left && interval_left < edge_right [e ]) {
5765
5758
tsk_tree_insert_edge (self , edge_parent [e ], edge_child [e ], e );
5766
5759
}
@@ -5770,9 +5763,10 @@ tsk_tree_seek_from_null(tsk_tree_t *self, double x, tsk_flags_t TSK_UNUSED(optio
5770
5763
if (ret != 0 ) {
5771
5764
goto out ;
5772
5765
}
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 ];
5776
5770
if (edge_right [e ] >= interval_right && interval_right > edge_left [e ]) {
5777
5771
tsk_tree_insert_edge (self , edge_parent [e ], edge_child [e ], e );
5778
5772
}
@@ -6962,23 +6956,19 @@ update_kc_subtree_state(
6962
6956
}
6963
6957
6964
6958
static 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 )
6967
6960
{
6968
6961
int ret = 0 ;
6969
6962
tsk_id_t u , v , e , j ;
6970
6963
double root_time , time ;
6971
6964
const double * restrict times = tree -> tree_sequence -> tables -> nodes .time ;
6972
6965
const tsk_id_t * restrict edges_child = tree -> tree_sequence -> tables -> edges .child ;
6973
6966
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 ;
6978
6968
6979
6969
/* 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 ];
6982
6972
u = edges_child [e ];
6983
6973
depths [u ] = 0 ;
6984
6974
@@ -6992,8 +6982,8 @@ update_kc_incremental(
6992
6982
}
6993
6983
6994
6984
/* 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 ];
6997
6987
u = edges_child [e ];
6998
6988
v = edges_parent [e ];
6999
6989
@@ -7026,17 +7016,11 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
7026
7016
const tsk_treeseq_t * treeseqs [2 ] = { self , other };
7027
7017
tsk_tree_t trees [2 ];
7028
7018
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 ];
7034
7019
tsk_size_t * depths [2 ];
7035
7020
int ret = 0 ;
7036
7021
7037
7022
for (i = 0 ; i < 2 ; i ++ ) {
7038
7023
tsk_memset (& trees [i ], 0 , sizeof (trees [i ]));
7039
- tsk_memset (& tree_pos [i ], 0 , sizeof (tree_pos [i ]));
7040
7024
tsk_memset (& kcs [i ], 0 , sizeof (kcs [i ]));
7041
7025
depths [i ] = NULL ;
7042
7026
}
@@ -7052,10 +7036,6 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
7052
7036
if (ret != 0 ) {
7053
7037
goto out ;
7054
7038
}
7055
- ret = tsk_tree_position_init (& tree_pos [i ], treeseqs [i ], 0 );
7056
- if (ret != 0 ) {
7057
- goto out ;
7058
- }
7059
7039
ret = kc_vectors_alloc (& kcs [i ], n );
7060
7040
if (ret != 0 ) {
7061
7041
goto out ;
@@ -7079,10 +7059,8 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
7079
7059
if (ret != 0 ) {
7080
7060
goto out ;
7081
7061
}
7082
- tsk_tree_position_next (& tree_pos [0 ]);
7083
- tsk_bug_assert (tree_pos [0 ].index == 0 );
7084
7062
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 ]);
7086
7064
if (ret != 0 ) {
7087
7065
goto out ;
7088
7066
}
@@ -7091,17 +7069,11 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
7091
7069
if (ret != 0 ) {
7092
7070
goto out ;
7093
7071
}
7094
- tsk_tree_position_next (& tree_pos [1 ]);
7095
- tsk_bug_assert (tree_pos [1 ].index != -1 );
7096
7072
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 ]);
7098
7074
if (ret != 0 ) {
7099
7075
goto out ;
7100
7076
}
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 );
7105
7077
while (trees [0 ].interval .right < trees [1 ].interval .right ) {
7106
7078
span = trees [0 ].interval .right - left ;
7107
7079
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,
7113
7085
if (ret != 0 ) {
7114
7086
goto out ;
7115
7087
}
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 ]);
7119
7089
if (ret != 0 ) {
7120
7090
goto out ;
7121
7091
}
@@ -7132,7 +7102,6 @@ tsk_treeseq_kc_distance(const tsk_treeseq_t *self, const tsk_treeseq_t *other,
7132
7102
out :
7133
7103
for (i = 0 ; i < 2 ; i ++ ) {
7134
7104
tsk_tree_free (& trees [i ]);
7135
- tsk_tree_position_free (& tree_pos [i ]);
7136
7105
kc_vectors_free (& kcs [i ]);
7137
7106
tsk_safe_free (depths [i ]);
7138
7107
}
0 commit comments