From: bdemsky Date: Fri, 23 Jan 2004 03:58:49 +0000 (+0000) Subject: Fix some of Dan's bugs (code generation for relation quantifiers misstyped), didn... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0ddd66cf596f161886dc67214f3fb2e19f6f7168;p=repair.git Fix some of Dan's bugs (code generation for relation quantifiers misstyped), didn't allow for relation quantifier in constraints, and my bugs. --- diff --git a/Repair/RepairCompiler/MCC/Compiler.java b/Repair/RepairCompiler/MCC/Compiler.java index df39d0f..ad98137 100755 --- a/Repair/RepairCompiler/MCC/Compiler.java +++ b/Repair/RepairCompiler/MCC/Compiler.java @@ -17,7 +17,7 @@ import MCC.IR.*; */ public class Compiler { - public static boolean REPAIR=true; + public static boolean REPAIR=false; public static void main(String[] args) { State state = null; @@ -54,11 +54,13 @@ public class Compiler { success = parse(state) || error(state, "Parsing failed, not attempting semantic analysis."); success = semantics(state) || error(state, "Semantic analysis failed, not attempting variable initialization."); + /* Check partition constraints */ + (new ImplicitSchema(state)).update(); + if (REPAIR) { - (new ImplicitSchema(state)).update(); Termination t=new Termination(state); } - + state.printall(); (new DependencyBuilder(state)).calculate(); try { diff --git a/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java b/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java index 569485c..4217361 100755 --- a/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java +++ b/Repair/RepairCompiler/MCC/IR/AbstractInterferes.java @@ -50,7 +50,24 @@ class AbstractInterferes { return false; } } - /* This if handles all the c comparisons in the paper */ + + if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&& + (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&& + (dp.getPredicate() instanceof ExprPredicate)&& + (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) { + boolean neg2=dp.isNegated(); + Opcode op2=((ExprPredicate)dp.getPredicate()).getOp(); + int size2=((ExprPredicate)dp.getPredicate()).leftsize(); + if ((!neg2&&(op2==Opcode.EQ)&&(size2==0))|| + (neg2&&(op2==Opcode.NE)&&(size2==0))|| + (!neg2&&(op2==Opcode.GE))|| + (!neg2&&(op2==Opcode.GT))|| + (neg2&&(op2==Opcode.LE))|| + (neg2&&(op2==Opcode.LT))) + return false; + } + + /* This handles all the c comparisons in the paper */ if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&& (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&& (ar.getPredicate().getPredicate() instanceof ExprPredicate)&& @@ -63,8 +80,8 @@ class AbstractInterferes { boolean neg2=dp.isNegated(); Opcode op2=((ExprPredicate)dp.getPredicate()).getOp(); int size2=((ExprPredicate)dp.getPredicate()).leftsize(); - if ((neg1&&((op1==Opcode.EQ)||(op1==Opcode.LT)||op1==Opcode.LE)||(op1==Opcode.NE))|| - (!neg1&&((op1==Opcode.EQ)||(op1==Opcode.GT)||op1==Opcode.GE)||(op1==Opcode.NE))) { + if ((!neg1&&((op1==Opcode.EQ)||(op1==Opcode.LT)||op1==Opcode.LE)||(op1==Opcode.NE))|| + (neg1&&((op1==Opcode.EQ)||(op1==Opcode.GT)||op1==Opcode.GE)||(op1==Opcode.NE))) { int size1a=0; if (neg1) { if((op1==Opcode.EQ)||(op1==Opcode.GE)) @@ -91,8 +108,37 @@ class AbstractInterferes { (neg2&&(op2==Opcode.LE)&&(size1a>size2))|| (neg2&&(op2==Opcode.LT)&&(size1a>=size2))) return false; - } + } + } + + if (ar.getDescriptor()==dp.getPredicate().getDescriptor()&& + (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&& + (dp.getPredicate() instanceof ExprPredicate)&& + (((ExprPredicate)dp.getPredicate()).getType()==ExprPredicate.SIZE)) { + boolean neg2=dp.isNegated(); + Opcode op2=((ExprPredicate)dp.getPredicate()).getOp(); + int size2=((ExprPredicate)dp.getPredicate()).leftsize(); + if ((!neg2&&(op2==Opcode.EQ)&&(size2==0))|| + (neg2&&(op2==Opcode.NE)&&(size2==0))|| + (neg2&&(op2==Opcode.GE))|| + (neg2&&(op2==Opcode.GT))|| + (!neg2&&(op2==Opcode.LE))|| + (!neg2&&(op2==Opcode.LT))) + return false; + } + if ((ar.getDescriptor()==dp.getPredicate().getDescriptor())&& + (ar.getType()==AbstractRepair.ADDTOSET||ar.getType()==AbstractRepair.ADDTORELATION)&& + (dp.getPredicate() instanceof InclusionPredicate)&& + (dp.isNegated()==false)) + return false; /* Could only satisfy this predicate */ + + if ((ar.getDescriptor()==dp.getPredicate().getDescriptor())&& + (ar.getType()==AbstractRepair.REMOVEFROMSET||ar.getType()==AbstractRepair.REMOVEFROMRELATION)&& + (dp.getPredicate() instanceof InclusionPredicate)&& + (dp.isNegated()==true)) + return false; /* Could only satisfy this predicate */ + return true; } @@ -113,6 +159,8 @@ class AbstractInterferes { { if ((!neg2&&(op2==Opcode.GE))|| (!neg2&&(op2==Opcode.GT))|| + (neg2&&(op2==Opcode.EQ)&&(size2==0))|| + (!neg2&&(op2==Opcode.NE)&&(size2==0))|| (neg2&&(op2==Opcode.LE))|| (neg2&&(op2==Opcode.LT))) return false; @@ -129,15 +177,29 @@ class AbstractInterferes { { if ((neg2&&(op2==Opcode.GE))|| (neg2&&(op2==Opcode.GT))|| + (!neg2&&(op2==Opcode.EQ)&&(size2==0))|| + (neg2&&(op2==Opcode.NE)&&(size2==0))|| (!neg2&&(op2==Opcode.LE))|| (!neg2&&(op2==Opcode.LT))) return false; } } + if ((des==dp.getPredicate().getDescriptor())&& + satisfy&& + (dp.getPredicate() instanceof InclusionPredicate)&& + (dp.isNegated()==false)) + return false; /* Could only satisfy this predicate */ + + if ((des==dp.getPredicate().getDescriptor())&& + (!satisfy)&& + (dp.getPredicate() instanceof InclusionPredicate)&& + (dp.isNegated()==true)) + return false; /* Could only satisfy this predicate */ + return true; } - static public boolean interferes(Descriptor des, boolean satisfy, Rule r, boolean satisfyrule) { + static public boolean interferesquantifier(Descriptor des, boolean satisfy, Quantifiers r, boolean satisfyrule) { for(int i=0;i " + node.getLabel() + " [" + edgelabel + edge.dotnodeparams + "];"); + if (nodes.contains(node)) { + String edgelabel = useEdgeLabels ? "label=\"" + edge.getLabel() + "\"" : "label=\"\""; + output.println("\t" + gn.getLabel() + " -> " + node.getLabel() + " [" + edgelabel + edge.dotnodeparams + "];"); + } } } } diff --git a/Repair/RepairCompiler/MCC/IR/ImplicitSchema.java b/Repair/RepairCompiler/MCC/IR/ImplicitSchema.java index 8d61947..1be0068 100755 --- a/Repair/RepairCompiler/MCC/IR/ImplicitSchema.java +++ b/Repair/RepairCompiler/MCC/IR/ImplicitSchema.java @@ -11,38 +11,230 @@ public class ImplicitSchema { } public void update() { - updaterules(); + // updaterules(); updateconstraints(); updaterelationconstraints(); } + boolean needDomain(RelationDescriptor rd) { + return needDR(rd, true); + } + + boolean needDR(RelationDescriptor rd,boolean isdomain) { + Vector rules=state.vRules; + SetDescriptor sd=isdomain?rd.getDomain():rd.getRange(); + for(int i=0;i in "+relation.toString(); + return str; + } + public boolean usesDescriptor(Descriptor d) { if (d==relation) return true; diff --git a/Repair/RepairCompiler/MCC/IR/RelationQuantifier.java b/Repair/RepairCompiler/MCC/IR/RelationQuantifier.java index 7281d2e..193e02c 100755 --- a/Repair/RepairCompiler/MCC/IR/RelationQuantifier.java +++ b/Repair/RepairCompiler/MCC/IR/RelationQuantifier.java @@ -13,6 +13,10 @@ public class RelationQuantifier extends Quantifier { relation = rd; } + public RelationDescriptor getRelation() { + return relation; + } + public void setTuple(VarDescriptor x, VarDescriptor y) { this.x = x; this.y = y; @@ -31,9 +35,9 @@ public class RelationQuantifier extends Quantifier { public void generate_open(CodeWriter writer) { writer.outputline("for (SimpleIterator* " + x.getSafeSymbol() + "_iterator = " + relation.getSafeSymbol() + "_hash->iterator(); " + x.getSafeSymbol() + "_iterator->hasNext(); )"); writer.startblock(); - writer.outputline(y.getType().getSafeSymbol() + " " + y.getSafeSymbol() + " = (" + y.getType().getSafeSymbol() + ") " + x.getSafeSymbol() + "_iterator->next();"); + writer.outputline(y.getType().getGenerateType() + " " + y.getSafeSymbol() + " = (" + y.getType().getGenerateType() + ") " + x.getSafeSymbol() + "_iterator->next();"); // #ATTN#: key is called second because next() forwards ptr and key does not! - writer.outputline(x.getType().getSafeSymbol() + " " + x.getSafeSymbol() + " = (" + x.getType().getSafeSymbol() + ") " + x.getSafeSymbol() + "_iterator->key();"); + writer.outputline(x.getType().getGenerateType() + " " + x.getSafeSymbol() + " = (" + x.getType().getGenerateType() + ") " + x.getSafeSymbol() + "_iterator->key();"); } public int generate_worklistload(CodeWriter writer, int offset) { diff --git a/Repair/RepairCompiler/MCC/IR/Rule.java b/Repair/RepairCompiler/MCC/IR/Rule.java index 12650d9..017e788 100755 --- a/Repair/RepairCompiler/MCC/IR/Rule.java +++ b/Repair/RepairCompiler/MCC/IR/Rule.java @@ -2,7 +2,7 @@ package MCC.IR; import java.util.*; -public class Rule { +public class Rule implements Quantifiers { static int count = 1; @@ -23,6 +23,15 @@ public class Rule { label = new String("rule" + count++); } + public String toString() { + String name=""; + for(int i=0;i"+inclusion.toString(); + return name; + } + public int numQuantifiers() { return quantifiers.size(); } diff --git a/Repair/RepairCompiler/MCC/IR/SetDescriptor.java b/Repair/RepairCompiler/MCC/IR/SetDescriptor.java index 6bd62ed..2b42ac2 100755 --- a/Repair/RepairCompiler/MCC/IR/SetDescriptor.java +++ b/Repair/RepairCompiler/MCC/IR/SetDescriptor.java @@ -28,7 +28,8 @@ public class SetDescriptor extends Descriptor { if (descriptor instanceof SetDescriptor) { expanded.addAll(((SetDescriptor) descriptor).allSubsets()); - } + } else + expanded.add(descriptor); /* Still need the descriptor */ } expanded.addAll(descriptors); diff --git a/Repair/RepairCompiler/MCC/IR/SetInclusion.java b/Repair/RepairCompiler/MCC/IR/SetInclusion.java index cdf67b2..9d37572 100755 --- a/Repair/RepairCompiler/MCC/IR/SetInclusion.java +++ b/Repair/RepairCompiler/MCC/IR/SetInclusion.java @@ -13,6 +13,12 @@ public class SetInclusion extends Inclusion { static boolean worklist = false; public boolean dostore = true; + public String toString() { + String str=""; + str+=elementexpr.name()+" in "+set; + return str; + } + public SetInclusion(Expr elementexpr, SetDescriptor set) { this.elementexpr = elementexpr; this.set = set; @@ -25,6 +31,10 @@ public class SetInclusion extends Inclusion { return elementexpr.usesDescriptor(d); } + public Expr getExpr() { + return elementexpr; + } + public SetDescriptor getSet() { return set; } diff --git a/Repair/RepairCompiler/MCC/IR/TermNode.java b/Repair/RepairCompiler/MCC/IR/TermNode.java index 9e3dbe8..7fadf32 100755 --- a/Repair/RepairCompiler/MCC/IR/TermNode.java +++ b/Repair/RepairCompiler/MCC/IR/TermNode.java @@ -55,6 +55,13 @@ class TermNode { return conj; } + public Constraint getConstraint() { + if (type!=CONJUNCTION) + throw new Error("Not Conjunction Node!"); + else + return constr; + } + public MultUpdateNode getUpdate() { if (type!=UPDATE) throw new Error("Not Update Node!"); diff --git a/Repair/RepairCompiler/MCC/IR/Termination.java b/Repair/RepairCompiler/MCC/IR/Termination.java index 0b01ab9..f9ae3bb 100755 --- a/Repair/RepairCompiler/MCC/IR/Termination.java +++ b/Repair/RepairCompiler/MCC/IR/Termination.java @@ -15,6 +15,8 @@ public class Termination { Hashtable scopesatisfy; Hashtable scopefalsify; Hashtable consequence; + Hashtable abstractadd; + Hashtable abstractremove; State state; @@ -29,11 +31,15 @@ public class Termination { consequence=new Hashtable(); updatenodes=new HashSet(); consequencenodes=new HashSet(); + abstractadd=new Hashtable(); + abstractremove=new Hashtable(); + generateconjunctionnodes(); generatescopenodes(); generaterepairnodes(); generatedatastructureupdatenodes(); + generatecompensationnodes(); generateabstractedges(); generatescopeedges(); @@ -42,9 +48,10 @@ public class Termination { HashSet superset=new HashSet(); superset.addAll(conjunctions); superset.addAll(abstractrepair); - superset.addAll(updatenodes); - superset.addAll(scopenodes); - superset.addAll(consequencenodes); + //superset.addAll(updatenodes); + //superset.addAll(scopenodes); + //superset.addAll(consequencenodes); + //GraphNode.computeclosure(superset); try { GraphNode.DOTVisitor.visit(new FileOutputStream("graph.dot"),superset); } catch (Exception e) { @@ -101,9 +108,12 @@ public class Termination { GraphNode gn2=(GraphNode)conjiterator.next(); TermNode tn2=(TermNode)gn2.getOwner(); Conjunction conj=tn2.getConjunction(); + Constraint cons=tn2.getConstraint(); + for(int i=0;i head in Nodes; [forall node in Nodes], !(node.next=literal(0)) => node.next in Nodes; [forall node in Nodes], !(node.next=literal(0)) => in nextnodes; -[forall node in Nodes], !(node.prev=literal(0)) => node.prev in Nodes; [forall node in Nodes], !(node.prev=literal(0)) => in prevnodes;