From a3b16797a2853e74d34bb94a28df1f615f7c0576 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Wed, 26 Aug 2026 19:15:00 +0200 Subject: [PATCH] feat(encode): add vertex cover encoding --- src/Sift/Encode/VertexCover.hs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/Sift/Encode/VertexCover.hs diff --git a/src/Sift/Encode/VertexCover.hs b/src/Sift/Encode/VertexCover.hs new file mode 100644 index 0000000..d555ada --- /dev/null +++ b/src/Sift/Encode/VertexCover.hs @@ -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