module Futhark.Profile.Details (CostCentreDetails (..), SourceRangeDetails (..), CostCentreName (..), sourceRangeDetailsFraction, CostCentres, SourceRanges) where

import Control.Arrow ((>>>))
import Data.Map (Map)
import Data.Monoid (Sum (Sum, getSum))
import Data.Text (Text)
import Futhark.Profile.EventSummary (EvSummary)
import Futhark.Profile.SourceRange (SourceRange)

type CostCentres = Map CostCentreName CostCentreDetails

type SourceRanges = Map SourceRange SourceRangeDetails

newtype CostCentreName = CostCentreName {CostCentreName -> Text
getCostCentreName :: Text}
  deriving (CostCentreName -> CostCentreName -> Bool
(CostCentreName -> CostCentreName -> Bool)
-> (CostCentreName -> CostCentreName -> Bool) -> Eq CostCentreName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CostCentreName -> CostCentreName -> Bool
== :: CostCentreName -> CostCentreName -> Bool
$c/= :: CostCentreName -> CostCentreName -> Bool
/= :: CostCentreName -> CostCentreName -> Bool
Eq, Eq CostCentreName
Eq CostCentreName =>
(CostCentreName -> CostCentreName -> Ordering)
-> (CostCentreName -> CostCentreName -> Bool)
-> (CostCentreName -> CostCentreName -> Bool)
-> (CostCentreName -> CostCentreName -> Bool)
-> (CostCentreName -> CostCentreName -> Bool)
-> (CostCentreName -> CostCentreName -> CostCentreName)
-> (CostCentreName -> CostCentreName -> CostCentreName)
-> Ord CostCentreName
CostCentreName -> CostCentreName -> Bool
CostCentreName -> CostCentreName -> Ordering
CostCentreName -> CostCentreName -> CostCentreName
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: CostCentreName -> CostCentreName -> Ordering
compare :: CostCentreName -> CostCentreName -> Ordering
$c< :: CostCentreName -> CostCentreName -> Bool
< :: CostCentreName -> CostCentreName -> Bool
$c<= :: CostCentreName -> CostCentreName -> Bool
<= :: CostCentreName -> CostCentreName -> Bool
$c> :: CostCentreName -> CostCentreName -> Bool
> :: CostCentreName -> CostCentreName -> Bool
$c>= :: CostCentreName -> CostCentreName -> Bool
>= :: CostCentreName -> CostCentreName -> Bool
$cmax :: CostCentreName -> CostCentreName -> CostCentreName
max :: CostCentreName -> CostCentreName -> CostCentreName
$cmin :: CostCentreName -> CostCentreName -> CostCentreName
min :: CostCentreName -> CostCentreName -> CostCentreName
Ord)

data CostCentreDetails = CostCentreDetails
  { -- | Fraction of total program time spent in this cost centre
    CostCentreDetails -> Double
fraction :: Double,
    -- | all source ranges included in this cost centre
    CostCentreDetails -> Map SourceRange SourceRangeDetails
sourceRanges :: Map SourceRange SourceRangeDetails,
    -- | statistics about the runtime characteristics
    CostCentreDetails -> EvSummary
summary :: EvSummary
  }

newtype SourceRangeDetails = SourceRangeDetails
  { SourceRangeDetails -> Map CostCentreName CostCentreDetails
containingCostCentres :: Map CostCentreName CostCentreDetails
  }

sourceRangeDetailsFraction :: SourceRangeDetails -> Double
sourceRangeDetailsFraction :: SourceRangeDetails -> Double
sourceRangeDetailsFraction =
  SourceRangeDetails -> Map CostCentreName CostCentreDetails
containingCostCentres
    (SourceRangeDetails -> Map CostCentreName CostCentreDetails)
-> (Map CostCentreName CostCentreDetails -> Double)
-> SourceRangeDetails
-> Double
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (CostCentreDetails -> Sum Double)
-> Map CostCentreName CostCentreDetails -> Sum Double
forall m a. Monoid m => (a -> m) -> Map CostCentreName a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Double -> Sum Double
forall a. a -> Sum a
Sum (Double -> Sum Double)
-> (CostCentreDetails -> Double) -> CostCentreDetails -> Sum Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CostCentreDetails -> Double
fraction)
    (Map CostCentreName CostCentreDetails -> Sum Double)
-> (Sum Double -> Double)
-> Map CostCentreName CostCentreDetails
-> Double
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> Sum Double -> Double
forall a. Sum a -> a
getSum