diff --git a/src/main/scala/leon/synthesis/rules/ADTSplit.scala b/src/main/scala/leon/synthesis/rules/ADTSplit.scala index 07347e95ba51f78d3603807ea3a95c3dbfcbdb62..04cd58c5a70b6a2bbbec25ce9807e00457a746a8 100644 --- a/src/main/scala/leon/synthesis/rules/ADTSplit.scala +++ b/src/main/scala/leon/synthesis/rules/ADTSplit.scala @@ -2,6 +2,8 @@ package leon package synthesis package rules +import solvers.TimeoutSolver + import purescala.Trees._ import purescala.Common._ import purescala.TypeTrees._ @@ -11,6 +13,8 @@ import purescala.Definitions._ case object ADTSplit extends Rule("ADT Split.") { def instantiateOn(sctx: SynthesisContext, p: Problem): Traversable[RuleInstantiation]= { + val solver = new TimeoutSolver(sctx.solver, 100L) // We give that 100ms + val candidates = p.as.collect { case IsTyped(id, AbstractClassType(cd)) => @@ -18,7 +22,7 @@ case object ADTSplit extends Rule("ADT Split.") { case ccd : CaseClassDef => val toSat = And(p.pc, Not(CaseClassInstanceOf(ccd, Variable(id)))) - val isImplied = sctx.solver.solveSAT(toSat) match { + val isImplied = solver.solveSAT(toSat) match { case (Some(false), _) => true case _ => false } diff --git a/src/main/scala/leon/synthesis/rules/Cegis.scala b/src/main/scala/leon/synthesis/rules/Cegis.scala index 2cb41ef38293fc445c65a3b45f8191ae8f5d4e6e..1bdf8d1cfb68026d0257d74e189752ae15949a33 100644 --- a/src/main/scala/leon/synthesis/rules/Cegis.scala +++ b/src/main/scala/leon/synthesis/rules/Cegis.scala @@ -2,6 +2,7 @@ package leon package synthesis package rules +import solvers.TimeoutSolver import purescala.Trees._ import purescala.Common._ import purescala.Definitions._ @@ -384,7 +385,7 @@ case object CEGIS extends Rule("CEGIS") { var unrolings = 0 val maxUnrolings = 3 - val mainSolver: FairZ3Solver = sctx.solver.asInstanceOf[FairZ3Solver] + val mainSolver = new TimeoutSolver(sctx.solver, 2000L) // 2sec var exampleInputs = Set[Seq[Expr]]() diff --git a/src/main/scala/leon/synthesis/rules/EqualitySplit.scala b/src/main/scala/leon/synthesis/rules/EqualitySplit.scala index 125b2e6060f115f699b45bd5bb682e785c486c6b..c59d37aa014af86df043465d4db59194fe86ff0e 100644 --- a/src/main/scala/leon/synthesis/rules/EqualitySplit.scala +++ b/src/main/scala/leon/synthesis/rules/EqualitySplit.scala @@ -2,6 +2,7 @@ package leon package synthesis package rules +import solvers.TimeoutSolver import purescala.Trees._ import purescala.Common._ import purescala.TypeTrees._ @@ -10,11 +11,13 @@ import purescala.Extractors._ case object EqualitySplit extends Rule("Eq. Split.") { def instantiateOn(sctx: SynthesisContext, p: Problem): Traversable[RuleInstantiation] = { + val solver = new TimeoutSolver(sctx.solver, 100L) // We give that 100ms + val candidates = p.as.groupBy(_.getType).mapValues(_.combinations(2).filter { case List(a1, a2) => val toValEQ = Implies(p.pc, Equals(Variable(a1), Variable(a2))) - val impliesEQ = sctx.solver.solveSAT(Not(toValEQ)) match { + val impliesEQ = solver.solveSAT(Not(toValEQ)) match { case (Some(false), _) => true case _ => false } @@ -22,7 +25,7 @@ case object EqualitySplit extends Rule("Eq. Split.") { if (!impliesEQ) { val toValNE = Implies(p.pc, Not(Equals(Variable(a1), Variable(a2)))) - val impliesNE = sctx.solver.solveSAT(Not(toValNE)) match { + val impliesNE = solver.solveSAT(Not(toValNE)) match { case (Some(false), _) => true case _ => false } diff --git a/src/main/scala/leon/synthesis/rules/Ground.scala b/src/main/scala/leon/synthesis/rules/Ground.scala index 953ad5b56f6d0a7dfa7b5551be27fb4d8554079a..bb74de12aba2f3a80861261cc221e045edd3f11f 100644 --- a/src/main/scala/leon/synthesis/rules/Ground.scala +++ b/src/main/scala/leon/synthesis/rules/Ground.scala @@ -2,6 +2,7 @@ package leon package synthesis package rules +import solvers.TimeoutSolver import purescala.Trees._ import purescala.TypeTrees._ import purescala.TreeOps._ @@ -11,9 +12,11 @@ case object Ground extends Rule("Ground") { def instantiateOn(sctx: SynthesisContext, p: Problem): Traversable[RuleInstantiation] = { if (p.as.isEmpty) { + val solver = new TimeoutSolver(sctx.solver, 1000L) // We give that 1s + val tpe = TupleType(p.xs.map(_.getType)) - sctx.solver.solveSAT(p.phi) match { + solver.solveSAT(p.phi) match { case (Some(true), model) => val sol = Solution(BooleanLiteral(true), Set(), Tuple(p.xs.map(valuateWithModel(model))).setType(tpe)) Some(RuleInstantiation.immediateSuccess(p, this, sol)) diff --git a/src/main/scala/leon/synthesis/rules/InequalitySplit.scala b/src/main/scala/leon/synthesis/rules/InequalitySplit.scala index d79bd66f06bfaac93de04e2288ed766d29e9c52b..11040132becd8790fbfb93ebf84a5163d41e0a8a 100644 --- a/src/main/scala/leon/synthesis/rules/InequalitySplit.scala +++ b/src/main/scala/leon/synthesis/rules/InequalitySplit.scala @@ -2,6 +2,8 @@ package leon package synthesis package rules +import solvers.TimeoutSolver + import purescala.Trees._ import purescala.TypeTrees._ import purescala.Common._ @@ -11,11 +13,13 @@ import purescala.Extractors._ case object InequalitySplit extends Rule("Ineq. Split.") { def instantiateOn(sctx: SynthesisContext, p: Problem): Traversable[RuleInstantiation] = { + val solver = new TimeoutSolver(sctx.solver, 100L) // We give that 100ms + val candidates = p.as.filter(_.getType == Int32Type).combinations(2).toList.filter { case List(a1, a2) => val toValLT = Implies(p.pc, LessThan(Variable(a1), Variable(a2))) - val impliesLT = sctx.solver.solveSAT(Not(toValLT)) match { + val impliesLT = solver.solveSAT(Not(toValLT)) match { case (Some(false), _) => true case _ => false } @@ -23,7 +27,7 @@ case object InequalitySplit extends Rule("Ineq. Split.") { if (!impliesLT) { val toValGT = Implies(p.pc, GreaterThan(Variable(a1), Variable(a2))) - val impliesGT = sctx.solver.solveSAT(Not(toValGT)) match { + val impliesGT = solver.solveSAT(Not(toValGT)) match { case (Some(false), _) => true case _ => false } @@ -31,7 +35,7 @@ case object InequalitySplit extends Rule("Ineq. Split.") { if (!impliesGT) { val toValEQ = Implies(p.pc, Equals(Variable(a1), Variable(a2))) - val impliesEQ = sctx.solver.solveSAT(Not(toValEQ)) match { + val impliesEQ = solver.solveSAT(Not(toValEQ)) match { case (Some(false), _) => true case _ => false } diff --git a/src/main/scala/leon/synthesis/rules/OptimisticGround.scala b/src/main/scala/leon/synthesis/rules/OptimisticGround.scala index d25db6600047ae1f607b7023bf26735a51cb5783..7e65ed7970c6e9d5c67e25b997c8f9c8d3f48f16 100644 --- a/src/main/scala/leon/synthesis/rules/OptimisticGround.scala +++ b/src/main/scala/leon/synthesis/rules/OptimisticGround.scala @@ -2,6 +2,7 @@ package leon package synthesis package rules +import solvers.TimeoutSolver import purescala.Trees._ import purescala.TypeTrees._ import purescala.TreeOps._ @@ -12,6 +13,9 @@ case object OptimisticGround extends Rule("Optimistic Ground") { if (!p.as.isEmpty && !p.xs.isEmpty) { val res = new RuleInstantiation(p, this, SolutionBuilder.none) { def apply(sctx: SynthesisContext) = { + + val solver = new TimeoutSolver(sctx.solver, 100L) // We give that 100ms + val xss = p.xs.toSet val ass = p.as.toSet @@ -27,14 +31,14 @@ case object OptimisticGround extends Rule("Optimistic Ground") { while (result.isEmpty && i < maxTries && continue) { val phi = And(p.pc +: p.phi +: predicates) //println("SOLVING " + phi + " ...") - sctx.solver.solveSAT(phi) match { + solver.solveSAT(phi) match { case (Some(true), satModel) => val satXsModel = satModel.filterKeys(xss) val newPhi = valuateWithModelIn(phi, xss, satModel) //println("REFUTING " + Not(newPhi) + "...") - sctx.solver.solveSAT(Not(newPhi)) match { + solver.solveSAT(Not(newPhi)) match { case (Some(true), invalidModel) => // Found as such as the xs break, refine predicates predicates = valuateWithModelIn(phi, ass, invalidModel) +: predicates