module HAHP.Algorithm where
import Data.List
import Data.Maybe
import Data.Ord (comparing)
import HAHP.Algorithm.Consistency
import HAHP.Algorithm.PriorityVector
import HAHP.Algorithm.Ranking
import HAHP.Data
import HAHP.Validation.Alternatives
import HAHP.Validation.Tree
import Numeric.LinearAlgebra.HMatrix
simpleAHP :: AHPDataSet
-> (AHPDataSet, [TreeError], [AlternativesError])
simpleAHP inputDataSet =
if null inputTreeErrors && null altsErrors
then (processedDataSet, treeErrors, [])
else (inputDataSet, inputTreeErrors ++ treeErrors, altsErrors)
where (ahpTree, alts) = inputDataSet
initializedTree = initAHP ahpTree
processedDataSet = rankAlternatives (initializedTree, alts)
inputTreeErrors = validateInputAHPTree ahpTree
altsErrors = validateAlternatives inputDataSet
treeErrors = if null inputTreeErrors
then validateAHPTree initializedTree
else []
initAHP :: AHPTree
-> AHPTree
initAHP ahpTree = computeTreePriorityVectors . computeTreeConsistencies $ ahpTree
rankAlternatives :: AHPDataSet
-> AHPDataSet
rankAlternatives (ahpTree, alts) = (rankedAhpTree, sortedRankedAlternatives)
where ranks = concat . toLists . fromJust . alternativesPriority $ rankedAhpTree
rankedAhpTree = computeTreeAlternativesPriorities alts ahpTree
sortedRankedAlternatives = reverse . map fst . sortOn' snd $ zip alts ranks
sortOn' :: Ord b => (a -> b) -> [a] -> [a]
sortOn' f =
map snd . sortBy (comparing fst) . map (\x -> let y = f x in y `seq` (y, x))