package org.simantics.scl.compiler.elaboration.chr;
+import java.util.ArrayList;
+
import org.simantics.scl.compiler.compilation.CompilationContext;
-import org.simantics.scl.compiler.elaboration.chr.plan.PlanOp;
-import org.simantics.scl.compiler.elaboration.chr.plan.PrioritizedPlan;
+import org.simantics.scl.compiler.elaboration.chr.plan.CHRSearchPlan;
import org.simantics.scl.compiler.elaboration.chr.planning.QueryPlanningContext;
import org.simantics.scl.compiler.elaboration.chr.relations.CHRConstraint;
import org.simantics.scl.compiler.elaboration.contexts.SimplificationContext;
import gnu.trove.set.hash.TIntHashSet;
public class CHRRule extends Symbol {
+ public CHRRuleset parentRuleset;
public int priority;
public CHRQuery head;
public CHRQuery body;
public Variable[] existentialVariables;
// Analysis
- public int firstPriorityExecuted;
+ //public int firstPriorityExecuted;
public int lastPriorityExecuted;
+ // Plans
+ public ArrayList<CHRSearchPlan> plans = new ArrayList<CHRSearchPlan>();
+
+ // Code generation, move to CHRPriority
+ public String containerClassName;
+
public CHRRule(long location, CHRQuery head, CHRQuery body, Variable[] existentialVariables) {
this.location = location;
this.head = head;
}
public void compile(CompilationContext compilationContext, CHRConstraint initConstraint) {
- boolean hasActiveLiteral = false;
+ boolean hasLocalActiveLiteral = false;
for(int i=0;i<head.literals.length;++i) {
CHRLiteral literal = head.literals[i];
if(literal.passive)
if(!head.createQueryPlan(context, new EVariable(activeFact), i))
return;
body.createEnforcePlan(context, priority);
- constraint.plans.add(new PrioritizedPlan(priority, activeFact, context.getPlanOps()));
+ addPlan(new CHRSearchPlan(constraint, activeFact, context.getPlanOps()));
- hasActiveLiteral = true;
+ if(constraint.parentRuleset == parentRuleset)
+ hasLocalActiveLiteral = true;
}
- if(!hasActiveLiteral) {
+ if(!hasLocalActiveLiteral) {
Variable activeFact = new Variable("activeFact", initConstraint.factType);
QueryPlanningContext context = new QueryPlanningContext(compilationContext, existentialVariables);
if(!head.createQueryPlan(context, null, -1))
/*System.out.println(this);
for(PlanOp planOp : context.getPlanOps())
System.out.println(" " + planOp);*/
- initConstraint.plans.add(new PrioritizedPlan(priority, activeFact, context.getPlanOps()));
+ addPlan(new CHRSearchPlan(initConstraint, activeFact, context.getPlanOps()));
}
}
+ private void addPlan(CHRSearchPlan plan) {
+ plans.add(plan);
+ }
+
public String toString() {
StringBuilder b = new StringBuilder();
ExpressionToStringVisitor visitor = new ExpressionToStringVisitor(b);