Updated API sources from the latest version of Logic. Adapted to the new API. Activation stack.

This commit is contained in:
Fedor Isakov 2016-01-11 16:07:52 +01:00
parent e97b854f4c
commit bedb9592a0
9 changed files with 199 additions and 42 deletions

View File

@ -2,11 +2,24 @@ package jetbrains.mps.logic.reactor.evaluation;
/*Generated by MPS */
import jetbrains.mps.logic.reactor.program.Rule;
import jetbrains.mps.logic.reactor.program.PredicateSymbol;
import jetbrains.mps.logic.reactor.program.Symbol;
public interface EvaluationTrace {
public void activate(ConstraintOccurrence occurrence);
public void reactivate(ConstraintOccurrence occurrence);
public void suspend(ConstraintOccurrence occurrence);
public void discard(ConstraintOccurrence occurrence);
public void trigger(MatchRule matchRule);
public void exit(Rule rule);
public void askSuccess(PredicateSymbol predicateSymbol, Object... args);
public void askFailure(PredicateSymbol predicateSymbol, Object... args);
@ -18,6 +31,19 @@ public interface EvaluationTrace {
public void reportFailure(String message);
public static final EvaluationTrace NULL = new EvaluationTrace() {
public void activate(ConstraintOccurrence occurrence) {
}
public void reactivate(ConstraintOccurrence occurrence) {
}
public void suspend(ConstraintOccurrence occurrence) {
}
public void discard(ConstraintOccurrence occurrence) {
}
public void trigger(MatchRule matchRule) {
}
public void exit(Rule rule) {
}
public void askSuccess(PredicateSymbol predicateSymbol, Object... args) {
}
public void askFailure(PredicateSymbol predicateSymbol, Object... args) {

View File

@ -0,0 +1,15 @@
package jetbrains.mps.logic.reactor.evaluation;
/*Generated by MPS */
import jetbrains.mps.logic.reactor.program.Rule;
public interface MatchRule {
public Rule rule();
public Iterable<ConstraintOccurrence> matchHeadKept();
public Iterable<ConstraintOccurrence> matchHeadReplaced();
}

View File

@ -12,62 +12,116 @@
<concept fqn="jetbrains.mps.baseLanguage.structure.ThrowStatement" />
<root nodeRef="r:2a79c8aa-e372-4c00-8d71-5d7f3db517e4(jetbrains.mps.logic.reactor.evaluation)/2394628030058821331">
<file name="EvaluationTrace.java">
<node id="2394628030058889702" at="10,0,11,0" concept="4" trace="askSuccess#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="2394628030058891476" at="12,0,13,0" concept="4" trace="askFailure#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="7375810237849470390" at="14,0,15,0" concept="4" trace="ask#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="7375810237849456124" at="16,0,17,0" concept="4" trace="tell#(Ljetbrains/mps/logic/reactor/program/Symbol;null)V" />
<node id="8344829839210112466" at="18,0,19,0" concept="4" trace="reportFailure#(Ljava/lang/String;)V" />
<node id="5160444407776325515" at="21,0,23,0" concept="4" trace="askSuccess#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="5160444407776325526" at="23,0,25,0" concept="4" trace="askFailure#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="5160444407776325537" at="25,0,27,0" concept="4" trace="ask#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="5160444407776325548" at="27,0,29,0" concept="4" trace="tell#(Ljetbrains/mps/logic/reactor/program/Symbol;null)V" />
<node id="5160444407776325559" at="29,0,31,0" concept="4" trace="reportFailure#(Ljava/lang/String;)V" />
<node id="5160444407776320865" at="20,0,32,0" concept="7" trace="NULL" />
<scope id="5160444407776325524" at="21,77,21,77" />
<scope id="5160444407776325535" at="23,77,23,77" />
<scope id="5160444407776325546" at="25,70,25,70" />
<scope id="5160444407776325557" at="27,53,27,53" />
<scope id="5160444407776325565" at="29,47,29,47" />
<scope id="2394628030058889702" at="10,0,11,0">
<node id="1568093847249272547" at="11,0,12,0" concept="4" trace="activate#(Ljetbrains/mps/logic/reactor/evaluation/ConstraintOccurrence;)V" />
<node id="1568093847249273983" at="13,0,14,0" concept="4" trace="reactivate#(Ljetbrains/mps/logic/reactor/evaluation/ConstraintOccurrence;)V" />
<node id="1568093847249274899" at="15,0,16,0" concept="4" trace="suspend#(Ljetbrains/mps/logic/reactor/evaluation/ConstraintOccurrence;)V" />
<node id="1568093847249275822" at="17,0,18,0" concept="4" trace="discard#(Ljetbrains/mps/logic/reactor/evaluation/ConstraintOccurrence;)V" />
<node id="1568093847249552578" at="19,0,20,0" concept="4" trace="trigger#(Ljetbrains/mps/logic/reactor/evaluation/MatchRule;)V" />
<node id="1568093847249559176" at="21,0,22,0" concept="4" trace="exit#(Ljetbrains/mps/logic/reactor/program/Rule;)V" />
<node id="2394628030058889702" at="23,0,24,0" concept="4" trace="askSuccess#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="2394628030058891476" at="25,0,26,0" concept="4" trace="askFailure#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="7375810237849470390" at="27,0,28,0" concept="4" trace="ask#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="7375810237849456124" at="29,0,30,0" concept="4" trace="tell#(Ljetbrains/mps/logic/reactor/program/Symbol;null)V" />
<node id="8344829839210112466" at="31,0,32,0" concept="4" trace="reportFailure#(Ljava/lang/String;)V" />
<node id="1568093847249278110" at="35,0,37,0" concept="4" trace="activate#(Ljetbrains/mps/logic/reactor/evaluation/ConstraintOccurrence;)V" />
<node id="1568093847249278118" at="37,0,39,0" concept="4" trace="reactivate#(Ljetbrains/mps/logic/reactor/evaluation/ConstraintOccurrence;)V" />
<node id="1568093847249278126" at="39,0,41,0" concept="4" trace="suspend#(Ljetbrains/mps/logic/reactor/evaluation/ConstraintOccurrence;)V" />
<node id="1568093847249278134" at="41,0,43,0" concept="4" trace="discard#(Ljetbrains/mps/logic/reactor/evaluation/ConstraintOccurrence;)V" />
<node id="1568093847249562172" at="43,0,45,0" concept="4" trace="trigger#(Ljetbrains/mps/logic/reactor/evaluation/MatchRule;)V" />
<node id="1568093847249562180" at="45,0,47,0" concept="4" trace="exit#(Ljetbrains/mps/logic/reactor/program/Rule;)V" />
<node id="5160444407776325515" at="47,0,49,0" concept="4" trace="askSuccess#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="5160444407776325526" at="49,0,51,0" concept="4" trace="askFailure#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="5160444407776325537" at="51,0,53,0" concept="4" trace="ask#(Ljetbrains/mps/logic/reactor/program/PredicateSymbol;null)V" />
<node id="5160444407776325548" at="53,0,55,0" concept="4" trace="tell#(Ljetbrains/mps/logic/reactor/program/Symbol;null)V" />
<node id="5160444407776325559" at="55,0,57,0" concept="4" trace="reportFailure#(Ljava/lang/String;)V" />
<node id="5160444407776320865" at="33,0,58,0" concept="7" trace="NULL" />
<scope id="1568093847249278117" at="35,59,35,59" />
<scope id="1568093847249278125" at="37,61,37,61" />
<scope id="1568093847249278133" at="39,58,39,58" />
<scope id="1568093847249278141" at="41,58,41,58" />
<scope id="1568093847249562179" at="43,46,43,46" />
<scope id="1568093847249562187" at="45,33,45,33" />
<scope id="5160444407776325524" at="47,77,47,77" />
<scope id="5160444407776325535" at="49,77,49,77" />
<scope id="5160444407776325546" at="51,70,51,70" />
<scope id="5160444407776325557" at="53,53,53,53" />
<scope id="5160444407776325565" at="55,47,55,47" />
<scope id="1568093847249272547" at="11,0,12,0">
<var name="occurrence" id="1568093847249273451" />
</scope>
<scope id="1568093847249273983" at="13,0,14,0">
<var name="occurrence" id="1568093847249273984" />
</scope>
<scope id="1568093847249274899" at="15,0,16,0">
<var name="occurrence" id="1568093847249274900" />
</scope>
<scope id="1568093847249275822" at="17,0,18,0">
<var name="occurrence" id="1568093847249275823" />
</scope>
<scope id="1568093847249552578" at="19,0,20,0">
<var name="matchRule" id="6976745534798433645" />
</scope>
<scope id="1568093847249559176" at="21,0,22,0">
<var name="rule" id="1568093847249559177" />
</scope>
<scope id="2394628030058889702" at="23,0,24,0">
<var name="args" id="2394628030058890766" />
<var name="predicateSymbol" id="2394628030058890707" />
</scope>
<scope id="2394628030058891476" at="12,0,13,0">
<scope id="2394628030058891476" at="25,0,26,0">
<var name="args" id="2394628030058891479" />
<var name="predicateSymbol" id="2394628030058891477" />
</scope>
<scope id="7375810237849470390" at="14,0,15,0">
<scope id="7375810237849470390" at="27,0,28,0">
<var name="args" id="7375810237849470393" />
<var name="predicateSymbol" id="7375810237849470391" />
</scope>
<scope id="7375810237849456124" at="16,0,17,0">
<scope id="7375810237849456124" at="29,0,30,0">
<var name="args" id="7375810237849456127" />
<var name="symbol" id="7375810237849456125" />
</scope>
<scope id="8344829839210112466" at="18,0,19,0">
<scope id="8344829839210112466" at="31,0,32,0">
<var name="message" id="8344829839210112700" />
</scope>
<scope id="5160444407776325515" at="21,0,23,0">
<scope id="1568093847249278110" at="35,0,37,0">
<var name="occurrence" id="1568093847249278111" />
</scope>
<scope id="1568093847249278118" at="37,0,39,0">
<var name="occurrence" id="1568093847249278119" />
</scope>
<scope id="1568093847249278126" at="39,0,41,0">
<var name="occurrence" id="1568093847249278127" />
</scope>
<scope id="1568093847249278134" at="41,0,43,0">
<var name="occurrence" id="1568093847249278135" />
</scope>
<scope id="1568093847249562172" at="43,0,45,0">
<var name="matchRule" id="1568093847249562173" />
</scope>
<scope id="1568093847249562180" at="45,0,47,0">
<var name="rule" id="1568093847249562181" />
</scope>
<scope id="5160444407776325515" at="47,0,49,0">
<var name="args" id="5160444407776325518" />
<var name="predicateSymbol" id="5160444407776325516" />
</scope>
<scope id="5160444407776325526" at="23,0,25,0">
<scope id="5160444407776325526" at="49,0,51,0">
<var name="args" id="5160444407776325529" />
<var name="predicateSymbol" id="5160444407776325527" />
</scope>
<scope id="5160444407776325537" at="25,0,27,0">
<scope id="5160444407776325537" at="51,0,53,0">
<var name="args" id="5160444407776325540" />
<var name="predicateSymbol" id="5160444407776325538" />
</scope>
<scope id="5160444407776325548" at="27,0,29,0">
<scope id="5160444407776325548" at="53,0,55,0">
<var name="args" id="5160444407776325551" />
<var name="symbol" id="5160444407776325549" />
</scope>
<scope id="5160444407776325559" at="29,0,31,0">
<scope id="5160444407776325559" at="55,0,57,0">
<var name="message" id="5160444407776325560" />
</scope>
<unit id="5160444407776325513" at="20,49,31,3" name="jetbrains.mps.logic.reactor.evaluation.EvaluationTrace$1" />
<unit id="2394628030058821331" at="8,0,33,0" name="jetbrains.mps.logic.reactor.evaluation.EvaluationTrace" />
<unit id="5160444407776325513" at="33,49,57,3" name="jetbrains.mps.logic.reactor.evaluation.EvaluationTrace$1" />
<unit id="2394628030058821331" at="9,0,59,0" name="jetbrains.mps.logic.reactor.evaluation.EvaluationTrace" />
</file>
</root>
<root nodeRef="r:2a79c8aa-e372-4c00-8d71-5d7f3db517e4(jetbrains.mps.logic.reactor.evaluation)/4787618122020806150">
@ -161,6 +215,17 @@
<unit id="6317379717821145892" at="8,0,15,0" name="jetbrains.mps.logic.reactor.evaluation.ConstraintOccurrence" />
</file>
</root>
<root nodeRef="r:2a79c8aa-e372-4c00-8d71-5d7f3db517e4(jetbrains.mps.logic.reactor.evaluation)/6976745534798407019">
<file name="MatchRule.java">
<node id="6976745534798407051" at="9,0,10,0" concept="4" trace="rule#()Ljetbrains/mps/logic/reactor/program/Rule;" />
<node id="6976745534798407110" at="11,0,12,0" concept="4" trace="matchHeadKept#()Ljava/lang/Iterable;" />
<node id="6976745534798407558" at="13,0,14,0" concept="4" trace="matchHeadReplaced#()Ljava/lang/Iterable;" />
<scope id="6976745534798407051" at="9,0,10,0" />
<scope id="6976745534798407110" at="11,0,12,0" />
<scope id="6976745534798407558" at="13,0,14,0" />
<unit id="6976745534798407019" at="7,0,16,0" name="jetbrains.mps.logic.reactor.evaluation.MatchRule" />
</file>
</root>
<root nodeRef="r:2a79c8aa-e372-4c00-8d71-5d7f3db517e4(jetbrains.mps.logic.reactor.evaluation)/7785665572546273004">
<file name="Instructible.java">
<node id="7785665572546273471" at="9,0,10,0" concept="4" trace="tell#(Ljetbrains/mps/logic/reactor/program/Symbol;null)V" />

View File

@ -1,6 +1,7 @@
package jetbrains.mps.logic.reactor.core
import jetbrains.mps.logic.reactor.evaluation.ConstraintOccurrence
import jetbrains.mps.logic.reactor.evaluation.EvaluationTrace
import jetbrains.mps.logic.reactor.evaluation.PredicateInvocation
import jetbrains.mps.logic.reactor.evaluation.SessionSolver
import jetbrains.mps.logic.reactor.logical.Logical
@ -17,19 +18,25 @@ class Handler {
val sessionSolver: SessionSolver
private val rules : MutableList<Rule> = ArrayList<Rule>()
val trace: EvaluationTrace
private val stored : MutableList<ConstraintOccurrence> = ArrayList<ConstraintOccurrence>()
private val rules = ArrayList<Rule>()
private val activeQueue : Queue<ConstraintOccurrence> = LinkedList<ConstraintOccurrence>()
private val stored = ArrayList<ConstraintOccurrence>()
private val activeQueue = LinkedList<ConstraintOccurrence>()
private val activationStack = LinkedList<PartialMatch>()
constructor(
sessionSolver: SessionSolver,
programRules: Iterable<Rule>,
trace: EvaluationTrace = EvaluationTrace.NULL,
// for testing purposes only
occurrences: Iterable<ConstraintOccurrence>? = null)
{
this.sessionSolver = sessionSolver
this.trace = trace
this.rules.addAll(programRules)
if (occurrences != null) {
this.stored.addAll(occurrences)
@ -38,6 +45,18 @@ class Handler {
fun occurrences(): Set<ConstraintOccurrence> = stored.toSet()
fun tell(constraint: Constraint) {
try {
queue(constraint.occurrence(this, noLogicalContext))
}
catch (t: Throwable) {
for (pm in activationStack) {
trace.trigger(pm)
}
throw t
}
}
fun queue(occurrence: ConstraintOccurrence) {
activeQueue.add(occurrence)
while (activeQueue.isNotEmpty()) {
@ -48,6 +67,10 @@ class Handler {
private fun process(active: ConstraintOccurrence) {
if (!active.isStored()) {
store(active)
trace.activate(active)
}
else {
trace.reactivate(active)
}
val matcher = object : Matcher(rules) {
@ -57,16 +80,27 @@ class Handler {
}
for (match in matcher.lookupMatches(active).filter { pm -> pm.rule.checkGuard(pm.logicalContext()) }) {
if (!active.isStored()) return
if (!active.isStored()) break
if (match.occurrences().any{ co -> !co.isStored() }) continue
activationStack.push(match)
trace.trigger(match)
for ((cst, occ) in match.discarded) {
discard(occ)
trace.discard(occ)
}
for (item in match.rule.body()) {
activate(item, match.logicalContext())
}
trace.exit(match.rule)
activationStack.pop()
}
if (active.isStored()) {
trace.suspend(active)
}
}
@ -109,6 +143,10 @@ private fun AndItem.argumentValues(context: LogicalContext): List<Any> =
private fun Constraint.occurrence(handler: Handler, context: LogicalContext): ConstraintOccurrence =
MemConstraintOccurrence(handler, this, argumentValues(context))
private val noLogicalContext: LogicalContext = object: LogicalContext {
override fun <V : Any?> valueFor(logicalPattern: LogicalPattern<V>): V? = null
}
private fun Predicate.invocation(logicalContext: LogicalContext): PredicateInvocation {
return object: PredicateInvocation {

View File

@ -77,7 +77,7 @@ class MemLogical<T> : SolverLogical<T> {
override fun union(other: SolverLogical<T>, reconciler: SolverLogical.ValueReconciler<T>) {
val leftRepr = this.find()
val rightRepr = (other as MemLogical<T>).find()
val rightRepr = (other as MemLogical<T>).find()
// invariant: leftRepr.rank > rightRepr.rank
if (leftRepr.rank() < rightRepr.rank()) {

View File

@ -2,6 +2,7 @@ package jetbrains.mps.logic.reactor.core
import com.github.andrewoma.dexx.collection.ConsList
import jetbrains.mps.logic.reactor.evaluation.ConstraintOccurrence
import jetbrains.mps.logic.reactor.evaluation.MatchRule
import jetbrains.mps.logic.reactor.logical.Logical
import jetbrains.mps.logic.reactor.logical.LogicalContext
import jetbrains.mps.logic.reactor.logical.LogicalPattern
@ -50,7 +51,7 @@ abstract class Matcher(val rules: Collection<Rule>) {
}
class PartialMatch(val rule: Rule) {
class PartialMatch(val rule: Rule) : MatchRule {
var kept = ConsList.empty<Pair<Constraint, ConstraintOccurrence>>()
private set
@ -110,6 +111,13 @@ class PartialMatch(val rule: Rule) {
}
fun logicalContext(): LogicalContext = logicalContext
override fun rule(): Rule = rule
override fun matchHeadKept(): Iterable<ConstraintOccurrence> = kept.map { p -> p.second }
override fun matchHeadReplaced(): Iterable<ConstraintOccurrence> = discarded.map { p -> p.second }
}

View File

@ -7,6 +7,7 @@ import jetbrains.mps.logic.reactor.evaluation.EvaluationTrace
import jetbrains.mps.logic.reactor.evaluation.ConstraintOccurrence
import jetbrains.mps.logic.reactor.evaluation.EvaluationSession
import jetbrains.mps.logic.reactor.evaluation.SessionSolver
import jetbrains.mps.logic.reactor.program.Constraint
import jetbrains.mps.logic.reactor.program.ConstraintSymbol
import jetbrains.mps.logic.reactor.program.PredicateSymbol
import jetbrains.mps.logic.reactor.program.Program
@ -48,11 +49,11 @@ class MemEvaluationSession : EvaluationSession {
val sessionSolver = program.sessionSolver()
sessionSolver.init(myEvaluationTrace, * predicateSymbols)
session = MemEvaluationSession(program)
session = MemEvaluationSession(program, myEvaluationTrace)
ourBackend.ourSession.set(session)
try {
session.launch(myParameters["main"] as ConstraintOccurrence)
session.launch(myParameters["main"] as Constraint)
}
finally {
ourBackend.ourSession.set(null)
@ -64,15 +65,18 @@ class MemEvaluationSession : EvaluationSession {
val program: Program
val trace: EvaluationTrace
lateinit var handler: Handler
private constructor(program: Program): super() {
private constructor(program: Program, trace: EvaluationTrace): super() {
this.program = program
this.trace = trace
}
fun launch(main: ConstraintOccurrence) {
this.handler = Handler(sessionSolver(), program.rules())
handler.queue(main)
fun launch(main: Constraint) {
this.handler = Handler(sessionSolver(), program.rules(), trace)
handler.tell(main)
// FIXME: shutdown the session properly
ourBackend.ourSession.set(null)
}

View File

@ -25,7 +25,7 @@ class TestHandler {
init(PredicateSymbol("equals", 2), JavaPredicateSymbol.EXPRESSION0, JavaPredicateSymbol.EXPRESSION1, JavaPredicateSymbol.EXPRESSION2, JavaPredicateSymbol.EXPRESSION3) }
private fun Builder.handler(vararg occurrences: ConstraintOccurrence): Handler =
Handler(sessionSolver(env.expressionSolver, env.equalsSolver), rules, listOf(* occurrences))
Handler(sessionSolver(env.expressionSolver, env.equalsSolver), rules, occurrences = listOf(* occurrences))
private fun <T : Any> Handler.eq(left: Logical<T>, right: Logical<T>) {
sessionSolver.tell(PredicateSymbol("equals", 2), left, right)

View File

@ -7,6 +7,7 @@ import jetbrains.mps.logic.reactor.program.JavaPredicateSymbol
import jetbrains.mps.logic.reactor.program.PredicateSymbol
import org.junit.*
import org.junit.Assert.*
import program.MemConstraint
import solver.eq
/**
@ -30,7 +31,7 @@ class TestProgram {
rules.forEach { r -> programBuilder.addRule(r) }
return EvaluationSession.newSession(programBuilder.program(name, sessionSolver)).
withPredicates(PredicateSymbol("equals", 2), JavaPredicateSymbol.EXPRESSION0, JavaPredicateSymbol.EXPRESSION1, JavaPredicateSymbol.EXPRESSION2, JavaPredicateSymbol.EXPRESSION3).
withParam("main", occurrence("main")).start()
withParam("main", MemConstraint(ConstraintSymbol("main", 0))).start()
}
@Test