packages feed

HaskellAnalysisProgram-0.1.0: src/ProgramLevelAnalysis.hs

{-|
Module      : ProgramLevelAnalysis
Description : Facade to the MetaModel aggregation functions
Copyright   : Copyright (C) 2019 S. Kamps
License     : -- This file is distributed under the  terms of the Apache License 2.0.
              For more information, see the file "LICENSE", which is included in the distribution.
Stability   : experimental
-}

module ProgramLevelAnalysis
  (calculateGiniCoefficient
  ,calculateCG
  ,calculateIvd
  ,calculateAverage
  ,calculateMedian
  ,calculateDistribution
  ,calculatePopulation
  )
  where

import qualified Data.Set as Set
import CsvData

import MetaHS.EDSL
import qualified MetaHS.DataModel.MetaModel as MetaModel
import MetaHS.Extensions.MacroLevelAggregation.GiniCoefficient
import MetaHS.Extensions.MacroLevelAggregation.Distribution
import MetaHS.Extensions.MacroLevelAggregation.Population
import MetaHS.Extensions.MacroLevelAggregation.Average
import MetaHS.Extensions.MacroLevelAggregation.Median
import MetaHS.Extensions.MacroLevelAggregation.IdealValueDeviation
import Settings (MetricType(LOC, LCOM, CBO))

-- | Calculate the Gini-coefficient of the metric values associated with the supplied metric Relation key
calculateGiniCoefficient :: String              -- ^ The identifier associated with this analysis.
                         -> RelationKey         -- ^ The MetaModel Relation Key (E.g., LCOM).
                         -> MetaModel.MetaModel -- ^ The MetaModel Containing the associated key.
                         -> MetricInfo          -- ^  The result of aggregating metric values of supplied key
calculateGiniCoefficient id key mm = generateMetricInfo id key $ giniCoefficient key mm

-- | Calculate the complement of the Gini-coefficient of the metric values associated with the supplied metric Relation key
calculateCG :: String              -- ^ The identifier associated with this analysis.
            -> RelationKey         -- ^ The MetaModel Relation Key (E.g., LCOM).
            -> MetaModel.MetaModel -- ^ The MetaModel Containing the associated key.
            -> MetricInfo          -- ^  The result of aggregating metric values of supplied key
calculateCG id key mm = generateMetricInfo id key $ 1 - (giniCoefficient key mm)

-- | Calculate the Ideal Value Deviation of the metric values associated with the supplied metric Relation key
-- | Note, the idealValueDeviation's arguments are determined empirically
calculateIvd :: String              -- ^ The identifier associated with this analysis.
             -> MetricType          -- ^ The MetaModel Relation Key (E.g., LCOM) expressed as MetricType
             -> MetaModel.MetaModel -- ^ The MetaModel Containing the associated key.
             -> MetricInfo          -- ^  The result of aggregating metric values of supplied key
calculateIvd id key@LOC mm = generateMetricInfo id (show key) $ idealValueDeviation (show key) mm (-15) 69 265
calculateIvd id key@CBO mm = generateMetricInfo id (show key) $ idealValueDeviation (show key) mm 0 6 16
calculateIvd id key@LCOM mm = generateMetricInfo id (show key) $ idealValueDeviation (show key) mm 0 1 11

-- | Calculate the average of the metric values associated with the supplied metric Relation key
calculateAverage :: String              -- ^ The identifier associated with this analysis.
                 -> RelationKey         -- ^ The MetaModel Relation Key (E.g., LCOM).
                 -> MetaModel.MetaModel -- ^ The MetaModel Containing the associated key.
                 -> MetricInfo          -- ^ The result of aggregating metric values of supplied key
calculateAverage id key mm =  generateMetricInfo id key $ average key mm

-- | Calculate the median of the metric values associated with the supplied metric Relation key
calculateMedian :: String              -- ^ The identifier associated with this analysis.
                 -> RelationKey         -- ^ The MetaModel Relation Key (E.g., LCOM).
                 -> MetaModel.MetaModel -- ^ The MetaModel Containing the associated key.
                 -> MetricInfo          -- ^ The result of aggregating metric values of supplied key
calculateMedian id key mm =  generateMetricInfo id key $ median key mm


-- | Calculate the distribution of the metric values associated with the supplied metric Relation key
calculateDistribution :: String              -- ^ The identifier associated with this analysis.
                      -> RelationKey         -- ^ The MetaModel Relation Key (E.g., LCOM).
                      -> MetaModel.MetaModel -- ^ The MetaModel Containing the associated key.
                      -> Set.Set (Int, Int)  -- ^ The set containing tuple(s) (MetricValue,Frequency)
calculateDistribution id = distribution

-- | Calculate the population of the metric values associated with the supplied metric Relation key
calculatePopulation :: String              -- ^ The identifier associated with this analysis.
                      -> RelationKey         -- ^ The MetaModel Relation Key (E.g., LCOM).
                      -> MetaModel.MetaModel -- ^ The MetaModel Containing the associated key.
                      -> [Int]               -- ^ The list containing MetricValues
calculatePopulation id = population

-- | helper function
generateMetricInfo :: String
                   -> RelationKey
                   -> Double
                   -> MetricInfo
generateMetricInfo i k v =
    MetricInfo {
                 identifier = i
                ,relationKey = k
                ,value = v
               }