Advise-me-0.1: src/Bayes/EliminationOrdering.hs
-----------------------------------------------------------------------------
-- Copyright 2019, Advise-Me project team. This file is distributed under
-- the terms of the Apache License 2.0. For more information, see the files
-- "LICENSE.txt" and "NOTICE.txt", which are included in the distribution.
-----------------------------------------------------------------------------
-- |
-- Maintainer : bastiaan.heeren@ou.nl
-- Stability : provisional
-- Portability : portable (depends on ghc)
--
-----------------------------------------------------------------------------
module Bayes.EliminationOrdering
( EliminationOrdering, nextVariable
, simpleOrder, staticOrder, minFactorOrder, minFactorVars
) where
import Bayes.Factor
import Data.List
-- depends on 'factors' and 'keeps'
newtype EliminationOrdering = Elim { fromElim :: [Dimensions] -> [String] -> Maybe (String, EliminationOrdering) }
nextVariable :: EliminationOrdering -> [Factor] -> [String] -> Maybe (String, EliminationOrdering)
nextVariable (Elim f) fs = f (map dimensions fs)
simpleOrder :: EliminationOrdering
simpleOrder = Elim $ \ds keeps ->
case filter (`notElem` keeps) (vars ds) of
[] -> Nothing
y:_ -> Just (y, simpleOrder)
staticOrder :: [String] -> EliminationOrdering
staticOrder xs = Elim $ \ds keeps ->
let rec [] = fromElim simpleOrder ds keeps
rec (y:ys)
| y `elem` keeps = rec ys
| otherwise = Just (y, staticOrder ys)
in rec xs
minFactorOrder :: EliminationOrdering
minFactorOrder = Elim $ \ds keeps ->
case minFactorNext (`notElem` keeps) ds of
Just v -> Just (v, minFactorOrder)
Nothing -> Nothing
minFactorNext :: (String -> Bool) -> [Dimensions] -> Maybe String
minFactorNext p ds =
case sortOn fst (map f vs) of
[] -> Nothing
(_, v):_ -> Just v
where
vs = filter p (vars ds)
f v = let xs = filter (hasVarD v) ds
res = mergesD xs
in (size res - size xs, v)
-- |elimination order of variables corresponding to the min-factor heuristic
minFactorVars :: [Factor] -> [String]
minFactorVars fs =
case minFactorNext (const True) (map dimensions fs) of
Just v -> v : minFactorVars (eliminate fs v)
Nothing -> []