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 eb96ba7ce92fe65cb342526872c9dc8daca784f0..5925867025b54ff349eee39e0d1ba88e7e8d4af1 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 4614e74d824cde44d815122d8afbebf73f9c1b91..eea71e6760ad6d588c15883ce9a1a6077de78e12 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 0000000000000000000000000000000000000000..ef6539db651bcedea93a0422f49b635993651757 --- /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 c57cfc7fdd2d210c88390e12a57497dbd238060c..88880059285cc5b7d932057804ea939893d6a966 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 b796175790d19d3f6732ed1931fc916f7adea2fe..b1405d74471e5112e1355c84f2e960dfca60509e 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 c2b32abcacf338abdf7ee1218af30d521e84c881..011f8abbfba8d3aac8f5b9a3be8aadef235ea930 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 349df57cc8d2269a1e6bdda2b94b3e594c6e581c..bb21d5112567d621e51c4a36d7cc6ca689a2ba3e 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 5ef9ce6e40979c5898c764809842b81b67393709..71726081410bc3f4f31e53f71ff8db78537ebbcd 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 610a0205a17c89834144a456aec5ffec4388471e..57dd6b0922121ed3064f32e7dafbd1834da211e9 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 9b8a83107974b0e777cf29cfc8faf4b09eef211a..591a47096e54d80810bb6db07b50da9ba121e7e4 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 d7c3c59ad3a105bad82f41f7be6d929d0bce7903..518050422faee7f2ea64814d9331d736d0ef1a9e 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 7f2dab51dd52f74d67317426bb5460979f0013ef..74c14f27fd3ddbfdc0225595f11775a77583493a 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 25ebcf7eb405c1d2df9bb554c0eea1b249b17ab7..f383b309add5b45c84b71817a0e3e0dc57f1ad3b 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 65b53f7b9659147a24ffd2eea56ad60bbbd77e9b..10debebdc0128cf261eac133af7d9c5835c1c571 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 c176d0c53f37f325ea99988556e2d8e69500835e..518b92660ea35e398c441d52e1e782a47850514e 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;