Skip to content
Snippets Groups Projects
Commit 3f39702f authored by Manos Koukoutos's avatar Manos Koukoutos
Browse files

Datagens should respect interrupts

parent 35da251f
Branches
Tags
No related merge requests found
...@@ -55,7 +55,7 @@ class GrammarDataGen(evaluator: Evaluator, grammar: ExpressionGrammar = ValueGra ...@@ -55,7 +55,7 @@ class GrammarDataGen(evaluator: Evaluator, grammar: ExpressionGrammar = ValueGra
def generate(tpe: TypeTree): Iterator[Expr] = { def generate(tpe: TypeTree): Iterator[Expr] = {
val enum = new MemoizedEnumerator[Label, Expr, ProductionRule[Label, Expr]](grammar.getProductions) val enum = new MemoizedEnumerator[Label, Expr, ProductionRule[Label, Expr]](grammar.getProductions)
enum.iterator(Label(tpe)).flatMap(expandGenerics) enum.iterator(Label(tpe)).flatMap(expandGenerics).takeWhile(_ => !interrupted.get)
} }
def generateFor(ins: Seq[Identifier], satisfying: Expr, maxValid: Int, maxEnumerated: Int): Iterator[Seq[Expr]] = { def generateFor(ins: Seq[Identifier], satisfying: Expr, maxValid: Int, maxEnumerated: Int): Iterator[Seq[Expr]] = {
...@@ -82,6 +82,7 @@ class GrammarDataGen(evaluator: Evaluator, grammar: ExpressionGrammar = ValueGra ...@@ -82,6 +82,7 @@ class GrammarDataGen(evaluator: Evaluator, grammar: ExpressionGrammar = ValueGra
detupled.take(maxEnumerated) detupled.take(maxEnumerated)
.filter(filterCond) .filter(filterCond)
.take(maxValid) .take(maxValid)
.takeWhile(_ => !interrupted.get)
} }
} }
......
...@@ -15,7 +15,7 @@ class SolverDataGen(ctx: LeonContext, pgm: Program, sf: SolverFactory[Solver]) e ...@@ -15,7 +15,7 @@ class SolverDataGen(ctx: LeonContext, pgm: Program, sf: SolverFactory[Solver]) e
implicit val ctx0 = ctx implicit val ctx0 = ctx
def generate(tpe: TypeTree): FreeableIterator[Expr] = { def generate(tpe: TypeTree): FreeableIterator[Expr] = {
generateFor(Seq(FreshIdentifier("tmp", tpe)), BooleanLiteral(true), 20, 20).map(_.head) generateFor(Seq(FreshIdentifier("tmp", tpe)), BooleanLiteral(true), 20, 20).map(_.head).takeWhile(_ => !interrupted.get)
} }
def generateFor(ins: Seq[Identifier], satisfying: Expr, maxValid: Int, maxEnumerated: Int): FreeableIterator[Seq[Expr]] = { def generateFor(ins: Seq[Identifier], satisfying: Expr, maxValid: Int, maxEnumerated: Int): FreeableIterator[Seq[Expr]] = {
...@@ -76,7 +76,7 @@ class SolverDataGen(ctx: LeonContext, pgm: Program, sf: SolverFactory[Solver]) e ...@@ -76,7 +76,7 @@ class SolverDataGen(ctx: LeonContext, pgm: Program, sf: SolverFactory[Solver]) e
val enum = modelEnum.enumVarying(ins, satisfying, sizeOf, 5) val enum = modelEnum.enumVarying(ins, satisfying, sizeOf, 5)
enum.take(maxValid).map(model => ins.map(model)) enum.take(maxValid).map(model => ins.map(model)).takeWhile(_ => !interrupted.get)
} }
} }
......
...@@ -4,6 +4,8 @@ package leon ...@@ -4,6 +4,8 @@ package leon
package utils package utils
abstract class FreeableIterator[T] extends Iterator[T] { abstract class FreeableIterator[T] extends Iterator[T] {
orig =>
private[this] var nextElem: Option[T] = None private[this] var nextElem: Option[T] = None
def hasNext = { def hasNext = {
...@@ -20,8 +22,6 @@ abstract class FreeableIterator[T] extends Iterator[T] { ...@@ -20,8 +22,6 @@ abstract class FreeableIterator[T] extends Iterator[T] {
def free() def free()
override def map[B](f: T => B): FreeableIterator[B] = { override def map[B](f: T => B): FreeableIterator[B] = {
val orig = this
new FreeableIterator[B] { new FreeableIterator[B] {
def computeNext() = orig.computeNext.map(f) def computeNext() = orig.computeNext.map(f)
def free() = orig.free() def free() = orig.free()
...@@ -29,10 +29,8 @@ abstract class FreeableIterator[T] extends Iterator[T] { ...@@ -29,10 +29,8 @@ abstract class FreeableIterator[T] extends Iterator[T] {
} }
override def take(n: Int): FreeableIterator[T] = { override def take(n: Int): FreeableIterator[T] = {
val orig = this
new FreeableIterator[T] { new FreeableIterator[T] {
private var c = 0; private var c = 0
def computeNext() = { def computeNext() = {
if (c < n) { if (c < n) {
...@@ -47,6 +45,13 @@ abstract class FreeableIterator[T] extends Iterator[T] { ...@@ -47,6 +45,13 @@ abstract class FreeableIterator[T] extends Iterator[T] {
} }
} }
override def takeWhile(p: T => Boolean) = {
new FreeableIterator[T] {
def computeNext(): Option[T] = orig.computeNext.filter(p)
def free(): Unit = orig.free()
}
}
override def toList: List[T] = { override def toList: List[T] = {
val res = super.toList val res = super.toList
free() free()
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
package leon.regression.verification package leon.regression.verification
import smtlib.interpreters.Z3Interpreter
import leon.solvers.SolverFactory import leon.solvers.SolverFactory
// If you add another regression test, make sure it contains exactly one object, whose name matches the file name. // If you add another regression test, make sure it contains exactly one object, whose name matches the file name.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment