Skip to content
Snippets Groups Projects
Commit 8e3b7790 authored by Nils Leusmann's avatar Nils Leusmann
Browse files

Merge remote-tracking branch 'origin/develop' into 160-new-generator-type-sequencer

parents 11d18866 6c57172d
No related branches found
No related tags found
1 merge request!57Draft: Add sequence generators
Showing
with 50 additions and 733 deletions
......@@ -127,6 +127,27 @@ public class AttributeEvaluator {
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) {
return attributeToNumber(instance, attributeName).intValue();
}
......
......@@ -2,4 +2,4 @@
export EVOAL_HOME=$( cd -- "$(dirname $0)/../../" >/dev/null 2>&1 ; pwd -P )
$SHELL $EVOAL_HOME/bin/evoal-generator.sh . ackley.generator
\ No newline at end of file
$SHELL $EVOAL_HOME/bin/evoal-pipeline.sh . ackley.generator
\ No newline at end of file
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';
......@@ -13,13 +16,17 @@ module 'ackley' {
* Bivariate normal distribution.
*/
step {
component 'multivariate-normal-distribution' {
'means' := [-10.00, 0.0];
'covariance' := [
[11.1111, 8.8889],
[8.8889, 11.1111]
];
component 'distribution-based-data' {
distributions := [
'multivariate-normal-distribution' {
'means' := [-10.00, 0.0];
'covariance' := [
[11.1111, 8.8889],
[8.8889, 11.1111]
];
}
];
}
writes [data 'x.0', data 'x.1'];
......
File mode changed from 100644 to 100755
......@@ -7,7 +7,7 @@ import "data" from ackley;
import "data" from meta;
module ackley {
module recalculate {
/**
* Introduce a simple pipeline that generates some test data using
* the Ackley function.
......
......@@ -2,5 +2,5 @@
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.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;
......@@ -13,10 +16,14 @@ module ackley {
* First, we generate some normally distributed data.
*/
step {
component 'normal-distribution' {
'μ' := 0.0;
'σ' := 5.12;
}
component 'distribution-based-data' {
distributions := [
'normal-distribution' {
'μ' := 0.0;
'σ' := 5.12;
}
];
}
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();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment