Skip to content

Commit

Permalink
Rearrange module structure for machine costs
Browse files Browse the repository at this point in the history
  • Loading branch information
kwxm committed May 13, 2021
1 parent 9532452 commit 4b1e33e
Show file tree
Hide file tree
Showing 24 changed files with 279 additions and 252 deletions.
18 changes: 11 additions & 7 deletions plutus-benchmark/nofib/bench/BenchPlc.hs
Expand Up @@ -3,27 +3,31 @@
{- | Plutus benchmarks based on some nofib examples. -}
module Main where

import Criterion.Main

import Common

import Control.Exception
import Control.Monad.Except
import qualified Plutus.Benchmark.Clausify as Clausify
import qualified Plutus.Benchmark.Knights as Knights
import qualified Plutus.Benchmark.Prime as Prime
import qualified Plutus.Benchmark.Queens as Queens
import qualified PlutusCore as PLC
import Criterion.Main

import qualified Plutus.Benchmark.Clausify as Clausify
import qualified Plutus.Benchmark.Knights as Knights
import qualified Plutus.Benchmark.Prime as Prime
import qualified Plutus.Benchmark.Queens as Queens

import qualified PlutusCore as PLC
import PlutusCore.Builtins
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultCekParameters)
import PlutusCore.Universe

import UntypedPlutusCore
import UntypedPlutusCore.Evaluation.Machine.Cek


benchCek :: Term NamedDeBruijn DefaultUni DefaultFun () -> Benchmarkable
benchCek t = case runExcept @PLC.FreeVariableError $ PLC.runQuoteT $ unDeBruijnTerm t of
Left e -> throw e
Right t' -> nf (unsafeEvaluateCek defaultCekMachineCosts defBuiltinsRuntime) t'
Right t' -> nf (unsafeEvaluateCek defaultCekParameters) t'

benchClausify :: Clausify.StaticFormula -> Benchmarkable
benchClausify f = benchCek $ Clausify.mkClausifyTerm f
Expand Down
45 changes: 24 additions & 21 deletions plutus-benchmark/nofib/exe/Main.hs
Expand Up @@ -3,32 +3,35 @@

module Main where

import Prelude ((<>))
import qualified Prelude as P
import Prelude ((<>))
import qualified Prelude as P

import Control.Exception
import Control.Monad ()
import Control.Monad ()
import Control.Monad.Trans.Except
import qualified Data.ByteString.Lazy as BSL
import Data.Char (isSpace)
import Options.Applicative as Opt hiding (action)
import System.Exit (exitFailure)
import qualified Data.ByteString.Lazy as BSL
import Data.Char (isSpace)
import Options.Applicative as Opt hiding (action)
import System.Exit (exitFailure)
import System.IO
import Text.PrettyPrint.ANSI.Leijen (Doc, indent, line, string, text, vsep)

import qualified Plutus.Benchmark.Clausify as Clausify
import qualified Plutus.Benchmark.Knights as Knights
import qualified Plutus.Benchmark.LastPiece as LastPiece
import qualified Plutus.Benchmark.Prime as Prime
import qualified Plutus.Benchmark.Queens as Queens
import PlutusCore (Name (..))
import qualified PlutusCore as PLC
import Text.PrettyPrint.ANSI.Leijen (Doc, indent, line, string, text, vsep)

import qualified Plutus.Benchmark.Clausify as Clausify
import qualified Plutus.Benchmark.Knights as Knights
import qualified Plutus.Benchmark.LastPiece as LastPiece
import qualified Plutus.Benchmark.Prime as Prime
import qualified Plutus.Benchmark.Queens as Queens

import PlutusCore (Name (..))
import qualified PlutusCore as PLC
import PlutusCore.Builtins
import PlutusCore.CBOR ()
import qualified PlutusCore.Pretty as PLC
import PlutusCore.CBOR ()
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultCekParameters)
import qualified PlutusCore.Pretty as PLC
import PlutusCore.Universe
import PlutusTx.Prelude as TxPrelude hiding (fmap, mappend, (<$), (<$>), (<*>), (<>))
import qualified UntypedPlutusCore as UPLC
import PlutusTx.Prelude as TxPrelude hiding (fmap, mappend, (<$), (<$>),
(<*>), (<>))
import qualified UntypedPlutusCore as UPLC
import UntypedPlutusCore.Evaluation.Machine.Cek

failWithMsg :: String -> IO a
Expand Down Expand Up @@ -187,7 +190,7 @@ options = hsubparser
---------------- Evaluation ----------------

evaluateWithCek :: UPLC.Term Name DefaultUni DefaultFun () -> EvaluationResult (UPLC.Term Name DefaultUni DefaultFun ())
evaluateWithCek = unsafeEvaluateCekNoEmit defaultCekMachineCosts defBuiltinsRuntime
evaluateWithCek = unsafeEvaluateCekNoEmit defaultCekParameters

toDeBruijn :: UPLC.Program Name DefaultUni DefaultFun a -> IO (UPLC.Program UPLC.DeBruijn DefaultUni DefaultFun a)
toDeBruijn prog = do
Expand Down
32 changes: 17 additions & 15 deletions plutus-benchmark/nofib/test/Spec.hs
Expand Up @@ -9,24 +9,26 @@ run to completion. -}

module Main where

import qualified Plutus.Benchmark.Clausify as Clausify
import qualified Plutus.Benchmark.Knights as Knights
import Plutus.Benchmark.Prime (Result (Composite, Prime))
import qualified Plutus.Benchmark.Prime as Prime
import qualified Plutus.Benchmark.Queens as Queens

import Control.Exception
import Control.Monad.Except
import qualified PlutusCore as PLC
import PlutusCore.Builtins
import PlutusCore.Universe (DefaultUni)
import qualified PlutusTx as Tx
import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import qualified UntypedPlutusCore as UPLC
import UntypedPlutusCore.Evaluation.Machine.Cek as UPLC (EvaluationResult (..), defaultCekMachineCosts,
unsafeEvaluateCekNoEmit)

import qualified Plutus.Benchmark.Clausify as Clausify
import qualified Plutus.Benchmark.Knights as Knights
import Plutus.Benchmark.Prime (Result (Composite, Prime))
import qualified Plutus.Benchmark.Prime as Prime
import qualified Plutus.Benchmark.Queens as Queens

import qualified PlutusCore as PLC
import PlutusCore.Builtins
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultCekParameters)
import PlutusCore.Universe (DefaultUni)
import qualified PlutusTx as Tx
import qualified UntypedPlutusCore as UPLC
import UntypedPlutusCore.Evaluation.Machine.Cek as UPLC (EvaluationResult (..),
unsafeEvaluateCekNoEmit)

---------------- Evaluation ----------------

Expand All @@ -36,7 +38,7 @@ type Term' = UPLC.Term PLC.Name DefaultUni DefaultFun ()
runCek :: Term -> EvaluationResult Term'
runCek t = case runExcept @UPLC.FreeVariableError $ PLC.runQuoteT $ UPLC.unDeBruijnTerm t of
Left e -> throw e
Right t' -> UPLC.unsafeEvaluateCekNoEmit defaultCekMachineCosts defBuiltinsRuntime t'
Right t' -> UPLC.unsafeEvaluateCekNoEmit defaultCekParameters t'

termOfHaskellValue :: Tx.Lift DefaultUni a => a -> Term
termOfHaskellValue v =
Expand All @@ -47,7 +49,7 @@ runCekWithErrMsg :: Term -> String -> IO Term'
runCekWithErrMsg term errMsg =
case runExcept @UPLC.FreeVariableError $ PLC.runQuoteT $ UPLC.unDeBruijnTerm term of
Left e -> assertFailure (show e)
Right t -> case UPLC.unsafeEvaluateCekNoEmit defaultCekMachineCosts defBuiltinsRuntime t of
Right t -> case UPLC.unsafeEvaluateCekNoEmit defaultCekParameters t of
EvaluationFailure -> assertFailure errMsg
EvaluationSuccess result -> pure result

Expand Down
24 changes: 14 additions & 10 deletions plutus-benchmark/validation/Main.hs
Expand Up @@ -4,20 +4,24 @@

module Main where

import qualified PlutusCore as PLC
import qualified PlutusCore.Pretty as PP
import Paths_plutus_benchmark (getDataFileName)


import qualified PlutusCore as PLC
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultCekParameters)
import qualified PlutusCore.Pretty as PP

import qualified UntypedPlutusCore as UPLC
import qualified UntypedPlutusCore.Evaluation.Machine.Cek as UPLC

import Criterion.Main
import Criterion.Types (Config (..))
import Paths_plutus_benchmark (getDataFileName)
import qualified UntypedPlutusCore as UPLC
import qualified UntypedPlutusCore.Evaluation.Machine.Cek as UPLC
import Criterion.Types (Config (..))

