Skip to content

Commit 9210f66

Browse files
committed
details
1 parent 10ad843 commit 9210f66

File tree

1 file changed

+82
-12
lines changed

1 file changed

+82
-12
lines changed

src/edge_differences.rs

Lines changed: 82 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,37 +76,107 @@ pub type EdgeRemoval = EdgeDifference<Removal>;
7676
/// Manages iteration over trees to obtain
7777
/// edge differences.
7878
pub struct EdgeDifferencesIterator<'ts> {
79-
edge_left: &'ts [Position],
80-
edge_right: &'ts [Position],
81-
edge_parent: &'ts [NodeId],
82-
edge_child: &'ts [NodeId],
79+
edges_left: &'ts [Position],
80+
edges_right: &'ts [Position],
81+
edges_parent: &'ts [NodeId],
82+
edges_child: &'ts [NodeId],
8383
insertion_order: &'ts [EdgeId],
84-
removal_orderr: &'ts [EdgeId],
84+
removal_order: &'ts [EdgeId],
8585
left: f64,
86+
sequence_length: f64,
87+
insertion_index: usize,
88+
removal_index: usize,
8689
}
8790

8891
impl<'ts> EdgeDifferencesIterator<'ts> {
8992
pub(crate) fn new(treeseq: &'ts TreeSequence) -> Self {
9093
Self {
91-
edge_left: treeseq.tables().edges().left_slice(),
92-
edge_right: treeseq.tables().edges().right_slice(),
93-
edge_parent: treeseq.tables().edges().parent_slice(),
94-
edge_child: treeseq.tables().edges().child_slice(),
94+
edges_left: treeseq.tables().edges().left_slice(),
95+
edges_right: treeseq.tables().edges().right_slice(),
96+
edges_parent: treeseq.tables().edges().parent_slice(),
97+
edges_child: treeseq.tables().edges().child_slice(),
9598
insertion_order: treeseq.edge_insertion_order(),
96-
removal_orderr: treeseq.edge_removal_order(),
99+
removal_order: treeseq.edge_removal_order(),
97100
left: 0.,
101+
sequence_length: treeseq.tables().sequence_length().into(),
102+
insertion_index: 0,
103+
removal_index: 0,
98104
}
99105
}
100106
}
101107

102108
pub struct EdgeDifferences<'ts> {
103-
marker: std::marker::PhantomData<&'ts ()>,
109+
edges_left: &'ts [Position],
110+
edges_right: &'ts [Position],
111+
edges_parent: &'ts [NodeId],
112+
edges_child: &'ts [NodeId],
113+
removals: (usize, usize),
114+
insertions: (usize, usize),
115+
left: f64,
116+
right: f64,
117+
}
118+
119+
fn update_right(
120+
right: f64,
121+
index: usize,
122+
position_slice: &[Position],
123+
diff_slice: &[EdgeId],
124+
) -> f64 {
125+
if index < diff_slice.len() {
126+
let temp = position_slice[diff_slice[index].as_usize()];
127+
if temp < right {
128+
temp.into()
129+
} else {
130+
right
131+
}
132+
} else {
133+
right
134+
}
104135
}
105136

106137
impl<'ts> Iterator for EdgeDifferencesIterator<'ts> {
107138
type Item = EdgeDifferences<'ts>;
108139

109140
fn next(&mut self) -> Option<Self::Item> {
110-
todo!()
141+
if self.insertion_index < self.insertion_order.len() && self.left < self.sequence_length {
142+
let removals_start = self.removal_index;
143+
while self.removal_index < self.removal_order.len()
144+
&& self.edges_right[self.removal_index] == self.left
145+
{
146+
self.removal_index += 1;
147+
}
148+
let right = update_right(
149+
self.sequence_length,
150+
self.insertion_index,
151+
self.edges_left,
152+
self.insertion_order,
153+
);
154+
let right = update_right(
155+
right,
156+
self.removal_index,
157+
self.edges_right,
158+
self.removal_order,
159+
);
160+
let insertions_start = self.insertion_index;
161+
while self.insertion_index < self.insertion_order.len()
162+
&& self.edges_left[self.insertion_index] == self.left
163+
{
164+
self.insertion_index += 1;
165+
}
166+
let diffs = EdgeDifferences {
167+
edges_left: self.edges_left,
168+
edges_right: self.edges_right,
169+
edges_parent: self.edges_parent,
170+
edges_child: self.edges_child,
171+
removals: (removals_start, self.removal_index),
172+
insertions: (insertions_start, self.insertion_index),
173+
left: self.left,
174+
right,
175+
};
176+
self.left = right;
177+
Some(diffs)
178+
} else {
179+
None
180+
}
111181
}
112182
}

0 commit comments

Comments
 (0)