Skip to content

Commit 90603cf

Browse files
committed
refactor: separate keep_intervals from simplify (#647)
1 parent cb37378 commit 90603cf

File tree

3 files changed

+37
-52
lines changed

3 files changed

+37
-52
lines changed

src/table_collection.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,16 +1379,19 @@ impl TableCollection {
13791379

13801380
/// Truncate the [TableCollection] to specified genome intervals.
13811381
///
1382-
/// # Return
1382+
/// # Return value
13831383
/// - `Ok(None)`: when truncation leads to empty edge table.
13841384
/// - `Ok(Some(TableCollection))`: when trunction is successfully performed
1385-
/// and results in non-empty edge table.
1385+
/// and results in non-empty edge table. The table collection is sorted.
13861386
/// - `Error(TskitError)`: Any errors from the C API propagate. An
13871387
/// [TskitError::RangeError] will occur when `intervals` are not
1388-
/// sorted. Note that as `tskit` currently does not support `simplify`
1389-
/// on [TableCollection] with a non-empty migration table, calling
1390-
/// `keep_intervals` on those [TableCollection] with `simplify` set to
1391-
/// `true` will return an error.
1388+
/// sorted.
1389+
///
1390+
/// # Notes
1391+
///
1392+
/// - There is no option to simplify the output value.
1393+
/// Do so manually if desired.
1394+
/// Encapsulate the procedure if necessary.
13921395
///
13931396
/// # Example
13941397
/// ```rust
@@ -1414,14 +1417,13 @@ impl TableCollection {
14141417
/// # tables.build_index().unwrap();
14151418
/// #
14161419
/// let intervals = [(0.0, 10.0), (90.0, 100.0)].into_iter();
1417-
/// tables.keep_intervals(intervals, true).unwrap().unwrap();
1420+
/// tables.keep_intervals(intervals).unwrap().unwrap();
14181421
/// ```
14191422
///
14201423
/// Note that no new provenance will be appended.
14211424
pub fn keep_intervals<P>(
14221425
self,
14231426
intervals: impl Iterator<Item = (P, P)>,
1424-
simplify: bool,
14251427
) -> Result<Option<Self>, TskitError>
14261428
where
14271429
P: Into<Position>,
@@ -1565,12 +1567,6 @@ impl TableCollection {
15651567
// sort tables
15661568
tables.full_sort(TableSortOptions::default())?;
15671569

1568-
// simplify tables
1569-
if simplify {
1570-
let samples = tables.samples_as_vector();
1571-
tables.simplify(samples.as_slice(), SimplificationOptions::default(), false)?;
1572-
}
1573-
15741570
// return None when edge table is empty
15751571
if tables.edges().num_rows() == 0 {
15761572
Ok(None)

src/test_fixtures.rs

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ mod keep_intervals {
519519
for intervals in intervals_lst {
520520
let add_migration_table = false;
521521
let trees = generate_simple_treesequence(add_migration_table);
522-
let res = trees.keep_intervals(intervals.into_iter(), true);
522+
let res = trees.keep_intervals(intervals.into_iter());
523523
assert!(res.is_err());
524524
}
525525
}
@@ -529,27 +529,13 @@ mod keep_intervals {
529529
let intervals = [(10.0, 20.0)];
530530

531531
let add_migration_table = true;
532-
let to_simplify = true;
533532
let trees = generate_simple_treesequence(add_migration_table);
534-
let res = trees.keep_intervals(intervals.iter().copied(), to_simplify);
535-
assert!(res.is_err());
536-
537-
let add_migration_table = true;
538-
let to_simply = false;
539-
let trees = generate_simple_treesequence(add_migration_table);
540-
let res = trees.keep_intervals(intervals.iter().copied(), to_simply);
541-
assert!(res.is_ok());
542-
543-
let add_migration_table = false;
544-
let to_simply = true;
545-
let trees = generate_simple_treesequence(add_migration_table);
546-
let res = trees.keep_intervals(intervals.iter().copied(), to_simply);
533+
let res = trees.keep_intervals(intervals.iter().copied());
547534
assert!(res.is_ok());
548535

549536
let add_migration_table = false;
550-
let to_simply = false;
551537
let trees = generate_simple_treesequence(add_migration_table);
552-
let res = trees.keep_intervals(intervals.iter().copied(), to_simply);
538+
let res = trees.keep_intervals(intervals.iter().copied());
553539
assert!(res.is_ok());
554540
}
555541

@@ -573,20 +559,23 @@ mod keep_intervals {
573559
.unwrap();
574560

575561
if exepected.edges().num_rows() > 0 {
576-
let truncated = full_trees
577-
.keep_intervals(intervals.iter().copied(), true)
562+
let mut truncated = full_trees
563+
.keep_intervals(intervals.iter().copied())
578564
.expect("error")
579565
.expect("empty table");
566+
let samples = truncated.samples_as_vector();
567+
assert!(truncated.edges().num_rows() > 0);
568+
truncated
569+
.simplify(&samples, crate::SimplificationOptions::default(), false)
570+
.expect("error simplifying");
580571

581572
// dump tables for comparision
582-
let truncated = truncated.dump_tables().unwrap();
583573
let expected = exepected.dump_tables().unwrap();
584-
585574
let res = truncated.equals(&expected, TableEqualityOptions::all());
586575
assert!(res);
587576
} else {
588577
let trucated = full_trees
589-
.keep_intervals(intervals.iter().copied(), true)
578+
.keep_intervals(intervals.iter().copied())
590579
.unwrap();
591580
assert!(trucated.is_none());
592581
}

src/trees/treeseq.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -346,15 +346,19 @@ impl TreeSequence {
346346

347347
/// Truncate the [TreeSequence] to specified genome intervals.
348348
///
349+
/// # Return value
349350
/// - `Ok(None)`: when truncation leads to empty edge table.
350351
/// - `Ok(Some(TableCollection))`: when trunction is successfully performed
351-
/// and results in non-empty edge table.
352+
/// and results in non-empty edge table. The tables are sorted.
352353
/// - `Error(TskitError)`: Any errors from the C API propagate. An
353354
/// [TskitError::RangeError] will occur when `intervals` are not
354-
/// sorted. Note that as `tskit` currently does not support `simplify`
355-
/// on [TreeSequence] with a non-empty migration table, calling
356-
/// `keep_intervals` on those [TreeSequence] with `simplify` set to `true`
357-
/// will return an error.
355+
/// sorted.
356+
///
357+
/// # Notes
358+
///
359+
/// - There is no option to simplify the output value.
360+
/// Do so manually if desired.
361+
/// Encapsulate the procedure if necessary.
358362
///
359363
/// # Example
360364
/// ```rust
@@ -382,26 +386,22 @@ impl TreeSequence {
382386
/// # let trees = TreeSequence::new(tables, TreeSequenceFlags::default()).unwrap();
383387
/// #
384388
/// let intervals = [(0.0, 10.0), (90.0, 100.0)].into_iter();
385-
/// trees.keep_intervals(intervals, true).unwrap().unwrap();
389+
/// let mut tables = trees.keep_intervals(intervals).unwrap().unwrap();
390+
/// // Conversion back to tree sequence requires the usual steps
391+
/// tables.simplify(&tables.samples_as_vector(), tskit::SimplificationOptions::default(), false).unwrap();
392+
/// tables.build_index().unwrap();
393+
/// let trees = tables.tree_sequence(tskit::TreeSequenceFlags::default()).unwrap();
386394
/// ```
387395
///
388396
/// Note that no new provenance will be appended.
389397
pub fn keep_intervals<P>(
390398
self,
391399
intervals: impl Iterator<Item = (P, P)>,
392-
simplify: bool,
393-
) -> Result<Option<Self>, TskitError>
400+
) -> Result<Option<TableCollection>, TskitError>
394401
where
395402
P: Into<Position>,
396403
{
397-
let tables = self.dump_tables()?;
398-
match tables.keep_intervals(intervals, simplify) {
399-
Ok(Some(tables)) => {
400-
Self::new(tables, TreeSequenceFlags::default().build_indexes()).map(Some)
401-
}
402-
Ok(None) => Ok(None),
403-
Err(e) => Err(e),
404-
}
404+
self.dump_tables()?.keep_intervals(intervals)
405405
}
406406

407407
#[cfg(feature = "provenance")]

0 commit comments

Comments
 (0)