Skip to content

Commit

Permalink
Translation relation and decision procedure for the Float-Delay (#6482)
Browse files Browse the repository at this point in the history
* WIP

* WIP

* WIP

* WIP

* WIP

* WIP - Most of the nFD->FD proof is done but I am now wondering if the application rules need the force in them...

* Some progress on the FD->pureFD proof... Not completely sure it is going in a good direction...

* Made the parameters to istranslation implicit, since they are encoded in the relation anyway

* WIP

* WIP

* WIP - with crazy variable binding issues

* Add 'forall DecEq' to 'Relation'

* Roman's additions.

* Workign Float-Delay translation relation and decision procedure.

* Missed a definition

* Now uses Purity, althought that is 'stub code' at the moment.

* Now with added Purity...

* Remove 'Terminating' from 'translation?'

---------

Co-authored-by: effectfully <[email protected]>
  • Loading branch information
ramsay-t and effectfully authored Sep 26, 2024
1 parent 84bcd15 commit 9802721
Show file tree
Hide file tree
Showing 6 changed files with 619 additions and 179 deletions.
25 changes: 25 additions & 0 deletions plutus-metatheory/src/VerifiedCompilation/Purity.lagda.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
title: VerifiedCompilation.Purity
layout: page
---

# Definitions of Purity for Terms
```
module VerifiedCompilation.Purity where
```
## Imports

```
open import Untyped using (_⊢; case; builtin; _·_; force; `; ƛ; delay; con; constr; error)
open import Relation.Nullary using (Dec; yes; no; ¬_)
```
## Untyped Purity
```
data UPure (X : Set) : (X ⊢) → Set where
FIXME : (t : X ⊢) → UPure X t
isUPure? : {X : Set} → (t : X ⊢) → Dec (UPure X t)
isUPure? t = yes (FIXME t)
```
16 changes: 8 additions & 8 deletions plutus-metatheory/src/VerifiedCompilation/UCaseOfCase.lagda.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ open import Data.List using (List; _∷_; [])
## Translation Relation

This compiler stage only applies to the very specific case where an `IfThenElse` builtin exists in a `case` expression.
It moves the `IfThenElse` outside and creates two `case` expressions with each of the possible lists of cases.
It moves the `IfThenElse` outside and creates two `case` expressions with each of the possible lists of cases.

This will just be an instance of the `Translation` relation once we define the "before" and "after" patterns.

```
data CoC : Relation where
isCoC : {X : Set} → (b : X ⊢) (tn fn : ℕ) (tt tt' ft ft' alts alts' : List (X ⊢)) →
isCoC : {X : Set} {{_ : DecEq X}} → (b : X ⊢) (tn fn : ℕ) (tt tt' ft ft' alts alts' : List (X ⊢)) →
Pointwise (Translation CoC) alts alts' →
Pointwise (Translation CoC) tt tt' →
Pointwise (Translation CoC) ft ft' →
Expand Down Expand Up @@ -76,7 +76,7 @@ isCoCCase? t | no ¬CoCCase = no λ { (isCoCCase b tn fn alts tt ft) → ¬CoCC
(isconstr tn (allterms alts)))
(isconstr fn (allterms tt)))
(allterms ft)) }
data CoCForce {X : Set} : (X ⊢) → Set where
isCoCForce : (b : (X ⊢)) (tn fn : ℕ) (tt' ft' alts' : List (X ⊢)) → CoCForce (force ((((force (builtin ifThenElse)) · b) · (delay (case (constr tn tt') alts'))) · (delay (case (constr fn ft') alts'))))
isCoCForce? : {X : Set} {{ _ : DecEq X }} → Unary.Decidable (CoCForce {X})
Expand All @@ -103,12 +103,12 @@ isUntypedCaseOfCase? : {X : Set} {{_ : DecEq X}} → Binary.Decidable (Translati
isCoC? : {X : Set} {{_ : DecEq X}} → Binary.Decidable (CoC {X})
isCoC? ast ast' with (isCoCCase? ast) ×-dec (isCoCForce? ast')
... | no ¬cf = no λ { (isCoC b tn fn tt tt' ft ft' alts alts' x x₁ x₂) → ¬cf
(isCoCCase b tn fn tt ft alts , isCoCForce b tn fn tt' ft' alts') }
(isCoCCase b tn fn tt ft alts , isCoCForce b tn fn tt' ft' alts') }
... | yes (isCoCCase b tn fn tt ft alts , isCoCForce b₁ tn₁ fn₁ tt' ft' alts') with (b ≟ b₁) ×-dec (tn ≟ tn₁) ×-dec (fn ≟ fn₁) ×-dec (decPointwise isUntypedCaseOfCase? tt tt') ×-dec (decPointwise isUntypedCaseOfCase? ft ft') ×-dec (decPointwise isUntypedCaseOfCase? alts alts')
... | yes (refl , refl , refl , ttpw , ftpw , altpw) = yes (isCoC b tn fn tt tt' ft ft' alts alts' altpw ttpw ftpw)
... | no ¬p = no λ { (isCoC .b .tn .fn .tt .tt' .ft .ft' .alts .alts' x x₁ x₂) → ¬p (refl , refl , refl , x₁ , x₂ , x) }
isUntypedCaseOfCase? {X} = translation? {X} isCoC?
isUntypedCaseOfCase? {X} = translation? {X} isCoC?
```

## Semantic Equivalence
Expand All @@ -125,11 +125,11 @@ The `stepper` function uses the CEK machine to evaluate a term. Here we call it
large gas budget and begin in an empty context (which assumes the term is closed).

```
-- TODO: Several approaches are possible.
-- TODO: Several approaches are possible.
--semantic_equivalence : ∀ {X set} {ast ast' : ⊥ ⊢}
-- → ⊥ ⊢̂ ast ⊳̂ ast'
-- <Some stuff about whether one runs out of gas -- as long as neither runs out of gas, _then_ they are equivilent>
-- <Some stuff about whether one runs out of gas -- as long as neither runs out of gas, _then_ they are equivilent>
-- → (stepper maxsteps (Stack.ϵ ; [] ▻ ast)) ≡ (stepper maxsteps (Stack.ε ; [] ▻ ast'))
-- ∀ {s : ℕ} → stepper s ast ≡ <valid terminate state> ⇔ ∃ { s' : ℕ } [ stepper s' ast' ≡ <same valid terminate state> ]
-- ∀ {s : ℕ} → stepper s ast ≡ <valid terminate state> ⇔ ∃ { s' : ℕ } [ stepper s' ast' ≡ <same valid terminate state> ]
```
157 changes: 157 additions & 0 deletions plutus-metatheory/src/VerifiedCompilation/UFloatDelay.lagda.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
---
title: VerifiedCompilation.UFloatDelay
layout: page
---

# Float-Delay Translation Phase
```
module VerifiedCompilation.UFloatDelay where
```
## Imports

```
open import VerifiedCompilation.Equality using (DecEq; _≟_;decPointwise)
open import VerifiedCompilation.UntypedViews using (Pred; isCase?; isApp?; isLambda?; isForce?; isBuiltin?; isConstr?; isDelay?; isTerm?; isVar?; allTerms?; iscase; isapp; islambda; isforce; isbuiltin; isconstr; isterm; allterms; isdelay; isvar)
open import VerifiedCompilation.UntypedTranslation using (Translation; translation?; Relation; convert; reflexive)
open import Relation.Nullary.Product using (_×-dec_)
open import Untyped using (_⊢; case; builtin; _·_; force; `; ƛ; delay; con; constr; error)
import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_; refl; _≢_)
open import Data.Empty using (⊥)
open import Function using (case_of_)
open import Agda.Builtin.Maybe using (Maybe; just; nothing)
open import Data.List using (map; all)
open import Relation.Nullary using (Dec; yes; no; ¬_)
import Relation.Binary as Binary using (Decidable)
open import Data.Product using (_,_)
open import Data.Nat using (ℕ)
open import Data.List using (List)
open import Builtin using (Builtin)
open import RawU using (TmCon)
open import VerifiedCompilation.Purity using (UPure; isUPure?)
open import Data.List.Relation.Unary.All using (All; all?)
variable
X : Set
x x' y y' : X ⊢
```
## Translation Relation

This translation "floats" delays in applied terms into the abstraction, without inlining the whole term.
This is separate from inlining because the added `delay` may make it seem like a substantial increase in code
size, and so dissuade the inliner from executing. However, it may be that the laziness inside the resulting term
is more computationally efficient.

This translation will only preserve semantics if the instances of the bound variable are under a `force` and if the applied term is "Pure".

This requires a function to check all the bound variables are under `force`. The `AllForced` type
is defined in terms of the de Brujin index of the bound variable, since this will be incremented under
further lambdas.
```
data AllForced (X : Set){{ _ : DecEq X}} : X → (X ⊢) → Set where
var : (v : X) → {v' : X} → v' ≢ v → AllForced X v (` v')
forced : (v : X) → AllForced X v (force (` v))
force : (v : X) → AllForced X v x' → AllForced X v (force x')
delay : (v : X) → AllForced X v x' → AllForced X v (delay x')
ƛ : (v : X) → {t : (Maybe X) ⊢}
→ AllForced (Maybe X) (just v) t
→ AllForced X v (ƛ t)
app : (v : X)
→ AllForced X v x
→ AllForced X v y
→ AllForced X v (x · y)
error : {v : X} → AllForced X v error
builtin : {v : X} → {b : Builtin} → AllForced X v (builtin b)
con : {v : X} → {c : TmCon} → AllForced X v (con c)
case : (v : X) → {t : X ⊢} {ts : List (X ⊢)}
→ AllForced X v t
→ All (AllForced X v) ts
→ AllForced X v (case t ts)
constr : (v : X) → {i : ℕ} {xs : List (X ⊢)}
→ All (AllForced X v) xs
→ AllForced X v (constr i xs)
{-# TERMINATING #-}
isAllForced? : {{ _ : DecEq X}} → (v : X) → (t : X ⊢) → Dec (AllForced X v t)
isAllForced? v t with isForce? isTerm? t
... | yes (isforce (isterm t)) with isVar? t
... | no ¬var with isAllForced? v t
... | yes allForced = yes (force v allForced)
... | no ¬allForced = no λ { (forced .v) → ¬var (isvar v) ; (force .v p) → ¬allForced p }
isAllForced? v t | yes (isforce (isterm _)) | yes (isvar v₁) with v₁ ≟ v
... | yes refl = yes (forced v)
... | no v₁≢v = yes (force v (var v v₁≢v))
isAllForced? v (` x) | no ¬force with x ≟ v
... | yes refl = no λ { (var .v x≢v) → x≢v refl}
... | no x≢v = yes (var v x≢v)
isAllForced? {X} v (ƛ t) | no ¬force with isAllForced? {Maybe X} (just v) t
... | yes p = yes (ƛ v p)
... | no ¬p = no λ { (ƛ .v p) → ¬p p}
isAllForced? v (t₁ · t₂) | no ¬force with (isAllForced? v t₁) ×-dec (isAllForced? v t₂)
... | yes (pt₁ , pt₂) = yes (app v pt₁ pt₂)
... | no ¬p = no λ { (app .v x₁ x₂) → ¬p (x₁ , x₂)}
isAllForced? v (force t) | no ¬force = no λ { (forced .v) → ¬force (isforce (isterm t)) ; (force .v x) → ¬force (isforce (isterm t)) }
isAllForced? v (delay t) | no ¬force with isAllForced? v t
... | yes p = yes (delay v p)
... | no ¬p = no λ { (delay .v pp) → ¬p pp}
isAllForced? v (con x) | no ¬force = yes con
isAllForced? v (constr i xs) | no ¬force with all? (isAllForced? v) xs
... | yes p = yes (constr v p)
... | no ¬p = no λ { (constr .v p) → ¬p p }
isAllForced? v (case t ts) | no ¬force with (isAllForced? v t) ×-dec (all? (isAllForced? v) ts)
... | yes (p₁ , p₂) = yes (case v p₁ p₂)
... | no ¬p = no λ { (case .v p₁ p₂) → ¬p ((p₁ , p₂)) }
isAllForced? v (builtin b) | no ¬force = yes builtin
isAllForced? v error | no ¬force = yes error
```
The `delay` needs to be added to all bound variables.
```
{-# TERMINATING #-}
subs-delay : {X : Set}{{de : DecEq X}} → (v : Maybe X) → (Maybe X ⊢) → (Maybe X ⊢)
subs-delay v (` x) with v ≟ x
... | yes refl = (delay (` x))
... | no _ = (` x)
subs-delay v (ƛ t) = ƛ (subs-delay (just v) t) -- The de Brujin index has to be incremented
subs-delay v (t · t₁) = (subs-delay v t) · (subs-delay v t₁)
subs-delay v (force t) = force (subs-delay v t) -- This doesn't immediately apply Force-Delay
subs-delay v (delay t) = delay (subs-delay v t)
subs-delay v (con x) = con x
subs-delay v (constr i xs) = constr i (map (subs-delay v) xs)
subs-delay v (case t ts) = case (subs-delay v t) (map (subs-delay v) ts)
subs-delay v (builtin b) = builtin b
subs-delay v error = error
```
The translation relation is then fairly striaghtforward.

```
data FlD {X : Set} {{de : DecEq X}} : (X ⊢) → (X ⊢) → Set₁ where
floatdelay : {y y' : X ⊢} {x x' : (Maybe X) ⊢}
→ Translation FlD (subs-delay nothing x) x'
→ Translation FlD y y'
→ UPure X y'
→ FlD (ƛ x · (delay y)) (ƛ x' · y')
FloatDelay : {X : Set} {{_ : DecEq X}} → (ast : X ⊢) → (ast' : X ⊢) → Set₁
FloatDelay = Translation FlD
```
## Decision Procedure
```
isFloatDelay? : {X : Set} {{de : DecEq X}} → Binary.Decidable (FloatDelay {X})
{-# TERMINATING #-}
isFlD? : {X : Set} {{de : DecEq X}} → Binary.Decidable (FlD {X})
isFlD? ast ast' with (isApp? (isLambda? isTerm?) (isDelay? isTerm?)) ast
... | no ¬match = no λ { (floatdelay x x₁ x₂) → ¬match ((isapp (islambda (isterm _)) (isdelay (isterm _)))) }
... | yes (isapp (islambda (isterm t₁)) (isdelay (isterm t₂))) with (isApp? (isLambda? isTerm?) isTerm?) ast'
... | no ¬match = no λ { (floatdelay x x₁ x₂) → ¬match ((isapp (islambda (isterm _)) (isterm _))) }
... | yes (isapp (islambda (isterm t₁')) (isterm t₂')) with (isFloatDelay? (subs-delay nothing t₁) t₁') ×-dec (isFloatDelay? t₂ t₂') ×-dec (isUPure? t₂')
... | no ¬p = no λ { (floatdelay x₁ x₂ x₃) → ¬p ((x₁ , x₂ , x₃))}
... | yes (p₁ , p₂ , pure) = yes (floatdelay p₁ p₂ pure)
isFloatDelay? = translation? isFlD?
```
Loading

1 comment on commit 9802721

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Performance Alert ⚠️

Possible performance regression was detected for benchmark 'Plutus Benchmarks'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.05.

Benchmark suite Current: 9802721 Previous: 84bcd15 Ratio
validation-auction_1-1 259.6 μs 186 μs 1.40
validation-auction_1-2 915.9 μs 647 μs 1.42
validation-auction_1-3 902 μs 638.8 μs 1.41
validation-auction_1-4 335.1 μs 264.2 μs 1.27
validation-escrow-redeem_1-1 495.1 μs 381 μs 1.30
validation-future-pay-out-4 1154 μs 905.7 μs 1.27
validation-future-settle-early-1 355 μs 251.3 μs 1.41
validation-future-settle-early-2 771.8 μs 562.6 μs 1.37
validation-game-sm-success_2-1 556.1 μs 435.2 μs 1.28
validation-multisig-sm-1 564.5 μs 505.6 μs 1.12
validation-multisig-sm-3 560.5 μs 401.5 μs 1.40
validation-multisig-sm-4 561.4 μs 396.1 μs 1.42
validation-multisig-sm-5 791.3 μs 585 μs 1.35
validation-multisig-sm-7 537.5 μs 390.1 μs 1.38
validation-token-account-1 274.3 μs 194 μs 1.41
validation-token-account-2 484.6 μs 342.3 μs 1.42
validation-uniswap-1 593.1 μs 466.8 μs 1.27
validation-uniswap-2 317.6 μs 259.5 μs 1.22
validation-decode-currency-1 325.8 μs 231.2 μs 1.41
validation-decode-escrow-redeem_1-1 445.6 μs 313.4 μs 1.42
validation-decode-escrow-redeem_1-2 359.6 μs 312.9 μs 1.15
validation-decode-game-sm-success_2-1 738.4 μs 680.1 μs 1.09
validation-decode-game-sm-success_2-2 230.4 μs 162.3 μs 1.42
validation-decode-game-sm-success_2-3 726 μs 512.9 μs 1.42
validation-decode-game-sm-success_2-4 230 μs 162.3 μs 1.42
validation-decode-game-sm-success_2-5 725.4 μs 513.9 μs 1.41
validation-decode-game-sm-success_2-6 230.2 μs 213.5 μs 1.08
validation-decode-multisig-sm-1 805.5 μs 735.7 μs 1.09
validation-decode-multisig-sm-3 748.7 μs 575.9 μs 1.30
validation-decode-multisig-sm-4 808.6 μs 767.8 μs 1.05
validation-decode-multisig-sm-7 807.2 μs 687 μs 1.17
validation-decode-multisig-sm-8 806.7 μs 569.1 μs 1.42
validation-decode-ping-pong_2-1 679.7 μs 479.2 μs 1.42
validation-decode-prism-1 226.1 μs 202.3 μs 1.12
validation-decode-stablecoin_1-2 230.4 μs 188.6 μs 1.22
validation-decode-stablecoin_1-3 1187 μs 845.1 μs 1.40
validation-decode-stablecoin_1-4 230.7 μs 200.4 μs 1.15
nofib-clausify/formula1 4344 μs 4109 μs 1.06
nofib-queens4x4/bm 9710 μs 8739 μs 1.11
nofib-queens4x4/bjbt1 9238 μs 6458 μs 1.43
nofib-queens4x4/bjbt2 8667 μs 6096 μs 1.42
nofib-queens4x4/fc 19530 μs 13730 μs 1.42
nofib-queens5x5/bt 104000 μs 73210 μs 1.42
marlowe-semantics/0000020002010200020101020201000100010001020101020201010000020102 454.9 μs 322.8 μs 1.41
marlowe-semantics/0001000101000000010101000001000001010101010100000001000001010000 631.4 μs 447.7 μs 1.41
marlowe-semantics/0003040402030103010203030303000200000104030002040304020400000102 1475 μs 1043 μs 1.41
marlowe-semantics/004025fd712d6c325ffa12c16d157064192992faf62e0b991d7310a2f91666b8 1159 μs 898.4 μs 1.29
marlowe-semantics/331e4a1bb30f28d7073c54f9a13c10ae19e2e396c299a0ce101ee6bf4b2020db 664.4 μs 468.6 μs 1.42
marlowe-semantics/33c3efd79d9234a78262b52bc6bbf8124cb321a467dedb278328215167eca455 892.1 μs 634.1 μs 1.41
marlowe-semantics/383683bfcecdab0f4df507f59631c702bd11a81ca3841f47f37633e8aacbb5de 1085 μs 772.7 μs 1.40
marlowe-semantics/3bb75b2e53eb13f718eacd3263ab4535f9137fabffc9de499a0de7cabb335479 424 μs 302.8 μs 1.40
marlowe-semantics/3db496e6cd39a8b888a89d0de07dace4397878958cab3b9d9353978b08c36d8a 1181 μs 841 μs 1.40
marlowe-semantics/44a9e339fa25948b48637fe7e10dcfc6d1256319a7b5ce4202cb54dfef8e37e7 423.2 μs 302.1 μs 1.40
marlowe-semantics/4c3efd13b6c69112a8a888372d56c86e60c232125976f29b1c3e21d9f537845c 1458 μs 1040 μs 1.40
marlowe-semantics/4d7adf91bfc93cebe95a7e054ec17cfbb912b32bd8aecb48a228b50e02b055c8 992 μs 707.8 μs 1.40
marlowe-semantics/4f9e8d361b85e62db2350dd3ae77463540e7af0d28e1eb68faeecc45f4655f57 567.5 μs 404.5 μs 1.40
marlowe-semantics/52df7c8dfaa5f801cd837faa65f2fd333665fff00a555ce8c55e36ddc003007a 519.6 μs 369.6 μs 1.41
marlowe-semantics/53ed4db7ab33d6f907eec91a861d1188269be5ae1892d07ee71161bfb55a7cb7 523.6 μs 374 μs 1.40
marlowe-semantics/55dfe42688ad683b638df1fa7700219f00f53b335a85a2825502ab1e0687197e 426.5 μs 303.1 μs 1.41
marlowe-semantics/56333d4e413dbf1a665463bf68067f63c118f38f7539b7ba7167d577c0c8b8ce 1108 μs 786.9 μs 1.41
marlowe-semantics/57728d8b19b0e06412786f3dfed9e1894cd0ad1d2bc2bd497ec0ecb68f989d2b 425.8 μs 302.2 μs 1.41
marlowe-semantics/5abae75af26f45658beccbe48f7c88e74efdfc0b8409ba1e98f95fa5b6caf999 696.4 μs 495.1 μs 1.41
marlowe-semantics/5d0a88250f13c49c20e146819357a808911c878a0e0a7d6f7fe1d4a619e06112 1487 μs 1054 μs 1.41
marlowe-semantics/5e274e0f593511543d41570a4b03646c1d7539062b5728182e073e5760561a66 1446 μs 1022 μs 1.41
marlowe-semantics/5e2c68ac9f62580d626636679679b97109109df7ac1a8ce86d3e43dfb5e4f6bc 736.5 μs 523.1 μs 1.41
marlowe-semantics/5f130d19918807b60eab4c03119d67878fb6c6712c28c54f5a25792049294acc 432.2 μs 306.2 μs 1.41
marlowe-semantics/5f3d46c57a56cef6764f96c9de9677ac6e494dd7a4e368d1c8dd9c1f7a4309a5 700 μs 616.8 μs 1.13
marlowe-semantics/67ba5a9a0245ee3aff4f34852b9889b8c810fccd3dce2a23910bddd35c503b71 7882 μs 6299 μs 1.25
marlowe-semantics/6d88f7294dd2b5ce02c3dc609bc7715bd508009738401d264bf9b3eb7c6f49c1 694.5 μs 491.9 μs 1.41
marlowe-semantics/8c7fdc3da6822b5112074380003524f50fb3a1ce6db4e501df1086773c6c0201 1651 μs 1166 μs 1.42
marlowe-semantics/8d9ae67656a2911ab15a8e5301c960c69aa2517055197aff6b60a87ff718d66c 511 μs 362.2 μs 1.41
marlowe-semantics/96e1a2fa3ceb9a402f2a5841a0b645f87b4e8e75beb636692478ec39f74ee221 431.3 μs 305.7 μs 1.41
marlowe-semantics/9fabc4fc3440cdb776b28c9bb1dd49c9a5b1605fe1490aa3f4f64a3fa8881b25 1488 μs 1053 μs 1.41
marlowe-semantics/a85173a832db3ea944fafc406dfe3fa3235254897d6d1d0e21bc380147687bd5 523.1 μs 372.5 μs 1.40
marlowe-semantics/a9a853b6d083551f4ed2995551af287880ef42aee239a2d9bc5314d127cce592 728.5 μs 521.1 μs 1.40
marlowe-semantics/acb9c83c2b78dabef8674319ad69ba54912cd9997bdf2d8b2998c6bfeef3b122 931.6 μs 664 μs 1.40
marlowe-semantics/acce04815e8fd51be93322888250060da173eccf3df3a605bd6bc6a456cde871 402.1 μs 285.7 μs 1.41
marlowe-semantics/ad6db94ed69b7161c7604568f44358e1cc11e81fea90e41afebd669e51bb60c8 833.7 μs 596.9 μs 1.40
marlowe-semantics/b21a4df3b0266ad3481a26d3e3d848aad2fcde89510b29cccce81971e38e0835 1924 μs 1358 μs 1.42
marlowe-semantics/b50170cea48ee84b80558c02b15c6df52faf884e504d2c410ad63ba46d8ca35c 1085 μs 768.1 μs 1.41
marlowe-semantics/bb5345bfbbc460af84e784b900ec270df1948bb1d1e29eacecd022eeb168b315 1308 μs 923.4 μs 1.42
marlowe-semantics/c4bb185380df6e9b66fc1ee0564f09a8d1253a51a0c0c7890f2214df9ac19274 1058 μs 745.5 μs 1.42
marlowe-semantics/c9efcb705ee057791f7c18a1de79c49f6e40ba143ce0579f1602fd780cabf153 1172 μs 824.1 μs 1.42
marlowe-semantics/ccab11ce1a8774135d0e3c9e635631b68af9e276b5dabc66ff669d5650d0be1c 1420 μs 1022 μs 1.39
marlowe-semantics/cdb9d5c233b288a5a9dcfbd8d5c1831a0bb46eec7a26fa31b80ae69d44805efc 1258 μs 889.3 μs 1.41
marlowe-semantics/ced1ea04649e093a501e43f8568ac3e6b37cd3eccec8cac9c70a4857b88a5eb8 1198 μs 842.5 μs 1.42
marlowe-semantics/cf542b7df466b228ca2197c2aaa89238a8122f3330fe5b77b3222f570395d9f5 707.7 μs 497.8 μs 1.42
marlowe-semantics/d1ab832dfab25688f8845bec9387e46ee3f00ba5822197ade7dd540489ec5e95 48700 μs 36500 μs 1.33
marlowe-semantics/d1c03759810747b7cab38c4296593b38567e11195d161b5bb0a2b58f89b2c65a 1463 μs 1031 μs 1.42
marlowe-semantics/d64607eb8a1448595081547ea8780886fcbd9e06036460eea3705c88ea867e33 425.9 μs 301.3 μs 1.41
marlowe-role-payout/0c9d3634aeae7038f839a1262d1a8bc724dc77af9426459417a56ec73240f0e0 253 μs 192.9 μs 1.31
marlowe-role-payout/0d0f01050a0a0a0b0b050d0404090e0d0506000d0a041003040e0f100e0a0408 250.9 μs 176 μs 1.43
marlowe-role-payout/0e00171d0f1e1f14070d0a00091f07101808021d081e1b120219081312081e15 246.2 μs 172.6 μs 1.43
marlowe-role-payout/0e72f62b0f922e31a2340baccc768104025400cf7fdd7dae62fbba5fc770936d 273.5 μs 191.9 μs 1.43
marlowe-role-payout/0e97c9d9417354d9460f2eb35018d3904b7b035af16ab299258adab93be0911a 263.9 μs 185.5 μs 1.42
marlowe-role-payout/0f010d040810040b10020e040f0e030b0a0d100f0c080c0c05000d04100c100f 281.6 μs 198.5 μs 1.42
marlowe-role-payout/1138a04a83edc0579053f9ffa9394b41df38230121fbecebee8c039776a88c0c 243 μs 170.9 μs 1.42
marlowe-role-payout/3565ee025317e065e8555eef288080276716366769aad89e03389f5ec4ce26d7 191.8 μs 181 μs 1.06
marlowe-role-payout/3569299fc986f5354d02e627a9eaa48ab46d5af52722307a0af72bae87e256dc 238.8 μs 168.6 μs 1.42
marlowe-role-payout/36866914aa07cf62ef36cf2cd64c7f240e3371e27bb9fff5464301678e809c40 239.1 μs 168.1 μs 1.42
marlowe-role-payout/371c10d2526fc0f09dbe9ed59e44dcd949270b27dc42035addd7ff9f7e0d05e7 290.4 μs 204.5 μs 1.42
marlowe-role-payout/3897ef714bba3e6821495b706c75f8d64264c3fdaa58a3826c808b5a768c303d 249.7 μs 176 μs 1.42
marlowe-role-payout/4121d88f14387d33ac5e1329618068e3848445cdd66b29e5ba382be2e02a174a 285.1 μs 200.4 μs 1.42
marlowe-role-payout/4299c7fcf093a5dbfe114c188e32ca199b571a7c25cb7f766bf49f12dab308be 264.8 μs 186.2 μs 1.42
marlowe-role-payout/452e17d16222a427707fa83f63ffb79f606cc25c755a18b1e3274c964ed5ec99 294.6 μs 206.7 μs 1.43
marlowe-role-payout/47364cfaf2c00f7d633283dce6cf84e4fd4e8228c0a0aa50e7c55f35c3ecaa1c 241.9 μs 229.5 μs 1.05
marlowe-role-payout/49b8275d0cb817be40865694ab05e3cfe5fc35fb43b78e7de68c1f3519b536bd 248.5 μs 176.6 μs 1.41
marlowe-role-payout/4dd7755b6ca1f0c9747c1fc0ee4da799f6f1c07108e980bd9f820911ad711ff2 322.7 μs 226.9 μs 1.42
marlowe-role-payout/4fbcfdb577a56b842d6f6938187a783f71d9da7519353e3da3ef0c564e1eb344 295 μs 208.6 μs 1.41
marlowe-role-payout/5a0725d49c733130eda8bc6ed5234f7f6ff8c9dd2d201e8806125e5fbcc081f9 254.9 μs 179.4 μs 1.42
marlowe-role-payout/5a2aae344e569a2c644dd9fa8c7b1f129850937eb562b7748c275f9e40bed596 240.6 μs 170.3 μs 1.41
marlowe-role-payout/5ade103e9530dd0d572fe1b053ea65ad925c6ebbe321e873ace8b804363fa82c 336 μs 237.3 μs 1.42
marlowe-role-payout/5d4c62a0671c65a14f6a15093e3efc4f1816d95a5a58fd92486bedaae8d9526b 281.2 μs 199.2 μs 1.41
marlowe-role-payout/5efe992e306e31cc857c64a62436ad2f9325acc5b4a74a8cebccdfd853ce63d2 239.7 μs 175.8 μs 1.36
marlowe-role-payout/6d66bddb4269bdf77392d3894da5341cf019d39787522af4f83f01285991e93c 244.7 μs 172.1 μs 1.42
marlowe-role-payout/73f044f34a30f26639c58bafe952047f74c7bf1eafebab5aadf5b73cfb9024ed 241.6 μs 170.4 μs 1.42
marlowe-role-payout/7b1dd76edc27f00eb382bf996378155baf74d6a7c6f3d5ec837c39d29784aade 245 μs 172.6 μs 1.42
marlowe-role-payout/803eae94d62e2afc0e835c204af8362170301bc329e2d849d5f5a47dddf479ec 272.5 μs 191.8 μs 1.42
marlowe-role-payout/87167fc5469adac97c1be749326fa79a6b7862ce68aa4abcb438e3c034bd0899 285 μs 200.4 μs 1.42
marlowe-role-payout/8c0fa5d9d6724c5c72c67e055d4bfc36a385ded7c3c81c08cdbd8705829af6e6 284.7 μs 201.5 μs 1.41
marlowe-role-payout/962c2c658b19904372984a56409707401e64e9b03c1986647134cfd329ec5139 259.9 μs 184.5 μs 1.41
marlowe-role-payout/996804e90f2c75fe68886fc8511304b8ab9b36785f8858f5cb098e91c159dde9 250.3 μs 176.7 μs 1.42
marlowe-role-payout/a004a989c005d59043f996500e110fa756ad1b85800b889d5815a0106388e1d7 259.8 μs 183.3 μs 1.42
marlowe-role-payout/a0fba5740174b5cd24036c8b008cb1efde73f1edae097b9325c6117a0ff40d3b 266.8 μs 189.5 μs 1.41
marlowe-role-payout/a1b25347409c3993feca1a60b6fcaf93d1d4bbaae19ab06fdf50cedc26cee68d 232.5 μs 164.6 μs 1.41
marlowe-role-payout/a27524cfad019df45e4e8316f927346d4cc39da6bdd294fb2c33c3f58e6a8994 240.8 μs 169.3 μs 1.42
marlowe-role-payout/a6664a2d2a82f370a34a36a45234f6b33120a39372331678a3b3690312560ce9 296.6 μs 209.4 μs 1.42
marlowe-role-payout/a6f064b83b31032ea7f25921364727224707268e472a569f584cc6b1d8c017e8 244.4 μs 172 μs 1.42
marlowe-role-payout/a7cb09f417c3f089619fe25b7624392026382b458486129efcff18f8912bf302 240.5 μs 169.7 μs 1.42
marlowe-role-payout/a92b4072cb8601fa697e1150c08463b14ffced54eb963df08d322216e27373cb 244.5 μs 173 μs 1.41
marlowe-role-payout/af2e072b5adfaa7211e0b341e1f7319c4f4e7364a4247c9247132a927e914753 287.9 μs 203.1 μs 1.42
marlowe-role-payout/b43564af5f13cc5208b92b1ad6d45369446f378d3891e5cb3e353b30d4f3fb10 244.6 μs 172.6 μs 1.42
marlowe-role-payout/b6243a5b4c353ce4852aa41705111d57867d2783eeef76f6d59beb2360da6e90 323.7 μs 228.6 μs 1.42
marlowe-role-payout/b869f3928200061abb1c3060425b9354b0e08cbf4400b340b8707c14b34317cd 352.2 μs 249.4 μs 1.41
marlowe-role-payout/bcdbc576d63b0454100ad06893812edafc2e7e4934fec1b44e2d06eb34f36eb8 245.2 μs 172.8 μs 1.42
marlowe-role-payout/bd460b7549b70c52e37b312a4242041eac18fe4a266f018bcea0c78a9085a271 278.1 μs 195.9 μs 1.42
marlowe-role-payout/bd79f4a84db23b7c4cd219d498bd581e085cbc3437957e74a8862281a700700b 279.7 μs 233.8 μs 1.20

This comment was automatically generated by workflow using github-action-benchmark.

CC: @IntersectMBO/plutus-core

Please sign in to comment.