hahp-0.1.0: src/HAHP/Algorithm/Consistency.hs
module HAHP.Algorithm.Consistency
(
computeTreeConsistencies
) where
import HAHP.Data
import Numeric.LinearAlgebra.HMatrix
-- trick : http://stackoverflow.com/a/7897595
-- trick2 : https://wiki.haskell.org/Default_values_in_records
computeTreeConsistencies :: AHPTree -> AHPTree
computeTreeConsistencies ahpTree =
case ahpTree of
(AHPTree _ prefMat _ _ _ children) -> ahpTree
{ consistencyValue = Just $ matrixConsistency prefMat
, children = map computeTreeConsistencies children
}
AHPLeaf {} -> ahpTree
-- |A matrix with consistency=0 is consistent.
matrixConsistency :: PairwiseMatrix -> Double
matrixConsistency prefMat
| matrixSize <= 2 = 0
| otherwise = consistencyIndicator / randomIndexValue
where randomIndexValue = randomIndex matrixSize
consistencyIndicator = (lambdaMax - matrixSize) / (matrixSize - 1)
lambdaMax = maxEigenValue prefMat
matrixSize = fromIntegral . rows $ prefMat
maxEigenValue :: PairwiseMatrix -> Double
maxEigenValue prefMat = realPart . maxElement . eigenvalues $ prefMat
randomIndex :: Double -> Double
randomIndex size
| size <= 15 = randomIndexSaaty size
| otherwise = randomIndexCalculated size
randomIndexSaaty :: Double -> Double
randomIndexSaaty matrixSize = saatyTable !! (round matrixSize - 1)
where saatyTable = [0.00, 0.00, 0.58, 0.90, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49, 1.51, 1.48, 1.56, 1.57, 1.59]
-- |Random Index estimation function taken from :
-- "Consistency in the AHP : A new approach"
-- José Antonio ALONSO and Teresa LAMATA,
-- IJUFKBS 2006
randomIndexCalculated :: Double -> Double
randomIndexCalculated matrixSize = ( 0.00149 * (matrixSize^3))
+ (- 0.05121) * (matrixSize^2)
+ ( 0.59150 * matrixSize)
+ (- 0.79124)