packages feed

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 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