import Control.Monad
import Control.Monad.Trans.Except (runExceptT)
import qualified Data.ByteString.Lazy as BSL
import Control.Monad.Trans.Except (runExceptT)
import qualified Data.ByteString.Lazy as BSL
import System.FilePath
import Text.Printf (printf)
import Text.Printf (printf)

{-- | This set of benchmarks is based on validations occurring in the tests in
plutus-use-cases. Those tests are run on the blockchain simulator, and a
Expand All @@ -38,7 +42,7 @@ loadPlcSource file = do
Right p -> return $ () <$ p

benchCek :: Term () -> Benchmarkable
benchCek program = nf (UPLC.unsafeEvaluateCek UPLC.defaultCekMachineCosts PLC.defBuiltinsRuntime) program
benchCek program = nf (UPLC.unsafeEvaluateCek defaultCekParameters) program


plcSuffix :: String
Expand Down
15 changes: 8 additions & 7 deletions plutus-core/common/PlcTestUtils.hs
Expand Up @@ -26,18 +26,19 @@ import PlutusPrelude

import Common

import qualified PlutusCore as TPLC
import qualified PlutusCore as TPLC
import PlutusCore.DeBruijn
import qualified PlutusCore.Evaluation.Machine.Ck as TPLC
import qualified PlutusCore.Evaluation.Machine.Ck as TPLC
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultBuiltinsRuntime, defaultCekParameters)
import PlutusCore.Pretty
import PlutusCore.Universe

import qualified UntypedPlutusCore as UPLC
import qualified UntypedPlutusCore.Evaluation.Machine.Cek as UPLC
import qualified UntypedPlutusCore as UPLC
import qualified UntypedPlutusCore.Evaluation.Machine.Cek as UPLC

import Control.Exception
import Control.Monad.Except
import qualified Data.Text.Prettyprint.Doc as PP
import qualified Data.Text.Prettyprint.Doc as PP
import System.IO.Unsafe

-- | Class for ad-hoc overloading of things which can be turned into a PLC program. Any errors
Expand Down Expand Up @@ -79,7 +80,7 @@ runTPlc
runTPlc values = do
ps <- traverse toTPlc values
let (TPLC.Program _ _ t) = foldl1 TPLC.applyProgram ps
liftEither $ first toException $ TPLC.extractEvaluationResult $ TPLC.evaluateCkNoEmit TPLC.defBuiltinsRuntime t
liftEither $ first toException $ TPLC.extractEvaluationResult $ TPLC.evaluateCkNoEmit defaultBuiltinsRuntime t

runUPlc
:: ToUPlc a DefaultUni TPLC.DefaultFun
Expand All @@ -88,7 +89,7 @@ runUPlc
runUPlc values = do
ps <- traverse toUPlc values
let (UPLC.Program _ _ t) = foldl1 UPLC.applyProgram ps
liftEither $ first toException $ TPLC.extractEvaluationResult $ UPLC.evaluateCekNoEmit UPLC.defaultCekParameters t
liftEither $ first toException $ TPLC.extractEvaluationResult $ UPLC.evaluateCekNoEmit defaultCekParameters t

ppCatch :: PrettyPlc a => ExceptT SomeException IO a -> IO (Doc ann)
ppCatch value = either (PP.pretty . show) prettyPlcClassicDebug <$> runExceptT value
Expand Down
23 changes: 12 additions & 11 deletions plutus-core/cost-model/budgeting-bench/Bench.hs
Expand Up @@ -4,23 +4,24 @@
-- See Note [Creation of the Cost Model]
module Main (main) where

import PlutusCore as PLC
import PlutusCore as PLC
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultCekParameters)
import PlutusCore.Evaluation.Machine.ExMemory
import PlutusCore.MkPlc
import UntypedPlutusCore as UPLC
import UntypedPlutusCore as UPLC
import UntypedPlutusCore.Evaluation.Machine.Cek

import Criterion.Main
import qualified Criterion.Types as C
import qualified Data.ByteString as BS
import qualified Criterion.Types as C
import qualified Data.ByteString as BS
import Data.Functor
import qualified Hedgehog as HH
import qualified Hedgehog.Internal.Gen as HH
import qualified Hedgehog.Internal.Tree as HH
import qualified Hedgehog.Range as HH.Range
import qualified Hedgehog as HH
import qualified Hedgehog.Internal.Gen as HH
import qualified Hedgehog.Internal.Tree as HH
import qualified Hedgehog.Range as HH.Range
import System.Directory
import System.FilePath
import System.Random (StdGen, getStdGen, randomR)
import System.Random (StdGen, getStdGen, randomR)

type PlainTerm = UPLC.Term Name DefaultUni DefaultFun ()

