module Ersatz.Solver
( module Ersatz.Solver.DepQBF
, module Ersatz.Solver.Kissat
, module Ersatz.Solver.Lingeling
, module Ersatz.Solver.Minisat
, module Ersatz.Solver.Z3
, solveWith
) where
import Control.Monad.State
import Data.Default
import Ersatz.Codec
import Ersatz.Problem
import Ersatz.Solution
import Ersatz.Solver.DepQBF
import Ersatz.Solver.Kissat
import Ersatz.Solver.Lingeling
import Ersatz.Solver.Minisat
import Ersatz.Solver.Z3
solveWith ::
(Monad m, HasSAT s, Default s, Codec a) =>
Solver s m -> StateT s m a -> m (Result, Maybe (Decoded a))
solveWith :: forall (m :: * -> *) s a.
(Monad m, HasSAT s, Default s, Codec a) =>
Solver s m -> StateT s m a -> m (Result, Maybe (Decoded a))
solveWith Solver s m
solver StateT s m a
m = do
(a
a, s
problem) <- StateT s m a -> s -> m (a, s)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT StateT s m a
m s
forall a. Default a => a
def
(Result
res, IntMap Bool
litMap) <- Solver s m
solver s
problem
(Result, Maybe (Decoded a)) -> m (Result, Maybe (Decoded a))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Result
res, Solution -> a -> Maybe (Decoded a)
forall a. Codec a => Solution -> a -> Maybe (Decoded a)
decode (IntMap Bool -> s -> Solution
forall s. HasSAT s => IntMap Bool -> s -> Solution
solutionFrom IntMap Bool
litMap s
problem) a
a)