@@ -11,6 +11,7 @@ module Booster.SMT.Interface (
11
11
finaliseSolver ,
12
12
getModelFor ,
13
13
checkPredicates ,
14
+ hardResetSolver ,
14
15
) where
15
16
16
17
import Control.Exception (Exception , throw )
@@ -82,19 +83,24 @@ initSolver def smtOptions = Log.withContext "smt" $ do
82
83
Log. logMessage (" Successfully initialised SMT solver with " <> (Text. pack . show $ smtOptions))
83
84
pure ctxt
84
85
85
- restartSolver :: forall io . Log. LoggerMIO io => SMTOptions -> SMT io ()
86
- restartSolver smtOptions = do
86
+ -- | Hot-swap @SMTOptions@ in the active @SMTContext@, update the query timeout
87
+ swapSmtOptions :: forall io . Log. LoggerMIO io => SMTOptions -> SMT io ()
88
+ swapSmtOptions smtOptions = do
89
+ ctxt <- SMT get
90
+ Log. logMessage (" Updating solver options with " <> (Text. pack . show $ smtOptions))
91
+ SMT $ put ctxt{options = smtOptions}
92
+ runCmd_ $ SetTimeout smtOptions. timeout
93
+
94
+ -- | Stop the solver, initialise a new one and put in the @SMTContext@
95
+ hardResetSolver :: forall io . Log. LoggerMIO io => SMTOptions -> SMT io ()
96
+ hardResetSolver smtOptions = do
87
97
Log. logMessage (" Starting new SMT solver" :: Text )
88
98
ctxt <- SMT get
89
99
liftIO ctxt. solverClose
90
100
(solver, handle) <- connectToSolver
91
- SMT $ put ctxt{solver, solverClose = Backend. close handle, options = smtOptions}
92
-
101
+ SMT $ put ctxt{solver, solverClose = Backend. close handle}
93
102
checkPrelude
94
- Log. logMessage (" Successfully re-initialised SMT solver with " <> (Text. pack . show $ smtOptions))
95
-
96
- -- set timeout value for the general queries
97
- runCmd_ $ SetTimeout smtOptions. timeout
103
+ swapSmtOptions smtOptions
98
104
99
105
translatePrelude :: Log. LoggerMIO io => KoreDefinition -> io [DeclareCommand ]
100
106
translatePrelude def =
@@ -179,7 +185,7 @@ getModelFor ctxt ps subst
179
185
case opts. retryLimit of
180
186
Just x | x > 0 -> do
181
187
let newOpts = opts{timeout = 2 * opts. timeout, retryLimit = Just $ x - 1 }
182
- restartSolver newOpts
188
+ swapSmtOptions newOpts
183
189
solve smtAsserts transState
184
190
_ -> getReasonUnknown
185
191
r@ ReasonUnknown {} ->
@@ -364,7 +370,7 @@ checkPredicates ctxt givenPs givenSubst psToCheck
364
370
case opts. retryLimit of
365
371
Just x | x > 0 -> do
366
372
let newOpts = opts{timeout = 2 * opts. timeout, retryLimit = Just $ x - 1 }
367
- restartSolver newOpts
373
+ swapSmtOptions newOpts
368
374
solve smtGiven sexprsToCheck transState
369
375
_ -> runMaybeT failBecauseUnknown
370
376
0 commit comments