@@ -379,13 +379,17 @@ csvRules build = do
379379 results = map tail allResults
380380 writeFileChanged out $ unlines $ header : concat results
381381 priority 2 $ build -/- " */*/*/*/resultDiff.csv" %> \ out -> do
382- let out2 @ [b, flav, example, ver, conf, exp_ ] = splitDirectories out
382+ let [b, flav, example, ver, conf, _exp ] = splitDirectories out
383383 prev <- fmap T. unpack $ askOracle $ GetParent $ T. pack ver
384384 allResultsCur <- readFileLines $ joinPath [b ,flav, example, ver, conf] </> " results.csv"
385- allResultsPrev <- readFileLines $ joinPath [b ,flav, example, prev, conf] </> " results.csv"
386- let resultsPrev = tail allResultsPrev
387- let resultsCur = tail allResultsCur
388- let resultDiff = zipWith convertToDiffResults resultsCur resultsPrev
385+ resultDiff <-
386+ if prev == ver
387+ then pure []
388+ else do
389+ allResultsPrev <- readFileLines $ joinPath [b ,flav, example, prev, conf] </> " results.csv"
390+ let resultsPrev = tail allResultsPrev
391+ let resultsCur = tail allResultsCur
392+ pure $ zipWith convertToDiffResults resultsCur resultsPrev
389393 writeFileChanged out $ unlines $ head allResultsCur : resultDiff
390394 -- aggregate all configurations for an experiment
391395 priority 3 $ build -/- " */*/*/results.csv" %> genConfig " results.csv"
@@ -413,15 +417,32 @@ convertToDiffResults line baseLine = intercalate "," diffResults
413417showItemDiffResult :: (Item , Maybe Double ) -> String
414418showItemDiffResult (ItemString x, _) = x
415419showItemDiffResult (_, Nothing ) = " NA"
416- showItemDiffResult (Mem x, Just y) = printf " %.2f" (y * 100 - 100 ) <> " %"
417- showItemDiffResult (Time x, Just y) = printf " %.2f" (y * 100 - 100 ) <> " %"
420+ showItemDiffResult (Mem _, Just y) = showPercentageDiff y
421+ showItemDiffResult (Time _, Just y) = showPercentageDiff y
422+
423+ showPercentageDiff :: Double -> String
424+ showPercentageDiff ratio
425+ | not (isFinite percent) = " NA"
426+ | abs percent < 0.005 = " "
427+ | otherwise = printf " %.2f" percent <> " %"
428+ where
429+ percent = ratio * 100 - 100
430+
431+ isFinite :: Double -> Bool
432+ isFinite x = not (isNaN x || isInfinite x)
418433
419434diffItem :: Item -> Item -> (Item , Maybe Double )
420- diffItem (Mem x) (Mem y) = (Mem x, Just $ fromIntegral x / fromIntegral y)
421- diffItem (Time x) (Time y) = (Time x, if y == 0 then Nothing else Just $ x / y)
435+ diffItem (Mem x) (Mem y) = (Mem x, ratioMaybe ( fromIntegral x) ( fromIntegral y) )
436+ diffItem (Time x) (Time y) = (Time x, ratioMaybe x y)
422437diffItem (ItemString x) (ItemString y) = (ItemString x, Nothing )
423438diffItem _ _ = (ItemString " no match" , Nothing )
424439
440+ ratioMaybe :: Double -> Double -> Maybe Double
441+ ratioMaybe x y
442+ | y == 0 = Nothing
443+ | not (isFinite x && isFinite y) = Nothing
444+ | otherwise = Just $ x / y
445+
425446data Item = Mem Int | Time Double | ItemString String
426447 deriving (Show )
427448
0 commit comments