]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/analysis/UsageAnalysis.java
(refs #7250) CHR rules modularization (first working version)
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / elaboration / chr / analysis / UsageAnalysis.java
index 3d5e0246bfd0a44e62dee6312fd29e2f3a37384b..a738c1f42126ebc7d0f01788f2e48ce1129021f3 100644 (file)
@@ -12,13 +12,14 @@ import gnu.trove.map.hash.THashMap;
 public class UsageAnalysis {
     public static void analyzeUsage(CHRRuleset ruleset) {
         THashMap<CHRConstraint,ArrayList<CHRRule>> headConstraintMap = createHeadConstraintMap(ruleset);
-        calculateFirstPriorities(ruleset, headConstraintMap);
+        //calculateFirstPriorities(ruleset, headConstraintMap);
         calculateLastPriorities(ruleset, headConstraintMap);
-        for(CHRRule rule : ruleset.rules)
-            determinePassiveLiterals(rule);
+        if(!ruleset.extensible)
+            for(CHRRule rule : ruleset.rules)
+                determinePassiveLiterals(rule);
         //printPriorities(ruleset);
     }
-
+    /*
     private static void calculateFirstPriorities(CHRRuleset ruleset,
             THashMap<CHRConstraint, ArrayList<CHRRule>> headConstraintMap) {
         for(CHRRule rule : ruleset.rules)
@@ -39,15 +40,14 @@ public class UsageAnalysis {
                 int constraintPriority = constraint.firstPriorityAdded;
                 if(constraintPriority == Integer.MAX_VALUE)
                     return;
-                result = Math.max(result, constraint.firstPriorityAdded);
+                result = Math.max(result, constraintPriority);
             }
         rule.firstPriorityExecuted = result;
         for(CHRLiteral literal : rule.head.literals)
             if(literal.killAfterMatch && literal.relation instanceof CHRConstraint) {
                 CHRConstraint constraint = (CHRConstraint)literal.relation;
-                if(constraint.firstPriorityRemoved != Integer.MAX_VALUE)
-                    continue;
-                constraint.firstPriorityRemoved = result;
+                if(constraint.firstPriorityRemoved == Integer.MAX_VALUE)
+                    constraint.firstPriorityRemoved = result;
             }
         for(CHRLiteral literal : rule.body.literals)
             if(literal.relation instanceof CHRConstraint) {
@@ -60,15 +60,17 @@ public class UsageAnalysis {
                     continue;
                 for(CHRRule lowerPriorityRule : list)
                     if(lowerPriorityRule.priority < rule.priority)
+                        // We know here that previous call to lowerPriorityRule "failed",
+                        // because constraint.firstPriorityAdded was previously Integer.MAX_VALUE
                         calculateFirstPriority(headConstraintMap, lowerPriorityRule);
             }
     }
-
+    */
     private static void calculateLastPriorities(CHRRuleset ruleset,
             THashMap<CHRConstraint, ArrayList<CHRRule>> headConstraintMap) {
         for(CHRRule rule : ruleset.rules)
             rule.lastPriorityExecuted = Integer.MIN_VALUE;
-        for(CHRConstraint constraint : ruleset.constraints) {
+        for(CHRConstraint constraint : headConstraintMap.keySet()) {
             constraint.lastPriorityAdded = Integer.MIN_VALUE;
             constraint.lastPriorityRemoved = Integer.MIN_VALUE;
         }
@@ -85,9 +87,8 @@ public class UsageAnalysis {
         for(CHRLiteral literal : rule.head.literals)
             if(literal.killAfterMatch && literal.relation instanceof CHRConstraint) {
                 CHRConstraint constraint = (CHRConstraint)literal.relation;
-                if(constraint.lastPriorityRemoved != Integer.MIN_VALUE)
-                    continue;
-                constraint.lastPriorityRemoved = priority;
+                if(constraint.lastPriorityRemoved == Integer.MIN_VALUE)
+                    constraint.lastPriorityRemoved = priority;
             }
         for(CHRLiteral literal : rule.body.literals)
             if(literal.relation instanceof CHRConstraint) {
@@ -121,7 +122,7 @@ public class UsageAnalysis {
         return map;
     }
     
-    private static void printPriorities(CHRRuleset ruleset) {
+    /*private static void printPriorities(CHRRuleset ruleset) {
         System.out.println("-------------------------------");
         for(CHRConstraint constraint : ruleset.constraints) {
             System.out.print(" [" + constraint.firstPriorityAdded + ".." + constraint.lastPriorityAdded + "]");
@@ -135,7 +136,7 @@ public class UsageAnalysis {
             System.out.print(" [" + rule.firstPriorityExecuted + ".." + rule.lastPriorityExecuted + "] ");
             System.out.println(rule);
         }
-    }
+    }*/
 
     private static void determinePassiveLiterals(CHRRule rule) {
         for(CHRLiteral literal : rule.head.literals) {