From d9d16f3c77990f79e869fd705d85c55fffc5fdfa Mon Sep 17 00:00:00 2001 From: federico <federico@inria.fr> Date: Wed, 12 Feb 2025 19:14:24 +0100 Subject: [PATCH] added methods to retrieve trackers from the chase --- .../GRI/dynamicProcessing/RELTracer.java | 1 + .../GRI/staticProcessing/GRIBuilder.java | 2 +- .../RuleTransformationRecord.java | 27 ++++++++++ .../StaticGRIRuleTransformer.java | 17 ++++--- .../ChaseStaticGRIRuleTransformerTest.java | 6 +-- .../chasingAndTracing/RELTracerTest.java | 25 ++++------ .../FactSupportKBGSATEncoderTest.java | 2 +- .../solvingViaGMUS/GMUSSolverTest.java | 2 +- .../solvingViaGMUS/GMUSTranslatorTest.java | 2 +- .../solvingViaGMUS/KBtoGSATEncoderTest.java | 2 +- .../sat4j/MUSSat4JSolverTest.java | 4 +- .../lineage/FederatedLineageTracker.java | 8 +-- .../chase/lineage/LineageTracker.java | 7 +++ .../chase/lineage/LineageTrackerImpl.java | 49 ++++++++++++------- .../chase/lineage/NoLineageTracker.java | 7 ++- 15 files changed, 107 insertions(+), 54 deletions(-) create mode 100644 integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/RuleTransformationRecord.java diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/dynamicProcessing/RELTracer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/dynamicProcessing/RELTracer.java index eb96ba7ce..592586702 100644 --- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/dynamicProcessing/RELTracer.java +++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/dynamicProcessing/RELTracer.java @@ -28,6 +28,7 @@ public class RELTracer { KnowledgeBase gri, StaticGRIRuleTransformer ruleTransformerFactory, Atom query) { + //TODO : modify and add the dynamic rules gri = new KnowledgeBaseImpl(new SimpleInMemoryGraphStore(gri.getFactBase().getAtomsInMemory()), gri.getRuleBase()); //first, check that the query is entailed diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/staticProcessing/GRIBuilder.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/staticProcessing/GRIBuilder.java index 4614e74d8..eea71e676 100644 --- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/staticProcessing/GRIBuilder.java +++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/GRI/staticProcessing/GRIBuilder.java @@ -15,7 +15,7 @@ public class GRIBuilder { // transform the ruleset to be able to build the GRI var transformedRB = staticRuleTransformerFactory.createTransformedRB(kb); - KnowledgeBase gri = new KnowledgeBaseImpl(kb.getFactBase(), transformedRB); + KnowledgeBase gri = new KnowledgeBaseImpl(kb.getFactBase(), transformedRB.getStaticRuleBase()); DefaultChaseForExplanations.chase(gri); diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/RuleTransformationRecord.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/RuleTransformationRecord.java new file mode 100644 index 000000000..ef6539db6 --- /dev/null +++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/RuleTransformationRecord.java @@ -0,0 +1,27 @@ +package fr.boreal.explanation.ruleFactories; + +import fr.boreal.model.kb.api.RuleBase; +import fr.boreal.model.kb.impl.RuleBaseImpl; +import fr.boreal.model.rule.api.FORule; +import fr.boreal.model.rule.api.Rule; + +import java.util.Collection; +import java.util.LinkedHashSet; + +public record RuleTransformationRecord(Collection<FORule> nodeBuildingRules, Collection<FORule> edgeBuildingRules, + Collection<FORule> relTracingRules){ + + public RuleBase getStaticRuleBase() { + Collection<FORule> temp = new LinkedHashSet<>(); + temp.addAll(this.nodeBuildingRules); + temp.addAll(this.edgeBuildingRules); + return new RuleBaseImpl(temp); + } + + public RuleBase getDynamicRuleBase() { + Collection<FORule> temp = new LinkedHashSet<>(); + temp.addAll(this.relTracingRules); + return new RuleBaseImpl(temp); + } + +} diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/StaticGRIRuleTransformer.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/StaticGRIRuleTransformer.java index c57cfc7fd..888800592 100644 --- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/StaticGRIRuleTransformer.java +++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/ruleFactories/StaticGRIRuleTransformer.java @@ -15,10 +15,12 @@ import fr.boreal.model.logicalElements.factory.impl.SameObjectTermFactory; import fr.boreal.model.logicalElements.impl.AtomImpl; import fr.boreal.model.logicalElements.impl.StoredFunctionalTermImpl; import fr.boreal.model.rule.api.FORule; +import fr.boreal.model.rule.api.Rule; import fr.boreal.model.rule.impl.FORuleImpl; import java.util.*; +; /** * This class implements a rule transformation for : * <p> @@ -28,6 +30,7 @@ import java.util.*; */ public class StaticGRIRuleTransformer { + // factories for creating new terms, predicates and transformed rules private TermFactory termFactory = SameObjectTermFactory.instance(); private static PredicateFactory predicateFactory = SameObjectPredicateFactory.instance(); @@ -66,21 +69,23 @@ public class StaticGRIRuleTransformer { * (3) rel propagation rules */ - public RuleBase createTransformedRB(KnowledgeBase kb) { + public RuleTransformationRecord createTransformedRB(KnowledgeBase kb) { - RuleBase rb = new RuleBaseImpl(); + Set<FORule> nodeBuildingRules = new LinkedHashSet<>(); + Set<FORule> edgeBuildingRules = new LinkedHashSet<>(); + Set<FORule> relTracingRules = new LinkedHashSet<>(); for (Iterator<Predicate> it = kb.getFactBase().getPredicates(); it.hasNext(); ) { Predicate p = it.next(); - rb.add(createGRINodeBuildingRule(p)); + nodeBuildingRules.add(createGRINodeBuildingRule(p)); } for (FORule r : kb.getRuleBase().getRules()) { - rb.add(createGRIEdgeBuildingRule(r)); - rb.add(createRelPropagationRule(r)); + edgeBuildingRules.add(createGRIEdgeBuildingRule(r)); + relTracingRules.add(createRelPropagationRule(r)); } - return rb; + return new RuleTransformationRecord(nodeBuildingRules,edgeBuildingRules,relTracingRules); } diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/ChaseStaticGRIRuleTransformerTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/ChaseStaticGRIRuleTransformerTest.java index b79617579..b1405d744 100644 --- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/ChaseStaticGRIRuleTransformerTest.java +++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/ChaseStaticGRIRuleTransformerTest.java @@ -47,7 +47,7 @@ public class ChaseStaticGRIRuleTransformerTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r3)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb).getStaticRuleBase()); TestData.chase(transformedKB); Predicate edge_r3 = factory.getOrGenerateEdgePredicateFromRule(TestData.r3); @@ -78,7 +78,7 @@ public class ChaseStaticGRIRuleTransformerTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r3, TestData.r4)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb).getStaticRuleBase()); TestData.chase(transformedKB); Predicate edge_r3 = factory.getOrGenerateEdgePredicateFromRule(TestData.r3); @@ -107,7 +107,7 @@ public class ChaseStaticGRIRuleTransformerTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r2)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, factory.createTransformedRB(kb).getStaticRuleBase()); TestData.chase(transformedKB); Predicate edge_r2 = factory.getOrGenerateEdgePredicateFromRule(TestData.r2); diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/RELTracerTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/RELTracerTest.java index c2b32abca..011f8abbf 100644 --- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/RELTracerTest.java +++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/chasingAndTracing/RELTracerTest.java @@ -63,31 +63,26 @@ public class RELTracerTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r3)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, ruleTransformerFactory.createTransformedRB(kb)); + var transformedRB = ruleTransformerFactory.createTransformedRB(kb); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, transformedRB.getStaticRuleBase()); Chase staticChase = chase(transformedKB); var tracker = staticChase.getTracker(); RELTracer tracer = new RELTracer(); - FactBase relAtoms ; + var query = TestData.qa; var gri=transformedKB; - gri = new KnowledgeBaseImpl(new SimpleInMemoryGraphStore(gri.getFactBase().getAtomsInMemory()), gri.getRuleBase()); + gri = new KnowledgeBaseImpl(factBase, transformedRB.getDynamicRuleBase()); //first, check that the query is entailed Atom queryWithFuncId = ruleTransformerFactory.createAtomWithStoredFnTermIdentifier(query); - if (!gri.getFactBase().contains(queryWithFuncId)) { - relAtoms= new SimpleInMemoryGraphStore(); - } - // add seed atom to the factbase Atom RELquery = new AtomImpl(StaticGRIRuleTransformer.REL, StaticGRIRuleTransformer.createFnTermIdentifier(query)); gri.getFactBase().add(RELquery); //propagate REL and REL_EDGE - var dynamicChase = DefaultChaseForExplanations.chase(gri); - - relAtoms= gri.getFactBase(); + var dynamicChase = chase(gri); StoredFunctionalTerm fpa = ruleTransformerFactory.createFnTermIdentifier(TestData.pa); StoredFunctionalTerm fqa = ruleTransformerFactory.createFnTermIdentifier(TestData.qa); @@ -108,16 +103,16 @@ public class RELTracerTest { ruleTransformerFactory.getOrGenerateRelEdgePredicateFromRule(TestData.r3), List.of(fpa, ftay)); - Assertions.assertTrue(relAtoms.contains(RELpa), + Assertions.assertTrue(factBase.contains(RELpa), String.format("Relevant atom missing: %s %n Rel Atoms: %s", RELpa, factBase)); - Assertions.assertTrue(relAtoms.contains(RELedgepaqa), + Assertions.assertTrue(factBase.contains(RELedgepaqa), String.format("Relevant edge missing: %s %n Rel Atoms: %s", RELedgepaqa, factBase)); - Assertions.assertTrue(!relAtoms.contains(RELtay), + Assertions.assertTrue(!factBase.contains(RELtay), String.format("Irrelevant atom marked as relevant: %s %n Rel Atoms: %s", RELtay, factBase)); - Assertions.assertTrue(!relAtoms.contains(RELedgepatay), + Assertions.assertTrue(!factBase.contains(RELedgepatay), String.format("Irrelevant edge marked as relevant: %s %n Rel Atoms: %s", RELedgepatay, factBase)); } @@ -129,7 +124,7 @@ public class RELTracerTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r5)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, ruleTransformerFactory.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, ruleTransformerFactory.createTransformedRB(kb).getStaticRuleBase()); chase(transformedKB); RELTracer tracer = new RELTracer(); diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/FactSupportKBGSATEncoderTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/FactSupportKBGSATEncoderTest.java index 349df57cc..bb21d5112 100644 --- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/FactSupportKBGSATEncoderTest.java +++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/FactSupportKBGSATEncoderTest.java @@ -51,7 +51,7 @@ public class FactSupportKBGSATEncoderTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase()); TestData.chase(transformedKB); RELTracer tracer = new RELTracer(); diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSSolverTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSSolverTest.java index 5ef9ce6e4..717260814 100644 --- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSSolverTest.java +++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSSolverTest.java @@ -46,7 +46,7 @@ public class GMUSSolverTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1, TestData.r4)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase()); TestData.chase(transformedKB); RELTracer tracer = new RELTracer(); diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSTranslatorTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSTranslatorTest.java index 610a0205a..57dd6b092 100644 --- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSTranslatorTest.java +++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/GMUSTranslatorTest.java @@ -43,7 +43,7 @@ public class GMUSTranslatorTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1, TestData.r4)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase()); TestData.chase(transformedKB); RELTracer tracer = new RELTracer(); diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBtoGSATEncoderTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBtoGSATEncoderTest.java index 9b8a83107..591a47096 100644 --- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBtoGSATEncoderTest.java +++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/KBtoGSATEncoderTest.java @@ -51,7 +51,7 @@ public class KBtoGSATEncoderTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase()); TestData.chase(transformedKB); RELTracer tracer = new RELTracer(); diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/sat4j/MUSSat4JSolverTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/sat4j/MUSSat4JSolverTest.java index d7c3c59ad..518050422 100644 --- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/sat4j/MUSSat4JSolverTest.java +++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/solvingViaGMUS/sat4j/MUSSat4JSolverTest.java @@ -39,7 +39,7 @@ public class MUSSat4JSolverTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1, TestData.r4)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase()); TestData.chase(transformedKB); RELTracer tracer = new RELTracer(); @@ -61,7 +61,7 @@ public class MUSSat4JSolverTest { RuleBase ruleBase = new RuleBaseImpl(List.of(TestData.r1, TestData.r4)); KnowledgeBase kb = new KnowledgeBaseImpl(factBase, ruleBase); - KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb)); + KnowledgeBase transformedKB = new KnowledgeBaseImpl(factBase, staticGRIRuleTransformer.createTransformedRB(kb).getStaticRuleBase()); TestData.chase(transformedKB); RELTracer tracer = new RELTracer(); diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/FederatedLineageTracker.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/FederatedLineageTracker.java index 7f2dab51d..74c14f27f 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/FederatedLineageTracker.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/FederatedLineageTracker.java @@ -2,25 +2,27 @@ package fr.boreal.forward_chaining.chase.lineage; import fr.boreal.model.logicalElements.api.Atom; +import java.util.ArrayList; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; public interface FederatedLineageTracker { static Set<Atom> getAncestorsOf(Atom atom, LineageTracker... trackers) { Set<Atom> result = new LinkedHashSet<>(); - Set<Atom> toDO = new LinkedHashSet<>(); + List<Atom> toDO = new ArrayList<>(); toDO.add(atom); boolean noNew = true; while (noNew) { if (toDO.isEmpty()){ break; } - Atom currentAtom = toDO.stream().findAny().get(); + Atom currentAtom = toDO.getFirst(); toDO.remove(currentAtom); boolean someNew = false; for (int i = 0; i < trackers.length; i++) { - for(Atom currentAtomAncestor : trackers[i].getAncestorsOf(currentAtom)) { + for(Atom currentAtomAncestor : trackers[i].getPrimeAncestorsOf(currentAtom)) { boolean addedCurrent = result.add(currentAtomAncestor); someNew = someNew || addedCurrent; if(addedCurrent){ diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTracker.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTracker.java index 25ebcf7eb..f383b309a 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTracker.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTracker.java @@ -17,6 +17,13 @@ public interface LineageTracker { */ Collection<Atom> getAncestorsOf(Atom atom); + /** + * + * @param atom + * @return the prime ancestors of atom, that is, only those who do not have ancestors + */ + Collection<Atom> getPrimeAncestorsOf(Atom atom); + /** * * Tracks the fact that the application of rule with substitution from the bodyfacts produced headFactsPossiblyNew diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTrackerImpl.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTrackerImpl.java index 65b53f7b9..10debebdc 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTrackerImpl.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/LineageTrackerImpl.java @@ -12,35 +12,46 @@ public class LineageTrackerImpl implements LineageTracker { Map<Atom, Map<Rule, Map<Substitution, Set<Atom>>>> lineage = new LinkedHashMap<>(); - @Override - public Collection<Atom> getAncestorsOf(Atom a) { + private Collection<Atom> getAncestorsOf(Atom a, boolean returnOnlyPrimeAncestors) { boolean finished = false; - Set<Atom> ancestors = new LinkedHashSet<>(); - List<Atom> toVisit = new ArrayList<>(); + Set<Atom> ancestorSet = new LinkedHashSet<>(); + List<Atom> computeAncestorsOf = new ArrayList<>(); Atom current = a; while (!finished) { - if (lineage.get(current) == null || lineage.get(current).isEmpty()) { - return Set.of(); - } - for (Rule rule : lineage.get(current).keySet()) { - for (Substitution substitution : lineage.get(current).get(rule).keySet()) { - Set<Atom> anc = lineage.get(current).get(rule).get(substitution); - for (Atom an : anc) { - if (!ancestors.contains(an)) { - ancestors.add(a); - toVisit.add(a); + if (!(lineage.get(current) == null || lineage.get(current).isEmpty())) { + for (Rule rule : lineage.get(current).keySet()) { + for (Substitution substitution : lineage.get(current).get(rule).keySet()) { + Set<Atom> tempAnc = lineage.get(current).get(rule).get(substitution); + for (Atom ancestorAtom : tempAnc) { + if (!ancestorSet.contains(ancestorAtom)) { + if (returnOnlyPrimeAncestors) { + if (lineage.get(ancestorAtom) == null || lineage.get(ancestorAtom).isEmpty()) + ancestorSet.add(ancestorAtom); + } + computeAncestorsOf.add(ancestorAtom); + } } } } } - toVisit.remove(current); - if (toVisit.isEmpty()) { + computeAncestorsOf.remove(current); + if (computeAncestorsOf.isEmpty()) { finished = true; } else { - current = toVisit.getFirst(); + current = computeAncestorsOf.getFirst(); } } - return ancestors; + return ancestorSet; + } + + @Override + public Collection<Atom> getAncestorsOf(Atom atom) { + return getAncestorsOf(atom,false); + } + + @Override + public Collection<Atom> getPrimeAncestorsOf(Atom atom) { + return getAncestorsOf(atom,true); } @Override @@ -52,7 +63,7 @@ public class LineageTrackerImpl implements LineageTracker { .computeIfAbsent(rule, r -> new LinkedHashMap<>()) .computeIfAbsent(substitution, s -> new LinkedHashSet<>()) .addAll(bodyFacts); - addedSomething = addedSomething||atomAdded; + addedSomething = addedSomething || atomAdded; } return addedSomething; } diff --git a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/NoLineageTracker.java b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/NoLineageTracker.java index c176d0c53..518b92660 100644 --- a/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/NoLineageTracker.java +++ b/integraal/integraal-forward-chaining/src/main/java/fr/boreal/forward_chaining/chase/lineage/NoLineageTracker.java @@ -10,13 +10,18 @@ import java.util.*; /** * Default Implementation of a no-tracker */ -public class NoLineageTracker implements LineageTracker{ +public class NoLineageTracker implements LineageTracker { @Override public Collection<Atom> getAncestorsOf(Atom a) { return Set.of(); } + @Override + public Collection<Atom> getPrimeAncestorsOf(Atom atom) { + return Set.of(); + } + @Override public boolean track(Set<Atom> bodyFacts, Set<Atom> headFactsPossiblyNew, FORule rule, Substitution substitution) { return false; -- GitLab