Expand All @@ -33,10 +34,10 @@ runTermBench :: String -> PlainTerm -> Benchmark
runTermBench name term = env
(do
(_result, budget) <-
pure $ (unsafeEvaluateCek defaultCekMachineCosts defBuiltinsRuntime) term
pure $ (unsafeEvaluateCek defaultCekParameters) term
pure budget
)
$ \_ -> bench name $ nf (unsafeEvaluateCek defaultCekMachineCosts defBuiltinsRuntime) term
$ \_ -> bench name $ nf (unsafeEvaluateCek defaultCekParameters) term


---------------- Constructing PLC terms for benchmarking ----------------
Expand Down
Expand Up @@ -28,6 +28,7 @@ import PlutusCore.Constant
import PlutusCore.Core
import PlutusCore.Error
import PlutusCore.Evaluation.Machine.Ck
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults
import PlutusCore.Evaluation.Machine.Exception
import PlutusCore.Name
import PlutusCore.Normalize
Expand Down Expand Up @@ -126,7 +127,7 @@ unsafeTypeEvalCheck
=> TermOf (Term TyName Name uni fun ()) a
-> TermOf (Term TyName Name uni fun ()) (EvaluationResult (Term TyName Name uni fun ()))
unsafeTypeEvalCheck termOfTbv = do
let errOrRes = typeEvalCheckBy (evaluateCkNoEmit defBuiltinsRuntime) termOfTbv
let errOrRes = typeEvalCheckBy (evaluateCkNoEmit defaultBuiltinsRuntime) termOfTbv
case errOrRes of
Left err -> error $ concat
[ prettyPlcErrorString err
Expand Down
20 changes: 11 additions & 9 deletions plutus-core/generators/PlutusCore/Generators/NEAT/Spec.hs
Expand Up @@ -30,20 +30,22 @@ module PlutusCore.Generators.NEAT.Spec

import PlutusCore
import PlutusCore.Evaluation.Machine.Ck
import PlutusCore.Evaluation.Machine.ExBudgetingDefaults (defaultBuiltinsRuntime, defaultCekParameters)
import PlutusCore.Generators.NEAT.Common
import PlutusCore.Generators.NEAT.Term
import PlutusCore.Normalize
import PlutusCore.Pretty
import qualified UntypedPlutusCore as U
import qualified UntypedPlutusCore.Evaluation.Machine.Cek as U

import qualified UntypedPlutusCore as U
import qualified UntypedPlutusCore.Evaluation.Machine.Cek as U

import Control.Monad.Except
import Control.Search (Enumerable (..), Options (..), ctrex', search')
import Data.Coolean (Cool, toCool, (!=>))
import Control.Search (Enumerable (..), Options (..), ctrex', search')
import Data.Coolean (Cool, toCool, (!=>))
import Data.Either
import Data.Maybe
import qualified Data.Stream as Stream
import qualified Data.Text as Text
import qualified Data.Stream as Stream
import qualified Data.Text as Text
import System.IO.Unsafe
import Test.Tasty
import Test.Tasty.HUnit
Expand Down Expand Up @@ -134,7 +136,7 @@ prop_typePreservation tyG tmG = do
-- Check if the converted term, when evaluated by CK, still has the same type:

tmCK <- withExceptT CkP $ liftEither $
evaluateCkNoEmit defBuiltinsRuntime tm `catchError` handleError ty
evaluateCkNoEmit defaultBuiltinsRuntime tm `catchError` handleError ty
withExceptT TypeError $ checkType tcConfig () tmCK (Normalized ty)

-- |Property: check if both the typed CK and untyped CEK machines produce the same ouput
Expand All @@ -152,14 +154,14 @@ prop_agree_termEval tyG tmG = do

-- run typed CK on input
tmCk <- withExceptT CkP $ liftEither $
evaluateCkNoEmit defBuiltinsRuntime tm `catchError` handleError ty
evaluateCkNoEmit defaultBuiltinsRuntime tm `catchError` handleError ty

-- erase CK output
let tmUCk = U.erase tmCk

-- run untyped CEK on erased input
tmUCek <- withExceptT UCekP $ liftEither $
U.evaluateCekNoEmit U.defaultCekParameters (U.erase tm) `catchError` handleUError
U.evaluateCekNoEmit defaultCekParameters (U.erase tm) `catchError` handleUError

-- check if typed CK and untyped CEK give the same output modulo erasure
unless (tmUCk == tmUCek) $
Expand Down

0 comments on commit 4b1e33e

Please sign in to comment.