{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module UntypedPlutusCore.Evaluation.Machine.CommonAPI
(
runCek
, runCekDeBruijn
, runCekNoEmit
, evaluateCek
, evaluateCekNoEmit
, EvaluationResult (..)
, splitStructuralOperational
, unsafeSplitStructuralOperational
, CekUserError (..)
, ErrorWithCause (..)
, CekEvaluationException
, EvaluationError (..)
, ExBudgetCategory (..)
, CekBudgetSpender (..)
, ExBudgetMode (..)
, StepKind (..)
, CekExTally (..)
, CountingSt (..)
, TallyingSt (..)
, RestrictingSt (..)
, CekMachineCosts
, counting
, tallying
, restricting
, restrictingEnormous
, enormousBudget
, noEmitter
, logEmitter
, logWithTimeEmitter
, logWithBudgetEmitter
, logWithCallTraceEmitter
, CekValue (..)
, readKnownCek
, Hashable
, ThrowableBuiltins
)
where
import PlutusPrelude
import UntypedPlutusCore.Core
import UntypedPlutusCore.DeBruijn
import UntypedPlutusCore.Evaluation.Machine.Cek.CekMachineCosts
import UntypedPlutusCore.Evaluation.Machine.Cek.EmitterMode
import UntypedPlutusCore.Evaluation.Machine.Cek.ExBudgetMode
import UntypedPlutusCore.Evaluation.Machine.Cek.Internal
import PlutusCore.Builtin
import PlutusCore.Evaluation.Machine.MachineParameters
import PlutusCore.Name.Unique
import PlutusCore.Quote
import Control.Monad.Except
import Control.Monad.State
import Data.Text (Text)
type MachineRunner cost uni fun ann =
MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode cost uni fun
-> EmitterMode uni fun
-> NTerm uni fun ann
-> CekReport cost NamedDeBruijn uni fun
runCek
:: MachineRunner cost uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode cost uni fun
-> EmitterMode uni fun
-> Term Name uni fun ann
-> CekReport cost Name uni fun
runCek :: forall cost (uni :: * -> *) fun ann.
MachineRunner cost uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode cost uni fun
-> EmitterMode uni fun
-> Term Name uni fun ann
-> CekReport cost Name uni fun
runCek MachineRunner cost uni fun ann
runner MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params ExBudgetMode cost uni fun
mode EmitterMode uni fun
emitMode Term Name uni fun ann
term =
case forall e a. Except e a -> Either e a
runExcept @FreeVariableError (Except FreeVariableError (Term NamedDeBruijn uni fun ann)
-> Either FreeVariableError (Term NamedDeBruijn uni fun ann))
-> Except FreeVariableError (Term NamedDeBruijn uni fun ann)
-> Either FreeVariableError (Term NamedDeBruijn uni fun ann)
forall a b. (a -> b) -> a -> b
$ Term Name uni fun ann
-> Except FreeVariableError (Term NamedDeBruijn uni fun ann)
forall (m :: * -> *) (uni :: * -> *) fun ann.
MonadError FreeVariableError m =>
Term Name uni fun ann -> m (Term NamedDeBruijn uni fun ann)
deBruijnTerm Term Name uni fun ann
term of
Left FreeVariableError
fvError -> FreeVariableError -> CekReport cost Name uni fun
forall a e. Exception e => e -> a
throw FreeVariableError
fvError
Right Term NamedDeBruijn uni fun ann
dbt -> do
case MachineRunner cost uni fun ann
runner MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params ExBudgetMode cost uni fun
mode EmitterMode uni fun
emitMode Term NamedDeBruijn uni fun ann
dbt of
CekReport CekResult NamedDeBruijn uni fun
res cost
cost' [Text]
logs ->
CekResult Name uni fun
-> cost -> [Text] -> CekReport cost Name uni fun
forall cost name (uni :: * -> *) fun.
CekResult name uni fun
-> cost -> [Text] -> CekReport cost name uni fun
CekReport ((Term NamedDeBruijn uni fun () -> Term Name uni fun ())
-> CekResult NamedDeBruijn uni fun -> CekResult Name uni fun
forall name (uni :: * -> *) fun name'.
(Term name uni fun () -> Term name' uni fun ())
-> CekResult name uni fun -> CekResult name' uni fun
mapTermCekResult Term NamedDeBruijn uni fun () -> Term Name uni fun ()
forall (uni :: * -> *) fun.
Term NamedDeBruijn uni fun () -> Term Name uni fun ()
gracefulUnDeBruijn CekResult NamedDeBruijn uni fun
res) cost
cost' [Text]
logs
where
gracefulUnDeBruijn :: Term NamedDeBruijn uni fun () -> Term Name uni fun ()
gracefulUnDeBruijn :: forall (uni :: * -> *) fun.
Term NamedDeBruijn uni fun () -> Term Name uni fun ()
gracefulUnDeBruijn Term NamedDeBruijn uni fun ()
t =
Quote (Term Name uni fun ()) -> Term Name uni fun ()
forall a. Quote a -> a
runQuote
(Quote (Term Name uni fun ()) -> Term Name uni fun ())
-> (StateT
(Map Level Unique) (QuoteT Identity) (Term Name uni fun ())
-> Quote (Term Name uni fun ()))
-> StateT
(Map Level Unique) (QuoteT Identity) (Term Name uni fun ())
-> Term Name uni fun ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StateT (Map Level Unique) (QuoteT Identity) (Term Name uni fun ())
-> Map Level Unique -> Quote (Term Name uni fun ()))
-> Map Level Unique
-> StateT
(Map Level Unique) (QuoteT Identity) (Term Name uni fun ())
-> Quote (Term Name uni fun ())
forall a b c. (a -> b -> c) -> b -> a -> c
flip StateT (Map Level Unique) (QuoteT Identity) (Term Name uni fun ())
-> Map Level Unique -> Quote (Term Name uni fun ())
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT Map Level Unique
forall a. Monoid a => a
mempty
(StateT (Map Level Unique) (QuoteT Identity) (Term Name uni fun ())
-> Term Name uni fun ())
-> StateT
(Map Level Unique) (QuoteT Identity) (Term Name uni fun ())
-> Term Name uni fun ()
forall a b. (a -> b) -> a -> b
$ (Index
-> ReaderT
LevelInfo (StateT (Map Level Unique) (QuoteT Identity)) Unique)
-> Term NamedDeBruijn uni fun ()
-> StateT
(Map Level Unique) (QuoteT Identity) (Term Name uni fun ())
forall (m :: * -> *) (uni :: * -> *) fun ann.
MonadQuote m =>
(Index -> ReaderT LevelInfo m Unique)
-> Term NamedDeBruijn uni fun ann -> m (Term Name uni fun ann)
unDeBruijnTermWith Index
-> ReaderT
LevelInfo (StateT (Map Level Unique) (QuoteT Identity)) Unique
forall (m :: * -> *).
(MonadReader LevelInfo m, MonadState (Map Level Unique) m,
MonadQuote m) =>
Index -> m Unique
freeIndexAsConsistentLevel Term NamedDeBruijn uni fun ()
t
runCekNoEmit
:: MachineRunner cost uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode cost uni fun
-> Term Name uni fun ann
-> (Either (CekEvaluationException Name uni fun) (Term Name uni fun ()), cost)
runCekNoEmit :: forall cost (uni :: * -> *) fun ann.
MachineRunner cost uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode cost uni fun
-> Term Name uni fun ann
-> (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
cost)
runCekNoEmit MachineRunner cost uni fun ann
runner MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params ExBudgetMode cost uni fun
mode =
(\(CekReport CekResult Name uni fun
res cost
cost [Text]
_logs) -> (CekResult Name uni fun
-> Either
(CekEvaluationException Name uni fun) (Term Name uni fun ())
forall name (uni :: * -> *) fun.
CekResult name uni fun
-> Either
(CekEvaluationException name uni fun) (Term name uni fun ())
cekResultToEither CekResult Name uni fun
res, cost
cost))
(CekReport cost Name uni fun
-> (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
cost))
-> (Term Name uni fun ann -> CekReport cost Name uni fun)
-> Term Name uni fun ann
-> (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
cost)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MachineRunner cost uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode cost uni fun
-> EmitterMode uni fun
-> Term Name uni fun ann
-> CekReport cost Name uni fun
forall cost (uni :: * -> *) fun ann.
MachineRunner cost uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode cost uni fun
-> EmitterMode uni fun
-> Term Name uni fun ann
-> CekReport cost Name uni fun
runCek MachineRunner cost uni fun ann
runner MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params ExBudgetMode cost uni fun
mode EmitterMode uni fun
forall (uni :: * -> *) fun. EmitterMode uni fun
noEmitter
evaluateCek
:: ThrowableBuiltins uni fun
=> MachineRunner RestrictingSt uni fun ann
-> EmitterMode uni fun
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> Term Name uni fun ann
-> (Either (CekEvaluationException Name uni fun) (Term Name uni fun ()), [Text])
evaluateCek :: forall (uni :: * -> *) fun ann.
ThrowableBuiltins uni fun =>
MachineRunner RestrictingSt uni fun ann
-> EmitterMode uni fun
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> Term Name uni fun ann
-> (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
[Text])
evaluateCek MachineRunner RestrictingSt uni fun ann
runner EmitterMode uni fun
emitMode MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params =
(\(CekReport CekResult Name uni fun
res RestrictingSt
_cost [Text]
logs) -> (CekResult Name uni fun
-> Either
(CekEvaluationException Name uni fun) (Term Name uni fun ())
forall name (uni :: * -> *) fun.
CekResult name uni fun
-> Either
(CekEvaluationException name uni fun) (Term name uni fun ())
cekResultToEither CekResult Name uni fun
res, [Text]
logs))
(CekReport RestrictingSt Name uni fun
-> (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
[Text]))
-> (Term Name uni fun ann -> CekReport RestrictingSt Name uni fun)
-> Term Name uni fun ann
-> (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
[Text])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MachineRunner RestrictingSt uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode RestrictingSt uni fun
-> EmitterMode uni fun
-> Term Name uni fun ann
-> CekReport RestrictingSt Name uni fun
forall cost (uni :: * -> *) fun ann.
MachineRunner cost uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode cost uni fun
-> EmitterMode uni fun
-> Term Name uni fun ann
-> CekReport cost Name uni fun
runCek MachineRunner RestrictingSt uni fun ann
runner MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params ExBudgetMode RestrictingSt uni fun
forall (uni :: * -> *) fun.
ThrowableBuiltins uni fun =>
ExBudgetMode RestrictingSt uni fun
restrictingEnormous EmitterMode uni fun
emitMode
evaluateCekNoEmit
:: ThrowableBuiltins uni fun
=> MachineRunner RestrictingSt uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> Term Name uni fun ann
-> Either (CekEvaluationException Name uni fun) (Term Name uni fun ())
evaluateCekNoEmit :: forall (uni :: * -> *) fun ann.
ThrowableBuiltins uni fun =>
MachineRunner RestrictingSt uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> Term Name uni fun ann
-> Either
(CekEvaluationException Name uni fun) (Term Name uni fun ())
evaluateCekNoEmit MachineRunner RestrictingSt uni fun ann
runner MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params = (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
RestrictingSt)
-> Either
(CekEvaluationException Name uni fun) (Term Name uni fun ())
forall a b. (a, b) -> a
fst ((Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
RestrictingSt)
-> Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()))
-> (Term Name uni fun ann
-> (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
RestrictingSt))
-> Term Name uni fun ann
-> Either
(CekEvaluationException Name uni fun) (Term Name uni fun ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. MachineRunner RestrictingSt uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode RestrictingSt uni fun
-> Term Name uni fun ann
-> (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
RestrictingSt)
forall cost (uni :: * -> *) fun ann.
MachineRunner cost uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> ExBudgetMode cost uni fun
-> Term Name uni fun ann
-> (Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()),
cost)
runCekNoEmit MachineRunner RestrictingSt uni fun ann
runner MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params ExBudgetMode RestrictingSt uni fun
forall (uni :: * -> *) fun.
ThrowableBuiltins uni fun =>
ExBudgetMode RestrictingSt uni fun
restrictingEnormous
readKnownCek
:: (ThrowableBuiltins uni fun, ReadKnown (Term Name uni fun ()) a)
=> MachineRunner RestrictingSt uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> Term Name uni fun ann
-> Either (CekEvaluationException Name uni fun) a
readKnownCek :: forall (uni :: * -> *) fun a ann.
(ThrowableBuiltins uni fun, ReadKnown (Term Name uni fun ()) a) =>
MachineRunner RestrictingSt uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> Term Name uni fun ann
-> Either (CekEvaluationException Name uni fun) a
readKnownCek MachineRunner RestrictingSt uni fun ann
runner MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params = MachineRunner RestrictingSt uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> Term Name uni fun ann
-> Either
(CekEvaluationException Name uni fun) (Term Name uni fun ())
forall (uni :: * -> *) fun ann.
ThrowableBuiltins uni fun =>
MachineRunner RestrictingSt uni fun ann
-> MachineParameters CekMachineCosts fun (CekValue uni fun ann)
-> Term Name uni fun ann
-> Either
(CekEvaluationException Name uni fun) (Term Name uni fun ())
evaluateCekNoEmit MachineRunner RestrictingSt uni fun ann
runner MachineParameters CekMachineCosts fun (CekValue uni fun ann)
params (Term Name uni fun ann
-> Either
(CekEvaluationException Name uni fun) (Term Name uni fun ()))
-> (Term Name uni fun ()
-> Either (CekEvaluationException Name uni fun) a)
-> Term Name uni fun ann
-> Either (CekEvaluationException Name uni fun) a
forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> Term Name uni fun ()
-> Either (CekEvaluationException Name uni fun) a
forall val a structural operational.
(ReadKnown val a,
BuiltinErrorToEvaluationError structural operational) =>
val
-> Either
(ErrorWithCause (EvaluationError structural operational) val) a
readKnownSelf