module BishBosh.Attribute.CriterionValue(
CriterionValue(),
zero,
calculateWeightedMean,
mkCriterionValue
) where
import Control.Arrow((&&&))
import qualified BishBosh.Attribute.CriterionWeight as Attribute.CriterionWeight
import qualified BishBosh.Attribute.WeightedMeanAndCriterionValues as Attribute.WeightedMeanAndCriterionValues
import qualified BishBosh.Types as T
import qualified Control.Exception
import qualified Factory.Math.Statistics
newtype CriterionValue criterionValue = MkCriterionValue criterionValue deriving (Eq, Show)
instance Num criterionValue => Bounded (CriterionValue criterionValue) where
minBound = MkCriterionValue $ negate 1
maxBound = MkCriterionValue 1
mkCriterionValue :: (
Num criterionValue,
Ord criterionValue
) => criterionValue -> CriterionValue criterionValue
mkCriterionValue criterionValue = Control.Exception.assert (abs criterionValue <= 1) $ MkCriterionValue criterionValue
zero :: Num criterionValue => CriterionValue criterionValue
zero = MkCriterionValue 0
calculateWeightedMean :: (
Fractional weightedMean,
Real criterionValue,
Real criterionWeight
) => [(CriterionValue criterionValue, Attribute.CriterionWeight.CriterionWeight criterionWeight)] -> Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues weightedMean criterionValue
{-# SPECIALISE calculateWeightedMean :: [(CriterionValue T.CriterionValue, Attribute.CriterionWeight.CriterionWeight T.CriterionWeight)] -> Attribute.WeightedMeanAndCriterionValues.WeightedMeanAndCriterionValues T.WeightedMean T.CriterionValue #-}
calculateWeightedMean assocs = uncurry Attribute.WeightedMeanAndCriterionValues.mkWeightedMeanAndCriterionValues $ (
Factory.Math.Statistics.getWeightedMean &&& map fst
) [
(bareCriterionValue, bareCriterionWeight) |
(MkCriterionValue bareCriterionValue, criterionWeight) <- assocs,
let bareCriterionWeight = Attribute.CriterionWeight.deconstruct criterionWeight,
bareCriterionWeight /= 0
]