Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set timeout on the fly, using command line interface #18

Open
Joool opened this issue Sep 5, 2018 · 8 comments
Open

Set timeout on the fly, using command line interface #18

Joool opened this issue Sep 5, 2018 · 8 comments
Assignees
Labels
feature New feature or request

Comments

@Joool
Copy link

Joool commented Sep 5, 2018

I am currently in the process of migrating a project from z3 to boolector and was wondering if it offers a similar functionality to change timeout on the fly, e.g.:

(set-option :timeout 2000)

I searched the API docs and found this, however, I was wondering if there is exists a comparable feature when using boolector from the command line with the smt2 flag.

@mpreiner
Copy link
Member

mpreiner commented Sep 5, 2018

There is currently no such feature implemented in the SMT2 front-end. However, we can add this feature in the future via the terminate function callbacks in the SMT2 front-end.

@mpreiner mpreiner added the feature New feature or request label Sep 5, 2018
@mpreiner mpreiner self-assigned this Sep 5, 2018
@Joool
Copy link
Author

Joool commented Sep 6, 2018

Thank you very much for your quick response, much appreciated!

While you are at it, I'm also missing a feature to reset the solver, i.e., z3's (reset). My workflow is as follows:

  • I spawn multiple sover processes in queue
  • then alternating between them I send them queries
  • then reset them and add them back to queue

However, I kind of want to avoid resetting them every time.

I hope I am not asking to much.

@mpreiner
Copy link
Member

mpreiner commented Sep 6, 2018

Can you provide a small SMT2 example for this workflow? That would be really helpful!

@Joool
Copy link
Author

Joool commented Sep 7, 2018

Sure:

(declare-const sub_1 (_ BitVec 256))
(declare-const sub_3 (_ BitVec 256))
(declare-const sub_2 (_ BitVec 256))
(assert (= sub_1 (_ bv1 256) ))
(assert (= sub_2 (_ bv0 256) ))
(assert (= sub_3 (ite (= sub_2 sub_1) (_ bv1 256) (_ bv0 256)) ))
(assert (= sub_3 (_ bv1 256) ))
(check-sat)
(reset)
(declare-const sub_1 (_ BitVec 256))
(declare-const sub_3 (_ BitVec 256))
(declare-const sub_2 (_ BitVec 256))
(assert (= sub_1 (_ bv0 256) ))
(assert (= sub_2 (_ bv0 256) ))
(assert (= sub_3 (ite (= sub_2 sub_1) (_ bv1 256) (_ bv0 256)) ))
(assert (= sub_3 (_ bv1 256) ))
(check-sat)

Maybe as context, I'm doing symbolic execution. However, in a multi threaded environment, i.e., I explore multiple paths simultaneously. I run multiple solver instances and tracking which solver has which symbols defined is too much of an overhead. Thus, I just cycle through the solvers, reseting them every time.
Note (reset), is defined by z3 not by SMT2.

@mpreiner
Copy link
Member

mpreiner commented Sep 7, 2018

Have you tried using push/pop instead of a reset? Or are the queries not related at all so that you always want to query a "fresh" instance of the solver?

Here would be the version with push/pop:

(push 1)
(declare-const sub_1 (_ BitVec 256))
(declare-const sub_3 (_ BitVec 256))
(declare-const sub_2 (_ BitVec 256))
(assert (= sub_1 (_ bv1 256) ))
(assert (= sub_2 (_ bv0 256) ))
(assert (= sub_3 (ite (= sub_2 sub_1) (_ bv1 256) (_ bv0 256)) ))
(assert (= sub_3 (_ bv1 256) ))
(check-sat)
(pop 1)
(push 1)
(declare-const sub_1 (_ BitVec 256))
(declare-const sub_3 (_ BitVec 256))
(declare-const sub_2 (_ BitVec 256))
(assert (= sub_1 (_ bv0 256) ))
(assert (= sub_2 (_ bv0 256) ))
(assert (= sub_3 (ite (= sub_2 sub_1) (_ bv1 256) (_ bv0 256)) ))
(assert (= sub_3 (_ bv1 256) ))
(check-sat)
(pop 1)

@Joool
Copy link
Author

Joool commented Sep 10, 2018

Ohh yeah forgot about that mode, I tried it with z3, but performance really suffers (https://stackoverflow.com/questions/26416814/why-does-z3-check-slow-when-it-is-immediately-preceded-by-z3-push). Thanks! I will give it a try with boolector.

@pointhi
Copy link

pointhi commented Jul 23, 2019

Any update in the meantime?

According to the help message there is the possibility of a time limit, but its an absolute timeout starting with the program execution:

  -t <seconds>,
    --time=<seconds>                  set time limit

It would be nice to have the ability to set a timeout which applies to commands like (check-sat), and thus is meaningful when using boolector for iterative solving. A global time limit does not make sense in those cases.

@aytey
Copy link
Contributor

aytey commented Jul 23, 2019

Hi @pointhi,

This is definitely not an official answer, but I had a need for something like this, which ended-up with this branch:

https://github.com/Boolector/boolector/compare/smtcomp19...andrewvaughanj:timeouts_for_term?expand=1

This adds:

  • a -to <VALUE> argument to the main command-line application

  • support for (set-option :timeout <VALUE>) in the SMT2 front-end

  • support for self.btor.Set_opt(boolector.BTOR_OPT_TIMEOUT, <VALUE>) via the Python API

(all values are in millis).

Some important notes:

  • this is based off of the smtcomp19 branch, which I am not sure is officially "ready for consumption" (so please be wary)

  • this will only work (currently) with Lingeling; CaDiCaL does not adhere to the call-back mechanism (yet, there's another PR for that), and CMS/MiniSAT do not have a call-back mechanism at all

Let me know how you get on and, if it is successful, I can see about wrapping it up into an official PR.

Cheers,

Andrew

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature New feature or request
Projects
None yet
Development

No branches or pull requests

4 participants