feat(encode): add vertex cover encoding
This commit is contained in:
1 parent
59b3ebd355
commit
a3b16797a2
1 file changed
+29
@@ -0,0 +1,29 @@
|
|||||||
|
module Sift.Encode.VertexCover
|
||||||
|
( vertexCover
|
||||||
|
, decodeVertexCover
|
||||||
|
, validVertexCover
|
||||||
|
) where
|
||||||
|
|
||||||
|
import Sift.Types
|
||||||
|
import Sift.Encode.Cardinality (atMostK)
|
||||||
|
import Sift.Encode.Coloring (Graph(..))
|
||||||
|
import qualified Data.Map.Strict as Map
|
||||||
|
|
||||||
|
vertexCover :: Int -> Graph -> CNF
|
||||||
|
vertexCover k (Graph vertices edges) = CNF (edgeClauses ++ cardClauses)
|
||||||
|
where
|
||||||
|
inCover v = posLit (Var v)
|
||||||
|
edgeClauses = [ [inCover u, inCover w] | (u, w) <- edges ]
|
||||||
|
(cardClauses, _) = atMostK k [ inCover v | v <- [1 .. vertices] ] (vertices + 1)
|
||||||
|
|
||||||
|
decodeVertexCover :: Int -> Assignment -> [Int]
|
||||||
|
decodeVertexCover vertices asn =
|
||||||
|
[ v | v <- [1 .. vertices], Map.findWithDefault False (Var v) asn ]
|
||||||
|
|
||||||
|
validVertexCover :: Int -> Graph -> Assignment -> Bool
|
||||||
|
validVertexCover k (Graph vertices edges) asn =
|
||||||
|
length cover <= k
|
||||||
|
&& all (\(u, w) -> u `elem` coverSet || w `elem` coverSet) edges
|
||||||
|
where
|
||||||
|
cover = decodeVertexCover vertices asn
|
||||||
|
coverSet = cover
|
||||||
Reference in new issue
Block a user