module SAT.Mios.OptionParser
(
MiosConfiguration (..)
, defaultConfiguration
, MiosProgramOption (..)
, miosDefaultOption
, miosOptions
, miosUsage
, miosParseOptions
, miosParseOptionsFromArgs
, toMiosConf
)
where
import System.Console.GetOpt (ArgDescr(..), ArgOrder(..), getOpt, OptDescr(..), usageInfo)
import System.Environment (getArgs)
import SAT.Mios.Types (MiosConfiguration (..), defaultConfiguration)
data MiosProgramOption = MiosProgramOption
{
_targetFile :: Maybe String
, _outputFile :: Maybe String
, _confVariableDecayRate :: !Double
, _confCheckAnswer :: !Bool
, _confVerbose :: !Bool
, _confTimeProbe :: !Bool
, _confStatProbe :: !Bool
, _confNoAnswer :: !Bool
, _validateAssignment :: !Bool
, _displayHelp :: !Bool
, _displayVersion :: !Bool
}
miosDefaultOption :: MiosProgramOption
miosDefaultOption = MiosProgramOption
{
_targetFile = Just ""
, _outputFile = Nothing
, _confVariableDecayRate = variableDecayRate defaultConfiguration
, _confCheckAnswer = False
, _confVerbose = False
, _confTimeProbe = False
, _confStatProbe = False
, _confNoAnswer = False
, _validateAssignment = False
, _displayHelp = False
, _displayVersion = False
}
miosOptions :: [OptDescr (MiosProgramOption -> MiosProgramOption)]
miosOptions =
[
Option ['d'] ["variable-decay-rate"]
(ReqArg (\v c -> c { _confVariableDecayRate = read v }) (show (_confVariableDecayRate miosDefaultOption)))
"[solver] variable activity decay rate (0.0 - 1.0)"
, Option [':'] ["validate-assignment"]
(NoArg (\c -> c { _validateAssignment = True }))
"[solver] read an assignment from STDIN and validate it"
, Option [] ["validate"]
(NoArg (\c -> c { _confCheckAnswer = True }))
"[solver] self-check the (satisfied) answer"
, Option ['o'] ["output"]
(ReqArg (\v c -> c { _outputFile = Just v })"file")
"[option] filename to store the result"
, Option ['v'] ["verbose"]
(NoArg (\c -> c { _confVerbose = True }))
"[option] display misc information"
, Option ['X'] ["hide-solution"]
(NoArg (\c -> c { _confNoAnswer = True }))
"[option] hide the solution"
, Option [] ["time"]
(NoArg (\c -> c { _confTimeProbe = True }))
"[option] display execution time"
, Option [] ["stat"]
(NoArg (\c -> c { _confStatProbe = True }))
"[option] display statistics information"
, Option ['h'] ["help"]
(NoArg (\c -> c { _displayHelp = True }))
"[misc] display this help message"
, Option [] ["version"]
(NoArg (\c -> c { _displayVersion = True }))
"[misc] display program ID"
]
miosUsage :: String -> String
miosUsage mes = usageInfo mes miosOptions
miosParseOptions :: String -> [String] -> IO MiosProgramOption
miosParseOptions mes argv =
case getOpt Permute miosOptions argv of
(o, [], []) -> do
return $ foldl (flip id) miosDefaultOption o
(o, (n:_), []) -> do
let conf = foldl (flip id) miosDefaultOption o
return $ conf { _targetFile = Just n }
(_, _, errs) -> ioError (userError (concat errs ++ miosUsage mes))
miosParseOptionsFromArgs :: String -> IO MiosProgramOption
miosParseOptionsFromArgs mes = miosParseOptions mes =<< getArgs
toMiosConf :: MiosProgramOption -> MiosConfiguration
toMiosConf opts = MiosConfiguration
{
variableDecayRate = _confVariableDecayRate opts
}