X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fchr%2Fanalysis%2FUsageAnalysis.java;fp=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Felaboration%2Fchr%2Fanalysis%2FUsageAnalysis.java;h=a738c1f42126ebc7d0f01788f2e48ce1129021f3;hp=3d5e0246bfd0a44e62dee6312fd29e2f3a37384b;hb=78f577368ba4c71ad6fb3d9f16c03c634585cf7b;hpb=a88529426319d66aa668882d767efb3f58a1a629 diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/analysis/UsageAnalysis.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/analysis/UsageAnalysis.java index 3d5e0246b..a738c1f42 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/analysis/UsageAnalysis.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/elaboration/chr/analysis/UsageAnalysis.java @@ -12,13 +12,14 @@ import gnu.trove.map.hash.THashMap; public class UsageAnalysis { public static void analyzeUsage(CHRRuleset ruleset) { THashMap> 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> 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> 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) {