mios-1.5.4: MultiConflict/utils/numbers.hs
-- | Usage:
-- > mios-summary < average.csv > summary.tbl (for org-mode or github-flavored markdown)
{-# LANGUAGE ViewPatterns #-}
module Main where
import Data.List (intercalate, lookup, minimumBy, nub)
import Data.Maybe (fromMaybe)
import Data.Ord (comparing)
import Numeric (showFFloat)
import System.Console.GetOpt (ArgDescr(..), ArgOrder(..), getOpt, OptDescr(..), usageInfo)
import System.Environment (getArgs)
import SAT.Mios.Types
import SAT.Mios.Util.Stat
data Opt = Opt
{
threshold :: Double
, p1 :: (Double, Double)
, p2 :: (Double, Double)
, p3 :: (Int, Int)
, p4 :: (Int, Int)
, message :: String
, help :: Bool
}
optDefault :: Opt
optDefault = Opt 0 (0, 10) (0, 10) (0, 10) (0, 10) "#-*-mode:org-*-" False
options ::[OptDescr (Opt -> Opt)]
options =
[
Option ['t'] ["threshold"]
(ReqArg (\v c -> c { threshold = read v }) "0.0") "threshold for p1"
, Option [] ["UF250"]
(NoArg (\c -> c { threshold = 12109075.01 })) "threshold for UF250; 12109075.01 (7.083)"
, Option [] ["38bits"]
(NoArg (\c -> c { threshold = 191761341.00 })) "threshold for 38bits; 191761341.00 (8.283)"
, Option [] ["44bits"]
(NoArg (\c -> c { threshold = 5204447789.00 })) "threshold for 44bits; 5204447789.00 (9.716)"
, Option ['1'] ["p1"]
(ReqArg (\v c -> c { p1 = read v }) "\"(0,10)\"") "range of p1"
, Option ['2'] ["p2"]
(ReqArg (\v c -> c { p2 = read v }) "\"(0,10)\"") "range of p2"
, Option ['3'] ["p3"]
(ReqArg (\v c -> c { p3 = read v }) "\"(0,10)\"") "range of p3"
, Option ['4'] ["p4"]
(ReqArg (\v c -> c { p4 = read v }) "\"(0,10)\"") "range of p4"
, Option ['m'] ["message"]
(ReqArg (\v c -> c { message = undecodeNewline v }) "\"\"") "extra message embeded into output"
, Option ['h'] ["help"]
(NoArg (\c -> c { help = True })) "display help message"
]
parseOptions :: String -> [String] -> IO Opt
parseOptions mes argv =
case getOpt Permute options argv of
(o, [], []) -> return $ foldl (flip id) optDefault o
(o, _, []) -> return $ foldl (flip id) optDefault o
(_, _, err) -> ioError (userError (concat err ++ usageInfo mes options))
-- | builds "MiosProgramOption" from a String
parseOptionsFromArgs :: String -> IO Opt
parseOptionsFromArgs mes = parseOptions mes =<< getArgs
undecodeNewline :: String -> String
undecodeNewline [] = []
undecodeNewline [a] = [a]
undecodeNewline ('\\' : 'n' : x) = '\n' : undecodeNewline x
undecodeNewline (a : x) = a : undecodeNewline x
showf :: Double -> String
showf x = showFFloat (Just 2) x ""
main :: IO ()
main = do
opts <- parseOptionsFromArgs "gp-summary"
if help opts
then putStrLn $ usageInfo "" options
else do putStrLn $ message opts
putStrLn ""
putStrLn "| p1 | good | bad |"
putStrLn "| ---- | ---- | --- |"
result <- pickup opts . parseBy [(fst (header :: (String, MergedDump)), fromMergedCSV)] <$> getContents
mapM_ (putStrLn . toString) result
let ngs = sum $ map (fst . snd) result
nbs = sum $ map (snd . snd) result
putStrLn $ intercalate "," [showf (fromIntegral ngs / fromIntegral (ngs + nbs)), show (ngs + nbs) ++ "/" ++ show (ngs, nbs)]
toString :: (Double, (Int, Int)) -> String
toString (p1, (ng, nb)) = "| " ++ intercalate " | " [showf p1, show ng, show nb] ++ " |"
pickup :: Opt -> [MergedDump] -> [(Double, (Int, Int))]
pickup opts l = filter notEmpty $ map gather keys
where
notEmpty (_, (0, 0)) = False
notEmpty _ = True
thr = threshold opts
keys = nub $ map (gpParameter1 . snd. _mergedConf) l
gather :: Double -> (Double, (Int, Int))
gather key = (key, (ng, length targets - ng))
where
targets' :: [MergedDump]
targets' = filter ((key ==) . gpParameter1 . snd. _mergedConf) l
inBand :: MergedDump -> Bool
inBand (_mergedConf -> snd -> conf) = c1 && c2 && c3 && c4
where
c1 = inPair (p1 opts) (gpParameter1 conf)
c2 = inPair (p2 opts) (gpParameter2 conf)
c3 = inPair (p3 opts) (extraParameter3 conf)
c4 = inPair (p4 opts) (extraParameter4 conf)
inPair :: (Num a, Ord a) => (a, a) -> a -> Bool
inPair (b, t) x = b <= x && x <= t
targets = filter inBand targets'
ng = length $ filter (< thr) (map value targets)
value :: MergedDump -> Double
value m = case lookup PropagationS . (\(MiosStats s) -> s) . _mergedStat $ m of
Just (Right v) -> fromIntegral v
Just (Left v) -> v
Nothing -> 10000000