From 8fade4ff288a0925e7e7f4fdb48004d627ede6b6 Mon Sep 17 00:00:00 2001 From: Masahiro Sakai Date: Sun, 21 Jun 2015 00:41:01 +0900 Subject: [PATCH] sort literals in a non-linear term when generating OPB/WBO files --- CHANGELOG.markdown | 1 + src/Data/PseudoBoolean/Builder.hs | 4 +++- src/Data/PseudoBoolean/ByteStringBuilder.hs | 4 +++- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown index 9362df9..cf8a278 100644 --- a/CHANGELOG.markdown +++ b/CHANGELOG.markdown @@ -2,3 +2,4 @@ ------- * parse* functions fails if the parser does not consume all of the inputs * generate '#product=', 'sizeproduct=' and '#soft=' in header line of OPB/WBO files +* sort literals in a non-linear term when generating OPB/WBO files diff --git a/src/Data/PseudoBoolean/Builder.hs b/src/Data/PseudoBoolean/Builder.hs index 3c34827..9adff72 100644 --- a/src/Data/PseudoBoolean/Builder.hs +++ b/src/Data/PseudoBoolean/Builder.hs @@ -26,7 +26,9 @@ import Prelude hiding (sum) import qualified Data.DList as DList import qualified Data.IntSet as IntSet import qualified Data.Set as Set +import Data.List (sortBy) import Data.Monoid hiding (Sum (..)) +import Data.Ord import Data.String import Text.Printf import Data.PseudoBoolean.Types @@ -75,7 +77,7 @@ showWeightedTerm :: (Monoid a, IsString a) => WeightedTerm -> a showWeightedTerm (c, lits) = foldr (\f g -> f <> fromString " " <> g) mempty (x:xs) where x = if c >= 0 then fromString "+" <> fromString (show c) else fromString (show c) - xs = map showLit lits + xs = map showLit $ sortBy (comparing abs) lits showLit :: (Monoid a, IsString a) => Lit -> a showLit lit = if lit > 0 then v else fromString "~" <> v diff --git a/src/Data/PseudoBoolean/ByteStringBuilder.hs b/src/Data/PseudoBoolean/ByteStringBuilder.hs index 6a7e1a0..e466c01 100644 --- a/src/Data/PseudoBoolean/ByteStringBuilder.hs +++ b/src/Data/PseudoBoolean/ByteStringBuilder.hs @@ -31,9 +31,11 @@ import qualified Prelude import Prelude hiding (sum) import qualified Data.IntSet as IntSet import qualified Data.Set as Set +import Data.List (sortBy) import Data.Monoid hiding (Sum (..)) import qualified Data.ByteString.Lazy as BS import Data.ByteString.Builder (Builder, intDec, integerDec, char7, string7, hPutBuilder, toLazyByteString) +import Data.Ord import System.IO import Data.PseudoBoolean.Types @@ -81,7 +83,7 @@ showWeightedTerm :: WeightedTerm -> Builder showWeightedTerm (c, lits) = foldr (\f g -> f <> char7 ' ' <> g) mempty (x:xs) where x = if c >= 0 then char7 '+' <> integerDec c else integerDec c - xs = map showLit lits + xs = map showLit $ sortBy (comparing abs) lits showLit :: Lit -> Builder showLit lit = if lit > 0 then v else char7 '~' <> v