Skip to content

Commit 26f3af8

Browse files
committed
more
1 parent 284352d commit 26f3af8

File tree

2 files changed

+115
-9
lines changed

2 files changed

+115
-9
lines changed

src/sys/tree.rs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,11 +201,17 @@ impl<'treeseq> LLTree<'treeseq> {
201201
}
202202

203203
pub fn left_child_array(&self) -> &[NodeId] {
204-
super::generate_slice(self.as_ll_ref().left_child, self.treeseq.num_nodes_raw() + 1)
204+
super::generate_slice(
205+
self.as_ll_ref().left_child,
206+
self.treeseq.num_nodes_raw() + 1,
207+
)
205208
}
206209

207210
pub fn right_child_array(&self) -> &[NodeId] {
208-
super::generate_slice(self.as_ll_ref().right_child, self.treeseq.num_nodes_raw() + 1)
211+
super::generate_slice(
212+
self.as_ll_ref().right_child,
213+
self.treeseq.num_nodes_raw() + 1,
214+
)
209215
}
210216

211217
pub fn total_branch_length(&self, by_span: bool) -> Result<Time, TskitError> {
@@ -238,6 +244,34 @@ impl<'treeseq> LLTree<'treeseq> {
238244
let i = self.interval();
239245
i.1 - i.0
240246
}
247+
248+
pub fn left_sample_array(&self) -> Result<&[NodeId], TskitError> {
249+
err_if_not_tracking_samples!(
250+
self.flags,
251+
super::generate_slice(
252+
self.as_ll_ref().left_sample,
253+
self.treeseq.num_nodes_raw() + 1
254+
)
255+
)
256+
}
257+
258+
pub fn right_sample_array(&self) -> Result<&[NodeId], TskitError> {
259+
err_if_not_tracking_samples!(
260+
self.flags,
261+
super::generate_slice(
262+
self.as_ll_ref().right_sample,
263+
self.treeseq.num_nodes_raw() + 1
264+
)
265+
)
266+
}
267+
268+
pub fn kc_distance(&self, other: &Self, lambda: f64) -> Result<f64, TskitError> {
269+
let mut kc = f64::NAN;
270+
let kcp: *mut f64 = &mut kc;
271+
let code =
272+
unsafe { bindings::tsk_tree_kc_distance(self.as_ptr(), other.as_ptr(), lambda, kcp) };
273+
handle_tsk_return_value!(code, kc)
274+
}
241275
}
242276

243277
// Trait defining iteration over nodes.

src/trees/tree.rs

Lines changed: 79 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -339,17 +339,89 @@ impl<'treeseq> Tree<'treeseq> {
339339
X
340340
}
341341

342-
pub fn left_sample_array(&self) {
343-
X
342+
/// # Failing examples
343+
///
344+
/// An error will be returned if ['crate::TreeFlags::SAMPLE_LISTS`] is not used:
345+
///
346+
/// ```should_panic
347+
/// use streaming_iterator::StreamingIterator;
348+
/// let tables = tskit::TableCollection::new(1.).unwrap();
349+
/// let treeseq =
350+
/// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
351+
/// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap(); // Error
352+
/// while let Some(tree) = tree_iter.next() {
353+
/// let l = tree.left_sample_array().unwrap();
354+
/// for _ in l {}
355+
/// }
356+
/// ```
357+
///
358+
/// The lifetime of the slice is tied to the parent object:
359+
///
360+
/// ```compile_fail
361+
/// use streaming_iterator::StreamingIterator;
362+
/// let tables = tskit::TableCollection::new(1.).unwrap();
363+
/// let treeseq =
364+
/// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
365+
/// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::SAMPLE_LISTS).unwrap();
366+
/// while let Some(tree) = tree_iter.next() {
367+
/// let l = tree.left_sample_array().unwrap();
368+
/// drop(tree_iter);
369+
/// for _ in l {} // Error
370+
/// }
371+
/// ```
372+
pub fn left_sample_array(&self) -> Result<&[NodeId], TskitError> {
373+
self.inner.left_sample_array()
344374
}
345375

346-
pub fn right_sample_array(&self) {
347-
x
376+
/// # Failing examples
377+
///
378+
/// An error will be returned if ['crate::TreeFlags::SAMPLE_LISTS`] is not used:
379+
///
380+
/// ```should_panic
381+
/// use streaming_iterator::StreamingIterator;
382+
/// let tables = tskit::TableCollection::new(1.).unwrap();
383+
/// let treeseq =
384+
/// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
385+
/// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::default()).unwrap(); // ERROR
386+
/// while let Some(tree) = tree_iter.next() {
387+
/// let r = tree.right_sample_array().unwrap();
388+
/// for _ in r {}
389+
/// }
390+
/// ```
391+
///
392+
/// The lifetime of the slice is tied to the parent object:
393+
///
394+
/// ```compile_fail
395+
/// use streaming_iterator::StreamingIterator;
396+
/// let tables = tskit::TableCollection::new(1.).unwrap();
397+
/// let treeseq =
398+
/// tables.tree_sequence(tskit::TreeSequenceFlags::BUILD_INDEXES).unwrap();
399+
/// let mut tree_iter = treeseq.tree_iterator(tskit::TreeFlags::SAMPLE_LISTS).unwrap();
400+
/// while let Some(tree) = tree_iter.next() {
401+
/// let r = tree.right_sample_array().unwrap();
402+
/// drop(tree_iter);
403+
/// for _ in r {} // ERROR
404+
/// }
405+
/// ```
406+
pub fn right_sample_array(&self) -> Result<&[NodeId], TskitError> {
407+
self.inner.right_sample_array()
348408
}
349409

350-
left_sample
351-
right_sample
352-
kc_distance
410+
/// Calculate the average Kendall-Colijn (`K-C`) distance between
411+
/// pairs of trees whose intervals overlap.
412+
///
413+
/// # Note
414+
///
415+
/// * [Citation](https://doi.org/10.1093/molbev/msw124)
416+
///
417+
/// # Parameters
418+
///
419+
/// * `lambda` specifies the relative weight of topology and branch length.
420+
/// If `lambda` is 0, we only consider topology.
421+
/// If `lambda` is 1, we only consider branch lengths.
422+
pub fn kc_distance(&self, other: &Self, lambda: f64) -> Result<f64, TskitError> {
423+
self.inner.kc_distance(&other.inner, lambda)
424+
}
353425
}
354426

355427
impl<'ts> streaming_iterator::StreamingIterator for Tree<'ts> {

0 commit comments

Comments
 (0)