From a9c21a76eb5ae660eb04959782ecc89d8f8b097d Mon Sep 17 00:00:00 2001 From: George Thomas Date: Tue, 21 Nov 2023 13:47:33 +0000 Subject: [PATCH] hack: Evaluate arbitrary lambdas in animation primitive Signed-off-by: George Thomas --- primer/src/Primer/Eval/Prim.hs | 2 +- primer/src/Primer/Eval/Redex.hs | 27 ++++-- primer/src/Primer/Primitives.hs | 109 ++++++++++++----------- primer/test/Tests/EvalFull.hs | 2 +- primer/test/outputs/eval/animation/2.gif | Bin 52888 -> 59328 bytes 5 files changed, 79 insertions(+), 61 deletions(-) diff --git a/primer/src/Primer/Eval/Prim.hs b/primer/src/Primer/Eval/Prim.hs index a5c6f42b0..07d2e3b9c 100644 --- a/primer/src/Primer/Eval/Prim.hs +++ b/primer/src/Primer/Eval/Prim.hs @@ -34,7 +34,7 @@ data ApplyPrimFunDetail = ApplyPrimFunDetail -- | If this node is a reducible application of a primitive, return the name of the primitive, the arguments, and -- (a computation for building) the result. -tryPrimFun :: Map GVarName PrimDef -> Expr -> Maybe (GVarName, [Expr], forall m. MonadFresh ID m => m Expr) +tryPrimFun :: Map GVarName PrimDef -> Expr -> Maybe (GVarName, [Expr], forall m. MonadFresh ID m => (Expr -> m Expr) -> m Expr) tryPrimFun primDefs expr | -- Since no primitive functions are polymorphic, there is no need to unfoldAPP (Var _ (GlobalVarRef name), args) <- bimap stripAnns (map stripAnns) $ unfoldApp expr diff --git a/primer/src/Primer/Eval/Redex.hs b/primer/src/Primer/Eval/Redex.hs index feafc5173..2e0be23d5 100644 --- a/primer/src/Primer/Eval/Redex.hs +++ b/primer/src/Primer/Eval/Redex.hs @@ -1,3 +1,4 @@ +{-# LANGUAGE BlockArguments #-} {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE ImpredicativeTypes #-} {-# LANGUAGE OverloadedRecordDot #-} @@ -27,9 +28,9 @@ import Foreword import Control.Monad.Fresh (MonadFresh) import Control.Monad.Log (MonadLog, WithSeverity) -import Control.Monad.Trans.Maybe (MaybeT) +import Control.Monad.Trans.Maybe (MaybeT, runMaybeT) import Data.Data (Data) -import Data.Generics.Uniplate.Data (children, descendM) +import Data.Generics.Uniplate.Data (children, descendM, transformM) import Data.List (zip3) import Data.Map qualified as M import Data.Set qualified as S @@ -433,7 +434,7 @@ data Redex -- ^ The original redex (used for details) } | ApplyPrimFun - { result :: forall m. MonadFresh ID m => m Expr + { result :: forall m. MonadFresh ID m => (Expr -> m Expr) -> m Expr -- ^ The result of the applied primitive function , primFun :: GVarName -- ^ The applied primitive function (used for details) @@ -441,6 +442,8 @@ data Redex -- ^ The original arguments to @primFun@ (used for details) , orig :: Expr -- ^ The original redex (used for details) + , tydefs :: TypeDefMap + , globals :: DefMap } data RedexType @@ -779,7 +782,7 @@ viewRedex opts tydefs globals dir = \case $ hoistMaybe $ tryPrimFun (M.mapMaybe defPrim globals) e >>= \(primFun, args, result) -> - pure ApplyPrimFun{result, primFun, args, orig = e} + pure ApplyPrimFun{result, primFun, args, orig = e, tydefs, globals} -- (Λa.t : ∀b.T) S ~> (letType a = S in t) : (letType b = S in T) orig@(APP _ (Ann _ (LAM m a body) (TForall _ forallVar forallKind tgtTy)) argTy) -> pure @@ -1216,8 +1219,20 @@ runRedex opts = \case -- We should replace this with a proper exception. See: -- https://github.com/hackworthltd/primer/issues/148 | otherwise -> error "Internal Error: RenameBindingsCase found no applicable branches" - ApplyPrimFun{result, primFun, orig, args} -> do - expr' <- result + ApplyPrimFun{result, primFun, orig, args, tydefs, globals} -> do + -- TODO this can run forever - we haven't set a bound on number of steps + -- TODO `transformM` probably doesn't give us the right eval order - reuse existing machinery + expr' <- result $ fix $ \f -> transformM \e -> + maybe (pure e) (f . fst <=< runRedex opts) + =<< runMaybeT + ( flip runReaderT mempty + $ viewRedex + (ViewRedexOptions True True False) -- TODO ? + tydefs + globals + Syn -- TODO ? + e + ) let details = ApplyPrimFunDetail { before = orig diff --git a/primer/src/Primer/Primitives.hs b/primer/src/Primer/Primitives.hs index 6d592227d..9f3fc4804 100644 --- a/primer/src/Primer/Primitives.hs +++ b/primer/src/Primer/Primitives.hs @@ -40,6 +40,8 @@ import Data.Aeson (FromJSON (..), ToJSON (..)) import Data.ByteString.Base64 qualified as B64 import Data.Data (Data) import Data.Map qualified as M +import Data.Set (isSubsetOf) +import Data.Set qualified as Set import Diagrams.Backend.Rasterific ( Options (RasterificOptions), Rasterific (Rasterific), @@ -47,6 +49,7 @@ import Diagrams.Backend.Rasterific ( import Diagrams.Prelude ( Diagram, V2 (..), + blue, circle, deg, fillColor, @@ -58,6 +61,7 @@ import Diagrams.Prelude ( renderDia, rotate, sRGB24, + text, translate, (@@), ) @@ -79,9 +83,9 @@ import Primer.Core ( GVarName, GlobalName, ID, + LocalName (unLocalName), ModuleName, PrimCon (PrimAnimation, PrimChar, PrimInt), - TmVarRef (LocalVarRef), TyConName, Type' (..), ValConName, @@ -95,7 +99,7 @@ import Primer.Core.DSL ( prim, tcon, ) -import Primer.Core.Utils (generateIDs) +import Primer.Core.Utils (freeVars, generateIDs) import Primer.JSON (CustomJSON (..), PrimerJSON) import Primer.Name (Name) import Primer.Primitives.PrimDef (PrimDef (..)) @@ -242,48 +246,49 @@ primFunTypes = \case a = TApp () f = TFun () -primFunDef :: PrimDef -> [Expr' () () ()] -> Either PrimFunError (forall m. MonadFresh ID m => m Expr) +primFunDef :: PrimDef -> [Expr' () () ()] -> Either PrimFunError (forall m. MonadFresh ID m => (Expr -> m Expr) -> m Expr) primFunDef def args = case def of ToUpper -> case args of [PrimCon _ (PrimChar c)] -> - Right $ char $ toUpper c + Right $ const $ char $ toUpper c _ -> err IsSpace -> case args of [PrimCon _ (PrimChar c)] -> - Right $ boolAnn (isSpace c) + Right $ const $ boolAnn (isSpace c) _ -> err HexToNat -> case args of - [PrimCon _ (PrimChar c)] -> Right $ maybeAnn (tcon tNat) nat (digitToIntSafe c) + [PrimCon _ (PrimChar c)] -> Right $ const $ maybeAnn (tcon tNat) nat (digitToIntSafe c) where digitToIntSafe :: Char -> Maybe Natural digitToIntSafe c' = fromIntegral <$> (guard (isHexDigit c') $> digitToInt c') _ -> err NatToHex -> case args of [exprToNat -> Just n] -> - Right $ maybeAnn (tcon tChar) char $ intToDigitSafe n + Right $ const $ maybeAnn (tcon tChar) char $ intToDigitSafe n where intToDigitSafe :: Natural -> Maybe Char intToDigitSafe n' = guard (0 <= n && n <= 15) $> intToDigit (fromIntegral n') _ -> err EqChar -> case args of [PrimCon _ (PrimChar c1), PrimCon _ (PrimChar c2)] -> - Right $ boolAnn $ c1 == c2 + Right $ const $ boolAnn $ c1 == c2 _ -> err IntAdd -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> - Right $ int $ x + y + Right $ const $ int $ x + y _ -> err IntMinus -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> - Right $ int $ x - y + Right $ const $ int $ x - y _ -> err IntMul -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> - Right $ int $ x * y + Right $ const $ int $ x * y _ -> err IntQuotient -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> Right + $ const $ maybeAnn (tcon tInt) int $ if y == 0 then Nothing @@ -292,6 +297,7 @@ primFunDef def args = case def of IntRemainder -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> Right + $ const $ maybeAnn (tcon tInt) int $ if y == 0 then Nothing @@ -300,12 +306,14 @@ primFunDef def args = case def of IntQuot -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> Right + $ const $ int $ if y == 0 then 0 else x `div` y _ -> err IntRem -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> Right + $ const $ int $ if y == 0 then x @@ -313,31 +321,32 @@ primFunDef def args = case def of _ -> err IntLT -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> - Right $ boolAnn $ x < y + Right $ const $ boolAnn $ x < y _ -> err IntLTE -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> - Right $ boolAnn $ x <= y + Right $ const $ boolAnn $ x <= y _ -> err IntGT -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> - Right $ boolAnn $ x > y + Right $ const $ boolAnn $ x > y _ -> err IntGTE -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> - Right $ boolAnn $ x >= y + Right $ const $ boolAnn $ x >= y _ -> err IntEq -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> - Right $ boolAnn $ x == y + Right $ const $ boolAnn $ x == y _ -> err IntNeq -> case args of [PrimCon _ (PrimInt x), PrimCon _ (PrimInt y)] -> - Right $ boolAnn $ x /= y + Right $ const $ boolAnn $ x /= y _ -> err IntToNat -> case args of [PrimCon _ (PrimInt x)] -> Right + $ const $ maybeAnn (tcon tNat) nat $ if x < 0 then Nothing @@ -345,46 +354,40 @@ primFunDef def args = case def of _ -> err IntFromNat -> case args of [exprToNat -> Just n] -> - Right $ int $ fromIntegral n + Right $ const $ int $ fromIntegral n _ -> err Animate -> case args of -- Since we only support translating a `Picture` expression to an image once it is in normal form, -- this guard will only pass when `picture` has no free variables other than `time`. - [PrimCon () (PrimInt duration), Lam () time picture] - | Just (frames :: [Diagram Rasterific]) <- traverse diagramAtTime [0 .. (duration * 100) `div` frameLength - 1] -> - Right - $ prim - $ PrimAnimation - $ either - -- This case really shouldn't be able to happen, unless `diagrams-rasterific` is broken. - -- In fact, the default behaviour (`animatedGif`) is just to write the error to `stdout`, - -- and we only have to handle this because we need to use the lower-level `rasterGif`, - -- for unrelated reasons (getting the `Bytestring` without dumping it to a file). - mempty - (decodeUtf8 . B64.encode . toS) - $ encodeComplexGifImage - $ GifEncode (fromInteger width) (fromInteger height) Nothing Nothing gifLooping - $ flip palettizeWithAlpha DisposalRestoreBackground - $ map - ( (fromInteger frameLength,) - . renderDia - Rasterific - (RasterificOptions (mkSizeSpec $ Just . fromInteger <$> V2 width height)) - . rectEnvelope - (fromInteger <$> mkP2 (-width `div` 2) (-height `div` 2)) - (fromInteger <$> V2 width height) - ) - frames + [PrimCon () (PrimInt duration), Lam () time picture] | freeVars picture `isSubsetOf` Set.singleton (unLocalName time) -> Right \eval -> do + frames0 <- for [0 .. (duration * 100) `div` frameLength - 1] \t -> + -- TODO let the evaluator do the beta reduction as well? + fmap exprToDiagram . eval =<< generateIDs (Let () time (PrimCon () (PrimInt t)) picture) + -- TODO better error handling + let (frames :: [Diagram Rasterific]) = fromMaybe [text "error" <> (circle 40 & fillColor blue)] $ sequence frames0 + prim + $ PrimAnimation + $ either + -- This case really shouldn't be able to happen, unless `diagrams-rasterific` is broken. + -- In fact, the default behaviour (`animatedGif`) is just to write the error to `stdout`, + -- and we only have to handle this because we need to use the lower-level `rasterGif`, + -- for unrelated reasons (getting the `Bytestring` without dumping it to a file). + mempty + (decodeUtf8 . B64.encode . toS) + $ encodeComplexGifImage + $ GifEncode (fromInteger width) (fromInteger height) Nothing Nothing gifLooping + $ flip palettizeWithAlpha DisposalRestoreBackground + $ map + ( (fromInteger frameLength,) + . renderDia + Rasterific + (RasterificOptions (mkSizeSpec $ Just . fromInteger <$> V2 width height)) + . rectEnvelope + (fromInteger <$> mkP2 (-width `div` 2) (-height `div` 2)) + (fromInteger <$> V2 width height) + ) + frames where - -- Note that this simple substitution hack only allows for trivial functions, - -- i.e. those where only substitution is needed for the function body to reach a normal form. - -- Our primitives system doesn't yet support further evaluation here. - diagramAtTime t = exprToDiagram $ substTime (PrimCon () (PrimInt t)) picture - where - substTime a = \case - Var () (LocalVarRef t') | t' == time -> a - Con () c es -> Con () c $ map (substTime a) es - e -> e -- Values which are hardcoded, for now at least, for the sake of keeping the student-facing API simple. -- We keep the frame rate and resolution low to avoid serialising huge GIFs. gifLooping = LoopingForever @@ -394,7 +397,7 @@ primFunDef def args = case def of _ -> err PrimConst -> case args of [x, _] -> - Right $ generateIDs x `ann` tcon tBool + Right $ const $ generateIDs x `ann` tcon tBool _ -> err where exprToNat = \case diff --git a/primer/test/Tests/EvalFull.hs b/primer/test/Tests/EvalFull.hs index 2767f7dd8..7f7556172 100644 --- a/primer/test/Tests/EvalFull.hs +++ b/primer/test/Tests/EvalFull.hs @@ -1972,7 +1972,7 @@ test_animation = cTranslate [ int 35 , int 0 - , con1 cCircle $ lvar "t" + , con1 cCircle $ pfun IntMul `app` lvar "t" `app` int 2 ] ] ] diff --git a/primer/test/outputs/eval/animation/2.gif b/primer/test/outputs/eval/animation/2.gif index e92378997d80297808e9ac1ac3171420e40fddd7..d4780836e241c69eedef507bc3cb1ac3d3aa2718 100644 GIT binary patch delta 27377 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 E7w=$O^Z)<= delta 19228 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