summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPéter Diviánszky <divipp@gmail.com>2016-05-16 09:36:57 +0200
committerPéter Diviánszky <divipp@gmail.com>2016-05-16 09:36:57 +0200
commit1df9d442261cd7ad9b889ca48b23ee34cf6121e9 (patch)
tree6c038e898ae355a3c28f69f2c4423277ee28cd1f
parent629f80cfeedd133f0ccca596dc33a4b54d2369eb (diff)
compactify db indices
-rw-r--r--prototypes/LamMachine.hs199
1 files changed, 110 insertions, 89 deletions
diff --git a/prototypes/LamMachine.hs b/prototypes/LamMachine.hs
index b98f84e3..59342a58 100644
--- a/prototypes/LamMachine.hs
+++ b/prototypes/LamMachine.hs
@@ -23,16 +23,18 @@ import LambdaCube.Compiler.DeBruijn hiding (up)
23 23
24-- expression 24-- expression
25data Exp_ 25data Exp_
26 = Lam_ Exp 26 = Var_ Int
27 | Var_ Int 27 | Y_ Exp
28 | Int_ Int
29 | Lam_ Exp
30
28 | App_ Exp Exp 31 | App_ Exp Exp
29 | Seq_ Exp Exp 32 | Seq_ Exp Exp
30 | Con_ String Int [Exp] 33 | Con_ String Int [Exp]
31 | Case_ Exp [(String, Exp)] 34 | Case_ Exp [(String, Exp)]
32 | Int_ Int
33 | Op1_ Op1 Exp 35 | Op1_ Op1 Exp
34 | Op2_ Op2 Exp Exp 36 | Op2_ Op2 Exp Exp
35 | Y_ Exp 37
36 | Ups_ [Up] Exp 38 | Ups_ [Up] Exp
37-- deriving (Eq) 39-- deriving (Eq)
38 40
@@ -43,7 +45,14 @@ data Op2 = Add | Sub | Mod | LessEq | EqInt
43 deriving (Eq, Show) 45 deriving (Eq, Show)
44 46
45-- cached free variables set 47-- cached free variables set
46data Exp = Exp FreeVars Exp_ 48data Exp = Exp' FreeVars Exp_
49
50pattern Exp a b <- Exp' a b
51 where Exp a b = compact a b
52
53compact a b@Ups_{} = Exp' a b
54compact a b | a == FreeVars (2^maxFreeVar a - 1) = Exp' a b
55 | otherwise = tracePShow (a, Exp' undefined b) $ Exp' a b
47 56
48-- state of the machine 57-- state of the machine
49data MSt = MSt [(FreeVars, Exp)] -- TODO: use finger tree instead of list 58data MSt = MSt [(FreeVars, Exp)] -- TODO: use finger tree instead of list
@@ -53,20 +62,20 @@ data MSt = MSt [(FreeVars, Exp)] -- TODO: use finger tree instead of list
53--------------------------------------------------------------------- toolbox: pretty print 62--------------------------------------------------------------------- toolbox: pretty print
54 63
55instance PShow Exp where 64instance PShow Exp where
56 pShow x = case {-pushUps-} x of 65 pShow x = case pushUps x of
57 Var i -> DVar i 66 Var_ i -> DVar i
58 App a b -> DApp (pShow a) (pShow b) 67 App_ a b -> DApp (pShow a) (pShow b)
59 Seq a b -> DOp "`seq`" (Infix 1) (pShow a) (pShow b) 68 Seq_ a b -> DOp "`seq`" (Infix 1) (pShow a) (pShow b)
60 Lam e -> shLam_ True $ pShow e 69 Lam_ e -> shLam_ True $ pShow e
61 Con s i xs -> foldl DApp (text s) $ pShow <$> xs 70 Con_ s i xs -> foldl DApp (text s) $ pShow <$> xs
62 Int i -> pShow i 71 Int_ i -> pShow i
63 Op1 o x -> text (show o) `DApp` pShow x 72 Op1_ o x -> text (show o) `DApp` pShow x
64 Op2 EqInt x y -> DOp "==" (Infix 4) (pShow x) (pShow y) 73 Op2_ EqInt x y -> DOp "==" (Infix 4) (pShow x) (pShow y)
65 Op2 Add x y -> DOp "+" (InfixL 6) (pShow x) (pShow y) 74 Op2_ Add x y -> DOp "+" (InfixL 6) (pShow x) (pShow y)
66 Op2 o x y -> text (show o) `DApp` pShow x `DApp` pShow y 75 Op2_ o x y -> text (show o) `DApp` pShow x `DApp` pShow y
67 Y e -> "Y" `DApp` pShow e 76 Y_ e -> "Y" `DApp` pShow e
68 Case e xs -> DPreOp (-20) (ComplexAtom "case" (-10) (pShow e) (SimpleAtom "of")) $ foldr1 DSemi [DArr_ "->" (text a) (pShow b) | (a, b) <- xs] 77 Case_ e xs -> DPreOp (-20) (ComplexAtom "case" (-10) (pShow e) (SimpleAtom "of")) $ foldr1 DSemi [DArr_ "->" (text a) (pShow b) | (a, b) <- xs]
69 Ups u xs -> DPreOp (-20) (SimpleAtom $ show u) $ pShow xs 78 Ups_ u xs -> DPreOp (-20) (SimpleAtom $ show u) $ pShow xs
70 79
71shLam_ usedVar b = DFreshName usedVar $ showLam (DVar 0) b 80shLam_ usedVar b = DFreshName usedVar $ showLam (DVar 0) b
72 81
@@ -94,34 +103,37 @@ instance PShow MSt where
94instance HasFreeVars Exp where 103instance HasFreeVars Exp where
95 getFreeVars (Exp fv _) = fv 104 getFreeVars (Exp fv _) = fv
96 105
97upss [] e = e 106upss [] (getUs -> (_, e)) = e
98upss u e = Ups u e 107upss u (getUs -> (_, e)) = Ups u e
108
109upss_ [] (Exp _ e) = e
110upss_ u e = Ups_ u e
99 111
100dup2 f (Ups a ax) (Ups b bx) = Ups_ s $ Exp (getFreeVars az <> getFreeVars bz) $ f az bz where 112dup2 f ax bx = upss_ s $ Exp (getFreeVars az <> getFreeVars bz) $ f az bz where
101 (s, [a', b']) = deltaUps [a, b] 113 (s, [a', b']) = deltaUps [ax, bx]
102 az = upss a' ax 114 az = upss a' ax
103 bz = upss b' bx 115 bz = upss b' bx
104dup2 f a b = f a b 116
105dup1 f (Ups a ax) = Ups_ a $ Exp (getFreeVars ax) $ f ax 117dup1 f (Ups a ax) = upss_ a $ Exp (getFreeVars ax) $ f ax
106dup1 f x = f x 118dup1 f x = f x
107 119
108getUs (Ups x y) = (x, y) 120getUs (Ups x y) = (x, y)
109getUs y = ([], y) 121getUs y = ([], y)
110 122
111dupCon f [] = f [] 123dupCon f [] = f []
112dupCon f [Ups a ax] = Ups_ a $ Exp (getFreeVars ax) $ f [ax] 124--dupCon f [Ups a ax] = Ups_ a $ Exp (getFreeVars ax) $ f [ax]
113dupCon f (unzip . map getUs -> (b, bx)) = Ups_ s $ Exp (foldMap getFreeVars bz) $ f bz where 125dupCon f bx = upss_ s $ Exp (foldMap getFreeVars bz) $ f bz where
114 (s, b') = deltaUps b 126 (s, b') = deltaUps bx
115 bz = zipWith upss b' bx 127 bz = zipWith upss b' bx
116 128
117dupCase f (getUs -> (a, ax)) (unzip -> (ss, unzip . map getUs -> (b, bx))) 129dupCase f ax (unzip -> (ss, bx))
118 = Ups_ s $ Exp (getFreeVars az <> foldMap getFreeVars bz) $ f az $ zip ss bz 130 = upss_ s $ Exp (getFreeVars az <> foldMap getFreeVars bz) $ f az $ zip ss bz
119 where 131 where
120 (s, a': b') = deltaUps $ a: b 132 (s, a': b') = deltaUps $ ax: bx
121 az = upss a' ax 133 az = upss a' ax
122 bz = zipWith upss b' bx 134 bz = zipWith upss b' bx
123 135
124dupLam f (Ups a ax) = Ups_ (ff a) $ Exp (shiftFreeVars (-1) $ getFreeVars ax') $ f ax' 136dupLam f (Ups a ax) = upss_ (ff a) $ Exp (shiftFreeVars (-1) $ getFreeVars ax') $ f ax'
125 where 137 where
126 ax' = case a of 138 ax' = case a of
127 Up 0 n: _ -> up (Up 0 1) ax 139 Up 0 n: _ -> up (Up 0 1) ax
@@ -164,20 +176,14 @@ rearr (Up l n) = rearrangeFreeVars (RFUp n) l
164 176
165upsFreeVars xs s = foldr rearr s xs 177upsFreeVars xs s = foldr rearr s xs
166 178
167pushUps (Ups us e) = foldr pushUp e us 179showUps us n = foldr f (replicate n True) us where
168pushUps e = e 180 f (Up l n) is = take l is ++ replicate n False ++ drop l is
169
170showUps us = foldr f [] us where
171 f (Up l n) is = take n [l..] ++ map (n+) is
172 181
173--sectUps' a b = sect (showUps a) (showUps b) -- sectUps 0 a 0 b 182--sectUps' a b = sect (showUps a) (showUps b) -- sectUps 0 a 0 b
174 183
175sect [] _ = [] 184sect [] xs = xs
176sect _ [] = [] 185sect xs [] = xs
177sect (x:xs) (y:ys) 186sect (x:xs) (y:ys) = (x || y): sect xs ys
178 | x == y = x: sect xs ys
179 | x < y = sect xs (y: ys)
180 | x > y = sect (x: xs) ys
181 187
182{- TODO 188{- TODO
183sectUps _ u _ [] = [] 189sectUps _ u _ [] = []
@@ -198,32 +204,43 @@ diffUps [] [] = []
198diffUps (Up l n: us) (Up l' n': us') = insertUp (Up l' (l - l')) $ diffUps us (Up (l + n) (l' + n' - l - n): us') 204diffUps (Up l n: us) (Up l' n': us') = insertUp (Up l' (l - l')) $ diffUps us (Up (l + n) (l' + n' - l - n): us')
199-} 205-}
200 206
201diffUps = diffUps' 0 207diffUps a b = diffUps' 0 (back a) (back b)
202 208
203diffUps' n u [] = (+(-n)) <$> u 209diffUps' n u [] = (+(-n)) <$> u
210diffUps' n [] _ = []
204diffUps' n (x: xs) (y: ys) 211diffUps' n (x: xs) (y: ys)
205 | x < y = (x - n): diffUps' n xs (y: ys) 212 | x < y = (x - n): diffUps' n xs (y: ys)
206 | x == y = diffUps' (n+1) xs ys 213 | x == y = diffUps' (n+1) xs ys
207 214
215back = map fst . filter (not . snd) . zip [0..]
216
208mkUps = f 0 217mkUps = f 0
209 where 218 where
210 f i [] = [] 219 f i [] = []
211 f i (x: xs) = insertUp (Up (x-i) 1) $ f (i+1) xs 220 f i (x: xs) = insertUp (Up (x-i) 1) $ f (i+1) xs
212 221
213deltaUps us = (mkUps s, [mkUps $ showUps u `diffUps` s | u <- us]) 222deltaUps = deltaUps_ . map (crk . getUs)
223
224deltaUps_ (map $ uncurry showUps -> us) = (mkUps $ back s, [mkUps $ u `diffUps` s | u <- us])
214 where 225 where
215 s = foldr1 sect $ showUps <$> us 226 s = foldr1 sect $ us
227
228crk (s, e) = (s, maxFreeVar $ getFreeVars e)
229
230maxFreeVar (FreeVars i) = f 0 i where
231 f i 0 = i
232 f i n = f (i+1) (n `div` 2)
216 233
217joinUps a b = foldr insertUp b a 234joinUps a b = foldr insertUp b a
218 235
219diffUpsTest xs | and $ zipWith (\a b -> s `joinUps` a == b) ys xs = "ok" 236diffUpsTest xs | and $ zipWith (\a (b, _) -> s `joinUps` a == b) ys xs = show (s, ys)
220 where 237 where
221 (s, ys) = deltaUps xs 238 (s, ys) = deltaUps_ xs
222 239
223diffUpsTest' = diffUpsTest [x,y] --diffUpsTest x y 240diffUpsTest' = diffUpsTest [x,y] --diffUpsTest x y
224 where 241 where
225 x = [Up 1 2, Up 3 4, Up 8 2] 242 x = ([Up 1 2, Up 3 4, Up 8 2], 20)
226 y = [Up 2 2, Up 5 1, Up 6 2, Up 7 2] 243 y = ([Up 2 2, Up 5 1, Up 6 2, Up 7 2], 18)
227 244
228insertUp u@(Up l 0) us = us 245insertUp u@(Up l 0) us = us
229insertUp u@(Up l n) [] = [u] 246insertUp u@(Up l n) [] = [u]
@@ -236,9 +253,13 @@ addUp (Up _ 0) e = e
236addUp u (Exp s (Ups_ us e)) = Exp (rearr u s) $ Ups_ (insertUp u us) e 253addUp u (Exp s (Ups_ us e)) = Exp (rearr u s) $ Ups_ (insertUp u us) e
237addUp u e = Ups [u] e 254addUp u e = Ups [u] e
238 255
239pushUp u@(Up i num) e@(Exp s x) 256pushUps :: Exp -> Exp_
240 | dbGE i s = e 257pushUps (Ups us (Exp _ e)) = foldr pushUp e us
241 | otherwise = Exp (rearrangeFreeVars (RFUp num) i s) $ case x of 258pushUps (Exp _ e) = e
259
260pushUp u@(Up i num) x
261-- | dbGE i s = e
262 | otherwise = case x of
242 App_ a b -> App_ (f a) (f b) 263 App_ a b -> App_ (f a) (f b)
243 Seq_ a b -> Seq_ (f a) (f b) 264 Seq_ a b -> Seq_ (f a) (f b)
244 Con_ cn s xs -> Con_ cn s (f <$> xs) 265 Con_ cn s xs -> Con_ cn s (f <$> xs)
@@ -283,8 +304,8 @@ down i x = Just $ down_ i x
283 304
284down_ i e@(Exp s x) 305down_ i e@(Exp s x)
285 | dbGE i s = e 306 | dbGE i s = e
286down_ i (Ups us e) = f i us e where 307down_ i0 e0@(Ups us e) = f i0 us e where
287 f i [] e = error $ "-- - - -- " ++ show i ++ " " ++ ppShow e ++ "\n" ++ ppShow (pushUps e) --"show down_ i e 308 f i [] e = error $ "-- - - -- " ++ show (i0, i) ++ " " ++ ppShow e0 ++ "\n" ++ ppShow e --(pushUps e) --"show down_ i e
288 f i (u@(Up j n): us) e 309 f i (u@(Up j n): us) e
289 | i < j = addUp (Up (j-1) n) $ f i us e 310 | i < j = addUp (Up (j-1) n) $ f i us e
290 | i >= j + n = addUp u $ f (i-n) us e 311 | i >= j + n = addUp u $ f (i-n) us e
@@ -304,7 +325,7 @@ down_ i e@(Exp s x) = Exp (delVar i s) $ case x of
304 325
305tryRemoves xs = tryRemoves_ (Var <$> freeVars xs) 326tryRemoves xs = tryRemoves_ (Var <$> freeVars xs)
306tryRemoves_ [] dt = dt 327tryRemoves_ [] dt = dt
307tryRemoves_ ((pushUps -> Var i): vs) dt 328tryRemoves_ ((pushUps -> Var_ i): vs) dt
308 | Just dt' <- tryRemove_ i dt 329 | Just dt' <- tryRemove_ i dt
309 = tryRemoves_ (catMaybes $ down i <$> vs) dt' 330 = tryRemoves_ (catMaybes $ down i <$> vs) dt'
310 | otherwise = tryRemoves_ vs dt 331 | otherwise = tryRemoves_ vs dt
@@ -352,8 +373,8 @@ instance MachineMonad Identity where
352 collectSizeStat _ = return () 373 collectSizeStat _ = return ()
353 374
354instance MachineMonad IO where 375instance MachineMonad IO where
355-- traceStep s = return () 376 traceStep s = return ()
356 traceStep = putStrLn 377-- traceStep = putStrLn
357 collectSizeStat s = return () 378 collectSizeStat s = return ()
358 379
359instance MachineMonad (Writer [Int]) where 380instance MachineMonad (Writer [Int]) where
@@ -378,11 +399,11 @@ runMachinePure e = putStr $ unlines $ ppShow t: []
378step :: MachineMonad m => MSt -> m MSt 399step :: MachineMonad m => MSt -> m MSt
379step dt@(MSt t e vs) = case pushUps e of 400step dt@(MSt t e vs) = case pushUps e of
380 401
381 Int{} -> return dt 402 Int_{} -> return dt
382 403
383 Lam{} -> return dt 404 Lam_{} -> return dt
384 405
385 Con cn i xs 406 Con_ cn i xs
386 | lz /= 0 -> return $ MSt (ups' 1 lz t) (Con cn i xs') $ zs ++ vs -- share complex constructor arguments 407 | lz /= 0 -> return $ MSt (ups' 1 lz t) (Con cn i xs') $ zs ++ vs -- share complex constructor arguments
387 | otherwise -> return dt 408 | otherwise -> return dt
388 where 409 where
@@ -392,43 +413,43 @@ step dt@(MSt t e vs) = case pushUps e of
392 f i (x: xs) | simple x = (up (Up 0 lz) x, []): f i xs 413 f i (x: xs) | simple x = (up (Up 0 lz) x, []): f i xs
393 | otherwise = (Var i, [up (Up 0 (lz - i - 1)) x]): f (i+1) xs 414 | otherwise = (Var i, [up (Up 0 (lz - i - 1)) x]): f (i+1) xs
394 415
395 Var i -> lookupHNF "var" (\e _ -> e) i dt 416 Var_ i -> lookupHNF "var" (\e _ -> e) i dt
396 417
397 Seq a b -> case pushUps a of 418 Seq_ a b -> case pushUps a of
398 Int{} -> stepMsg "seq" $ MSt t b vs 419 Int_{} -> stepMsg "seq" $ MSt t b vs
399 Lam{} -> stepMsg "seq" $ tryRemoves (getFreeVars a) $ MSt t b vs 420 Lam_{} -> stepMsg "seq" $ tryRemoves (getFreeVars a) $ MSt t b vs
400 Con{} -> stepMsg "seq" $ tryRemoves (getFreeVars a) $ MSt t b vs 421 Con_{} -> stepMsg "seq" $ tryRemoves (getFreeVars a) $ MSt t b vs
401 Var i -> lookupHNF' "seqvar" (\e (pushUps -> Seq _ b) -> b) i dt 422 Var_ i -> lookupHNF' "seqvar" (\e (pushUps -> Seq_ _ b) -> b) i dt
402 _ -> stepMsg "seqexp" $ MSt (ups' 1 1 t) (Seq (Var 0) $ up (Up 0 1) b) $ a: vs 423 _ -> stepMsg "seqexp" $ MSt (ups' 1 1 t) (Seq (Var 0) $ up (Up 0 1) b) $ a: vs
403 424
404 -- TODO: handle recursive constants 425 -- TODO: handle recursive constants
405 Y (pushUps -> Lam x) -> stepMsg "Y" $ MSt (ups' 1 1 t) x $ e: vs 426 Y_ (pushUps -> Lam_ x) -> stepMsg "Y" $ MSt (ups' 1 1 t) x $ e: vs
406 427
407 App a b -> case pushUps a of 428 App_ a b -> case pushUps a of
408 Lam x | usedVar 0 x 429 Lam_ x | usedVar 0 x
409 -> stepMsg "app" $ MSt (ups' 1 1 t) x $ b: vs 430 -> stepMsg "app" $ MSt (ups' 1 1 t) x $ b: vs
410 Lam x -> stepMsg "appdel" $ tryRemoves (getFreeVars b) $ MSt t x vs 431 Lam_ x -> stepMsg "appdel" $ tryRemoves (getFreeVars b) $ MSt t x vs
411 Var i -> lookupHNF' "appvar" (\e (pushUps -> App _ y) -> App e y) i dt 432 Var_ i -> lookupHNF' "appvar" (\e (pushUps -> App_ _ y) -> App e y) i dt
412 _ -> stepMsg "appexp" $ MSt (ups' 1 1 t) (App (Var 0) $ up (Up 0 1) b) $ a: vs 433 _ -> stepMsg "appexp" $ MSt (ups' 1 1 t) (App (Var 0) $ up (Up 0 1) b) $ a: vs
413 434
414 Case a cs -> case pushUps a of 435 Case_ a cs -> case pushUps a of
415 Con cn i es -> stepMsg "case" $ tryRemoves (foldMap (getFreeVars . snd) $ delElem i cs) $ (MSt t (foldl App (snd $ cs !! i) es) vs) 436 Con_ cn i es -> stepMsg "case" $ tryRemoves (foldMap (getFreeVars . snd) $ delElem i cs) $ (MSt t (foldl App (snd $ cs !! i) es) vs)
416 Var i -> lookupHNF' "casevar" (\e (pushUps -> Case _ cs) -> Case e cs) i dt 437 Var_ i -> lookupHNF' "casevar" (\e (pushUps -> Case_ _ cs) -> Case e cs) i dt
417 _ -> stepMsg "caseexp" $ MSt (ups' 1 1 t) (Case (Var 0) $ second (up (Up 0 1)) <$> cs) $ a: vs 438 _ -> stepMsg "caseexp" $ MSt (ups' 1 1 t) (Case (Var 0) $ second (up (Up 0 1)) <$> cs) $ a: vs
418 439
419 Op2 op x y -> case (pushUps x, pushUps y) of 440 Op2_ op x y -> case (pushUps x, pushUps y) of
420 (Int e, Int f) -> return $ MSt t (int op e f) vs 441 (Int_ e, Int_ f) -> return $ MSt t (int op e f) vs
421 where 442 where
422 int Add a b = Int $ a + b 443 int Add a b = Int $ a + b
423 int Sub a b = Int $ a - b 444 int Sub a b = Int $ a - b
424 int Mod a b = Int $ a `mod` b 445 int Mod a b = Int $ a `mod` b
425 int LessEq a b = if a <= b then T else F 446 int LessEq a b = if a <= b then T else F
426 int EqInt a b = if a == b then T else F 447 int EqInt a b = if a == b then T else F
427 (Var i, _) -> lookupHNF' "op2-1var" (\e (pushUps -> Op2 op _ y) -> Op2 op e y) i dt 448 (Var_ i, _) -> lookupHNF' "op2-1var" (\e (pushUps -> Op2_ op _ y) -> Op2 op e y) i dt
428 (_, Var i) -> lookupHNF' "op2-2var" (\e (pushUps -> Op2 op x _) -> Op2 op x e) i dt 449 (_, Var_ i) -> lookupHNF' "op2-2var" (\e (pushUps -> Op2_ op x _) -> Op2 op x e) i dt
429 (Int{}, _) -> stepMsg "op2" $ MSt (ups' 1 1 t) (Op2 op x (Var 0)) $ y: vs 450 (Int_{}, _) -> stepMsg "op2" $ MSt (ups' 1 1 t) (Op2 op x (Var 0)) $ y: vs
430 (_, Int{}) -> stepMsg "op2" $ MSt (ups' 1 1 t) (Op2 op (Var 0) y) $ x: vs 451 (_, Int_{}) -> stepMsg "op2" $ MSt (ups' 1 1 t) (Op2 op (Var 0) y) $ x: vs
431 _ -> stepMsg "op2" $ MSt (ups' 1 2 t) (Op2 op (Var 0) (Var 1)) $ x: y: vs 452 _ -> stepMsg "op2" $ MSt (ups' 1 2 t) (Op2 op (Var 0) (Var 1)) $ x: y: vs
432 453
433stepMsg :: MachineMonad m => String -> MSt -> m MSt 454stepMsg :: MachineMonad m => String -> MSt -> m MSt
434stepMsg msg dt = do 455stepMsg msg dt = do