@@ -11,20 +11,21 @@ import Prelude
1111
1212import Common
1313import Control.Monad (replicateM )
14+ import Control.Monad.State.Strict (State )
1415import Criterion.Main (Benchmark )
1516import Data.ByteString (ByteString )
1617import Data.ByteString qualified as BS
1718import Data.Int (Int64 )
1819import Data.List (find , sort )
1920import Data.Word (Word8 )
2021import GHC.Stack (HasCallStack )
21- import PlutusCore (DefaultFun (LookupCoin , UnValueData , ValueContains , ValueData ))
22+ import PlutusCore (DefaultFun (InsertCoin , LookupCoin , UnValueData , ValueContains , ValueData ))
2223import PlutusCore.Builtin (BuiltinResult (BuiltinFailure , BuiltinSuccess , BuiltinSuccessWithLogs ))
2324import PlutusCore.Evaluation.Machine.ExMemoryUsage (ValueLogOuterSizeAddLogMaxInnerSize (.. ),
2425 ValueTotalSize (.. ))
25- import PlutusCore.Value (K , Value )
26+ import PlutusCore.Value (K , Quantity ( .. ), Value )
2627import PlutusCore.Value qualified as Value
27- import System.Random.Stateful (StatefulGen , StdGen , runStateGen_ , uniformRM )
28+ import System.Random.Stateful (StateGenM , StatefulGen , StdGen , runStateGen_ , uniformRM )
2829
2930----------------------------------------------------------------------------------------------------
3031-- Benchmarks --------------------------------------------------------------------------------------
@@ -35,6 +36,7 @@ makeBenchmarks gen =
3536 , valueContainsBenchmark gen
3637 , valueDataBenchmark gen
3738 , unValueDataBenchmark gen
39+ , insertCoinBenchmark gen
3840 ]
3941
4042----------------------------------------------------------------------------------------------------
@@ -46,10 +48,10 @@ lookupCoinBenchmark gen =
4648 (id , id , ValueLogOuterSizeAddLogMaxInnerSize ) -- Wrap Value argument to report sum of log sizes
4749 LookupCoin -- the builtin fun
4850 [] -- no type arguments needed (monomorphic builtin)
49- (lookupCoinArgs gen) -- the argument combos to generate benchmarks for
51+ (runBenchGen gen lookupCoinArgs ) -- the argument combos to generate benchmarks for
5052
51- lookupCoinArgs :: StdGen -> [(ByteString , ByteString , Value )]
52- lookupCoinArgs gen = runStateGen_ gen \ (g :: g ) -> do
53+ lookupCoinArgs :: ( StatefulGen g m ) => g -> m [(ByteString , ByteString , Value )]
54+ lookupCoinArgs gen = do
5355 {- Exhaustive power-of-2 combinations for BST worst-case benchmarking.
5456
5557 Tests all combinations of sizes from powers and half-powers of 2.
@@ -80,7 +82,7 @@ lookupCoinArgs gen = runStateGen_ gen \(g :: g) -> do
8082
8183 sequence
8284 -- Generate worst-case lookups for each size combination
83- [ withWorstCaseSearchKeys (generateConstrainedValueWithMaxPolicy numPolicies tokensPerPolicy g )
85+ [ withWorstCaseSearchKeys (generateConstrainedValueWithMaxPolicy numPolicies tokensPerPolicy gen )
8486 | numPolicies <- sizes
8587 , tokensPerPolicy <- sizes
8688 ]
@@ -210,6 +212,41 @@ unValueDataBenchmark :: StdGen -> Benchmark
210212unValueDataBenchmark gen =
211213 createOneTermBuiltinBench UnValueData [] (Value. valueData <$> generateTestValues gen)
212214
215+ ----------------------------------------------------------------------------------------------------
216+ -- InsertCoin --------------------------------------------------------------------------------------
217+
218+ insertCoinBenchmark :: StdGen -> Benchmark
219+ insertCoinBenchmark gen =
220+ createFourTermBuiltinBenchElementwiseWithWrappers
221+ (id , id , id , ValueLogOuterSizeAddLogMaxInnerSize )
222+ InsertCoin
223+ []
224+ (runBenchGen gen insertCoinArgs)
225+
226+ insertCoinArgs :: (StatefulGen g m ) => g -> m [(ByteString , ByteString , Integer , Value )]
227+ insertCoinArgs gen = do
228+ lookupArgs <- lookupCoinArgs gen
229+ let noOfBenchs = length lookupArgs
230+ amounts <- genZeroOrMaxAmount gen noOfBenchs
231+ pure $ reorderArgs <$> zip lookupArgs amounts
232+ where
233+ reorderArgs ((b1, b2, val), am) = (b1, b2, am, val)
234+
235+ -- | Generate either zero or maximum amount Integer values, the probability of each is 50%
236+ genZeroOrMaxAmount
237+ :: (StatefulGen g m )
238+ => g
239+ -> Int
240+ -- ^ Number of amounts to generate
241+ -> m [Integer ]
242+ genZeroOrMaxAmount gen n =
243+ replicateM n $ do
244+ coinType <- uniformRM (0 :: Int , 1 ) gen
245+ pure $ case coinType of
246+ 0 -> 0
247+ 1 -> unQuantity maxBound
248+ _ -> error " genZeroOrMaxAmount: impossible"
249+
213250----------------------------------------------------------------------------------------------------
214251-- Value Generators --------------------------------------------------------------------------------
215252
@@ -341,3 +378,8 @@ unsafeFromBuiltinResult = \case
341378 BuiltinSuccess x -> x
342379 BuiltinSuccessWithLogs _ x -> x
343380 BuiltinFailure _ err -> error $ " BuiltinResult failed: " <> show err
381+
382+ -- | Abstracted runner for computations using stateful random generator 'StdGen'
383+ runBenchGen :: StdGen -> (StateGenM StdGen -> State StdGen a ) -> a
384+ runBenchGen gen ma = runStateGen_ gen \ g -> ma g
385+
0 commit comments