From 55afa2372e5dc7d40a685285d3664426328d3fb0 Mon Sep 17 00:00:00 2001 From: Jonas Blatt <jonasblatt@uni-koblenz.de> Date: Tue, 24 Sep 2019 19:49:51 +0200 Subject: [PATCH] Add more creater for numerical value types --- .gitignore | 4 ++ .../boundary/AbstractGrowingBoundary.java | 10 ++-- .../boundary/bicreater/BiCreaterBetween.java | 8 +-- .../bicreater/BiCreaterIntersection.java | 41 +++++++++++++ .../bicreater/BiCreaterLowerBounds.java | 57 +++++++++++++++++++ .../bicreater/BiCreaterUpperBounds.java | 57 +++++++++++++++++++ .../impl/PartialReductionVerifier.java | 14 ++--- 7 files changed, 175 insertions(+), 16 deletions(-) create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterIntersection.java create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterLowerBounds.java create mode 100644 dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterUpperBounds.java diff --git a/.gitignore b/.gitignore index 4dee5e11..29db7e2a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,7 @@ # Exclude all target folders */target/* + + +# ignore temporay camunda frontend +/dmnverifiercamundamodelerplugin/* diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java index a64b1091..092e7a88 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/AbstractGrowingBoundary.java @@ -19,9 +19,11 @@ import static de.unikoblenz.fgbks.base.utils.boundary.creater.BoundaryCreaterTyp import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterAppend; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterBetween; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterCombine; +import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterIntersection; +import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterLowerBounds; +import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BiCreaterUpperBounds; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreater; import de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType; -import de.unikoblenz.fgbks.base.utils.boundary.bicreater.EmptyBiCreater; import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheck; import de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType; import de.unikoblenz.fgbks.base.utils.boundary.checker.CheckEqual; @@ -54,9 +56,9 @@ public abstract class AbstractGrowingBoundary<T extends Comparable<? super T>> checkerMap.put(SUBSUMES, CheckSubsumes.getInstance()); createrMap.put(UPPER, CreaterUpper.getInstance()); createrMap.put(LOWER, CreaterLower.getInstance()); - biCreaterMap.put(INTERSECTION, EmptyBiCreater.getInstance()); - biCreaterMap.put(LOWER_BOUNDS, EmptyBiCreater.getInstance()); - biCreaterMap.put(UPPER_BOUNDS, EmptyBiCreater.getInstance()); + biCreaterMap.put(INTERSECTION, BiCreaterIntersection.getInstance()); + biCreaterMap.put(LOWER_BOUNDS, BiCreaterLowerBounds.getInstance()); + biCreaterMap.put(UPPER_BOUNDS, BiCreaterUpperBounds.getInstance()); biCreaterMap.put(BETWEEN, BiCreaterBetween.getInstance()); biCreaterMap.put(APPEND, BiCreaterAppend.getInstance()); biCreaterMap.put(COMBINE, BiCreaterCombine.getInstance()); diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterBetween.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterBetween.java index b49e8450..f76d28bf 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterBetween.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterBetween.java @@ -59,11 +59,11 @@ public class BiCreaterBetween extends AbstractBoundaryBiCreater<AbstractGrowingB long b2L = (long) b1.getLowerBound(); long b2U = (long) b1.getUpperBound(); if (b1U + 1 == b2L - && b1.getUpperBoundType() == INCLUSIVE - && b2.getLowerBoundType() == INCLUSIVE + && b1.getUpperBoundType() == INCLUSIVE + && b2.getLowerBoundType() == INCLUSIVE || b2U + 1 == b1L - && b2.getUpperBoundType() == INCLUSIVE - && b1.getLowerBoundType() == INCLUSIVE) { + && b2.getUpperBoundType() == INCLUSIVE + && b1.getLowerBoundType() == INCLUSIVE) { return Optional.empty(); } } diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterIntersection.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterIntersection.java new file mode 100644 index 00000000..c9774699 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterIntersection.java @@ -0,0 +1,41 @@ +package de.unikoblenz.fgbks.base.utils.boundary.bicreater; + +import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.INTERSECTION; +import static de.unikoblenz.fgbks.base.utils.boundary.checker.BoundaryCheckType.IS_NOT_IN_CONTACT; + +import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary; +import java.util.Optional; + +public class BiCreaterIntersection extends AbstractBoundaryBiCreater<AbstractGrowingBoundary> { + + private static final BiCreaterIntersection instance = new BiCreaterIntersection(); + + private BiCreaterIntersection() { + super(); + } + + public static BiCreaterIntersection getInstance() { + return instance; + } + + @Override + public BoundaryBiCreaterType getType() { + return INTERSECTION; + } + + @Override + public Optional<AbstractGrowingBoundary> create( + AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + if (b1.checkWith(IS_NOT_IN_CONTACT, b2)) { + return Optional.empty(); + } + int compLower = b1.compareToLowerBound(b2); + int compUpper = b1.compareToUpperBound(b2); + return Optional.of( + b1.getCopy( + compLower > 0 ? b1.getLowerBound() : b2.getLowerBound(), + compUpper < 0 ? b1.getUpperBound() : b2.getUpperBound(), + compLower > 0 ? b1.getLowerBoundType() : b2.getLowerBoundType(), + compUpper < 0 ? b1.getUpperBoundType() : b2.getUpperBoundType())); + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterLowerBounds.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterLowerBounds.java new file mode 100644 index 00000000..2723cf33 --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterLowerBounds.java @@ -0,0 +1,57 @@ +package de.unikoblenz.fgbks.base.utils.boundary.bicreater; + +import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.EXCLUSIVE; +import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.INCLUSIVE; +import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.LOWER_BOUNDS; + +import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary; +import de.unikoblenz.fgbks.base.utils.boundary.impl.IntegerBoundary; +import de.unikoblenz.fgbks.base.utils.boundary.impl.LongBoundary; +import java.util.Optional; + +public class BiCreaterLowerBounds extends AbstractBoundaryBiCreater<AbstractGrowingBoundary> { + + private static final BiCreaterLowerBounds instance = new BiCreaterLowerBounds(); + + private BiCreaterLowerBounds() { + super(); + } + + public static BiCreaterLowerBounds getInstance() { + return instance; + } + + @Override + public BoundaryBiCreaterType getType() { + return LOWER_BOUNDS; + } + + @Override + public Optional<AbstractGrowingBoundary> create( + AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + if (b1 instanceof IntegerBoundary) { + if ((int) b1.getLowerBound() + 1 == (int) b2.getLowerBound() + && b1.getLowerBoundType() == EXCLUSIVE + && b2.getLowerBoundType() == INCLUSIVE) { + return Optional.empty(); + } + } + if (b1 instanceof LongBoundary) { + if (b1.getUpperBound().equals((long) b2.getUpperBound() + 1) + && b1.getLowerBoundType() == EXCLUSIVE + && b2.getLowerBoundType() == INCLUSIVE) { + return Optional.empty(); + } + } + try { + return Optional.of( + b1.getCopy( + b1.getLowerBound(), + b2.getLowerBound(), + b1.getLowerBoundType().getOp(), + b2.getLowerBoundType())); + } catch (Exception e) { + return Optional.empty(); + } + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterUpperBounds.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterUpperBounds.java new file mode 100644 index 00000000..a9a3ff2a --- /dev/null +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/base/utils/boundary/bicreater/BiCreaterUpperBounds.java @@ -0,0 +1,57 @@ +package de.unikoblenz.fgbks.base.utils.boundary.bicreater; + +import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.EXCLUSIVE; +import static de.unikoblenz.fgbks.base.utils.boundary.BoundType.INCLUSIVE; +import static de.unikoblenz.fgbks.base.utils.boundary.bicreater.BoundaryBiCreaterType.UPPER_BOUNDS; + +import de.unikoblenz.fgbks.base.utils.boundary.AbstractGrowingBoundary; +import de.unikoblenz.fgbks.base.utils.boundary.impl.IntegerBoundary; +import de.unikoblenz.fgbks.base.utils.boundary.impl.LongBoundary; +import java.util.Optional; + +public class BiCreaterUpperBounds extends AbstractBoundaryBiCreater<AbstractGrowingBoundary> { + + private static final BiCreaterUpperBounds instance = new BiCreaterUpperBounds(); + + private BiCreaterUpperBounds() { + super(); + } + + public static BiCreaterUpperBounds getInstance() { + return instance; + } + + @Override + public BoundaryBiCreaterType getType() { + return UPPER_BOUNDS; + } + + @Override + public Optional<AbstractGrowingBoundary> create( + AbstractGrowingBoundary b1, AbstractGrowingBoundary b2) { + if (b1 instanceof IntegerBoundary) { + if (b1.getUpperBound().equals((int) b2.getUpperBound() + 1) + && b1.getUpperBoundType() == INCLUSIVE + && b2.getUpperBoundType() == EXCLUSIVE) { + return Optional.empty(); + } + } + if (b1 instanceof LongBoundary) { + if (b1.getUpperBound().equals((long) b2.getUpperBound() + 1) + && b1.getUpperBoundType() == INCLUSIVE + && b2.getUpperBoundType() == EXCLUSIVE) { + return Optional.empty(); + } + } + try { + return Optional.of( + b1.getCopy( + b2.getUpperBound(), + b1.getUpperBound(), + b2.getUpperBoundType().getOp(), + b1.getUpperBoundType())); + } catch (Exception e) { + return Optional.empty(); + } + } +} diff --git a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java index ce56c450..508e238d 100644 --- a/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java +++ b/dmnverifierapi/src/main/java/de/unikoblenz/fgbks/core/dmn/verification/verifier/impl/PartialReductionVerifier.java @@ -31,16 +31,15 @@ public class PartialReductionVerifier extends AbstractVerifier { } private void findPartialReduction(VDmnDecisionTable dmnDecisionTable) { - List<List<VDmnRule>> identicalOutputCluster = VDmnFunctions - .getRuleClustersWithIdenticalOutput(dmnDecisionTable); + List<List<VDmnRule>> identicalOutputCluster = + VDmnFunctions.getRuleClustersWithIdenticalOutput(dmnDecisionTable); List<VDmnInputColumn> inColumns = dmnDecisionTable.getInputColumns(); identicalOutputCluster.stream() // do: parallelStream() ? .forEach(c -> findPartialReduction(inColumns, 0, c, false)); } - private void findPartialReduction(List<VDmnInputColumn> inColumns, int i, - List<VDmnRule> clusterRules, - boolean hasCombination) { + private void findPartialReduction( + List<VDmnInputColumn> inColumns, int i, List<VDmnRule> clusterRules, boolean hasCombination) { if (i == inColumns.size()) { if (hasCombination) { clusterRules.forEach( @@ -51,8 +50,8 @@ public class PartialReductionVerifier extends AbstractVerifier { vreFactory.addToEntry(VerificationClassification.WARNING, "PartialReduction"); } } else { - List<VDmnInputValue> rules = VDmnFunctions - .getColumnValuesInRules(inColumns.get(i), clusterRules); + List<VDmnInputValue> rules = + VDmnFunctions.getColumnValuesInRules(inColumns.get(i), clusterRules); List<List<VDmnRule>> nClusters = new ArrayList<>(); List<Boolean> combinationCluster = new ArrayList<>(); for (int i1 = 0; i1 < rules.size(); i1++) { @@ -98,5 +97,4 @@ public class PartialReductionVerifier extends AbstractVerifier { } } } - } -- GitLab