diff options
author | Laurent Mazare <laurent.mazare@gmail.com> | 2023-07-27 09:28:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-27 09:28:47 +0100 |
commit | f291065f6cac82827a47a736ebf78e4fc9c7c569 (patch) | |
tree | d8d7df22f561842bc5ea65f2b7ea3628d89336ab | |
parent | 209f06d7c37503892eac7e0cffe491657de1ab8a (diff) | |
download | candle-f291065f6cac82827a47a736ebf78e4fc9c7c569.tar.gz candle-f291065f6cac82827a47a736ebf78e4fc9c7c569.tar.bz2 candle-f291065f6cac82827a47a736ebf78e4fc9c7c569.zip |
Do not panic on empty ranges. (#257)
-rw-r--r-- | candle-core/src/indexer.rs | 2 | ||||
-rw-r--r-- | candle-core/tests/indexing_tests.rs | 13 |
2 files changed, 14 insertions, 1 deletions
diff --git a/candle-core/src/indexer.rs b/candle-core/src/indexer.rs index c7a9a140..6ab209ca 100644 --- a/candle-core/src/indexer.rs +++ b/candle-core/src/indexer.rs @@ -42,7 +42,7 @@ impl Tensor { Bound::Excluded(n) => *n, Bound::Unbounded => dims[i], }; - let out = x.narrow(current_dim, start, stop - start)?; + let out = x.narrow(current_dim, start, stop.saturating_sub(start))?; current_dim += 1; out } diff --git a/candle-core/tests/indexing_tests.rs b/candle-core/tests/indexing_tests.rs index 6a71b8fb..122f63b0 100644 --- a/candle-core/tests/indexing_tests.rs +++ b/candle-core/tests/indexing_tests.rs @@ -58,6 +58,19 @@ fn range_index() -> Result<()> { let result = tensor.i(..=1)?; assert_eq!(result.dims(), &[2, 3]); assert_eq!(result.to_vec2::<u32>()?, &[[0, 1, 2], [3, 4, 5]]); + + // Empty range + let result = tensor.i(1..1)?; + assert_eq!(result.dims(), &[0, 3]); + let empty: [[u32; 3]; 0] = []; + assert_eq!(result.to_vec2::<u32>()?, &empty); + + // Similar to PyTorch, allow empty ranges when the computed length is negative. + #[allow(clippy::reversed_empty_ranges)] + let result = tensor.i(1..0)?; + assert_eq!(result.dims(), &[0, 3]); + let empty: [[u32; 3]; 0] = []; + assert_eq!(result.to_vec2::<u32>()?, &empty); Ok(()) } |