@@ -10,9 +10,9 @@ import Common
1010import Control.Monad (replicateM )
1111import Criterion.Main (Benchmark )
1212import Data.ByteString (ByteString )
13- import PlutusCore (DefaultFun (LookupCoin , UnValueData , ValueContains , ValueData ))
13+ import PlutusCore (DefaultFun (InsertCoin , LookupCoin , UnValueData , ValueContains , ValueData ))
1414import PlutusCore.Evaluation.Machine.ExMemoryUsage (LogValueOuterOrMaxInner (.. ),
15- ValueTotalSize (.. ))
15+ ValueOuterOrMaxInner ( .. ), ValueTotalSize (.. ))
1616import PlutusCore.Value (K , Value )
1717import PlutusCore.Value qualified as Value
1818import System.Random.Stateful (StatefulGen , StdGen , runStateGen_ , uniformByteStringM , uniformRM )
@@ -205,6 +205,58 @@ unValueDataBenchmark :: StdGen -> Benchmark
205205unValueDataBenchmark gen =
206206 createOneTermBuiltinBench UnValueData [] (Value. valueData <$> generateTestValues gen)
207207
208+ -- insertCoin :: ByteString -> ByteString -> Integer -> Value -> Value
209+ ----------------------------------------------------------------------------------------------------
210+ -- InsertCoin --------------------------------------------------------------------------------------
211+
212+ insertCoinBenchmark :: StdGen -> Benchmark
213+ insertCoinBenchmark gen =
214+ createFourTermBuiltinBenchElementwiseWithWrappers
215+ (id , id , id , ValueOuterOrMaxInner ) -- Wrap Value argument to report outer/max inner size
216+ InsertCoin -- the builtin fun
217+ [] -- no type arguments needed (monomorphic builtin)
218+ (insertCoinArgs gen) -- the argument combos to generate benchmarks for
219+
220+ insertCoinArgs :: StdGen -> [(ByteString , ByteString , Integer , Value )]
221+ insertCoinArgs gen = runStateGen_ gen $ \ (g :: g ) -> do
222+ -- Add search keys to common test values
223+ let testValues = generateTestValues gen
224+ commonWithKeys <- mapM (withSearchKeys g . pure ) testValues
225+
226+ -- Additional tests specific to insertCoin
227+ let valueSizes = [(100 , 10 ), (500 , 20 ), (1_000 , 50 ), (2_000 , 100 )]
228+ additionalTests <-
229+ sequence $
230+ concat
231+ [ -- Value size tests (number of policies × tokens per policy)
232+ [ generateInsertTest g numPolicies tokensPerPolicy
233+ | (numPolicies, tokensPerPolicy) <- valueSizes
234+ ]
235+ , -- Budget-constrained tests (at 30KB limit)
236+ [generateBudgetTest g 30_000 ]
237+ , -- Additional random tests for parameter spread
238+ replicate 50 (generateRandomInsertTest g)
239+ ]
240+
241+ pure $ commonWithKeys ++ additionalTests
242+
243+ -- | Generate insert test with specified parameters
244+ generateInsertTest
245+ :: (StatefulGen g m )
246+ => g
247+ -> Int -- Number of policies
248+ -> Int -- Tokens per policy
249+ -> m (ByteString , ByteString , Value )
250+ generateInsertTest g numPolicies tokensPerPolicy =
251+ withSearchKeys g (generateConstrainedValue numPolicies tokensPerPolicy g)
252+
253+ -- | Generate random insert test with varied parameters for better spread
254+ generateRandomInsertTest :: (StatefulGen g m ) => g -> m (ByteString , ByteString , Value )
255+ generateRandomInsertTest g = do
256+ numPolicies <- uniformRM (1 , 2_000 ) g
257+ tokensPerPolicy <- uniformRM (1 , 1_000 ) g
258+ withSearchKeys g (generateConstrainedValue numPolicies tokensPerPolicy g)
259+
208260----------------------------------------------------------------------------------------------------
209261-- Value Generators --------------------------------------------------------------------------------
210262
@@ -244,15 +296,10 @@ generateConstrainedValue numPolicies tokensPerPolicy g = do
244296 policyIds <- replicateM numPolicies (generateKey g)
245297 tokenNames <- replicateM tokensPerPolicy (generateKey g)
246298
247- -- Generate positive quantities (1 to 1000000)
248- let quantity :: Int -> Int -> Integer
249- quantity policyIndex tokenIndex =
250- fromIntegral (1 + (policyIndex * 1_000 + tokenIndex) `mod` 1_000_000 )
251-
252- nestedMap :: [(K , [(K , Integer )])]
299+ let nestedMap :: [(K , [(K , Integer )])]
253300 nestedMap =
254301 [ ( policyId
255- , [ (tokenName, quantity policyIndex tokenIndex)
302+ , [ (tokenName, genQuantity policyIndex tokenIndex)
256303 | (tokenIndex, tokenName) <- zip [0 .. ] tokenNames
257304 ]
258305 )
@@ -295,3 +342,8 @@ generateKey g = do
295342-- | Generate random key as ByteString (for lookup arguments)
296343generateKeyBS :: (StatefulGen g m ) => g -> m ByteString
297344generateKeyBS = uniformByteStringM Value. maxKeyLen
345+
346+ -- | Generate positive quantities (1 to 1000000)
347+ genQuantity :: Int -> Int -> Integer
348+ genQuantity policyIndex tokenIndex =
349+ fromIntegral (1 + (policyIndex * 1_000 + tokenIndex) `mod` 1_000_000 )
0 commit comments