-- ==========================================================-- -- === Printer of abstract functions ===-- -- === File: PrintResults.m ===-- -- ==========================================================-- module PrintResults where import BaseDefs import Utils import MyUtils import Inverse import AbstractMisc -- ==========================================================-- -- prLift :: PrDomain -> PrDomain prLift d = newBottom:d where dElemLen = length (head d) dBottomElem = minimum (concat d) - (1 :: Int) newBottom = copy dElemLen dBottomElem -- ==========================================================-- -- prCross :: PrDomain -> PrDomain -> PrDomain prCross d1 d2 = [e1++e2 | e1 <- d1, e2 <- d2] -- ==========================================================-- -- prCrossList :: [PrDomain] -> PrDomain prCrossList [] = [[0]] -- ???????????? prCrossList [d] = d prCrossList (a:b:abs) = prCross a (prCrossList (b:abs)) -- ==========================================================-- -- prAllPoints :: Domain -> [Char] prAllPoints d = "{" ++ interleave " " ((h.g.f) d) ++ "}" where -- f creates the numbered version of a domain f Two = [ [(-1) :: Int], [0 :: Int] ] f (Lift1 ds) = prLift (prCrossList (map f ds)) f (Lift2 ds) = prLift (prLift (prCrossList (map f ds))) -- g normalises the numbers in a domain so the lowest is zero g d = map (map (mySubtract (minimum (concat d)))) d -- h converts a domain of numbers into one of characters h x = map (map k) (g x) -- k turns a number into its ascii representation k :: Int -> Char k n = toEnum (n+48) -- ==========================================================-- -- prWidth :: Domain -> Int prWidth Two = 1 :: Int prWidth (Lift1 ds) = sum (map prWidth ds) prWidth (Lift2 ds) = sum (map prWidth ds) -- ==========================================================-- -- prLiftsIn :: Domain -> Int prLiftsIn Two = 2 :: Int prLiftsIn (Lift1 ds) = 1 + maximum (map prLiftsIn ds) prLiftsIn (Lift2 ds) = 2 + maximum (map prLiftsIn ds) -- ==========================================================-- -- prSucc :: Int -> Int -> Int prSucc n c = n + c -- ==========================================================-- -- prRoute :: Domain -> Route -> [Char] prRoute d r = let k :: Int -> Char k n = toEnum (n + 48) in map k (prRouteMain d r) -- ==========================================================-- -- prRouteMain :: Domain -> Route -> [Int] prRouteMain Two Zero = [0 :: Int] prRouteMain Two One = [1 :: Int] prRouteMain d@(Lift1 ds) Stop1 = copy (prWidth d) 0 prRouteMain d@(Lift1 ds) (Up1 rs) = map (prSucc 1) (prRouteMain_cross ds rs) prRouteMain d@(Lift2 ds) Stop2 = copy (prWidth d) 0 prRouteMain d@(Lift2 ds) Up2 = copy (prWidth d) 1 prRouteMain d@(Lift2 ds) (UpUp2 rs) = map (prSucc 2) (prRouteMain_cross ds rs) prRouteMain_cross ds rs = concat fixedRoutes where unFixedRoutes = myZipWith2 prRouteMain ds rs compFactors = map prLiftsIn ds compFactMax = maximum compFactors compFactNorm = map subCompFactMax compFactors fixedRoutes = map applyCompensationFactor (myZip2 compFactNorm unFixedRoutes) applyCompensationFactor (n, roote) = map (prSucc n) roote subCompFactMax :: Int -> Int subCompFactMax nn = compFactMax - nn -- ==========================================================-- -- prPrintFunction :: Bool -> StaticComponent -> Naam -> Point -> [Char] -- the normal case, for printing non-constant functions prPrintFunction mi statics fName (fDomain@(Func dss dt), Rep rep) | amIsaHOF (Func dss dt) || NoFormat `elem` utSCflags statics = "\nFunction \"" ++ fName++ "\" has input domains:\n" ++ layn (map show dss) ++ " and output domain\n " ++ show dt ++ "\n\nwith value:\n\n" ++ show rep ++ "\n\n" | otherwise = "\nFunction \"" ++ fName++ "\" has input domains:\n" ++ numberedPrInDs ++ " and output domain\n " ++ prettyOutDomain ++ "\n\n Output | Lower frontier" ++ "\n --------+----------------\n" ++ concat (map f ((reverse.sort.amAllRoutes) dt)) ++ "\n\n" where pseudoParams = utSureLookup (utSCfreevars statics) "prPrintFunction" fName ++ forever "" forever x = x:forever x inputDomains = dss outputDomain = dt prettyInDomains = map prAllPoints inputDomains prettyOutDomain = prAllPoints outputDomain numberedPrInDs = layn (map ff (zip pseudoParams prettyInDomains)) ff ("", pid) = pid ff (name, pid) = pid ++ " (free \"" ++ name ++ "\")" f op = let ipl = inMinInverse mi fDomain (Rep rep) op in (copy (8 - length outColText) ' ') ++ outColText ++ " | " ++ (interleave " and " (map g ipl)) ++ "\n" where outColText = prRoute dt op g (MkFrel rs) = interleave " " (myZipWith2 prRoute dss rs) -- the exception case, for printing constants prPrintFunction mi statics fName (ds, rs) | amContainsFunctionSpace ds = "\nFunction \"" ++ fName++ "\" is a higher-order constant (yuck) in domain\n\n" ++ show ds ++ "\n\nof value\n\n" ++ show rs ++ "\n\n" | otherwise = "\nFunction \"" ++ fName++ "\" is a constant point " ++ prRoute ds rs ++ " in domain \n " ++ prAllPoints ds ++ "\n\n" -- ==========================================================-- -- === end PrintResults.m ===-- -- ==========================================================--