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) {}