diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java index d0784c272..449db5f20 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/crossreference/UndirectedCrossReferenceInitializer.java @@ -15,7 +15,9 @@ import tools.refinery.store.representation.Symbol; import tools.refinery.store.tuple.Tuple; +import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.Set; class UndirectedCrossReferenceInitializer implements PartialModelInitializer { private final PartialRelation linkType; @@ -30,11 +32,23 @@ class UndirectedCrossReferenceInitializer implements PartialModelInitializer { public void initialize(Model model, ModelSeed modelSeed) { var mergedMap = getMergedMap(modelSeed); var interpretation = model.getInterpretation(symbol); + + var oldCursor = interpretation.getAll(); + Set oldKeys = new HashSet<>(); + while (oldCursor.move()) { + oldKeys.add(oldCursor.getKey()); + } + for (var entry : mergedMap.entrySet()) { var key = entry.getKey(); var value = entry.getValue(); + oldKeys.remove(key); interpretation.put(key, value); } + + for (var unusedOldKey : oldKeys) { + interpretation.put(unusedOldKey, symbol.defaultValue()); + } } @NotNull diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java index 955dc1f47..3ed9db27b 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/multiobject/MultiObjectInitializer.java @@ -6,6 +6,7 @@ package tools.refinery.store.reasoning.translator.multiobject; import org.jetbrains.annotations.NotNull; +import tools.refinery.store.model.Interpretation; import tools.refinery.store.model.Model; import tools.refinery.store.reasoning.ReasoningAdapter; import tools.refinery.store.reasoning.refinement.PartialModelInitializer; @@ -17,8 +18,10 @@ import tools.refinery.logic.term.cardinalityinterval.CardinalityIntervals; import tools.refinery.store.tuple.Tuple; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.function.Function; class MultiObjectInitializer implements PartialModelInitializer { @@ -30,10 +33,13 @@ public MultiObjectInitializer(Symbol countSymbol) { @Override public void initialize(Model model, ModelSeed modelSeed) { + var countInterpretation = model.getInterpretation(countSymbol); + eraseNodeCardinalityOverLimit(countInterpretation, modelSeed.getNodeCount()); + var intervals = initializeIntervals(model, modelSeed); initializeExists(intervals, model, modelSeed); initializeEquals(intervals, model, modelSeed); - var countInterpretation = model.getInterpretation(countSymbol); + var uniqueTable = new HashMap(); for (int i = 0; i < intervals.length; i++) { var uniqueInterval = uniqueTable.computeIfAbsent(intervals[i], Function.identity()); @@ -41,6 +47,21 @@ public void initialize(Model model, ModelSeed modelSeed) { } } + private void eraseNodeCardinalityOverLimit(Interpretation interpretation, int limit) { + var cursor = interpretation.getAll(); + List toDelete = new ArrayList<>(); + while(cursor.move()) { + int index = cursor.getKey().get(0); + if(index >= limit) { + toDelete.add(index); + } + } + for(var index : toDelete) { + interpretation.put(Tuple.of(index), countSymbol.defaultValue()); + } + } + + @NotNull private CardinalityInterval[] initializeIntervals(Model model, ModelSeed modelSeed) { var intervals = new CardinalityInterval[modelSeed.getNodeCount()]; @@ -126,4 +147,5 @@ private void checkNodeId(CardinalityInterval[] intervals, int nodeId) { .formatted(nodeId, intervals.length)); } } + } diff --git a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyInitializer.java b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyInitializer.java index aa76d927f..15ee95458 100644 --- a/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyInitializer.java +++ b/subprojects/store-reasoning/src/main/java/tools/refinery/store/reasoning/translator/typehierarchy/TypeHierarchyInitializer.java @@ -5,6 +5,7 @@ */ package tools.refinery.store.reasoning.translator.typehierarchy; +import tools.refinery.store.model.Interpretation; import tools.refinery.store.model.Model; import tools.refinery.store.reasoning.refinement.PartialModelInitializer; import tools.refinery.store.reasoning.representation.PartialRelation; @@ -13,8 +14,10 @@ import tools.refinery.logic.term.truthvalue.TruthValue; import tools.refinery.store.tuple.Tuple; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.function.Function; public class TypeHierarchyInitializer implements PartialModelInitializer { @@ -28,13 +31,16 @@ public TypeHierarchyInitializer(TypeHierarchy typeHierarchy, Symbol(); for (int i = 0; i < inferredTypes.length; i++) { model.checkCancelled(); @@ -43,6 +49,20 @@ public void initialize(Model model, ModelSeed modelSeed) { } } + private void eraseNodeTypesOverLimit(Interpretation interpretation, int limit) { + var cursor = interpretation.getAll(); + List toDelete = new ArrayList<>(); + while(cursor.move()) { + int index = cursor.getKey().get(0); + if(index >= limit) { + toDelete.add(index); + } + } + for(var index : toDelete) { + interpretation.put(Tuple.of(index), typeSymbol.defaultValue()); + } + } + private void initializeType(PartialRelation type, InferredType[] inferredTypes, Model model, ModelSeed modelSeed) { var cursor = modelSeed.getCursor(type, TruthValue.UNKNOWN); var analysisResult = typeHierarchy.getAnalysisResult(type);