@@ -76,7 +76,7 @@ epsilon = 2 / 100
7676
7777-- How many tests to run for each costing function
7878numberOfTests :: 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 =
233236testPredictThree
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 )
340345makeProp3 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
343358makeProp6
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