From 52049655c993bbdfc2192e1f98f6432375d9cf25 Mon Sep 17 00:00:00 2001 From: "Bernhard J. Berger" <bernhard.berger@uni-bremen.de> Date: Thu, 19 Jan 2023 01:09:53 +0100 Subject: [PATCH] Fixed wrong DSL assumption. --- .../core/api/ea/correlations/Correlation.java | 4 +- .../api/ea/correlations/Correlations.java | 2 +- .../ea/correlations/RangedCorrelation.java | 8 +- .../constraints/correlation/el/AstHelper.java | 7 +- .../constraints/el/DataReferenceSwitch.java | 117 ++++++++++++++++++ 5 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java index d89886cd..ac64ab6d 100644 --- a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlation.java @@ -28,11 +28,11 @@ public class Correlation { */ private double correlationFactor; - public boolean matchesSource(int chromosomeIndex, double chromosomeValue) { + public boolean matchesSource(int chromosomeIndex, final Number chromosomeValue) { return chromosomeOne == chromosomeIndex; } - public boolean matchesTarget(int chromosomeIndex, double chromosomeValue) { + public boolean matchesTarget(int chromosomeIndex, final Number chromosomeValue) { return chromosomeTwo == chromosomeIndex; } } diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java index c38a75a7..182a46aa 100644 --- a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/Correlations.java @@ -33,7 +33,7 @@ public class Correlations<G extends Gene<?, G>> { final Properties properties = codec.decode(genotype); return correlations.stream() - .filter(c -> c.matchesSource(chromosomeIndex, properties.getAsDouble(chromosomeIndex))) + .filter(c -> c.matchesSource(chromosomeIndex, (Number)properties.get(chromosomeIndex))) .collect(Collectors.toList()); } diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java index c3b4f0ee..064a7a94 100644 --- a/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/api/ea/correlations/RangedCorrelation.java @@ -15,20 +15,20 @@ public class RangedCorrelation extends Correlation { private Range chromosomeTwoRange; @Override - public boolean matchesSource(int chromosomeIndex, double chromosomeValue) { + public boolean matchesSource(int chromosomeIndex, final Number chromosomeValue) { if(!super.matchesSource(chromosomeIndex, chromosomeValue)) { return false; } - return getChromosomeOneRange().includes(chromosomeValue); + return getChromosomeOneRange().includes(chromosomeValue.doubleValue()); } @Override - public boolean matchesTarget(int chromosomeIndex, double chromosomeValue) { + public boolean matchesTarget(int chromosomeIndex, final Number chromosomeValue) { if(!super.matchesTarget(chromosomeIndex, chromosomeValue)) { return false; } - return getChromosomeTwoRange().includes(chromosomeValue); + return getChromosomeTwoRange().includes(chromosomeValue.doubleValue()); } } diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java index 75543ffd..6df67471 100644 --- a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/correlation/el/AstHelper.java @@ -2,8 +2,9 @@ package de.evoal.core.main.ea.constraints.correlation.el; import de.evoal.core.api.properties.PropertiesSpecification; import de.evoal.core.api.properties.PropertySpecification; -import de.evoal.core.main.ea.constraints.el.StringSwitch; +import de.evoal.core.main.ea.constraints.el.DataReferenceSwitch; import de.evoal.core.api.ea.correlations.Range; +import de.evoal.languages.model.ddl.DataDescription; import de.evoal.languages.model.el.Expression; public final class AstHelper { @@ -15,8 +16,8 @@ public final class AstHelper { } public static int findChromosomeIndex(final PropertiesSpecification specification, final Expression expression) { - final String name = new StringSwitch().doSwitch(expression); + final DataDescription data = new DataReferenceSwitch().doSwitch(expression); - return specification.indexOf(name); + return specification.indexOf(data.getName()); } } diff --git a/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java new file mode 100644 index 00000000..4a01d1a0 --- /dev/null +++ b/src/core/de.evoal.core/src/main/java/de/evoal/core/main/ea/constraints/el/DataReferenceSwitch.java @@ -0,0 +1,117 @@ +package de.evoal.core.main.ea.constraints.el; + +import de.evoal.languages.model.ddl.DataDescription; +import de.evoal.languages.model.ddl.DataReference; +import de.evoal.languages.model.ddl.SelfReference; +import de.evoal.languages.model.el.*; +import de.evoal.languages.model.el.util.ELSwitch; + +import java.util.Objects; + +public class DataReferenceSwitch extends ELSwitch<DataDescription> { + @Override + public DataDescription caseOrExpression(final OrExpression object) { + Objects.equals(object.getSubExpressions().size(), 1); + + return this.doSwitch(object.getSubExpressions().get(0)); + } + + @Override + public DataDescription caseXorExpression(final XorExpression object) { + Objects.equals(object.getSubExpressions().size(), 1); + + return this.doSwitch(object.getSubExpressions().get(0)); + } + + @Override + public DataDescription caseAndExpression(final AndExpression object) { + Objects.equals(object.getSubExpressions().size(), 1); + + return this.doSwitch(object.getSubExpressions().get(0)); + } + + @Override + public DataDescription caseNotExpression(final NotExpression object) { + return this.doSwitch(object.getOperand()); + } + + @Override + public DataDescription caseComparisonExpression(final ComparisonExpression object) { + Objects.equals(object.getComparison().size(), 0); + + return this.doSwitch(object.getLeftOperand()); + } + + @Override + public DataDescription caseAddOrSubtractExpression(AddOrSubtractExpression object) { + Objects.equals(object.getOperators().size(), 0); + + return this.doSwitch(object.getLeftOperand()); + } + + @Override + public DataDescription caseMultiplyDivideModuloExpression(MultiplyDivideModuloExpression object) { + Objects.equals(object.getOperators().size(), 0); + + return this.doSwitch(object.getLeftOperand()); + } + + @Override + public DataDescription casePowerOfExpression(PowerOfExpression object) { + Objects.isNull(object.getRightOperand()); + + return this.doSwitch(object.getLeftOperand()); + } + + @Override + public DataDescription caseUnaryAddOrSubtractExpression(UnaryAddOrSubtractExpression object) { + Objects.equals(object.getOperators().size(), 0); + + return this.doSwitch(object.getSubExpression()); + } + /* + @Override + public DataDescription caseCallOrLiteralOrReferenceOrParantheses(CallOrLiteralOrReferenceOrParantheses object) { + return super.caseCallOrLiteralOrReferenceOrParantheses(object); + } + */ + + @Override + public DataDescription caseIntegerLiteral(final IntegerLiteral object) { + throw new IllegalStateException("Searching for Data but found a integer literal."); + } + + @Override + public DataDescription caseDoubleLiteral(final DoubleLiteral object) { + throw new IllegalStateException("Searching for Data but found a double literal."); + } + + @Override + public DataDescription caseStringLiteral(StringLiteral object) { + throw new IllegalStateException("Searching for Data but found a string literal."); + } + + @Override + public DataDescription caseBooleanLiteral(BooleanLiteral object) { + throw new IllegalStateException("Searching for Data but found a boolean literal."); + } + + @Override + public DataDescription caseCall(final Call object) { + throw new IllegalStateException("Searching for Data but found a call."); + } + + @Override + public DataDescription caseParantheses(Parantheses object) { + return this.doSwitch(object.getSubExpression()); + } + + @Override + public DataDescription caseValueReference(final ValueReference object) { + if(object instanceof SelfReference) { + throw new IllegalStateException("Not yet implemented"); + } else { + return ((DataReference)object).getDefinition(); + } + } +} -- GitLab