experimenter 0.1.0.2 → 0.1.0.4
raw patch · 6 files changed
+61/−36 lines, 6 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Experimenter.Eval.Table: printTableTabularX :: MonadLogger m => Bool -> Table -> LaTeXT m ()
+ Experimenter.Eval.Table: printTextwidthTable :: MonadLogger m => Table -> LaTeXT m ()
- Experimenter.Eval.Type: evalExperiment :: forall a_a2Q6D. Lens' (ExperimentEval a_a2Q6D) (Experiment a_a2Q6D)
+ Experimenter.Eval.Type: evalExperiment :: forall a_a2Q8b. Lens' (ExperimentEval a_a2Q8b) (Experiment a_a2Q8b)
- Experimenter.Eval.Type: evalExperimentNumber :: forall a_a2Q6D. Lens' (ExperimentEval a_a2Q6D) Int
+ Experimenter.Eval.Type: evalExperimentNumber :: forall a_a2Q8b. Lens' (ExperimentEval a_a2Q8b) Int
- Experimenter.Eval.Type: evalExperimentResults :: forall a_a2Q6D. Lens' (ExperimentEval a_a2Q6D) [Availability IO (EvalResults a_a2Q6D)]
+ Experimenter.Eval.Type: evalExperimentResults :: forall a_a2Q8b. Lens' (ExperimentEval a_a2Q8b) [Availability IO (EvalResults a_a2Q8b)]
- Experimenter.Eval.Type: evalType :: forall a_a2ONL. Lens' (EvalResults a_a2ONL) (StatsDef a_a2ONL)
+ Experimenter.Eval.Type: evalType :: forall a_a2OPj. Lens' (EvalResults a_a2OPj) (StatsDef a_a2OPj)
- Experimenter.Eval.Type: evalUnit :: forall a_a2ONL. Lens' (EvalResults a_a2ONL) Unit
+ Experimenter.Eval.Type: evalUnit :: forall a_a2OPj. Lens' (EvalResults a_a2OPj) Unit
- Experimenter.Eval.Type: evalValue :: forall a_a2ONL. Traversal' (EvalResults a_a2ONL) Double
+ Experimenter.Eval.Type: evalValue :: forall a_a2OPj. Traversal' (EvalResults a_a2OPj) Double
- Experimenter.Eval.Type: evalValues :: forall a_a2ONL. Traversal' (EvalResults a_a2ONL) [EvalResults a_a2ONL]
+ Experimenter.Eval.Type: evalValues :: forall a_a2OPj. Traversal' (EvalResults a_a2OPj) [EvalResults a_a2OPj]
- Experimenter.Eval.Type: evalVariableName :: forall a_a2ONL. Traversal' (EvalResults a_a2ONL) ByteString
+ Experimenter.Eval.Type: evalVariableName :: forall a_a2OPj. Traversal' (EvalResults a_a2OPj) ByteString
- Experimenter.Eval.Type: evalX :: forall a_a2ONL. Traversal' (EvalResults a_a2ONL) (Either Int Double)
+ Experimenter.Eval.Type: evalX :: forall a_a2OPj. Traversal' (EvalResults a_a2OPj) (Either Int Double)
- Experimenter.Eval.Type: evalY :: forall a_a2ONL. Traversal' (EvalResults a_a2ONL) Double
+ Experimenter.Eval.Type: evalY :: forall a_a2OPj. Traversal' (EvalResults a_a2OPj) Double
- Experimenter.Eval.Type: evalsExperiments :: forall a_a2Qkk. Lens' (Evals a_a2Qkk) (Experiments a_a2Qkk)
+ Experimenter.Eval.Type: evalsExperiments :: forall a_a2QlS. Lens' (Evals a_a2QlS) (Experiments a_a2QlS)
- Experimenter.Eval.Type: evalsResults :: forall a_a2Qkk. Lens' (Evals a_a2Qkk) [ExperimentEval a_a2Qkk]
+ Experimenter.Eval.Type: evalsResults :: forall a_a2QlS. Lens' (Evals a_a2QlS) [ExperimentEval a_a2QlS]
- Experimenter.Input: inputValue :: forall a_a2K2u a_a2K3C. Lens (Input a_a2K2u) (Input a_a2K3C) (InputValue a_a2K2u) (InputValue a_a2K3C)
+ Experimenter.Input: inputValue :: forall a_a2K42 a_a2K5a. Lens (Input a_a2K42) (Input a_a2K5a) (InputValue a_a2K42) (InputValue a_a2K5a)
- Experimenter.Input: inputValuePeriod :: forall a_a2K2u. Lens' (Input a_a2K2u) Int
+ Experimenter.Input: inputValuePeriod :: forall a_a2K42. Lens' (Input a_a2K42) Int
- Experimenter.Parameter.Type: parameterSettingExperimentDesign :: forall a_a2Cck a_a2Deh. Lens (ParameterSetting a_a2Cck) (ParameterSetting a_a2Deh) ExperimentDesign ExperimentDesign
+ Experimenter.Parameter.Type: parameterSettingExperimentDesign :: forall a_a2CdZ a_a2DfP. Lens (ParameterSetting a_a2CdZ) (ParameterSetting a_a2DfP) ExperimentDesign ExperimentDesign
- Experimenter.Parameter.Type: parameterSettingName :: forall a_a2Cck a_a2Dei. Lens (ParameterSetting a_a2Cck) (ParameterSetting a_a2Dei) Text Text
+ Experimenter.Parameter.Type: parameterSettingName :: forall a_a2CdZ a_a2DfQ. Lens (ParameterSetting a_a2CdZ) (ParameterSetting a_a2DfQ) Text Text
- Experimenter.Parameter.Type: parameterSettingSkipPreparationPhase :: forall a_a2Cck a_a2Dej. Lens (ParameterSetting a_a2Cck) (ParameterSetting a_a2Dej) Bool Bool
+ Experimenter.Parameter.Type: parameterSettingSkipPreparationPhase :: forall a_a2CdZ a_a2DfR. Lens (ParameterSetting a_a2CdZ) (ParameterSetting a_a2DfR) Bool Bool
- Experimenter.Parameter.Type: parameterSettingValue :: forall a_a2Cck a_a2Dek. Lens (ParameterSetting a_a2Cck) (ParameterSetting a_a2Dek) ByteString ByteString
+ Experimenter.Parameter.Type: parameterSettingValue :: forall a_a2CdZ a_a2DfS. Lens (ParameterSetting a_a2CdZ) (ParameterSetting a_a2DfS) ByteString ByteString
- Experimenter.Result.Type: endInputState :: forall a_a2KdR. Lens' (ResultData a_a2KdR) (Maybe (InputState a_a2KdR))
+ Experimenter.Result.Type: endInputState :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) (Maybe (InputState a_a2Kfp))
- Experimenter.Result.Type: endRandGen :: forall a_a2KdR. Lens' (ResultData a_a2KdR) (Maybe GenIO)
+ Experimenter.Result.Type: endRandGen :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) (Maybe GenIO)
- Experimenter.Result.Type: endState :: forall a_a2KdR. Lens' (ResultData a_a2KdR) (Availability (ExpM a_a2KdR) (Maybe a_a2KdR))
+ Experimenter.Result.Type: endState :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) (Availability (ExpM a_a2Kfp) (Maybe a_a2Kfp))
- Experimenter.Result.Type: endTime :: forall a_a2KdR. Lens' (ResultData a_a2KdR) (Maybe UTCTime)
+ Experimenter.Result.Type: endTime :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) (Maybe UTCTime)
- Experimenter.Result.Type: evalResults :: forall a_a2KlS. Lens' (ReplicationResult a_a2KlS) (Maybe (ResultData a_a2KlS))
+ Experimenter.Result.Type: evalResults :: forall a_a2Knq. Lens' (ReplicationResult a_a2Knq) (Maybe (ResultData a_a2Knq))
- Experimenter.Result.Type: evaluationResults :: forall a_a2Ku1. Lens' (ExperimentResult a_a2Ku1) [ReplicationResult a_a2Ku1]
+ Experimenter.Result.Type: evaluationResults :: forall a_a2Kvz. Lens' (ExperimentResult a_a2Kvz) [ReplicationResult a_a2Kvz]
- Experimenter.Result.Type: experimentEndTime :: forall a_a2Kxz. Lens' (Experiment a_a2Kxz) (Maybe UTCTime)
+ Experimenter.Result.Type: experimentEndTime :: forall a_a2Kz7. Lens' (Experiment a_a2Kz7) (Maybe UTCTime)
- Experimenter.Result.Type: experimentKey :: forall a_a2Kxz. Lens' (Experiment a_a2Kxz) (Key Exp)
+ Experimenter.Result.Type: experimentKey :: forall a_a2Kz7. Lens' (Experiment a_a2Kz7) (Key Exp)
- Experimenter.Result.Type: experimentNumber :: forall a_a2Kxz. Lens' (Experiment a_a2Kxz) Int
+ Experimenter.Result.Type: experimentNumber :: forall a_a2Kz7. Lens' (Experiment a_a2Kz7) Int
- Experimenter.Result.Type: experimentResultKey :: forall a_a2Ku1. Lens' (ExperimentResult a_a2Ku1) (Key ExpResult)
+ Experimenter.Result.Type: experimentResultKey :: forall a_a2Kvz. Lens' (ExperimentResult a_a2Kvz) (Key ExpResult)
- Experimenter.Result.Type: experimentResults :: forall a_a2Kxz. Lens' (Experiment a_a2Kxz) [ExperimentResult a_a2Kxz]
+ Experimenter.Result.Type: experimentResults :: forall a_a2Kz7. Lens' (Experiment a_a2Kz7) [ExperimentResult a_a2Kz7]
- Experimenter.Result.Type: experimentStartTime :: forall a_a2Kxz. Lens' (Experiment a_a2Kxz) UTCTime
+ Experimenter.Result.Type: experimentStartTime :: forall a_a2Kz7. Lens' (Experiment a_a2Kz7) UTCTime
- Experimenter.Result.Type: experiments :: forall a_a2KBL. Lens' (Experiments a_a2KBL) [Experiment a_a2KBL]
+ Experimenter.Result.Type: experiments :: forall a_a2KDj. Lens' (Experiments a_a2KDj) [Experiment a_a2KDj]
- Experimenter.Result.Type: experimentsEndTime :: forall a_a2KBL. Lens' (Experiments a_a2KBL) (Maybe UTCTime)
+ Experimenter.Result.Type: experimentsEndTime :: forall a_a2KDj. Lens' (Experiments a_a2KDj) (Maybe UTCTime)
- Experimenter.Result.Type: experimentsInfoParameters :: forall a_a2KBL. Lens' (Experiments a_a2KBL) [ExperimentInfoParameter]
+ Experimenter.Result.Type: experimentsInfoParameters :: forall a_a2KDj. Lens' (Experiments a_a2KDj) [ExperimentInfoParameter]
- Experimenter.Result.Type: experimentsInitialInputState :: forall a_a2KBL. Lens' (Experiments a_a2KBL) (InputState a_a2KBL)
+ Experimenter.Result.Type: experimentsInitialInputState :: forall a_a2KDj. Lens' (Experiments a_a2KDj) (InputState a_a2KDj)
- Experimenter.Result.Type: experimentsInitialState :: forall a_a2KBL. Lens' (Experiments a_a2KBL) a_a2KBL
+ Experimenter.Result.Type: experimentsInitialState :: forall a_a2KDj. Lens' (Experiments a_a2KDj) a_a2KDj
- Experimenter.Result.Type: experimentsKey :: forall a_a2KBL. Lens' (Experiments a_a2KBL) (Key Exps)
+ Experimenter.Result.Type: experimentsKey :: forall a_a2KDj. Lens' (Experiments a_a2KDj) (Key Exps)
- Experimenter.Result.Type: experimentsName :: forall a_a2KBL. Lens' (Experiments a_a2KBL) Text
+ Experimenter.Result.Type: experimentsName :: forall a_a2KDj. Lens' (Experiments a_a2KDj) Text
- Experimenter.Result.Type: experimentsParameters :: forall a_a2KBL. Lens' (Experiments a_a2KBL) [ParameterSetup a_a2KBL]
+ Experimenter.Result.Type: experimentsParameters :: forall a_a2KDj. Lens' (Experiments a_a2KDj) [ParameterSetup a_a2KDj]
- Experimenter.Result.Type: experimentsSetup :: forall a_a2KBL. Lens' (Experiments a_a2KBL) ExpsSetup
+ Experimenter.Result.Type: experimentsSetup :: forall a_a2KDj. Lens' (Experiments a_a2KDj) ExpsSetup
- Experimenter.Result.Type: experimentsStartTime :: forall a_a2KBL. Lens' (Experiments a_a2KBL) UTCTime
+ Experimenter.Result.Type: experimentsStartTime :: forall a_a2KDj. Lens' (Experiments a_a2KDj) UTCTime
- Experimenter.Result.Type: inputValues :: forall a_a2KdR. Lens' (ResultData a_a2KdR) (AvailabilityList (ExpM a_a2KdR) (Input a_a2KdR))
+ Experimenter.Result.Type: inputValues :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) (AvailabilityList (ExpM a_a2Kfp) (Input a_a2Kfp))
- Experimenter.Result.Type: parameterSetup :: forall a_a2Kxz. Lens' (Experiment a_a2Kxz) [ParameterSetting a_a2Kxz]
+ Experimenter.Result.Type: parameterSetup :: forall a_a2Kz7. Lens' (Experiment a_a2Kz7) [ParameterSetting a_a2Kz7]
- Experimenter.Result.Type: preparationResults :: forall a_a2Ku1. Lens' (ExperimentResult a_a2Ku1) (Maybe (ResultData a_a2Ku1))
+ Experimenter.Result.Type: preparationResults :: forall a_a2Kvz. Lens' (ExperimentResult a_a2Kvz) (Maybe (ResultData a_a2Kvz))
- Experimenter.Result.Type: repetitionNumber :: forall a_a2Ku1. Lens' (ExperimentResult a_a2Ku1) Int
+ Experimenter.Result.Type: repetitionNumber :: forall a_a2Kvz. Lens' (ExperimentResult a_a2Kvz) Int
- Experimenter.Result.Type: replicationNumber :: forall a_a2KlS. Lens' (ReplicationResult a_a2KlS) Int
+ Experimenter.Result.Type: replicationNumber :: forall a_a2Knq. Lens' (ReplicationResult a_a2Knq) Int
- Experimenter.Result.Type: replicationResultKey :: forall a_a2KlS. Lens' (ReplicationResult a_a2KlS) (Key RepResult)
+ Experimenter.Result.Type: replicationResultKey :: forall a_a2Knq. Lens' (ReplicationResult a_a2Knq) (Key RepResult)
- Experimenter.Result.Type: resultDataKey :: forall a_a2KdR. Lens' (ResultData a_a2KdR) ResultDataKey
+ Experimenter.Result.Type: resultDataKey :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) ResultDataKey
- Experimenter.Result.Type: results :: forall a_a2KdR. Lens' (ResultData a_a2KdR) (AvailabilityList (ExpM a_a2KdR) Measure)
+ Experimenter.Result.Type: results :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) (AvailabilityList (ExpM a_a2Kfp) Measure)
- Experimenter.Result.Type: startInputState :: forall a_a2KdR. Lens' (ResultData a_a2KdR) (InputState a_a2KdR)
+ Experimenter.Result.Type: startInputState :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) (InputState a_a2Kfp)
- Experimenter.Result.Type: startRandGen :: forall a_a2KdR. Lens' (ResultData a_a2KdR) GenIO
+ Experimenter.Result.Type: startRandGen :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) GenIO
- Experimenter.Result.Type: startState :: forall a_a2KdR. Lens' (ResultData a_a2KdR) (Availability (ExpM a_a2KdR) a_a2KdR)
+ Experimenter.Result.Type: startState :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) (Availability (ExpM a_a2Kfp) a_a2Kfp)
- Experimenter.Result.Type: startTime :: forall a_a2KdR. Lens' (ResultData a_a2KdR) UTCTime
+ Experimenter.Result.Type: startTime :: forall a_a2Kfp. Lens' (ResultData a_a2Kfp) UTCTime
- Experimenter.Result.Type: warmUpResults :: forall a_a2KlS. Lens' (ReplicationResult a_a2KlS) (Maybe (ResultData a_a2KlS))
+ Experimenter.Result.Type: warmUpResults :: forall a_a2Knq. Lens' (ReplicationResult a_a2Knq) (Maybe (ResultData a_a2Knq))
Files
- ChangeLog.md +4/−0
- README.md +1/−1
- experimenter.cabal +2/−2
- src/Experimenter/Eval/Latex.hs +17/−8
- src/Experimenter/Eval/Ops.hs +20/−16
- src/Experimenter/Eval/Table.hs +17/−9
ChangeLog.md view
@@ -1,3 +1,7 @@ # Changelog for experimenter +Release 0.1.0.3 on 31.12.2020:+ - Using username for LaTeX output+ - Parameter tables are rendered using the tabularX to ensure the textwidth is not exceeded+ - Nicer output for running the evaluations ## Unreleased changes
README.md view
@@ -85,7 +85,7 @@ the preparation steps are changed, all consecutive data, including warm-up and all evaluations, are deleted and rerun. -See [Dice.hs](https://github.com/schnecki/experimenter/examples/Dice.hs) for a full implementation,+See [Dice.hs](https://github.com/schnecki/experimenter/blob/master/examples/Dice.hs) for a full implementation, where the sides of the dices are variable over the experiment. An example report of this experiment can be found in the same folder.
experimenter.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 65a21babb6664fc85d1c1d35f1aabed01dbdf6b1603323eb13e2b77dae22c6e7+-- hash: 2dfd476c8b0f4da0340c035c0501e8087c0808ea9fba7aaec32f5527c7114c37 name: experimenter-version: 0.1.0.2+version: 0.1.0.4 synopsis: Perform scientific experiments stored in a DB, and generate reports. description: Please see the README on GitHub at <https://github.com/schnecki/experimenter#readme> category: Experiment
src/Experimenter/Eval/Latex.hs view
@@ -16,6 +16,7 @@ import Control.DeepSeq import Control.Lens hiding ((&)) import Control.Monad (forM, unless, void)+import Control.Monad.IO.Class import Control.Monad.Logger import Data.List as L (find, foldl') import qualified Data.Map.Strict as M@@ -24,11 +25,13 @@ import GHC.Generics import System.Directory import System.FilePath.Posix+import System.Posix.User import System.Process import Text.LaTeX import Text.LaTeX.Packages.AMSMath import Text.LaTeX.Packages.Hyperref import Text.LaTeX.Packages.Inputenc+import Text.LaTeX.Packages.TabularX import Experimenter.Availability import Experimenter.DatabaseSetting@@ -43,6 +46,8 @@ import Experimenter.Util +import Debug.Trace+ writeAndCompileLatex :: DatabaseSetting -> Evals a -> IO () writeAndCompileLatex dbSetup evals = writeLatex dbSetup evals >> compileLatex evals @@ -73,17 +78,19 @@ -- Preamble with some basic info.-thePreamble :: (MonadLogger m) => Evals a -> LaTeXT m ()+thePreamble :: (MonadIO m) => Evals a -> LaTeXT m () thePreamble evals = do let n = evals ^. evalsExperiments . experimentsName documentclass [] article- author "Manuel Schneckenreither"+ user <- liftIO getLoginName+ author ("Username: " <> fromString user) title $ "Evaluation for ``" <> raw n <> "''" usepackage [utf8] inputenc usepackage [] "fullpage" usepackage [] "array" usepackage [] amsmath usepackage [pdftex] hyperref+ usepackage [] tabularxp -- Body with a section. theBody :: Evals a -> LaTeXT SimpleDB ()@@ -108,12 +115,14 @@ , Row ["Experiment Evaluation Replications:", CellT (tshow $ exps ^. experimentsSetup . expsSetupEvaluationReplications)] ] - let infoParams = exps ^. experimentsInfoParameters- unless (null infoParams) $ do- part "Experiment Information Parameters"- printTable $ Table (Row ["Parameter", "Value"])- (map mkInfoParam infoParams)+ let infoParams = trace( "Info Params: " ++ show (length $ exps ^. experimentsInfoParameters)) $ exps ^. experimentsInfoParameters ++ part "Experiment Information Parameters"+ if null infoParams+ then center $ text "No Information Parameters were defined in the experiment setup"+ else printTextwidthTable $ Table (Row ["Parameter", "Value"]) (map mkInfoParam infoParams)+ where mkInfoParam (ExperimentInfoParameter n v) = Row [CellT n, CellT (tshow v)] @@ -174,7 +183,7 @@ let tblsFiltered = filter (( == k) . fst) tbls unless (null tblsFiltered) $ do subsection $ "Experiment No. " <> raw (tshow k)- maybe "There are no configured parameters!" printTable (M.findWithDefault Nothing k params)+ maybe "There are no configured parameters!" printTextwidthTable (M.findWithDefault Nothing k params) mapM_ (\(_, tbls') -> forM tbls' $ \statsDefTbl -> printTableWithName statsDefTbl) tblsFiltered
src/Experimenter/Eval/Ops.hs view
@@ -60,9 +60,13 @@ mkEvals :: (ExperimentDef a ) => [StatsDef a] -> Experiment a -> DB (ExpM a) (ExperimentEval a) mkEvals evals e = do- xs <- mkTime "All Experiment Evaluations" $ mapMRnf (fmap Available . genExperiment e) evals+ liftIO $ putStrLn $ "Evaluating Experiment " ++ show (e ^. experimentNumber)+ xs <- mkTime "All Experiment Evaluations" $ mapMRnf evalStatsDef evals return $ force $ ExperimentEval (e ^. experimentNumber) xs (e {_experimentResults = []})-+ where+ evalStatsDef statsDef = do+ -- liftIO $ putStrLn $ "Evaluating " ++ show statsDef+ Available <$> genExperiment e statsDef mapMRnf :: (NFData b, Monad m) => (a -> m b) -> [a] -> m [b] mapMRnf _ [] = return []@@ -80,12 +84,12 @@ where addName res = res { _evalType = Named (res ^. evalType) name } genExperiment exp eval = case eval of- Mean OverExperimentRepetitions (Stats eval') -> reduce (Stats eval') <$!> genExpRes id eval'- Mean OverExperimentRepetitions eval' -> reduce eval' <$!> genExpRes id (Id eval')- Sum OverExperimentRepetitions (Stats eval') -> reduce (Stats eval') <$!> genExpRes id eval'- Sum OverExperimentRepetitions eval' -> reduce eval' <$!> genExpRes id (Id eval')+ Mean OverExperimentRepetitions (Stats eval') -> reduce (Stats eval') <$!> genExpRes id eval'+ Mean OverExperimentRepetitions eval' -> reduce eval' <$!> genExpRes id (Id eval')+ Sum OverExperimentRepetitions (Stats eval') -> reduce (Stats eval') <$!> genExpRes id eval'+ Sum OverExperimentRepetitions eval' -> reduce eval' <$!> genExpRes id (Id eval') StdDev OverExperimentRepetitions (Stats eval') -> reduce (Stats eval') <$!> genExpRes id eval'- StdDev OverExperimentRepetitions eval' -> reduce eval' <$!> genExpRes id (Id eval')+ StdDev OverExperimentRepetitions eval' -> reduce eval' <$!> genExpRes id (Id eval') -- Mean (OverBestXExperimentRepetitions nr cmp) eval' -> reduce eval' <$> genExpRes (take nr . sortBy (cmp `on` id)) (Id eval') -- Sum (OverBestXExperimentRepetitions nr cmp) eval' -> reduce eval' <$> genExpRes (take nr . sortBy (cmp `on` id)) (Id eval') -- StdDev (OverBestXExperimentRepetitions nr cmp) eval' -> reduce eval' <$> genExpRes (take nr . sortBy (cmp `on` id)) (Id eval')@@ -101,14 +105,14 @@ genExperimentResult _ (Named _ n) _ = error $ "An evaluation may only be named on the outermost function in evaluation " <> T.unpack (E.decodeUtf8 n) genExperimentResult _ (Name n _) _ = error $ "An evaluation may only be named on the outermost function in evaluation " <> T.unpack (E.decodeUtf8 n) genExperimentResult exp eval expRes =- case eval of- Mean OverReplications (Stats eval') -> reduce <$!> genRepl eval'- Mean OverReplications eval' -> reduce <$!> genRepl (Id eval')- StdDev OverReplications (Stats eval') -> reduce <$!> genRepl eval'- StdDev OverReplications eval' -> reduce <$!> genRepl (Id eval')- Sum OverReplications (Stats eval') -> reduce <$!> genRepl eval'- Sum OverReplications eval' -> reduce <$!> genRepl (Id eval')- _ -> packGenRes <$!> genRepl eval+ case eval of+ Mean OverReplications (Stats eval') -> reduce <$!> genRepl eval'+ Mean OverReplications eval' -> reduce <$!> genRepl (Id eval')+ StdDev OverReplications (Stats eval') -> reduce <$!> genRepl eval'+ StdDev OverReplications eval' -> reduce <$!> genRepl (Id eval')+ Sum OverReplications (Stats eval') -> reduce <$!> genRepl eval'+ Sum OverReplications eval' -> reduce <$!> genRepl (Id eval')+ _ -> packGenRes <$!> genRepl eval where packGenRes = EvalVector eval UnitReplications -- genRepl e = mapMRnf (fmap force . genReplication exp e) (expRes ^. evaluationResults)@@ -122,7 +126,7 @@ genReplication :: (ExperimentDef a) => Experiment a -> StatsDef a -> Int -> ReplicationResult a -> DB (ExpM a) (EvalResults a) genReplication exp eval repNr repl =- mkTime ("Experiment " <> show (exp ^. experimentNumber) <> " Repetition " <> show repNr <> " Replication" <> show (repl ^. replicationNumber)) $+ mkTime ("\tExperiment " <> show (exp ^. experimentNumber) <> " Repetition " <> show repNr <> " Replication" <> show (repl ^. replicationNumber)) $ fromMaybe (error "Evaluation data is incomplete!") <$!> sequence (genResultData exp eval <$!> (repl ^. evalResults))
src/Experimenter/Eval/Table.hs view
@@ -7,14 +7,15 @@ module Experimenter.Eval.Table where import Control.DeepSeq-import Control.Monad (forM_)+import Control.Monad (forM_) import Control.Monad.Logger-import Data.List (foldl')-import qualified Data.Text as T+import Data.List (foldl')+import qualified Data.Text as T import GHC.Generics import Text.LaTeX import Text.LaTeX.Base.Class+import Text.LaTeX.Packages.TabularX import Text.Printf data Table =@@ -47,14 +48,21 @@ dereferLatex :: T.Text -> T.Text dereferLatex = protectText . T.replace "{" "\\{" . T.replace "}" "\\}" . T.replace "_" "\\_" +printTextwidthTable :: (MonadLogger m) => Table -> LaTeXT m ()+printTextwidthTable = printTableTabularX True printTable :: (MonadLogger m) => Table -> LaTeXT m ()-printTable tbl@Table{} = forM_ (splitTable tbl) printTable'+printTable = printTableTabularX False+++printTableTabularX :: (MonadLogger m) => Bool -> Table -> LaTeXT m ()+printTableTabularX tabX tbl@Table {} = forM_ (splitTable tbl) printTable' where- printTable' (Table headerInput rowsInput) =- center $- tabular Nothing (replicate colLen LeftColumn) $ hline <> printRow textbf header <> hline <> mconcat (map (printRow id) rows) <> hline+ printTable' (Table headerInput rowsInput)+ | tabX = center $ tabularx (CustomMeasure textwidth) Nothing (LeftColumn : replicate (cols - 1) (NameColumn "X")) content+ | otherwise = center $ tabular Nothing (replicate cols LeftColumn) content where+ content = hline <> printRow textbf header <> hline <> mconcat (map (printRow id) rows) <> hline printRow :: (LaTeXC l) => (l -> l) -> Row -> l printRow _ (Row []) = mempty printRow f (Row (c:cs)) = foldl' (&) (f $ printCell c) (map (f . printCell) cs) <> lnbk@@ -63,9 +71,9 @@ printCell (CellD nr) = raw $ printDouble nr printCell (CellL l) = fromLaTeX l printCell CellEmpty = mempty- colLen = maximum $ map cellCount (headerInput : rowsInput)+ cols = maximum $ map cellCount (headerInput : rowsInput) cellCount (Row xs) = length xs- extendRow (Row xs) = Row $ xs ++ replicate (colLen - length xs) CellEmpty+ extendRow (Row xs) = Row $ xs ++ replicate (cols - length xs) CellEmpty header = extendRow headerInput rows = map extendRow rowsInput