Skip to content

Commit 7702c39

Browse files
authored
Merge pull request #78 from molpopgen/streamline_simplification_code
Streamline simplification code
2 parents f52517b + c03215a commit 7702c39

File tree

1 file changed

+31
-37
lines changed

1 file changed

+31
-37
lines changed

src/simplification.rs

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -12,39 +12,27 @@ struct SegmentOverlapper {
1212
right: Position,
1313
qbeg: usize,
1414
qend: usize,
15-
obeg: usize,
16-
oend: usize,
15+
num_overlaps: usize,
1716
}
1817

1918
impl SegmentOverlapper {
2019
fn set_partition(&mut self) -> Position {
2120
let mut tright = Position::MAX;
2221
let mut b: usize = 0;
2322

24-
for i in 0..self.oend {
23+
for i in 0..self.num_overlaps {
2524
if self.overlapping[i].right > self.left {
2625
self.overlapping[b] = self.overlapping[i];
2726
tright = std::cmp::min(tright, self.overlapping[b].right);
2827
b += 1;
2928
}
3029
}
3130

32-
self.oend = b;
31+
self.num_overlaps = b;
3332

3433
tright
3534
}
3635

37-
fn num_overlaps(&self) -> usize {
38-
assert!(
39-
self.oend - self.obeg <= self.overlapping.len(),
40-
"overlap details = {} {} {}",
41-
self.oend,
42-
self.obeg,
43-
self.overlapping.len()
44-
);
45-
self.oend - self.obeg
46-
}
47-
4836
// Public interface below
4937

5038
const fn new() -> SegmentOverlapper {
@@ -55,17 +43,15 @@ impl SegmentOverlapper {
5543
right: Position::MAX,
5644
qbeg: std::usize::MAX,
5745
qend: std::usize::MAX,
58-
obeg: std::usize::MAX,
59-
oend: std::usize::MAX,
46+
num_overlaps: std::usize::MAX,
6047
}
6148
}
6249

6350
fn init(&mut self) {
6451
self.qbeg = 0;
6552
self.qend = self.segment_queue.len() - 1;
6653
assert!(self.qend < self.segment_queue.len());
67-
self.obeg = 0;
68-
self.oend = 0;
54+
self.num_overlaps = 0;
6955
self.overlapping.clear();
7056
}
7157

@@ -88,24 +74,32 @@ impl SegmentOverlapper {
8874
if self.qbeg < self.qend {
8975
self.left = self.right;
9076
let mut tright = self.set_partition();
91-
if self.num_overlaps() == 0 {
77+
if self.num_overlaps == 0 {
9278
self.left = self.segment_queue[self.qbeg].left;
9379
}
94-
while self.qbeg < self.qend && self.segment_queue[self.qbeg].left == self.left {
95-
tright = std::cmp::min(tright, self.segment_queue[self.qbeg].right);
96-
// NOTE: I wonder how efficient this is vs C++?
97-
self.overlapping
98-
.insert(self.oend, self.segment_queue[self.qbeg]);
99-
self.oend += 1;
100-
self.qbeg += 1;
80+
for seg in self
81+
.segment_queue
82+
.iter()
83+
.skip(self.qbeg)
84+
.take(self.qend - self.qbeg)
85+
{
86+
if seg.left == self.left {
87+
tright = std::cmp::min(tright, seg.right);
88+
// NOTE: I wonder how efficient this is vs C++?
89+
self.overlapping.insert(self.num_overlaps, *seg);
90+
self.num_overlaps += 1;
91+
self.qbeg += 1;
92+
} else {
93+
break;
94+
}
10195
}
10296
self.right = std::cmp::min(self.segment_queue[self.qbeg].left, tright);
10397
rv = true;
10498
} else {
10599
self.left = self.right;
106100
self.right = Position::MAX;
107101
let tright = self.set_partition();
108-
if self.num_overlaps() > 0 {
102+
if self.num_overlaps > 0 {
109103
self.right = tright;
110104
rv = true
111105
}
@@ -125,10 +119,6 @@ impl SegmentOverlapper {
125119
fn clear_queue(&mut self) {
126120
self.segment_queue.clear();
127121
}
128-
129-
fn overlap(&self, i: usize) -> &Segment {
130-
&self.overlapping[i]
131-
}
132122
}
133123

134124
type AncestryList = NestedForwardList<Segment>;
@@ -259,8 +249,8 @@ fn merge_ancestors(
259249
state.temp_edge_buffer.clear();
260250

261251
while state.overlapper.advance() {
262-
if state.overlapper.num_overlaps() == 1 {
263-
ancestry_node = state.overlapper.overlap(0).node;
252+
if state.overlapper.num_overlaps == 1 {
253+
ancestry_node = state.overlapper.overlapping[0].node;
264254
if is_sample {
265255
buffer_edge(
266256
state.overlapper.get_left(),
@@ -281,8 +271,12 @@ fn merge_ancestors(
281271
idmap[parent_input_id as usize] = output_id;
282272
}
283273
ancestry_node = output_id;
284-
for i in 0..state.overlapper.num_overlaps() as usize {
285-
let o = &state.overlapper.overlap(i);
274+
for o in state
275+
.overlapper
276+
.overlapping
277+
.iter()
278+
.take(state.overlapper.num_overlaps)
279+
{
286280
buffer_edge(
287281
state.overlapper.get_left(),
288282
state.overlapper.get_right(),
@@ -511,7 +505,7 @@ fn find_pre_existing_edges(
511505

512506
// TODO: this could eventually be called in a debug_assert
513507
if !rv.is_empty() {
514-
for i in 1..rv.len() {
508+
for (i, _) in rv.iter().enumerate().skip(1) {
515509
let t0 = tables.nodes_[rv[i - 1].parent as usize].time;
516510
let t1 = tables.nodes_[rv[i].parent as usize].time;
517511
if t0 < t1 {

0 commit comments

Comments
 (0)