diff --git a/.gitignore b/.gitignore index 4dee5e1147037aa9ba7d12683a93415d2edc70cc..29db7e2a82bddb3ccf4339f3d47945e393803169 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 a64b10913eadf89eeb023d1cf57c59dee5378b69..092e7a8895a9cfc4c970c8fc4cfbf3e297305451 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 b49e845040179b0f5f961cc1274e8e91d1faea4d..f76d28bf2934960b912339a5032fc4dc1595761c 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 0000000000000000000000000000000000000000..c9774699f80ef0c0fb2f14b12a825ab020af7a85 --- /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 0000000000000000000000000000000000000000..2723cf33707b556f417c9265729283550e670aa5 --- /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 0000000000000000000000000000000000000000..a9a3ff2ae37a5ea925be5f4748c79bca62680220 --- /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 ce56c450de75f31b01b74ba0fbdf1d94d9220abd..508e238d7355eedd798756933ec9013ae0c3ffc6 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 { } } } - }