-- ==========================================================-- -- === Miscellaneous stuff for the frontiers algorithm. ===-- -- === FrontierMisc.hs ===-- -- ==========================================================-- module FrontierMisc2 where import BaseDefs import Utils import MyUtils import AbstractVals2 import SuccsAndPreds2 import AbstractMisc -- ==========================================================-- -- fsZULB :: Rep -> Rep -> Rep fsZULB (RepTwo fru) (RepTwo frl) = RepTwo (fsZULB_2 fru frl) fsZULB (Rep1 lfu hfsu) (Rep1 lfl hfsl) = Rep1 (fsZULB_2 lfu lfl) (myZipWith2 fsZULB hfsu hfsl) fsZULB (Rep2 lfu mfu hfsu) (Rep2 lfl mfl hfsl) = Rep2 (fsZULB_2 lfu lfl) (fsZULB_2 mfu mfl) (myZipWith2 fsZULB hfsu hfsl) fsZULB_2 (Min1Max0 aru f1u f0u) (Min1Max0 arl f1l f0l) = Min1Max0 aru f1l f0u -- ==========================================================-- -- fmSelect :: Int -> [FrontierElem] -> [FrontierElem] -> Bool -> Maybe FrontierElem fmSelect a_rand up_space down_space fromTop = let min_max_pairs = take 30 [(mi, ma) | mi <- up_space, ma <- down_space, mi `avBelowEQfrel` ma] mmpl = length min_max_pairs n = a_rand `mod` mmpl selected_pair = min_max_pairs ## n in if null min_max_pairs then Nothing else if fromTop then Just (second selected_pair) else Just (first selected_pair) -- ==========================================================-- -- fmIsNothing :: Maybe a -> Bool fmIsNothing Nothing = True fmIsNothing (Just _) = False -- ==========================================================-- -- fmMaxIntersection :: [FrontierElem] -> [FrontierElem] -> [FrontierElem] fmMaxIntersection xx yy = avMaxfrel [ x `avGLBfrel` y | x <- xx, y <- yy ] -- ==========================================================-- -- fmMinIntersection :: [FrontierElem] -> [FrontierElem] -> [FrontierElem] fmMinIntersection xx yy = avMinfrel [ x `avLUBfrel` y | x <- xx, y <- yy ] -- ==========================================================-- -- fmReviseMinXX :: [Domain] -> [FrontierElem] -> FrontierElem -> [FrontierElem] fmReviseMinXX ds trial_min_xx args = let (x_underneath, x_not_underneath) = splitList (`avBelowEQfrel` args) trial_min_xx optimised_result = fmReviseMinXX_aux (fmMinIntersection x_underneath (spSuccsFrel ds args)) x_not_underneath fmReviseMinXX_aux xs ys = if length xs < length ys then foldr avMinAddPtfrel xs ys else foldr avMinAddPtfrel ys xs in optimised_result -- ==========================================================-- -- fmReviseMaxYY :: [Domain] -> [FrontierElem] -> FrontierElem -> [FrontierElem] fmReviseMaxYY ds trial_max_yy args = let (y_above, y_not_above) = splitList (args `avBelowEQfrel`) trial_max_yy optimised_result = fmReviseMaxYY_aux y_not_above (fmMaxIntersection y_above (spPredsFrel ds args)) fmReviseMaxYY_aux xs ys = if length xs > length ys then foldr avMaxAddPtfrel xs ys else foldr avMaxAddPtfrel ys xs in optimised_result -- ==========================================================-- -- === end FrontierMisc.hs ===-- -- ==========================================================--