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