use of searcher.pack.separable_mino.SeparableMino in project solution-finder by knewjade.
the class BuildUpStreamTest method randomShort.
@Test
void randomShort() throws ExecutionException, InterruptedException {
// Initialize
Randoms randoms = new Randoms();
MinoFactory minoFactory = new MinoFactory();
MinoShifter minoShifter = new MinoShifter();
MinoRotation minoRotation = new MinoRotation();
// Define size
int height = 4;
int basicWidth = 3;
SizedBit sizedBit = new SizedBit(basicWidth, height);
SeparableMinos separableMinos = SeparableMinos.createSeparableMinos(minoFactory, minoShifter, sizedBit);
// Create basic solutions
TaskResultHelper taskResultHelper = new Field4x10MinoPackingHelper();
LockedReachableThreadLocal lockedReachableThreadLocal = new LockedReachableThreadLocal(minoFactory, minoShifter, minoRotation, height);
Predicate<ColumnField> memorizedPredicate = (columnField) -> true;
OnDemandBasicSolutions basicSolutions = new OnDemandBasicSolutions(separableMinos, sizedBit, memorizedPredicate);
AtomicInteger counter = new AtomicInteger();
for (int count = 0; count < 10000; count++) {
// Create field
int numOfMinos = randoms.nextInt(1, 7);
Field field = randoms.field(height, numOfMinos);
// Search
List<InOutPairField> inOutPairFields = InOutPairField.createInOutPairFields(basicWidth, height, field);
SolutionFilter solutionFilter = createRandomSolutionFilter(randoms, sizedBit, lockedReachableThreadLocal, field);
PerfectPackSearcher searcher = new PerfectPackSearcher(inOutPairFields, basicSolutions, sizedBit, solutionFilter, taskResultHelper);
Optional<Result> resultOptional = searcher.findAny();
// If found solution
resultOptional.ifPresent(result -> {
counter.incrementAndGet();
LinkedList<MinoOperationWithKey> operationWithKeys = result.getMemento().getSeparableMinoStream(basicWidth).map(SeparableMino::toMinoOperationWithKey).collect(Collectors.toCollection(LinkedList::new));
// Create Pieces
LockedReachable reachable = lockedReachableThreadLocal.get();
Set<List<MinoOperationWithKey>> valid = new BuildUpStream(reachable, height).existsValidBuildPattern(field, operationWithKeys).collect(Collectors.toSet());
PermutationIterable<MinoOperationWithKey> permutations = new PermutationIterable<>(operationWithKeys, operationWithKeys.size());
for (List<MinoOperationWithKey> permutation : permutations) {
boolean canBuild = BuildUp.cansBuild(field, permutation, height, reachable);
if (canBuild) {
assertThat(valid).as(FieldView.toString(field)).contains(permutation);
} else {
assertThat(valid).as(FieldView.toString(field)).doesNotContain(permutation);
}
}
});
}
System.out.println(counter);
}
use of searcher.pack.separable_mino.SeparableMino in project solution-finder by knewjade.
the class FullOperationSeparableMinoComparatorTest method compareMinoFieldEqual.
@Test
void compareMinoFieldEqual() {
List<SeparableMino> minos = separableMinos.getMinos();
Randoms randoms = new Randoms();
int index = randoms.nextInt(minos.size());
SeparableMino mino = minos.get(index);
FullOperationSeparableMinoComparator comparator = new FullOperationSeparableMinoComparator();
assertThat(comparator.compare(mino, mino)).isEqualTo(0);
}
use of searcher.pack.separable_mino.SeparableMino in project solution-finder by knewjade.
the class MinoFieldComparatorTest method compareMinoFieldDiffOuterField.
@Test
void compareMinoFieldDiffOuterField() {
Randoms randoms = new Randoms();
List<SeparableMino> minos = separableMinos.getMinos();
int index = randoms.nextInt(0, minos.size() - 1);
SeparableMino mino = minos.get(index);
RecursiveMinoField recursiveMinoField1 = new RecursiveMinoField(mino, ColumnFieldFactory.createField(), separableMinos);
RecursiveMinoField recursiveMinoField2 = new RecursiveMinoField(mino, ColumnFieldFactory.createField(1L), separableMinos);
MinoFieldComparator comparator = new MinoFieldComparator();
assertThat(comparator.compare(recursiveMinoField1, recursiveMinoField2)).isEqualTo(0);
}
use of searcher.pack.separable_mino.SeparableMino in project solution-finder by knewjade.
the class MinoFieldComparatorTest method compareMinoFieldEqual.
@Test
void compareMinoFieldEqual() {
Randoms randoms = new Randoms();
List<SeparableMino> minos = separableMinos.getMinos();
SeparableMino mino = minos.get(0);
RecursiveMinoField recursiveMinoField1 = new RecursiveMinoField(mino, ColumnFieldFactory.createField(), separableMinos);
RecursiveMinoField recursiveMinoField2 = new RecursiveMinoField(mino, ColumnFieldFactory.createField(), separableMinos);
for (int count = 0; count < 10; count++) {
int index = randoms.nextInt(0, minos.size() - 1);
SeparableMino randomMino = minos.get(index);
recursiveMinoField1 = new RecursiveMinoField(randomMino, recursiveMinoField1, ColumnFieldFactory.createField(), separableMinos);
recursiveMinoField2 = new RecursiveMinoField(randomMino, recursiveMinoField2, ColumnFieldFactory.createField(), separableMinos);
}
MinoFieldComparator comparator = new MinoFieldComparator();
assertThat(comparator.compare(recursiveMinoField1, recursiveMinoField2)).isEqualTo(0);
}
use of searcher.pack.separable_mino.SeparableMino in project solution-finder by knewjade.
the class MinoFieldComparatorTest method compareMinoFieldDiffMino.
@Test
void compareMinoFieldDiffMino() {
Randoms randoms = new Randoms();
List<SeparableMino> minos = separableMinos.getMinos();
MinoFieldComparator comparator = new MinoFieldComparator();
for (int count = 0; count < 100000; count++) {
int index1 = randoms.nextInt(0, minos.size());
SeparableMino mino1 = minos.get(index1);
RecursiveMinoField recursiveMinoField1 = new RecursiveMinoField(mino1, ColumnFieldFactory.createField(), separableMinos);
int index2 = randoms.nextInt(0, minos.size() - 1);
if (index1 == index2)
index2 += 1;
SeparableMino mino2 = minos.get(index2);
RecursiveMinoField recursiveMinoField2 = new RecursiveMinoField(mino2, ColumnFieldFactory.createField(), separableMinos);
// assert is not 0 & sign reversed
assertThat(comparator.compare(recursiveMinoField1, recursiveMinoField2) * comparator.compare(recursiveMinoField2, recursiveMinoField1)).isLessThan(0);
}
}
Aggregations