From bcad14d2a5547ea7f9700c164b3ad876cdbb9cfb Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Mon, 14 Mar 2022 18:35:17 +0100 Subject: [PATCH] Introduce support for undo activate/discard trace events In case evaluation fails and the state of activated occurrences is reset to some previously stored state, the trace view does not get updated and contains some stale information. This patch fixes it. --- .../core/internal/EvaluationSessionImpl.kt | 2 +- .../reactor/core/internal/MatchJournalImpl.kt | 34 ++++++++++++------- .../reactor/evaluation/EvaluationTrace.java | 4 +++ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/EvaluationSessionImpl.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/EvaluationSessionImpl.kt index 0dfa8531..347f3f0e 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/EvaluationSessionImpl.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/EvaluationSessionImpl.kt @@ -105,7 +105,7 @@ internal class EvaluationSessionImpl private constructor ( ?.also { it.updateIndexFromRules(program.rules()) } ?: RuleIndex(program.rules()) - val journal = MatchJournalImpl(incrementality) + val journal = MatchJournalImpl(incrementality, trace) val logicalState = LogicalState() val dispatchingFront = Dispatcher(ruleIndex).front() diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt index b13266c2..2c23fdb2 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/MatchJournalImpl.kt @@ -175,6 +175,27 @@ internal open class MatchJournalImpl( return added } + internal fun resetOccurrences(occSpecs: List) = + // assume occSpecs are ordered in order of processing + // so, iterate over reversed list + occSpecs.asReversed().forEach { + if (it.discarded) { + + trace.undoDiscard(it.occ) + + it.occ.alive = true + it.occ.stored = true + + } else { + + trace.undoActivate(it.occ) + + it.occ.alive = false + it.occ.stored = false + } + } + + override fun initialChunk(): MatchChunk = initialChunk override fun parentChunk(): MatchChunk = ancestorChunksStack.peek()!! @@ -379,19 +400,6 @@ internal fun RuleMatch.collectJustifications(vararg withEvidence: Evidence): Jus this.allHeads().forEach { allJss.addAll(it.justifications()) } } -internal fun resetOccurrences(occSpecs: List) = - // assume occSpecs are ordered in order of processing - // so, iterate over reversed list - occSpecs.asReversed().forEach { - if (it.discarded) { - it.occ.alive = true - it.occ.stored = true - } else { - it.occ.alive = false - it.occ.stored = false - } - } - internal fun MutableList.push(element: E) = this.add(element) internal fun MutableList.pop() = this.removeAt(this.size - 1) internal fun MutableList.peek() = this.last() diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/evaluation/EvaluationTrace.java b/reactor/Core/src/jetbrains/mps/logic/reactor/evaluation/EvaluationTrace.java index c562aad1..903aa67d 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/evaluation/EvaluationTrace.java +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/evaluation/EvaluationTrace.java @@ -31,6 +31,8 @@ public interface EvaluationTrace { default void activate(ConstraintOccurrence occurrence) {} + default void undoActivate(ConstraintOccurrence occurrence) {} + default void reactivate(ConstraintOccurrence occurrence) {} default void activateContinue(ConstraintOccurrence occurrence) {} @@ -39,6 +41,8 @@ public interface EvaluationTrace { default void discard(ConstraintOccurrence occurrence) {} + default void undoDiscard(ConstraintOccurrence occurrence) {} + default void trying(RuleMatch ruleMatch) {} default void reject(RuleMatch ruleMatch) {}