module GEP.Examples.Regression.FitnessInput (
readFitnessInput
) where
import Text.ParserCombinators.Parsec
import System.Exit
csvfile = many csvline
csvline = do
entries <- (sepBy entry (char ','))
newline
return entries
entry = do
many (char ' ')
body <- many (noneOf ",\n")
many (char ' ')
return body
type FitnessDict = [[(Char,Double)]]
dictify :: [String] -> [[String]] -> (FitnessDict, [Double])
dictify lbls values =
(map (\j -> zip (init charLbls) j) (init floatValues),
map last floatValues)
where
charLbls = map head lbls
floatValues = map (\j -> map (\i -> (read i) :: Double) j) values
readFitnessInput :: String -> IO (FitnessDict,[Double])
readFitnessInput fname = do
result <- parseFromFile csvfile fname
case result of Left err -> do putStrLn "Bad regression fitness input!"
exitFailure
Right xs -> do return $ dictify (head xs) (tail xs)