Config.java

  1. package com.github.dakusui.jcunitx.pipeline;

  2. import com.github.dakusui.jcunitx.core.AArray;
  3. import com.github.dakusui.jcunitx.factorspace.Constraint;
  4. import com.github.dakusui.jcunitx.factorspace.Factor;
  5. import com.github.dakusui.jcunitx.factorspace.FactorSpace;
  6. import com.github.dakusui.jcunitx.metamodel.ParameterSpace;
  7. import com.github.dakusui.jcunitx.pipeline.stages.Encoder;
  8. import com.github.dakusui.jcunitx.pipeline.stages.Generator;
  9. import com.github.dakusui.jcunitx.pipeline.stages.Joiner;
  10. import com.github.dakusui.jcunitx.pipeline.stages.Partitioner;
  11. import com.github.dakusui.jcunitx.testsuite.SchemafulAArraySet;

  12. import java.util.List;
  13. import java.util.function.BinaryOperator;
  14. import java.util.function.Function;

  15. import static java.util.Collections.singletonList;
  16. import static java.util.Objects.requireNonNull;
  17. import static java.util.stream.Collectors.toList;

  18. public interface Config {
  19.   Requirement getRequirement();

  20.   /**
  21.    * Returns a function that encodes a parameter space into internal factor spaces.
  22.    *
  23.    * @return A function that encodes a parameter space.
  24.    */
  25.   Function<ParameterSpace, FactorSpace> encoder();

  26.   Function<FactorSpace, List<FactorSpace>> partitioner();

  27.   Function<FactorSpace, SchemafulAArraySet> generator(ParameterSpace parameterSpace, Requirement requirement);

  28.   BinaryOperator<SchemafulAArraySet> joiner();

  29.   Function<? super FactorSpace, ? extends FactorSpace> optimizer();

  30.   class Builder {
  31.     private final Requirement       requirement;
  32.     private       Generator.Factory generatorFactory;
  33.     private       Joiner            joiner;
  34.     private       Partitioner       partitioner;

  35.     public static Builder forTuple(Requirement requirement) {
  36.       return new Builder(requirement);
  37.     }

  38.     public Builder(Requirement requirement) {
  39.       this.requirement = requirement;
  40.       this.withJoiner(new Joiner.Standard(requirement))
  41.           .withPartitioner(new Partitioner.Standard(requirement))
  42.           .withGeneratorFactory(new Generator.Factory.Standard());
  43.     }

  44.     public Builder withGeneratorFactory(Generator.Factory generatorFactory) {
  45.       this.generatorFactory = generatorFactory;
  46.       return this;
  47.     }

  48.     public Builder withJoiner(Joiner joiner) {
  49.       this.joiner = joiner;
  50.       return this;
  51.     }

  52.     public Builder withPartitioner(Partitioner partitioner) {
  53.       this.partitioner = partitioner;
  54.       return this;
  55.     }

  56.     public Config build() {
  57.       return new Impl(requirement, generatorFactory, joiner, partitioner);
  58.     }
  59.   }

  60.   class Impl implements Config {
  61.     private final Generator.Factory generatorFactory;
  62.     private final Joiner            joiner;
  63.     private final Partitioner       partitioner;
  64.     private final Requirement       requirement;
  65.     private final Encoder           encoder;

  66.     public Impl(Requirement requirement, Generator.Factory generatorFactory, Joiner joiner, Partitioner partitioner) {
  67.       this.generatorFactory = requireNonNull(generatorFactory);
  68.       this.encoder = new Encoder.Standard();
  69.       this.joiner = requireNonNull(joiner);
  70.       this.partitioner = requireNonNull(partitioner);
  71.       this.requirement = requireNonNull(requirement);
  72.     }

  73.     @Override
  74.     public Function<ParameterSpace, FactorSpace> encoder() {
  75.       return this.encoder;
  76.     }

  77.     @Override
  78.     public Function<FactorSpace, List<FactorSpace>> partitioner() {
  79.       return partitioner;
  80.     }

  81.     @Override
  82.     public Function<FactorSpace, SchemafulAArraySet> generator(ParameterSpace parameterSpace, Requirement requirement) {
  83.       return (FactorSpace factorSpace) -> new SchemafulAArraySet.Builder(
  84.           factorSpace.getFactors().stream(
  85.           ).map(
  86.               Factor::getName
  87.           ).collect(
  88.               toList()
  89.           )
  90.       ).addAll(
  91.           generatorFactory.create(
  92.               factorSpace,
  93.               requirement,
  94.               ParameterSpace.encodeSeeds(parameterSpace, requirement.seeds())
  95.           ).generate()
  96.       ).build();
  97.     }

  98.     @Override
  99.     public BinaryOperator<SchemafulAArraySet> joiner() {
  100.       return joiner;
  101.     }

  102.     @Override
  103.     public Requirement getRequirement() {
  104.       return requirement;
  105.     }

  106.     /**
  107.      * Returns a function that removes levels that cannot be valid because single
  108.      * parameter constraints invalidate them.
  109.      */
  110.     @Override
  111.     public Function<? super FactorSpace, ? extends FactorSpace> optimizer() {
  112.       return (FactorSpace factorSpace) -> FactorSpace.create(
  113.           factorSpace.getFactors().stream()
  114.               .map(
  115.                   (Factor factor) -> Factor.create(
  116.                       factor.getName(),
  117.                       factor.getLevels()
  118.                           .stream()
  119.                           .filter(
  120.                               (Object o) -> factorSpace.getConstraints()
  121.                                   .stream()
  122.                                   .filter((Constraint constraint) -> singletonList(factor.getName()).equals(constraint.involvedKeys()))
  123.                                   .allMatch((Constraint constraint) -> constraint.test(new AArray.Builder().put(factor.getName(), o).build()))
  124.                           )
  125.                           .collect(toList()).toArray()
  126.                   ))
  127.               .collect(toList()),
  128.           factorSpace.getConstraints().stream()
  129.               .filter(
  130.                   (Constraint constraint) -> constraint.involvedKeys().size() > 1
  131.               )
  132.               .collect(toList())
  133.       );
  134.     }
  135.   }
  136. }