Skip to content

Commit 204df7c

Browse files
committed
Fix _fastest_varying_stride_order to always be a stable sort order
This adds a test that ensures order indices are unique even when strides are equal.
1 parent af2cd32 commit 204df7c

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

src/dimension.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,10 +585,11 @@ unsafe impl Dimension for (Ix, Ix, Ix) {
585585
}
586586
}
587587
{
588+
// stable sorting network for 3 elements
588589
let order = order.slice_mut();
589590
let strides = stride.slice_mut();
591+
swap![strides, order, 1, 2];
590592
swap![strides, order, 0, 1];
591-
swap![strides, order, 0, 2];
592593
swap![strides, order, 1, 2];
593594
}
594595
order

tests/dimension.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,5 +51,11 @@ fn fastest_varying_order() {
5151
assert_eq!((1, 3)._fastest_varying_stride_order(), (0, 1));
5252
assert_eq!((7, 2)._fastest_varying_stride_order(), (1, 0));
5353
assert_eq!((6, 1, 3)._fastest_varying_stride_order(), (1, 2, 0));
54+
55+
// it's important that it produces distinct indices. Prefer the stable order
56+
// where 0 is before 1 when they are equal.
57+
assert_eq!((2, 2)._fastest_varying_stride_order(), (0, 1));
58+
assert_eq!((2, 2, 1)._fastest_varying_stride_order(), (2, 0, 1));
59+
assert_eq!((2, 2, 3, 1, 2)._fastest_varying_stride_order(), (3, 0, 1, 4, 2));
5460
}
5561

0 commit comments

Comments
 (0)