Config.java
package com.github.dakusui.jcunitx.pipeline;
import com.github.dakusui.jcunitx.core.AArray;
import com.github.dakusui.jcunitx.factorspace.Constraint;
import com.github.dakusui.jcunitx.factorspace.Factor;
import com.github.dakusui.jcunitx.factorspace.FactorSpace;
import com.github.dakusui.jcunitx.metamodel.ParameterSpace;
import com.github.dakusui.jcunitx.pipeline.stages.Encoder;
import com.github.dakusui.jcunitx.pipeline.stages.Generator;
import com.github.dakusui.jcunitx.pipeline.stages.Joiner;
import com.github.dakusui.jcunitx.pipeline.stages.Partitioner;
import com.github.dakusui.jcunitx.testsuite.SchemafulAArraySet;
import java.util.List;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import static java.util.Collections.singletonList;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.toList;
public interface Config {
Requirement getRequirement();
/**
* Returns a function that encodes a parameter space into internal factor spaces.
*
* @return A function that encodes a parameter space.
*/
Function<ParameterSpace, FactorSpace> encoder();
Function<FactorSpace, List<FactorSpace>> partitioner();
Function<FactorSpace, SchemafulAArraySet> generator(ParameterSpace parameterSpace, Requirement requirement);
BinaryOperator<SchemafulAArraySet> joiner();
Function<? super FactorSpace, ? extends FactorSpace> optimizer();
class Builder {
private final Requirement requirement;
private Generator.Factory generatorFactory;
private Joiner joiner;
private Partitioner partitioner;
public static Builder forTuple(Requirement requirement) {
return new Builder(requirement);
}
public Builder(Requirement requirement) {
this.requirement = requirement;
this.withJoiner(new Joiner.Standard(requirement))
.withPartitioner(new Partitioner.Standard(requirement))
.withGeneratorFactory(new Generator.Factory.Standard());
}
public Builder withGeneratorFactory(Generator.Factory generatorFactory) {
this.generatorFactory = generatorFactory;
return this;
}
public Builder withJoiner(Joiner joiner) {
this.joiner = joiner;
return this;
}
public Builder withPartitioner(Partitioner partitioner) {
this.partitioner = partitioner;
return this;
}
public Config build() {
return new Impl(requirement, generatorFactory, joiner, partitioner);
}
}
class Impl implements Config {
private final Generator.Factory generatorFactory;
private final Joiner joiner;
private final Partitioner partitioner;
private final Requirement requirement;
private final Encoder encoder;
public Impl(Requirement requirement, Generator.Factory generatorFactory, Joiner joiner, Partitioner partitioner) {
this.generatorFactory = requireNonNull(generatorFactory);
this.encoder = new Encoder.Standard();
this.joiner = requireNonNull(joiner);
this.partitioner = requireNonNull(partitioner);
this.requirement = requireNonNull(requirement);
}
@Override
public Function<ParameterSpace, FactorSpace> encoder() {
return this.encoder;
}
@Override
public Function<FactorSpace, List<FactorSpace>> partitioner() {
return partitioner;
}
@Override
public Function<FactorSpace, SchemafulAArraySet> generator(ParameterSpace parameterSpace, Requirement requirement) {
return (FactorSpace factorSpace) -> new SchemafulAArraySet.Builder(
factorSpace.getFactors().stream(
).map(
Factor::getName
).collect(
toList()
)
).addAll(
generatorFactory.create(
factorSpace,
requirement,
ParameterSpace.encodeSeeds(parameterSpace, requirement.seeds())
).generate()
).build();
}
@Override
public BinaryOperator<SchemafulAArraySet> joiner() {
return joiner;
}
@Override
public Requirement getRequirement() {
return requirement;
}
/**
* Returns a function that removes levels that cannot be valid because single
* parameter constraints invalidate them.
*/
@Override
public Function<? super FactorSpace, ? extends FactorSpace> optimizer() {
return (FactorSpace factorSpace) -> FactorSpace.create(
factorSpace.getFactors().stream()
.map(
(Factor factor) -> Factor.create(
factor.getName(),
factor.getLevels()
.stream()
.filter(
(Object o) -> factorSpace.getConstraints()
.stream()
.filter((Constraint constraint) -> singletonList(factor.getName()).equals(constraint.involvedKeys()))
.allMatch((Constraint constraint) -> constraint.test(new AArray.Builder().put(factor.getName(), o).build()))
)
.collect(toList()).toArray()
))
.collect(toList()),
factorSpace.getConstraints().stream()
.filter(
(Constraint constraint) -> constraint.involvedKeys().size() > 1
)
.collect(toList())
);
}
}
}