From 8cb6aa72d32b4a47f5207b344e49def1d5c6c7cb Mon Sep 17 00:00:00 2001 From: Grigorii Kirgizov Date: Wed, 15 Jul 2020 18:09:18 +0300 Subject: [PATCH] minor refactorings in engine (some moves & renames) --- .../mps/logic/reactor/core/RuleMatchEx.kt | 4 ++++ .../core/internal/ConstraintsProcessing.kt | 21 +++++++------------ ...onQueue.kt => ContinuedActivationQueue.kt} | 2 +- .../reactor/core/internal/MatchJournalImpl.kt | 4 ++-- 4 files changed, 15 insertions(+), 16 deletions(-) rename reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/{ExecutionQueue.kt => ContinuedActivationQueue.kt} (99%) diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/RuleMatchEx.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/RuleMatchEx.kt index 55ddacfc..77c90a8b 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/RuleMatchEx.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/RuleMatchEx.kt @@ -16,6 +16,7 @@ package jetbrains.mps.logic.reactor.core +import jetbrains.mps.logic.reactor.evaluation.ConstraintOccurrence import jetbrains.mps.logic.reactor.evaluation.RuleMatch import jetbrains.mps.logic.reactor.program.Constraint import jetbrains.mps.logic.reactor.program.Rule @@ -44,6 +45,9 @@ interface RuleMatchEx : RuleMatch { inline fun RuleMatchEx.forEachReplaced(action: (Occurrence) -> Unit) = this.matchHeadReplaced().forEach(action) +fun RuleMatch.discards(occurrence: ConstraintOccurrence): Boolean = + this.matchHeadReplaced().contains(occurrence) + fun Rule.allHeads() = (headKept().asSequence() + headReplaced().asSequence()) fun RuleMatch.allHeads() = (matchHeadKept().asSequence() + matchHeadReplaced().asSequence()) as Sequence diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt index 8eeb4695..019871a3 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ConstraintsProcessing.kt @@ -19,7 +19,6 @@ package jetbrains.mps.logic.reactor.core.internal import jetbrains.mps.logic.reactor.core.* import jetbrains.mps.logic.reactor.evaluation.EvaluationTrace import jetbrains.mps.logic.reactor.program.IncrementalProgramSpec -import jetbrains.mps.logic.reactor.evaluation.RuleMatch import jetbrains.mps.logic.reactor.evaluation.SessionToken import jetbrains.mps.logic.reactor.program.Rule import jetbrains.mps.logic.reactor.util.Profiler @@ -48,7 +47,7 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di { private val journalIndex: MatchJournal.Index = journal.index() - private val execQueue: ExecutionQueue = ExecutionQueue(journalIndex, RuleOrdering(ruleIndex)) + private val activationQueue: ContinuedActivationQueue = ContinuedActivationQueue(journalIndex, RuleOrdering(ruleIndex)) private val invalidatedRulesTags: MutableSet = mutableSetOf() @@ -118,7 +117,7 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di // all occurrences from the head are principal. assert(chunk.match.allHeads().all { it.isPrincipal }) - execQueue.offerAll(lastValidChunk.toPos(), validOccs.asIterable()) + activationQueue.offerAll(lastValidChunk.toPos(), validOccs.asIterable()) } } else { lastValidChunk = chunk @@ -158,7 +157,7 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di val (candRule, occChunk) = aIt.next() val pos = - if (execQueue.canBeInserted(candRule, occChunk, chunk)) + if (activationQueue.canBeInserted(candRule, occChunk, chunk)) // We need the previous chunk as pos here (i.e. adding after it). prevChunk.toPos() else if (!it.hasNext()) @@ -167,7 +166,7 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di else continue - execQueue.offer(pos, occChunk) + activationQueue.offer(pos, occChunk) trace.potentialMatch(occChunk.occ, candRule) // Drop the candidate if appropriate activation place is found. aIt.remove() @@ -180,7 +179,7 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di } fun launchQueue(controller: Controller): FeedbackStatus = - execQueue.run(controller, this) + activationQueue.run(controller, this) /** * Clears state unneeded between incremental sessions @@ -230,13 +229,12 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di if (isFront() || !active.isPrincipal) { matches } else { - execQueue.postponeFutureMatches(matches) + activationQueue.postponeFutureMatches(matches) } val outStatus = currentMatches.fold(inStatus) { status, match -> if (activationChunk != null && !isFront()) { - val discards = match.matchHeadReplaced().contains(active) - if (discards) { + if (match.discards(active)) { dropDiscardingMatchesFor(activationChunk, invalidatedRulesTags) } } @@ -259,10 +257,7 @@ internal class ConstraintsProcessing(private var dispatchingFront: Dispatcher.Di private fun dropDiscardingMatchesFor(ancestor: MatchJournal.OccChunk, droppedRuleTags: MutableSet) = this.dropDescendantsWhile(ancestor) { chunk -> - - if (chunk is MatchJournal.MatchChunk - && chunk.match.matchHeadReplaced().contains(ancestor.occ)) - { + if (chunk is MatchJournal.MatchChunk && chunk.match.discards(ancestor.occ)) { droppedRuleTags.add(chunk.ruleUniqueTag) true } else false diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ExecutionQueue.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ContinuedActivationQueue.kt similarity index 99% rename from reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ExecutionQueue.kt rename to reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ContinuedActivationQueue.kt index a0160447..a44178bd 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ExecutionQueue.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/core/internal/ContinuedActivationQueue.kt @@ -20,7 +20,7 @@ import jetbrains.mps.logic.reactor.core.* import jetbrains.mps.logic.reactor.program.Rule import java.util.* -internal class ExecutionQueue( +internal class ContinuedActivationQueue( private val journalIndex: MatchJournal.Index, private val ruleOrdering: RuleOrdering ) { 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 4d83e817..25acef75 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 @@ -245,7 +245,7 @@ internal open class MatchJournalImpl( * while applying [action] to each visited [Chunk]. * No journal state is changed during operation (except by [action] effects). */ - private fun forEachChunkFrom(from: Pos, action: (Chunk) -> Unit) { + private inline fun forEachChunkFrom(from: Pos, action: (Chunk) -> Unit) { val to = current do { // there's always at least initial chunk @@ -260,7 +260,7 @@ internal open class MatchJournalImpl( override fun replay(futurePos: Pos) = replayWith(futurePos, {}) - private fun replayWith(futurePos: MatchJournal.Pos, action: (Chunk) -> Unit) { + private inline fun replayWith(futurePos: MatchJournal.Pos, action: (Chunk) -> Unit) { do { if (futurePos.chunk === current) { replayOccurrences(current.entries.take(futurePos.entriesCount))