From aab5a26895857f2e7ceea42ea741f9975597b552 Mon Sep 17 00:00:00 2001 From: "Bernhard J. Berger" <bernhard.berger@tuhh.de> Date: Thu, 7 Mar 2024 21:09:04 +0100 Subject: [PATCH] [WIP] Half-way of making the Genotype configurable. Restructuring to remove hard dependency to vector-based genotype. #54 --- .../de/evoal/core/api/cdi/BeanFactory.java | 30 +++++++--- .../GenerationStatisticsWriter.java | 2 +- .../evoal/core/ea/api/codec/CustomCodec.java | 3 +- .../ea/api/codec/CustomCodecDescriber.java | 20 +++++++ .../core/ea/main/alterer/AltererFactory.java | 3 +- .../mutator/CorrelationMutatorFactory.java | 3 +- .../core/ea/main/codec/CodecProducer.java | 20 +++++++ .../ea/main/codec/VectorGenotypeCodec.java | 51 ++++++++-------- .../main/codec/VectorGenotypeDescriber.java | 60 +++++++++++++++++++ .../DynamicBoundedDoubleChromosome.java | 4 +- .../DynamicBoundedIntegerChromosome.java | 4 +- .../codec/chromosome/DynamicChromosome.java | 8 ++- .../chromosome/DynamicScaledChromosome.java | 4 +- .../JeneticsConstraintProducer.java | 2 +- .../core/ea/main/initial/InitialStream.java | 3 +- .../main/producer/SpecificationProducer.java | 13 +++- .../EvolutionaryAlgorithmOptimisation.java | 14 ++--- .../ea/main/statistics/CandidateAdapter.java | 8 ++- .../src/main/java/module-info.java | 3 + .../de/evoal/core/ea/optimisation.dl | 37 ++++++++++-- src/examples/search/search.ol | 8 ++- 21 files changed, 235 insertions(+), 65 deletions(-) create mode 100644 src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodecDescriber.java create mode 100644 src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/CodecProducer.java create mode 100644 src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/VectorGenotypeDescriber.java diff --git a/src/evoal/core/de.evoal.core.main/src/main/java/de/evoal/core/api/cdi/BeanFactory.java b/src/evoal/core/de.evoal.core.main/src/main/java/de/evoal/core/api/cdi/BeanFactory.java index 70b88470..8d8989ce 100644 --- a/src/evoal/core/de.evoal.core.main/src/main/java/de/evoal/core/api/cdi/BeanFactory.java +++ b/src/evoal/core/de.evoal.core.main/src/main/java/de/evoal/core/api/cdi/BeanFactory.java @@ -1,7 +1,9 @@ package de.evoal.core.api.cdi; import de.evoal.core.api.utils.InitializationException; +import de.evoal.core.api.utils.LanguageHelper; import de.evoal.core.api.utils.Requirements; +import de.evoal.languages.model.base.Attribute; import de.evoal.languages.model.base.Instance; import de.evoal.languages.model.dl.util.FQNProvider; import lombok.NonNull; @@ -73,17 +75,16 @@ public final class BeanFactory { } } - public static <T extends EvoalComponent<T>> T createComponent(final Class<T> type, final Instance configuration) { + public static <T extends EvoalComponent<T>> T createComponent(final Class<T> type, final String name, final Instance configuration) { Requirements.requireNotNull(type); Requirements.requireNotNull(configuration); - - final String name = new FQNProvider().get(configuration); + Requirements.requireNotNull(name); log.info("Creating bean for instance of type {}.", name); try { return BeanProvider.getContextualReference(name, false, type) - .init(configuration); - } catch(final IllegalStateException | IllegalArgumentException | InitializationException e) { + .init(configuration); + } catch (final IllegalStateException | IllegalArgumentException | InitializationException e) { log.error("Failed to create contextual reference of type '{}' with name '{}'.", type, name); logInstantiationError(type, e); @@ -91,7 +92,22 @@ public final class BeanFactory { } } - public static void injectFields(final Object instance) { - BeanProvider.injectFields(instance); + public static <T extends EvoalComponent<T>> T createComponent(final Class<T> type, final Instance configuration) { + Requirements.requireNotNull(configuration); + + final String name = new FQNProvider().get(configuration); + + return createComponent(type, name, configuration); + } + + public static <T extends EvoalComponent<T>> T createComponentForAttribute(final Class<T> type, final Instance configuration, final String attributeName) { + final LanguageHelper helper = BeanFactory.create(LanguageHelper.class); + final Instance child = helper.lookup(configuration, attributeName); + + return createComponent(type, child); + } + + public static <T> T injectFields(final T instance) { + return BeanProvider.injectFields(instance); } } diff --git a/src/evoal/plugins/de.evoal.approximative.interval/src/main/java/de/evoal/prediction/interval/statistics/GenerationStatisticsWriter.java b/src/evoal/plugins/de.evoal.approximative.interval/src/main/java/de/evoal/prediction/interval/statistics/GenerationStatisticsWriter.java index 27b5acdb..9929d031 100644 --- a/src/evoal/plugins/de.evoal.approximative.interval/src/main/java/de/evoal/prediction/interval/statistics/GenerationStatisticsWriter.java +++ b/src/evoal/plugins/de.evoal.approximative.interval/src/main/java/de/evoal/prediction/interval/statistics/GenerationStatisticsWriter.java @@ -44,7 +44,7 @@ public class GenerationStatisticsWriter implements StatisticsWriter { /** * Encoding for converting between ea and domain. */ - @Inject + @Inject @Named("codec") private CustomCodec encoding; private EvolutionResult<?, FitnessValue> bestIndividual; diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodec.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodec.java index 745626a7..993f6eb1 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodec.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodec.java @@ -1,5 +1,6 @@ package de.evoal.core.ea.api.codec; +import de.evoal.core.api.cdi.EvoalComponent; import de.evoal.core.api.properties.Properties; import io.jenetics.Gene; import io.jenetics.Genotype; @@ -10,7 +11,7 @@ import io.jenetics.engine.Codec; * * @param <G> The gene type. */ -public interface CustomCodec<G extends Gene<?, G>> extends Codec<Properties, G> { +public interface CustomCodec<G extends Gene<?, G>> extends Codec<Properties, G>, EvoalComponent<CustomCodec<G>> { /** * Encodes an individual according to the codes into a genotype. diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodecDescriber.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodecDescriber.java new file mode 100644 index 00000000..59ef1f99 --- /dev/null +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/api/codec/CustomCodecDescriber.java @@ -0,0 +1,20 @@ +package de.evoal.core.ea.api.codec; + +import de.evoal.core.api.cdi.EvoalComponent; +import de.evoal.languages.model.base.Definition; + +import java.util.List; + +/** + * Additional interface that a codec implementer has to implement to give a + * description of the data/instances a codec configuration maps. In case + * of the vector genotype codec it is the list of all used data descriptions. + * The describer has to expand the name of the codec by the suffix "-describer" + * in the @Named annotation. + */ +public interface CustomCodecDescriber extends EvoalComponent<CustomCodecDescriber> { + /** + * @return The mapped data. + */ + public List<Definition> describe(); +} diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java index b79e783f..1c7ebbad 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/AltererFactory.java @@ -20,12 +20,13 @@ import javax.enterprise.context.ApplicationScoped; import lombok.extern.slf4j.Slf4j; import javax.inject.Inject; +import javax.inject.Named; @ApplicationScoped @Slf4j public class AltererFactory { - @Inject + @Inject @Named("codec") private CustomCodec codec; @Inject diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorFactory.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorFactory.java index 7ed1a928..7f3d9d4e 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorFactory.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/alterer/mutator/CorrelationMutatorFactory.java @@ -10,6 +10,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; +import javax.inject.Named; import java.util.function.BiFunction; @ApplicationScoped @@ -19,7 +20,7 @@ public final class CorrelationMutatorFactory { @Inject private Blackboard board; - @Inject + @Inject @Named("codec") private CustomCodec codec; @Produces diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/CodecProducer.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/CodecProducer.java new file mode 100644 index 00000000..88085206 --- /dev/null +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/CodecProducer.java @@ -0,0 +1,20 @@ +package de.evoal.core.ea.main.codec; + +import de.evoal.core.api.board.CoreBlackboardEntries; +import de.evoal.core.api.cdi.BeanFactory; +import de.evoal.core.api.cdi.ConfigurationValue; +import de.evoal.core.ea.api.codec.CustomCodec; +import de.evoal.languages.model.base.Instance; + +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.Produces; +import javax.inject.Inject; +import javax.inject.Named; + +@ApplicationScoped +public class CodecProducer { + @Produces @Named("codec") + public CustomCodec create(final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.genotype") Instance configuration) { + return BeanFactory.createComponent(CustomCodec.class, configuration); + } +} diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/VectorGenotypeCodec.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/VectorGenotypeCodec.java index cdf93f3d..f5092a4e 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/VectorGenotypeCodec.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/VectorGenotypeCodec.java @@ -1,12 +1,11 @@ package de.evoal.core.ea.main.codec; import de.evoal.core.api.cdi.BeanFactory; +import de.evoal.core.api.utils.LanguageHelper; import de.evoal.core.ea.api.codec.CustomCodec; import de.evoal.core.api.properties.Properties; import de.evoal.core.api.properties.PropertiesSpecification; import de.evoal.core.ea.main.codec.chromosome.DynamicChromosome; -import de.evoal.core.ea.main.codec.chromosome.DynamicChromosomeFactory; -import de.evoal.languages.model.base.Array; import de.evoal.languages.model.base.Instance; import io.jenetics.Chromosome; import io.jenetics.Gene; @@ -14,39 +13,35 @@ import io.jenetics.Genotype; import io.jenetics.util.Factory; import lombok.extern.slf4j.Slf4j; -import java.util.Arrays; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.Produces; +import javax.inject.Inject; +import javax.inject.Named; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @Slf4j -public class DynamicCodec<G extends Gene<?, G>> implements CustomCodec<G> { +public class VectorGenotypeCodec<G extends Gene<?, G>> implements CustomCodec<G> { - private final List<DynamicChromosome> dynamicTemplates; + @Inject + private @Named("genotype-specification") PropertiesSpecification specification; - private final PropertiesSpecification specification; - - public DynamicCodec(final PropertiesSpecification specification, final List<DynamicChromosome> dynamicTemplates, final List<Chromosome<G>> jeneticsTemplates) { - this.specification = specification; - this.dynamicTemplates = dynamicTemplates; - } - - static DynamicCodec from(final Instance [] config, final PropertiesSpecification specification) { - final DynamicChromosomeFactory factory = BeanFactory.create(DynamicChromosomeFactory.class); - final List<DynamicChromosome> chromosomes = Arrays.stream(config) - .map(Instance.class::cast) - .map(factory::create) - .collect(Collectors.toList()); - - final List<Chromosome> templates = chromosomes.stream() - .map(DynamicChromosome::toJenetics) - .collect(Collectors.toList()); + @Inject + private LanguageHelper helper; + private List<DynamicChromosome> dynamicTemplates; + @Override + public VectorGenotypeCodec<G> init(final Instance config) { + log.info("LanguageHelper is {}", helper); + final List<Instance> chromosomeConfigurations = helper.lookup(config, "chromosomes"); - log.info("Created dynamic codec for properties specification {}.", specification); + dynamicTemplates = chromosomeConfigurations.stream() + .map(i -> BeanFactory.createComponent(DynamicChromosome.class, i)) + .collect(Collectors.toList()); - return new DynamicCodec(specification, chromosomes, templates); + return this; } @Override @@ -84,4 +79,12 @@ public class DynamicCodec<G extends Gene<?, G>> implements CustomCodec<G> { return Genotype.of(chromosomes); } + + @Produces + @Named("de.evoal.core.ea.optimisation.vector-genotype") + @ApplicationScoped + public static CustomCodec create() { + log.info("Creating vector-based codec for optimisation problem."); + return BeanFactory.injectFields(new VectorGenotypeCodec()); + } } diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/VectorGenotypeDescriber.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/VectorGenotypeDescriber.java new file mode 100644 index 00000000..20541065 --- /dev/null +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/VectorGenotypeDescriber.java @@ -0,0 +1,60 @@ +package de.evoal.core.ea.main.codec; + +import de.evoal.core.api.languages.ExpressionEvaluator; +import de.evoal.core.api.utils.InitializationException; +import de.evoal.core.api.utils.LanguageHelper; +import de.evoal.core.ea.api.codec.CustomCodecDescriber; +import de.evoal.languages.model.base.Attribute; +import de.evoal.languages.model.base.Instance; +import de.evoal.languages.model.base.Definition; +import de.evoal.languages.model.ddl.DataDescription; +import lombok.extern.slf4j.Slf4j; + +import javax.enterprise.context.Dependent; +import javax.inject.Inject; +import javax.inject.Named; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +@Dependent +@Named("de.evoal.core.ea.optimisation.vector-genotype-describer") +@Slf4j +public class VectorGenotypeDescriber implements CustomCodecDescriber { + + private Instance configuration; + + @Inject + private LanguageHelper helper; + + @Inject + private ExpressionEvaluator evaluator; + + @Override + public CustomCodecDescriber init(final Instance configuration) throws InitializationException { + log.info("Setting up describer"); + this.configuration = configuration; + + return CustomCodecDescriber.super.init(configuration); + } + + @Override + public List<Definition> describe() { + log.info("Describing Genotype."); + final Object [] genes = helper.lookup(configuration, "chromosomes"); + + final List<DataDescription> descriptors = Arrays.stream(genes) + .map(Instance.class::cast) + .map(i -> i.findAttribute("genes")) + .map(Attribute::getValue) + .map(evaluator::evaluate) + .flatMap(l -> ((List<Instance>)(List)l).stream()) + .map(i -> evaluator.attributeToObject(i, "content")) + .map(DataDescription.class::cast) + .collect(Collectors.toList()); + + log.info("{}", descriptors); + + throw new IllegalArgumentException("HERE WE ARE"); + } +} diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedDoubleChromosome.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedDoubleChromosome.java index bb3d2d96..27f7df21 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedDoubleChromosome.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedDoubleChromosome.java @@ -17,12 +17,14 @@ public abstract class DynamicBoundedDoubleChromosome extends DynamicChromosome { protected List<DoubleRange> ranges; @Override - public void init(final Instance specification) { + public DynamicChromosome init(final Instance specification) { super.init(specification); ranges = dataRepresented.stream() .map(this::toRange) .collect(Collectors.toList()); + + return this; } protected DoubleRange toRange(final DataDescription dataDescription) { diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedIntegerChromosome.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedIntegerChromosome.java index ea019494..19384a1e 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedIntegerChromosome.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicBoundedIntegerChromosome.java @@ -17,12 +17,14 @@ public abstract class DynamicBoundedIntegerChromosome extends DynamicChromosome protected List<IntRange> ranges; @Override - public void init(final Instance specification) { + public DynamicChromosome init(final Instance specification) { super.init(specification); ranges = dataRepresented.stream() .map(this::toRange) .collect(Collectors.toList()); + + return this; } protected IntRange toRange(final DataDescription dataDescription) { diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosome.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosome.java index 0e7879fb..c740bded 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosome.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicChromosome.java @@ -1,5 +1,6 @@ package de.evoal.core.ea.main.codec.chromosome; +import de.evoal.core.api.cdi.EvoalComponent; import de.evoal.core.api.languages.ExpressionEvaluator; import de.evoal.core.api.properties.Properties; import de.evoal.core.api.properties.PropertiesSpecification; @@ -17,14 +18,15 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; -public abstract class DynamicChromosome { +public abstract class DynamicChromosome implements EvoalComponent<DynamicChromosome> { @Inject private ExpressionEvaluator evaluator; protected List<DataDescription> dataRepresented; protected PropertiesSpecification specification; - public void init(final Instance specification) { + @Override + public DynamicChromosome init(final Instance specification) { final List<Instance> genes = (List<Instance>) evaluator.attributeToObject(specification, "genes"); this.dataRepresented = genes.stream() @@ -36,6 +38,8 @@ public abstract class DynamicChromosome { this.specification = PropertiesSpecification.builder() .add(dataRepresented.stream()) .build(); + + return this; } public abstract Chromosome toJenetics(); diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicScaledChromosome.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicScaledChromosome.java index 57aee89d..ccbdb5eb 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicScaledChromosome.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/codec/chromosome/DynamicScaledChromosome.java @@ -22,12 +22,14 @@ public abstract class DynamicScaledChromosome extends DynamicBoundedDoubleChromo protected int scale; @Override - public void init(final Instance specification) { + public DynamicChromosome init(final Instance specification) { scale = evaluator.attributeToInteger(specification, "scale"); super.init(specification); Requirements.requireSize(dataRepresented, 1); Requirements.requireSize(ranges, 1); + + return this; } protected DoubleRange toRange(final DataDescription dataDescription) { diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraint/JeneticsConstraintProducer.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraint/JeneticsConstraintProducer.java index ca2ac595..788db614 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraint/JeneticsConstraintProducer.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/constraint/JeneticsConstraintProducer.java @@ -37,7 +37,7 @@ public class JeneticsConstraintProducer { final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.handlers") Instance [] handlerConfigurations, final @Named("optimisation-space-specification") PropertiesSpecification optimisationSpec, final @Named("optimisation-function") OptimisationFunction function, - final CustomCodec codec, + final @Named("codec") CustomCodec codec, final Constraints constraints, final CalculationFactory factory) { diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/InitialStream.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/InitialStream.java index b71ef69d..c71eca97 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/InitialStream.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/initial/InitialStream.java @@ -12,6 +12,7 @@ import io.jenetics.engine.EvolutionStream; import javax.enterprise.context.Dependent; import javax.inject.Inject; +import javax.inject.Named; import java.util.stream.Stream; @Dependent @@ -25,7 +26,7 @@ public class InitialStream { private Engine engine; - @Inject + @Inject @Named("codec") private CustomCodec codec; public InitialStream init(final InitialCandidatesProvider provider, final Engine<?, OptimisationValue> engine) { diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SpecificationProducer.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SpecificationProducer.java index 54303306..29f259a0 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SpecificationProducer.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/producer/SpecificationProducer.java @@ -1,13 +1,16 @@ -package de.evoal.core.main.producer; +package de.evoal.core.ea.main.producer; import de.evoal.core.api.board.CoreBlackboardEntries; import de.evoal.core.api.cdi.BeanFactory; import de.evoal.core.api.cdi.ConfigurationValue; import de.evoal.core.api.languages.ExpressionEvaluator; import de.evoal.core.api.properties.PropertiesSpecification; +import de.evoal.core.ea.api.codec.CustomCodecDescriber; +import de.evoal.languages.model.base.Definition; import de.evoal.languages.model.ddl.DataDescription; -import de.evoal.languages.model.base.Attribute; import de.evoal.languages.model.base.Instance; +import de.evoal.languages.model.dl.util.FQNProvider; +import lombok.extern.slf4j.Slf4j; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.context.Dependent; @@ -19,6 +22,7 @@ import java.util.List; import java.util.stream.Collectors; @ApplicationScoped +@Slf4j public class SpecificationProducer { @Inject @@ -28,7 +32,10 @@ public class SpecificationProducer { @Dependent @Named("genotype-description") public List<DataDescription> createSourceSpecification(final @ConfigurationValue(entry = CoreBlackboardEntries.OPTIMISATION_CONFIGURATION, access = "algorithm.genotype") Instance genotype) { - BeanFactory.createComponent(Codec) + final String name = new FQNProvider().get(genotype) + "-describer"; + final CustomCodecDescriber describer = BeanFactory.createComponent(CustomCodecDescriber.class, name, genotype); + final List<Definition> references = describer.describe(); + throw new RuntimeException("safd"); } diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmOptimisation.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmOptimisation.java index 3522d0de..b2d1ea68 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmOptimisation.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/search/EvolutionaryAlgorithmOptimisation.java @@ -17,11 +17,12 @@ import de.evoal.core.api.utils.LanguageHelper; import de.evoal.core.api.optimisation.OptimisationValue; import de.evoal.core.api.statistics.writer.StatisticsWriter; +import de.evoal.core.ea.api.codec.CustomCodec; import de.evoal.core.ea.main.fitness.JeneticsFitnessFunction; import de.evoal.core.ea.main.initial.InitialStream; import de.evoal.core.ea.main.jenetics.ConstraintList; import de.evoal.core.ea.main.alterer.AltererFactory; -import de.evoal.core.ea.main.codec.DynamicCodec; +import de.evoal.core.ea.main.codec.VectorGenotypeCodec; import de.evoal.core.ea.main.statistics.JeneticsStatisticsWriter; import de.evoal.languages.model.base.Attribute; import de.evoal.languages.model.ol.OptimisationModule; @@ -33,6 +34,7 @@ import lombok.extern.slf4j.Slf4j; import javax.enterprise.context.Dependent; import javax.enterprise.inject.Instance; +import javax.enterprise.inject.Produces; import javax.inject.Inject; import javax.inject.Named; @@ -67,8 +69,8 @@ public class EvolutionaryAlgorithmOptimisation implements OptimisationAlgorithm private final Map<String, List<Alterer<?, OptimisationValue>>> alterers = new HashMap<>(); - @Inject - private DynamicCodec encoding; + @Inject @Named("codec") + private CustomCodec encoding; private final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); @@ -90,15 +92,9 @@ public class EvolutionaryAlgorithmOptimisation implements OptimisationAlgorithm @Inject private Instance<List<Constraint>> constraints; - @Inject @Named("initial") private InitialCandidatesProvider provider; - @Override - public OptimisationAlgorithm init(de.evoal.languages.model.base.Instance instance) { - return this; - } - public void run() { setup(); diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/CandidateAdapter.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/CandidateAdapter.java index 9836c62e..f820f5fe 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/CandidateAdapter.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/de/evoal/core/ea/main/statistics/CandidateAdapter.java @@ -3,11 +3,13 @@ package de.evoal.core.ea.main.statistics; import de.evoal.core.api.optimisation.OptimisationValue; import de.evoal.core.api.properties.Properties; import de.evoal.core.api.statistics.Candidate; -import de.evoal.core.ea.main.codec.DynamicCodec; +import de.evoal.core.ea.api.codec.CustomCodec; +import de.evoal.core.ea.main.codec.VectorGenotypeCodec; import io.jenetics.Phenotype; import javax.enterprise.context.Dependent; import javax.inject.Inject; +import javax.inject.Named; /** * An adapter, c.f. GOF: adapter pattern, for adapting Jenetic's {@link Phenotype} to @@ -27,8 +29,8 @@ public class CandidateAdapter implements Candidate { */ private Phenotype<?, OptimisationValue> phenotype; - @Inject - private DynamicCodec codec; + @Inject @Named("codec") + private CustomCodec codec; public CandidateAdapter init(final Phenotype<?, OptimisationValue> phenotype, final int generation) { this.phenotype = phenotype; diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/java/module-info.java b/src/evoal/plugins/de.evoal.core.ea/src/main/java/module-info.java index 756ab0de..2cc8840a 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/java/module-info.java +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/java/module-info.java @@ -11,6 +11,7 @@ module de.evoal.core.ea { requires org.eclipse.emf.common; + requires de.evoal.languages.model.dl; requires de.evoal.languages.model.ddl; requires de.evoal.languages.model.base; requires de.evoal.languages.model.instance; @@ -28,6 +29,7 @@ module de.evoal.core.ea { opens de.evoal.core.ea; + opens de.evoal.core.ea.api.codec to weld.core.impl; opens de.evoal.core.ea.main.alterer to weld.core.impl; opens de.evoal.core.ea.main.alterer.mutator to weld.core.impl; opens de.evoal.core.ea.main.codec to weld.core.impl; @@ -36,6 +38,7 @@ module de.evoal.core.ea { opens de.evoal.core.ea.main.constraint to weld.core.impl; opens de.evoal.core.ea.main.fitness to weld.core.impl; opens de.evoal.core.ea.main.initial to weld.core.impl; + opens de.evoal.core.ea.main.producer to weld.core.impl; opens de.evoal.core.ea.main.selector to weld.core.impl; opens de.evoal.core.ea.main.search to weld.core.impl; opens de.evoal.core.ea.main.statistics to weld.core.impl; diff --git a/src/evoal/plugins/de.evoal.core.ea/src/main/resources/de/evoal/core/ea/optimisation.dl b/src/evoal/plugins/de.evoal.core.ea/src/main/resources/de/evoal/core/ea/optimisation.dl index ad95699b..0aa53130 100644 --- a/src/evoal/plugins/de.evoal.core.ea/src/main/resources/de/evoal/core/ea/optimisation.dl +++ b/src/evoal/plugins/de.evoal.core.ea/src/main/resources/de/evoal/core/ea/optimisation.dl @@ -6,14 +6,36 @@ module de.evoal.core.ea.optimisation { 'size-of-population' : int; 'maximum-age' : int; - genotype : array instance chromosome; + genotype : instance genotype; handlers : array instance 'handler'; selectors : instance selectors; alterers : instance alterers; } - + + /** + * Base class for genotypes. + */ + abstract type genotype { + } + + /** + * A vector-based genotype that automatically maps 'data' to genes. + */ + type 'vector-genotype' extends genotype { + /** + * List of chromosomes for mapping data on different ways. + */ + chromosomes : array instance chromosome; + } + + /** + * Abstract base type for different chromosome types. + */ abstract type chromosome { + /** + * A chromosome consists of one to multiple genes. + */ genes : array instance gene; } @@ -30,10 +52,15 @@ module de.evoal.core.ea.optimisation { type 'integer-chromosome' extends chromosome { } + + /** + * A gene maps some data. + */ + type gene { + content : data; + } - type gene { content : data; } - - type pareto extends comparator { + type pareto extends comparator { } abstract type handler {} diff --git a/src/examples/search/search.ol b/src/examples/search/search.ol index cc5a762e..f7a22e78 100644 --- a/src/examples/search/search.ol +++ b/src/examples/search/search.ol @@ -31,14 +31,16 @@ module search { 'comparator' := 'numeric-comparator' {}; - genotype := [ - 'bit-chromosome' { + genotype := 'vector-genotype' { + chromosomes := [ + 'bit-chromosome' { scale := 12; genes:= [ gene {content:= data 'x:0';} ]; } - ]; + ]; + }; handlers := []; -- GitLab