From a003211a2c0ea6da4f1730b620e4713bd3ed7fe7 Mon Sep 17 00:00:00 2001 From: Fedor Isakov Date: Sat, 1 Aug 2020 15:12:44 +0200 Subject: [PATCH] Minor optimization of term trie. --- .../mps/logic/reactor/util/ArrayListStack.kt | 5 +++- .../mps/logic/reactor/util/ClassicTermTrie.kt | 26 ++++++++++--------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/util/ArrayListStack.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/util/ArrayListStack.kt index e1e7df9b..131322aa 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/util/ArrayListStack.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/util/ArrayListStack.kt @@ -16,6 +16,9 @@ package jetbrains.mps.logic.reactor.util +import java.util.* +import kotlin.collections.ArrayList + /** * @author Fedor Isakov */ @@ -24,4 +27,4 @@ fun ArrayList.push (element: T): Unit { add(element) } fun ArrayList.pop (): T = removeAt(size - 1) -fun ArrayList.peek (): T = last() \ No newline at end of file +fun ArrayList.peek (): T = get(size - 1) diff --git a/reactor/Core/src/jetbrains/mps/logic/reactor/util/ClassicTermTrie.kt b/reactor/Core/src/jetbrains/mps/logic/reactor/util/ClassicTermTrie.kt index 4dab8c4a..db27e3b7 100644 --- a/reactor/Core/src/jetbrains/mps/logic/reactor/util/ClassicTermTrie.kt +++ b/reactor/Core/src/jetbrains/mps/logic/reactor/util/ClassicTermTrie.kt @@ -76,41 +76,43 @@ class ClassicTermTrie : TermTrie { val seen = IdentityHashMap() val nodeStack = arrayListOf(root) val termStack = arrayListOf(matchTerm) + val argPool = arrayListOf() while (!termStack.isEmpty()) { val node = nodeStack.peek() val term = termStack.pop() // dereferece the term only if it hasn't been dereferenced before val deref = deref(term).let { dt -> seen[dt]?.run { term } ?: dt.apply { seen[dt] = term } } - val arguments = deref.arguments().toList() - for(i in 1..arguments.size) { - termStack.push(arguments[arguments.size - i]) + argPool.addAll(deref.arguments()) + for(i in 1..argPool.size) { + termStack.push(argPool[argPool.size - i]) } - - val nextNode = node.nextOrDefault(symbolOrWildcard(deref)) { sym -> PathNode(sym, arguments.size) } + val nextNode = node.nextOrDefault(symbolOrWildcard(deref)) { sym -> PathNode(sym, argPool.size) } nodeStack.push(nextNode) + argPool.clear() } val head = nodeStack.pop() head.addValue(value) - nodeStack.reverse() - nodeStack.fold(head) { nextNode, node -> node.putNext(nextNode) } + nodeStack.foldRight(head) { node, nextNode -> node.putNext(nextNode) } } private fun removeValue(matchTerm: Term, value: T) { val seen = IdentityHashMap() val nodeStack = arrayListOf(root) val termStack = arrayListOf(matchTerm) + val argPool = arrayListOf() while (!termStack.isEmpty()) { val node = nodeStack.peek() - val term = termStack.removeAt(termStack.size - 1) + val term = termStack.pop() // dereferece the term only if it hasn't been dereferenced before val deref = deref(term).let { dt -> seen[dt]?.run { term } ?: dt.apply { seen[dt] = term } } - val arguments = deref.arguments().toList() - for(i in 1..arguments.size) { - termStack.add(arguments[arguments.size - i]) + argPool.addAll(deref.arguments()) + for(i in 1..argPool.size) { + termStack.push(argPool[argPool.size - i]) } + argPool.clear() val nextNode = node.next(symbolOrWildcard(deref)) if (nextNode == null) { @@ -251,7 +253,7 @@ class ClassicTermTrie : TermTrie { val term = ArrayList>() val edge = ArrayList>() - val stack = ArrayList, Int>>() + val stack = arrayListOf, Int>>() for (n in allNext()) { stack.push(n to 0) }