Skip to content

Commit

Permalink
consider polarity in ToySolver.SAT.Encoder.Cardinality.Internal.Naive
Browse files Browse the repository at this point in the history
  • Loading branch information
msakai committed Aug 10, 2022
1 parent b172dae commit 8759d5d
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 9 deletions.
4 changes: 2 additions & 2 deletions src/ToySolver/SAT/Encoder/Cardinality.hs
Original file line number Diff line number Diff line change
Expand Up @@ -108,9 +108,9 @@ encodeAtLeast :: PrimMonad m => Encoder m -> SAT.AtLeast -> m SAT.Lit
encodeAtLeast enc = encodeAtLeastWithPolarity enc polarityBoth

encodeAtLeastWithPolarity :: PrimMonad m => Encoder m -> Polarity -> SAT.AtLeast -> m SAT.Lit
encodeAtLeastWithPolarity (Encoder base@(Totalizer.Encoder tseitin _) strategy) _polarity =
encodeAtLeastWithPolarity (Encoder base@(Totalizer.Encoder tseitin _) strategy) polarity =
case strategy of
Naive -> encodeAtLeastNaive tseitin
Naive -> encodeAtLeastWithPolarityNaive tseitin polarity
ParallelCounter -> encodeAtLeastParallelCounter tseitin
SequentialCounter -> \(lhs,rhs) -> BDD.encodePBLinAtLeastBDD tseitin ([(1,l) | l <- lhs], fromIntegral rhs)
Totalizer -> Totalizer.encodeAtLeast base
14 changes: 7 additions & 7 deletions src/ToySolver/SAT/Encoder/Cardinality/Internal/Naive.hs
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@
-----------------------------------------------------------------------------
module ToySolver.SAT.Encoder.Cardinality.Internal.Naive
( addAtLeastNaive
, encodeAtLeastNaive
, encodeAtLeastWithPolarityNaive
) where

import Control.Monad.Primitive
import qualified ToySolver.SAT.Types as SAT
import qualified ToySolver.SAT.Encoder.Tseitin as Tseitin
import ToySolver.SAT.Encoder.Tseitin (Polarity ())

addAtLeastNaive :: PrimMonad m => Tseitin.Encoder m -> SAT.AtLeast -> m ()
addAtLeastNaive enc (lhs,rhs) = do
Expand All @@ -27,15 +28,14 @@ addAtLeastNaive enc (lhs,rhs) = do
else do
mapM_ (SAT.addClause enc) (comb (n - rhs + 1) lhs)

-- TODO: consider polarity
encodeAtLeastNaive :: PrimMonad m => Tseitin.Encoder m -> SAT.AtLeast -> m SAT.Lit
encodeAtLeastNaive enc (lhs,rhs) = do
encodeAtLeastWithPolarityNaive :: PrimMonad m => Tseitin.Encoder m -> Polarity -> SAT.AtLeast -> m SAT.Lit
encodeAtLeastWithPolarityNaive enc polarity (lhs,rhs) = do
let n = length lhs
if n < rhs then do
Tseitin.encodeDisj enc []
Tseitin.encodeDisjWithPolarity enc polarity []
else do
ls <- mapM (Tseitin.encodeDisj enc) (comb (n - rhs + 1) lhs)
Tseitin.encodeConj enc ls
ls <- mapM (Tseitin.encodeDisjWithPolarity enc polarity) (comb (n - rhs + 1) lhs)
Tseitin.encodeConjWithPolarity enc polarity ls

comb :: Int -> [a] -> [[a]]
comb 0 _ = [[]]
Expand Down

0 comments on commit 8759d5d

Please sign in to comment.