Skip to content

Commit 85ce1fd

Browse files
authored
Update cost-model-test and enable the test for expMod (#7497)
1 parent cfe5364 commit 85ce1fd

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

plutus-core/cost-model/test/TestCostModels.hs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ epsilon = 2 / 100
7676

7777
-- How many tests to run for each costing function
7878
numberOfTests :: TestLimit
79-
numberOfTests = 100
79+
numberOfTests = 500
8080

8181
-- Generate inputs for costing functions, making sure that we test a large range
8282
-- of inputs, but that we also get small inputs.
@@ -89,9 +89,12 @@ memUsageGen =
8989

9090
-- Smaller inputs for testing the piecewise costing functions for integer
9191
-- division operations, where the Haskell model differs from the R one for
92-
-- larger values.
93-
memUsageGen40 :: Gen CostingInteger
94-
memUsageGen40 = unsafeToSatInt <$> Gen.integral (Range.linear 0 40)
92+
-- larger values. We're dealing with sizes here, so this covers inputs up to
93+
-- 2^256. To deal with this properly we'd need to read the mimimum value from R
94+
-- as well and then mimic the baqhaviour of the Haskell version by having
95+
-- something like `max (predictH x y) mimimum`.
96+
memUsageGen32 :: Gen CostingInteger
97+
memUsageGen32 = unsafeToSatInt <$> Gen.integral (Range.linear 0 32)
9598

9699
-- A type alias to make our signatures more concise. This type is a record in
97100
-- which every field refers to an R SEXP (over some state s), the lm model for
@@ -223,7 +226,7 @@ testPredictTwo costingFunH modelR domain =
223226
BelowDiagonal' -> Gen.filter (uncurry (>=)) twoArgs'
224227
where
225228
twoArgs = (,) <$> memUsageGen <*> memUsageGen
226-
twoArgs' = (,) <$> memUsageGen40 <*> memUsageGen40
229+
twoArgs' = (,) <$> memUsageGen32 <*> memUsageGen32
227230
in do
228231
(x, y) <- forAll sizeGen
229232
byR <- lift $ predictR x y
@@ -233,8 +236,9 @@ testPredictTwo costingFunH modelR domain =
233236
testPredictThree
234237
:: CostingFun ModelThreeArguments
235238
-> SomeSEXP s
239+
-> ((CostingInteger, CostingInteger, CostingInteger) -> Bool)
236240
-> Property
237-
testPredictThree costingFunH modelR =
241+
testPredictThree costingFunH modelR predicate =
238242
propertyR $
239243
let predictR :: MonadR m => CostingInteger -> CostingInteger -> CostingInteger -> m CostingInteger
240244
predictR x y z =
@@ -251,7 +255,8 @@ testPredictThree costingFunH modelR =
251255
exBudgetCPU $
252256
sumExBudgetStream $
253257
runCostingFunThreeArguments costingFunH (ExM x) (ExM y) (ExM z)
254-
sizeGen = (,,) <$> memUsageGen <*> memUsageGen <*> memUsageGen
258+
sizeGen = Gen.filter predicate threeArgs
259+
threeArgs = (,,) <$> memUsageGen <*> memUsageGen <*> memUsageGen
255260
in do
256261
(x, y, z) <- forAll sizeGen
257262
byR <- lift $ predictR x y z
@@ -338,7 +343,17 @@ makeProp3
338343
-> RModels s
339344
-> (PropertyName, Property)
340345
makeProp3 name getField modelsH modelsR =
341-
(fromString name, testPredictThree (getField modelsH) (getConst $ getField modelsR))
346+
(fromString name, testPredictThree (getField modelsH) (getConst $ getField modelsR) (const True))
347+
348+
makeProp3WithFilter
349+
:: String
350+
-> (forall f. BuiltinCostModelBase f -> f ModelThreeArguments)
351+
-> HModels
352+
-> RModels s
353+
-> ((CostingInteger, CostingInteger, CostingInteger) -> Bool)
354+
-> (PropertyName, Property)
355+
makeProp3WithFilter name getField modelsH modelsR predicate =
356+
(fromString name, testPredictThree (getField modelsH) (getConst $ getField modelsR) predicate)
342357

343358
makeProp6
344359
:: String
@@ -368,10 +383,7 @@ main =
368383
, $(genTest 2 "lessThanInteger") Everywhere
369384
, $(genTest 2 "lessThanEqualsInteger") Everywhere
370385
, $(genTest 2 "equalsInteger") Everywhere
371-
, -- , $(genTest 3 "expModInteger")
372-
-- \^ Doesn't work because of the penalty for initial modular reduction.
373-
374-
-- Bytestrings
386+
, -- Bytestrings
375387
$(genTest 2 "appendByteString") Everywhere
376388
, $(genTest 2 "consByteString") Everywhere
377389
, $(genTest 3 "sliceByteString")
@@ -471,4 +483,16 @@ main =
471483
, $(genTest 2 "rotateByteString") Everywhere
472484
, $(genTest 1 "countSetBits")
473485
, $(genTest 1 "findFirstSetBit")
486+
, -- Batch 6
487+
$(genTest 2 "dropList") Everywhere
488+
, makeProp3WithFilter "expModInteger" paramExpModInteger modelsH modelsR (\(a, _, m) -> a <= m)
489+
, -- \^ We have to restrict to the case a^e mod m with `size a <= size m`
490+
-- because there's an extra charge for large values of `a` in the
491+
-- Haskell costing code that the R code doesn't include.
492+
$(genTest 2 "bls12_381_G1_multiScalarMul") Everywhere
493+
, $(genTest 2 "bls12_381_G2_multiScalarMul") Everywhere
494+
, $(genTest 1 "lengthOfArray")
495+
, $(genTest 1 "listToArray")
496+
, $(genTest 2 "indexArray") Everywhere
497+
-- Value builtins to follow when costing is complete.
474498
]

0 commit comments

Comments
 (0)