From c549f70f9e4ae04a5a3b31a73078467b9cdf4c8f Mon Sep 17 00:00:00 2001 From: Akira <akira.charoensit@inria.fr> Date: Mon, 24 Mar 2025 21:56:41 +0100 Subject: [PATCH] Refactoring incremental GRI --- ...actIncrementalGRIBasedExplainer_KBGRI.java | 70 ++++++++++++++----- .../MowlOntologyTest.java | 3 +- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/kb_gri/explainers/incremental_gri/AbstractIncrementalGRIBasedExplainer_KBGRI.java b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/kb_gri/explainers/incremental_gri/AbstractIncrementalGRIBasedExplainer_KBGRI.java index 8dee62f95..0da20ba3b 100644 --- a/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/kb_gri/explainers/incremental_gri/AbstractIncrementalGRIBasedExplainer_KBGRI.java +++ b/integraal/integraal-explanation/src/main/java/fr/boreal/explanation/kb_gri/explainers/incremental_gri/AbstractIncrementalGRIBasedExplainer_KBGRI.java @@ -6,6 +6,7 @@ import fr.boreal.explanation.api.explainers.AtomicQueryExplainer; import fr.boreal.explanation.api.processors.ExplanationProcessor_GRI; import fr.boreal.explanation.api.solver.Solver; import fr.boreal.explanation.configuration.DefaultChaseForExplanations; +import fr.boreal.explanation.configuration.TimingUtil; import fr.boreal.explanation.kb_gri.rule_transformation.GRIRuleTransformer; import fr.boreal.explanation.kb_gri.rule_transformation.static_gri.RulesetForStaticGRIBuildingAndTracing; import fr.boreal.explanation.solving_enumerating.marco.MARCOGMUSSolver; @@ -70,7 +71,6 @@ public abstract class AbstractIncrementalGRIBasedExplainer_KBGRI<ExplanationType // preprocessing java.util.function.Predicate<Atom> belongsToInitialFactbase; - boolean queryEntailed = false; boolean queryInInitialFB = false; // encoding @@ -88,19 +88,6 @@ public abstract class AbstractIncrementalGRIBasedExplainer_KBGRI<ExplanationType protected Set explanations; protected Set<String> gmuses; - - protected KnowledgeBase relTracingKB; - protected FactBase relEdgeFB; - protected Set<String> marcoGmuses; - BiMap<FORule, fr.boreal.model.logicalElements.api.Predicate> ruleToEdgePredicateMap; - - - /** - * The chase object used to compute the GRI, so that it can be reused for tracing. - */ - protected Chase griKBChase; - - /** * Sets the initial KB * @@ -150,6 +137,44 @@ public abstract class AbstractIncrementalGRIBasedExplainer_KBGRI<ExplanationType } + public void dynamicStepWithTimer(String datasetName, Collection<Atom> queries) { + + TimingUtil.timer(this::recordInitialFactbase, "recordInitialFactbase", datasetName); + + for (Atom query : queries) { + TimingUtil.timer(() -> checkQueryInInitialFB(query), "checkQueryInInitialFB", datasetName); + + if (!queryInInitialFB) { + + if (queryAncestorRules != null) { + TimingUtil.timer(this::clearAncestorRules, "clearAncestorRules", datasetName); + } + + TimingUtil.timer(() -> computeAncestorRules(query), "computeAncestorRules", datasetName); + TimingUtil.timer(this::transformRules, "transformRules", datasetName); + TimingUtil.timer(this::chaseKBforGRI, "chaseKBforGRI", datasetName); + + // filtering + TimingUtil.timer(() -> prepareRelTracing(query), "prepareRelTracing", datasetName); + TimingUtil.timer(this::chaseForRELPropagation, "chaseForRELPropagation", datasetName); + TimingUtil.timer(() -> encodeClauses(query), "encodeClauses", datasetName); + + if (solver instanceof MARCOGMUSSolver) { + TimingUtil.timer(this::writeMarcoGCNF, "writeMarcoGCNF", datasetName); + TimingUtil.timer(this::solveGMUSviaMarco, "solveGMUSviaMarco", datasetName); + TimingUtil.timer(this::decodeGMUSesFromMarco, "decodeGMUSesFromMarco", datasetName); + } else if (solver instanceof Sat4JSolver) { + TimingUtil.timer(this::solveGMUSviaSat4j, "solveGMUSviaSat4j", datasetName); + TimingUtil.timer(this::decodeGMUSesFromSat4j, "decodeGMUSesFromSat4j", datasetName + ); + } + + } else { + TimingUtil.timer(() -> returnExplanationForQueryInFB(query), "returnExplanationForQueryInFB", datasetName); + } + } + } + /** * This methods takes in a query and * (1) compute queryAncestorRules of the query @@ -213,21 +238,31 @@ public abstract class AbstractIncrementalGRIBasedExplainer_KBGRI<ExplanationType queryAncestorRules.addAll(getAncestorRules(inputKB.getRuleBase(), query)); } + /** + * This operation transforms rules and prepares + * (1) static KB for static chase + * (2) dynamic RB for dynamic chase + */ public void transformRules() { if (seenRules.isEmpty()) { - FactBase initialFB = inputKB.getFactBase(); + + // building static KB (partial GRI) KnowledgeBase queryAncestorRuleKB = new KnowledgeBaseImpl( - initialFB, + new SimpleInMemoryGraphStore(inputKB.getFactBase().getAtomsInMemory()), new RuleBaseImpl(queryAncestorRules)); + this.transformedRB = ruleTransformer.createStaticGRIBuildingRB(queryAncestorRuleKB); + staticKB = new KnowledgeBaseImpl(inputKB.getFactBase(), transformedRB.getStaticRuleBase()); + // preparing rules for dynamic chase for (FORule rule : queryAncestorRules) { FORule transformedRelPropRule = ruleTransformer.createRelPropagationRule(rule); dynamicRB.add(transformedRelPropRule); } - staticKB = new KnowledgeBaseImpl(initialFB, transformedRB.getStaticRuleBase()); + // recording the rules already seen seenRules.addAll(queryAncestorRules); + } else if (!seenRules.containsAll(queryAncestorRules)) { Set<FORule> rulesToAdd = new HashSet<>(queryAncestorRules); @@ -249,7 +284,6 @@ public abstract class AbstractIncrementalGRIBasedExplainer_KBGRI<ExplanationType } public void chaseKBforGRI() { - DefaultChaseForExplanations.chase(this.staticKB); } diff --git a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/check_has_explanation/MowlOntologyTest.java b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/check_has_explanation/MowlOntologyTest.java index 51e6f04c7..b66e0c7cf 100644 --- a/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/check_has_explanation/MowlOntologyTest.java +++ b/integraal/integraal-explanation/src/test/java/fr/boreal/test/explanation/check_has_explanation/MowlOntologyTest.java @@ -8,7 +8,6 @@ import fr.boreal.explanation.kb_gri.explainers.static_gri.KBSupportExplainer_KBG import fr.boreal.explanation.kb_gri.explainers.static_gri.RuleSupportExplainer_KBGRI; import fr.boreal.explanation.solving_enumerating.sat4j.Sat4JSolver; import fr.boreal.explanation.tracker_gri.explainers.FactSupportExplainer_TrackerGRI; -import fr.boreal.explanation.tracker_gri.explainers.UnambiguousProofTreeWhyProvenanceExplainer_TrackerGRI; import fr.boreal.model.kb.api.KnowledgeBase; import fr.boreal.model.kb.impl.KnowledgeBaseImpl; import fr.boreal.model.kb.impl.RuleBaseImpl; @@ -31,7 +30,7 @@ import java.util.stream.Stream; public class MowlOntologyTest { static String mowl_bench_path = "./src/test/resources/mowl-bench-main/"; - static List<String> mowl_bench_datasets = TestData.hard_mowl_bench_datasets; + static List<String> mowl_bench_datasets = TestData.default_mowl_bench_datasets; enum AtomicQueryExplainerType { STATIC_GRI_FB_MARCO, -- GitLab