Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • evoal/source/evoal-core
1 result
Show changes
Commits on Source (3)
Showing
with 50 additions and 733 deletions
...@@ -127,6 +127,27 @@ public class AttributeEvaluator { ...@@ -127,6 +127,27 @@ public class AttributeEvaluator {
return (Instance)result; return (Instance)result;
} }
public Instance [] attributeToInstanceArray(final Instance instance, final String attributeName) {
final Object result = attributeToObject(instance, attributeName);
if(!(result instanceof List<?> resultList)) {
log.error("Expression did not evaluate to a list for attribute {} which was expected.", attributeName);
throw new IllegalStateException("Expression evaluation error. Please check your configuration.");
}
final boolean allInstances = resultList.stream()
.allMatch(Instance.class::isInstance);
if(!allInstances) {
log.error("Expression did not evaluate to a list of instances for attribute {} which was expected.", attributeName);
throw new IllegalStateException("Expression evaluation error. Please check your configuration.");
}
return resultList.stream()
.map(Instance.class::cast)
.toArray(Instance[]::new);
}
public int attributeToInteger(final Instance instance, final String attributeName) { public int attributeToInteger(final Instance instance, final String attributeName) {
return attributeToNumber(instance, attributeName).intValue(); return attributeToNumber(instance, attributeName).intValue();
} }
......
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
export EVOAL_HOME=$( cd -- "$(dirname $0)/../../" >/dev/null 2>&1 ; pwd -P ) export EVOAL_HOME=$( cd -- "$(dirname $0)/../../" >/dev/null 2>&1 ; pwd -P )
$SHELL $EVOAL_HOME/bin/evoal-generator.sh . ackley.generator $SHELL $EVOAL_HOME/bin/evoal-pipeline.sh . ackley.generator
\ No newline at end of file \ No newline at end of file
import "definitions" from de.evoal.core.math; import "definitions" from de.evoal.core.math;
import "definitions" from de.evoal.generator.generator; import "definitions" from de.evoal.'pipeline'.base;
import "definitions" from de.evoal.'pipeline'.benchmarks;
import "definitions" from de.evoal.'pipeline'.distributions;
import "data" from 'ackley'; import "data" from 'ackley';
...@@ -13,13 +16,17 @@ module 'ackley' { ...@@ -13,13 +16,17 @@ module 'ackley' {
* Bivariate normal distribution. * Bivariate normal distribution.
*/ */
step { step {
component 'multivariate-normal-distribution' { component 'distribution-based-data' {
'means' := [-10.00, 0.0]; distributions := [
'covariance' := [ 'multivariate-normal-distribution' {
[11.1111, 8.8889], 'means' := [-10.00, 0.0];
[8.8889, 11.1111] 'covariance' := [
]; [11.1111, 8.8889],
[8.8889, 11.1111]
];
}
];
} }
writes [data 'x.0', data 'x.1']; writes [data 'x.0', data 'x.1'];
......
File mode changed from 100644 to 100755
...@@ -7,7 +7,7 @@ import "data" from ackley; ...@@ -7,7 +7,7 @@ import "data" from ackley;
import "data" from meta; import "data" from meta;
module ackley { module recalculate {
/** /**
* Introduce a simple pipeline that generates some test data using * Introduce a simple pipeline that generates some test data using
* the Ackley function. * the Ackley function.
......
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
export EVOAL_HOME=$( cd -- "$(dirname $0)/../../" >/dev/null 2>&1 ; pwd -P ) export EVOAL_HOME=$( cd -- "$(dirname $0)/../../" >/dev/null 2>&1 ; pwd -P )
$SHELL $EVOAL_HOME/bin/evoal-generator.sh . ackley.generator $SHELL $EVOAL_HOME/bin/evoal-pipeline.sh . ackley.generator
import "definitions" from de.evoal.core.math; import "definitions" from de.evoal.core.math;
import "definitions" from de.evoal.generator.generator; import "definitions" from de.evoal.'pipeline'.base;
import "definitions" from de.evoal.'pipeline'.benchmarks;
import "definitions" from de.evoal.'pipeline'.distributions;
import "data" from ackley; import "data" from ackley;
...@@ -13,10 +16,14 @@ module ackley { ...@@ -13,10 +16,14 @@ module ackley {
* First, we generate some normally distributed data. * First, we generate some normally distributed data.
*/ */
step { step {
component 'normal-distribution' { component 'distribution-based-data' {
'μ' := 0.0; distributions := [
'σ' := 5.12; 'normal-distribution' {
} 'μ' := 0.0;
'σ' := 5.12;
}
];
}
writes [data 'x:0']; writes [data 'x:0'];
} }
......
package de.evoal.generator.api;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertiesSpecification;
import de.evoal.core.api.properties.PropertySpecification;
import de.evoal.core.api.utils.InitializationException;
import de.evoal.languages.model.generator.Step;
import de.evoal.languages.model.instance.DataReference;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@Slf4j
public abstract class AbstractGeneratorFunction implements GeneratorFunction {
protected Step configuration;
/**
* The properties the generator function writes.
*/
protected @Getter PropertiesSpecification writeSpecification;
/**
* The properties the generator function reads.
*/
protected @Getter PropertiesSpecification readSpecification;
@Override
public GeneratorFunction init(final Step configuration) throws InitializationException {
this.configuration = configuration;
writeSpecification = createSpecification(configuration.getWrites());
readSpecification = createSpecification(configuration.getReads());
log.info("Reading {}", readSpecification);
log.info("Writing {}", writeSpecification);
return this;
}
private static PropertiesSpecification createSpecification(final List<DataReference> references) {
final PropertiesSpecification.Builder builder = PropertiesSpecification.builder();
builder.add(references.stream()
.map(DataReference::getDefinition));
return builder.build();
}
/**
* Merges the properties' specification with the write-specicfication of this
* generator function, creates a new properties instance according to the new
* specification and copies all property values.
*/
protected Properties mergeAndCopy(final Properties properties) {
final PropertiesSpecification specification =
PropertiesSpecification.builder()
.add(properties.getSpecification())
.add(writeSpecification)
.build();
final Properties result = new Properties(specification);
for(final PropertySpecification ps : properties.getSpecification().getProperties()) {
result.put(ps, properties.get(ps));
}
return result;
}
}
package de.evoal.generator.api;
import de.evoal.core.api.board.BlackboardEntries;
import de.evoal.core.api.cdi.Commandline;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Named;
@ApplicationScoped
@Named("generator-entries")
public class GeneratorBlackboardEntries implements BlackboardEntries {
/**
* Loaded generator configuration.
*/
public static final String GENERATOR_CONFIGURATION = "generator:configuration";
/**
* Configuration file for the data generator.
*/
@Commandline(main = "data-generator", name = "generator:configuration-file", doc = "The generator file to use.")
public static final String GENERATOR_CONFIGURATION_FILE = "generator:configuration-file";
}
package de.evoal.generator.api;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertiesSpecification;
import de.evoal.core.api.utils.InitializationException;
import de.evoal.languages.model.generator.Step;
/**
* Interface for all generator functions. A generator function is a named CDI
* component with a pre-defined life-cycle.
*/
public interface GeneratorFunction {
Properties apply(final Properties in);
default GeneratorFunction init(final Step configuration) throws InitializationException {
return this;
}
/**
* Returns the specification properties read by the generator function.
*/
PropertiesSpecification getReadSpecification();
/**
* Returns the specification properties written by the generator function.
*/
PropertiesSpecification getWriteSpecification();
}
package de.evoal.generator.main;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import de.evoal.core.api.cdi.Application;
import de.evoal.core.api.cdi.BlackboardValue;
import de.evoal.core.api.cdi.MainClass;
import de.evoal.core.api.utils.InitializationException;
import de.evoal.generator.api.*;
import de.evoal.generator.main.generators.GeneratorFactory;
import de.evoal.generator.main.internal.Pipeline;
import de.evoal.generator.main.internal.StatementExecutor;
import de.evoal.languages.model.generator.GeneratorModule;
import de.evoal.languages.model.generator.PipelineDefinition;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Main class for EvoAl's data generator.
*/
@ApplicationScoped
@Application(
name = "data-generator",
documentation = """
Application for generating benchmark data based on a generator file.
"""
)
@Named("data-generator")
public class DataGenerator implements MainClass {
/**
* Logger instance
*/
private final static Logger log = LoggerFactory.getLogger(DataGenerator.class);
@Inject
@BlackboardValue(GeneratorBlackboardEntries.GENERATOR_CONFIGURATION)
private GeneratorModule configuration;
@Inject
private GeneratorFactory factory;
@Override
public void run() {
log.info("Starting data generation.");
final Map<String, Pipeline> pipelineTable = createPipelines();
new StatementExecutor(pipelineTable)
.execute(configuration.getStatements());
log.info("Finished data generation.");
}
private Map<String, Pipeline> createPipelines() {
final Map<String, Pipeline> result = new HashMap<>();
for(final PipelineDefinition definition : configuration.getPipelines()) {
final String pipelineName = definition.getName();
log.info("Creating pipeline '{}'.", pipelineName);
final Pipeline pipeline = new Pipeline(pipelineName,
definition.getSteps()
.stream()
.map(f -> {
try {
return factory.create(f);
} catch(final InitializationException e) {
log.error("Failed to initialize generator function:", e);
throw new RuntimeException("Failed to initialize generator function.", e);
}
})
.collect(Collectors.toList()));
result.put(pipelineName, pipeline);
}
return result;
}
}
package de.evoal.generator.main.benchmarks;
import de.evoal.core.api.languages.AttributeEvaluator;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertySpecification;
import de.evoal.core.api.utils.InitializationException;
import de.evoal.generator.api.AbstractGeneratorFunction;
import de.evoal.generator.api.GeneratorFunction;
import de.evoal.languages.model.base.Instance;
import de.evoal.languages.model.generator.Step;
import lombok.extern.slf4j.Slf4j;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.inject.Named;
@Dependent
@Named("de.evoal.generator.generator.ackley")
@Slf4j
public class Ackley extends AbstractGeneratorFunction {
private double a = 20;
private double b = 0.2;
private double c = 6.283185307179586;
@Inject
private AttributeEvaluator evaluator;
@Override
public Properties apply(final Properties in) {
final Properties result = mergeAndCopy(in);
final double n = readSpecification.size();
double sum1 = 0.0;
double sum2 = 0.0;
for(final PropertySpecification ps : readSpecification.getProperties()) {
double read_i = in.getAsDouble(ps);
sum1 += Math.pow(read_i, 2.0);
sum2 += Math.cos(c * read_i);
}
double value = -a * Math.exp(-b * Math.sqrt((1 / n) * sum1)) - Math.exp((1 / n) * sum2) + a + Math.E;
result.put(writeSpecification.getProperties().get(0), value);
return result;
}
@Override
public GeneratorFunction init(final Step configuration) throws InitializationException {
super.init(configuration);
final Instance instance = configuration.getInstance();
a = evaluator.attributeToDouble(instance, "a");
b = evaluator.attributeToDouble(instance, "b");
c = evaluator.attributeToDouble(instance, "c");
log.info("Creating Ackley function with parameter a={}, b={} and c={}.", a, b, c);
return this;
}
}
package de.evoal.generator.main.benchmarks;
import de.evoal.core.api.languages.AttributeEvaluator;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertySpecification;
import de.evoal.core.api.utils.InitializationException;
import de.evoal.generator.api.AbstractGeneratorFunction;
import de.evoal.generator.api.GeneratorFunction;
import de.evoal.languages.model.generator.Step;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.inject.Named;
@Dependent
@Named("de.evoal.generator.generator.rastrigin")
public class Rastrigin extends AbstractGeneratorFunction {
@Inject
private AttributeEvaluator evaluator;
private double a;
@Override
public Properties apply(final Properties in) {
final Properties result = mergeAndCopy(in);
final double n = readSpecification.size();
double value = a * n;
for(final PropertySpecification ps : readSpecification.getProperties()) {
double read_i = in.getAsDouble(ps);
value += (Math.pow(read_i, 2.0) - a * Math.cos(2 * Math.PI * read_i));
}
result.put(writeSpecification.getProperties().get(0), value);
return result;
}
@Override
public GeneratorFunction init(final Step configuration) throws InitializationException {
super.init(configuration);
a = evaluator.attributeToDouble(configuration.getInstance(), "a");
return this;
}
}
package de.evoal.generator.main.benchmarks;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertySpecification;
import de.evoal.generator.api.AbstractGeneratorFunction;
import javax.enterprise.context.Dependent;
import javax.inject.Named;
@Dependent
@Named("de.evoal.generator.generator.rosenbrock")
public class Rosenbrock extends AbstractGeneratorFunction {
@Override
public Properties apply(final Properties in) {
final Properties result = mergeAndCopy(in);
final double n = readSpecification.size();
double value = 0.0;
for(int i = 0; i < readSpecification.getProperties().size() - 1; ++i) {
final PropertySpecification ps_i = readSpecification.getProperties().get(i);
final PropertySpecification ps_n = readSpecification.getProperties().get(i+1);
double read_i = in.getAsDouble(ps_i);
double read_n = in.getAsDouble(ps_n);
value += 100 * Math.pow(read_n - (Math.pow(read_i, 2.0)), 2.0) + Math.pow(1 - read_i, 2.0);
}
result.put(writeSpecification.getProperties().get(0), value);
return result;
}
}
package de.evoal.generator.main.benchmarks;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertySpecification;
import de.evoal.generator.api.AbstractGeneratorFunction;
import javax.enterprise.context.Dependent;
import javax.inject.Named;
@Dependent
@Named("de.evoal.generator.generator.weighted-sphere")
public class WeightedSphere extends AbstractGeneratorFunction {
@Override
public Properties apply(final Properties in) {
final Properties result = mergeAndCopy(in);
final double n = readSpecification.size();
double value = 0.0;
int counter = 1;
for(final PropertySpecification ps : readSpecification.getProperties()) {
double read_i = in.getAsDouble(ps);
value += Math.pow(read_i, 2.0) * counter++;
}
result.put(writeSpecification.getProperties().get(0), value);
return result;
}
}
\ No newline at end of file
package de.evoal.generator.main.cdi;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertiesSpecification;
import de.evoal.core.api.properties.PropertySpecification;
import de.evoal.core.api.utils.AttributeHelper;
import de.evoal.generator.api.GeneratorFunction;
import de.evoal.languages.model.ddl.DataDescription;
import de.evoal.languages.model.generator.GeneratorFactory;
import de.evoal.languages.model.generator.Step;
import de.evoal.languages.model.instance.DataReference;
import de.evoal.languages.model.base.Instance;
import de.evoal.languages.model.instance.InstanceFactory;
import lombok.SneakyThrows;
import org.eclipse.emf.ecore.util.EcoreUtil;
import de.evoal.optimisation.api.model.OptimisationFunction;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.inject.Named;
import java.util.List;
@Dependent
@Named("de.evoal.generator.optimisation.benchmark-function")
public class BenchmarkOptimisationFunction implements OptimisationFunction {
@Inject
private AttributeHelper helper;
@Inject @Named("search-space-specification")
private PropertiesSpecification searchSpaceSpecification;
@Inject @Named("optimisation-space-specification")
private PropertiesSpecification optimisationSpaceSpecification;
private PropertiesSpecification mergedSpaceSpecification;
@Inject
private de.evoal.generator.main.generators.GeneratorFactory factory;
private GeneratorFunction [] functions;
private PropertiesSpecification [] functionProperties;
@Override
public double[] evaluate(final Properties candidate) {
final Properties result = new Properties(optimisationSpaceSpecification);
for(int i = 0; i < functions.length; ++i) {
final GeneratorFunction function = functions[i];
final PropertiesSpecification specification = functionProperties[i];
final Properties calculated = function.apply(candidate);
for(PropertySpecification spec : specification.getProperties()) {
result.put(spec, calculated.get(spec));
}
}
return result.getValuesAsDouble();
}
@SneakyThrows
@Override
public OptimisationFunction init(final Instance config) {
final List<Instance> benchmarkConfigurations = helper.lookup(config, "benchmarks");
functions = new GeneratorFunction[benchmarkConfigurations.size()];
functionProperties = new PropertiesSpecification[benchmarkConfigurations.size()];
for(int index = 0; index < functions.length; ++index) {
final Instance benchmarkConfiguration = benchmarkConfigurations.get(index);
final Instance function = helper.lookup(benchmarkConfiguration, "function");
final Step stepConfiguration = GeneratorFactory.eINSTANCE.createStep();
stepConfiguration.setInstance(EcoreUtil.copy(function));
final List<DataDescription> readReferences = helper.lookup(benchmarkConfiguration, "reads");
readReferences.forEach(dr -> {
final DataReference reference = InstanceFactory.eINSTANCE.createDataReference();
reference.setDefinition(dr);
stepConfiguration.getReads().add(reference);
});
final List<DataDescription> writeReferences = (List<DataDescription>) helper.lookup(benchmarkConfiguration, "writes");
writeReferences
.forEach(dr -> {
final DataReference reference = InstanceFactory.eINSTANCE.createDataReference();
reference.setDefinition(dr);
stepConfiguration.getWrites().add(reference);
});
functions[index] = factory.create(stepConfiguration);
functionProperties[index] = PropertiesSpecification.builder()
.addDescriptions(writeReferences.stream())
.build();
}
mergedSpaceSpecification = PropertiesSpecification.builder()
.add(searchSpaceSpecification)
.add(optimisationSpaceSpecification)
.build();
return this;
}
}
package de.evoal.generator.main.cdi;
import com.google.inject.Injector;
import de.evoal.core.api.board.Blackboard;
import de.evoal.core.api.board.BlackboardEntry;
import de.evoal.core.api.cdi.BlackboardValue;
import de.evoal.generator.api.GeneratorBlackboardEntries;
import de.evoal.languages.model.ddl.dsl.DataDescriptionLanguageStandaloneSetup;
import de.evoal.languages.model.ddl.impl.DdlPackageImpl;
import de.evoal.languages.model.dl.dsl.DefinitionLanguageStandaloneSetup;
import de.evoal.languages.model.dl.impl.DlPackageImpl;
import de.evoal.languages.model.base.dsl.BaseLanguageStandaloneSetup;
import de.evoal.languages.model.base.impl.BasePackageImpl;
import de.evoal.languages.model.generator.dsl.GeneratorDSLStandaloneSetup;
import de.evoal.languages.model.generator.GeneratorModule;
import de.evoal.languages.model.generator.impl.GeneratorPackageImpl;
import lombok.extern.slf4j.Slf4j;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import java.io.File;
import java.util.Optional;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceSet;
@ApplicationScoped
@Slf4j
public class GeneratorModuleProducer {
public void loadModel(final @Observes BlackboardEntry value, final Blackboard board) {
if(!value.isSame(GeneratorBlackboardEntries.GENERATOR_CONFIGURATION_FILE)) {
return;
}
final String configurationFile = board.get(value.getLabel());
log.info("Using generator configuration from '{}'.", configurationFile);
initializeEMF();
final File file = new File(configurationFile);
if(!file.isFile()) {
log.info("Configured generator configuration is a folder.");
throw new IllegalArgumentException("Please specify a generator file.");
}
if(!file.canRead()) {
log.info("Configured generator configuration cannot be read.");
throw new IllegalArgumentException("Please specify a readable genrator file.");
}
final GeneratorModule configuration = read(file).get();
board.bind(GeneratorBlackboardEntries.GENERATOR_CONFIGURATION, configuration);
}
/**
* Initialize the model packages and perform the parser setup.
*/
private void initializeEMF() {
DdlPackageImpl.init();
BasePackageImpl.init();
DlPackageImpl.init();
GeneratorPackageImpl.init();
DataDescriptionLanguageStandaloneSetup.doSetup();
BaseLanguageStandaloneSetup.doSetup();
DefinitionLanguageStandaloneSetup.doSetup();
GeneratorDSLStandaloneSetup.doSetup();
}
/**
* Parses the given generator file and returns the corresponding model.
*
* @param modelFile The model file to read.
* @return The data validation model or an empty optional.
*/
private Optional<GeneratorModule> read(final File modelFile) {
log.info("Reading model file {}.", modelFile);
final Injector injector = new GeneratorDSLStandaloneSetup().createInjectorAndDoEMFRegistration();
final XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE);
resourceSet.addLoadOption(XtextResource.OPTION_ENCODING, "UTF-8");
try {
final URI modelURI = URI.createFileURI(modelFile.getAbsolutePath());
final Resource resource = resourceSet.getResource(modelURI, true);
resource.load(resourceSet.getLoadOptions());
if(!resource.getErrors().isEmpty()) {
for(Resource.Diagnostic diagnostic : resource.getErrors()) {
log.error("Error while processing rule '{}': {}", modelFile, diagnostic);
}
}
if(!resource.getWarnings().isEmpty()) {
for(Resource.Diagnostic diagnostic : resource.getWarnings()) {
log.error("Warning while processing rule '{}': {}", modelFile, diagnostic);
}
}
return Optional.of((GeneratorModule) resource.getContents().get(0));
} catch (final Exception e) {
log.error("Unable to to generator file '{}'.", modelFile, e);
return Optional.empty();
}
}
@Produces
@BlackboardValue(GeneratorBlackboardEntries.GENERATOR_CONFIGURATION)
public GeneratorModule injectIntegerValue(final InjectionPoint ip, final Blackboard board) {
final BlackboardValue value = ip.getAnnotated().getAnnotation(BlackboardValue.class);
final Object result = board.get(value.value());
if(result instanceof GeneratorModule) {
return (GeneratorModule)result;
}
throw new IllegalArgumentException("Unable to handle type " + result.getClass());
}
}
package de.evoal.generator.main.functions;
import de.evoal.core.api.languages.AttributeEvaluator;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.utils.InitializationException;
import de.evoal.generator.api.AbstractGeneratorFunction;
import de.evoal.generator.api.GeneratorFunction;
import de.evoal.languages.model.generator.Step;
import javax.enterprise.context.Dependent;
import javax.inject.Inject;
import javax.inject.Named;
@Dependent
@Named("de.evoal.generator.generator.constants")
public class ConstantFunction extends AbstractGeneratorFunction {
private double [] constants = {};
@Inject
private AttributeEvaluator evaluator;
public Properties apply(final Properties in) {
final Properties result = mergeAndCopy(in);
for(int i = 0; i < constants.length; ++i) {
result.put(writeSpecification.getProperties().get(i), constants[i]);
}
return result;
}
@Override
public GeneratorFunction init(final Step configuration) throws InitializationException {
super.init(configuration);
constants = evaluator.attributeToDoubleArray(configuration.getInstance(), "constants");
return this;
}
}
package de.evoal.generator.main.functions;
import java.util.ArrayList;
import java.util.List;
import de.evoal.core.api.properties.Properties;
import de.evoal.core.api.properties.PropertySpecification;
import de.evoal.core.api.utils.InitializationException;
import de.evoal.generator.api.AbstractGeneratorFunction;
import de.evoal.generator.api.GeneratorFunction;
import de.evoal.generator.main.functions.distributions.Distribution;
import de.evoal.generator.main.functions.distributions.DistributionsFactory;
import de.evoal.languages.model.generator.Step;
import javax.enterprise.context.Dependent;
import javax.inject.Named;
@Dependent
@Named("de.evoal.generator.generator.noise-data")
public class NoiseDataFunction extends AbstractGeneratorFunction {
/**
* The different distributions to apply.
*/
private final List<Distribution> distributions = new ArrayList<>();
public GeneratorFunction init(final Step configuration) throws InitializationException {
super.init(configuration);
distributions.addAll(DistributionsFactory.readDistributions(configuration.getInstance(), "distributions"));
return this;
}
@Override
public Properties apply(final Properties in) {
final Properties result = mergeAndCopy(in);
final int dimension = writeSpecification.size();
for(int i = 0; i < dimension; ++i) {
final PropertySpecification ps = writeSpecification.getProperties().get(i);
double value = result.getAsDouble(ps) + distributions.get(i).sample();
result.put(ps, value);
}
return result;
}
}
package de.evoal.generator.main.functions.distributions;
import de.evoal.core.api.cdi.EvoalComponent;
public interface Distribution extends EvoalComponent<Distribution> {
double sample();
}