Add constructor to DefaultShuffleOrder to support sideloaded shuffle orders

Issue: #4915

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=221075615
This commit is contained in:
aquilescanta 2018-11-12 05:11:37 -08:00 committed by Oliver Woodman
parent 2426a047f1
commit f7ed39ee17
2 changed files with 28 additions and 0 deletions

View File

@ -55,6 +55,17 @@ public interface ShuffleOrder {
this(length, new Random(randomSeed));
}
/**
* Creates an instance with a specified shuffle order and the specified random seed. The random
* seed is used for {@link #cloneAndInsert(int, int)} invocations.
*
* @param shuffledIndices The shuffled indices to use as order.
* @param randomSeed A random seed.
*/
public DefaultShuffleOrder(int[] shuffledIndices, long randomSeed) {
this(Arrays.copyOf(shuffledIndices, shuffledIndices.length), new Random(randomSeed));
}
private DefaultShuffleOrder(int length, Random random) {
this(createShuffledList(length, random), random);
}

View File

@ -79,6 +79,23 @@ public final class ShuffleOrderTest {
}
}
@Test
public void testSideloadedShuffleOrder() {
int[] shuffledIndices = new int[] {2, 1, 0, 4, 3};
ShuffleOrder shuffleOrder = new DefaultShuffleOrder(shuffledIndices, RANDOM_SEED);
assertThat(shuffleOrder.getFirstIndex()).isEqualTo(2);
assertThat(shuffleOrder.getLastIndex()).isEqualTo(3);
for (int i = 0; i < 4; i++) {
assertThat(shuffleOrder.getNextIndex(shuffledIndices[i])).isEqualTo(shuffledIndices[i + 1]);
}
assertThat(shuffleOrder.getNextIndex(3)).isEqualTo(C.INDEX_UNSET);
for (int i = 4; i > 0; i--) {
assertThat(shuffleOrder.getPreviousIndex(shuffledIndices[i]))
.isEqualTo(shuffledIndices[i - 1]);
}
assertThat(shuffleOrder.getPreviousIndex(2)).isEqualTo(C.INDEX_UNSET);
}
private static void assertShuffleOrderCorrectness(ShuffleOrder shuffleOrder, int length) {
assertThat(shuffleOrder.getLength()).isEqualTo(length);
if (length == 0) {