Skip to content

Commit 3edea96

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 a51eb70 commit 3edea96

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

src/dimension.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -591,10 +591,11 @@ unsafe impl Dimension for (Ix, Ix, Ix) {
591591
}
592592
}
593593
{
594+
// stable sorting network for 3 elements
594595
let order = order.slice_mut();
595596
let strides = stride.slice_mut();
597+
swap![strides, order, 1, 2];
596598
swap![strides, order, 0, 1];
597-
swap![strides, order, 0, 2];
598599
swap![strides, order, 1, 2];
599600
}
600601
order

tests/dimension.rs

+6
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)