A few small changes to try to make generation faster.

This commit is contained in:
2020-03-02 15:20:33 -08:00
parent 9c76d7e0b4
commit f93aa7ffc3
4 changed files with 25 additions and 18 deletions

View File

@@ -9,7 +9,7 @@ import Control.Exception(assert)
import Data.Map.Strict(Map)
import qualified Data.Map.Strict as Map
import Generators
import GHC.Integer.GMP.Internals(recipModInteger)
import GHC.Integer.GMP.Internals(powModInteger, recipModInteger)
import Language.Rust.Data.Ident
import Language.Rust.Data.Position
import Language.Rust.Quote
@@ -232,9 +232,10 @@ generateModInvTest size g = go g
in if z == 0
then go g2
else assert (z < y) $
assert ((x * z) `mod` y == 1) $
assert (((a * x) + (b * y)) == v) $
assert (v == gcd x y) $
assert (powModInteger x z y == 1) $
-- assert ((x * z) `mod` y == 1) $
-- assert (((a * x) + (b * y)) == v) $
-- assert (v == gcd x y) $
(tcase, g2)
extendedGCD :: Integer -> Integer -> (Integer, Integer, Integer)

View File

@@ -118,7 +118,7 @@ generateModulusTest size g = go g
("m", showX m),
("r", showX (x `mod` m)),
("t", showX ((x * y) `mod` m)),
("s", showX ((x * x) `mod` m)),
("s", showX (powModInteger x 2 m)),
("e", showX (powModInteger x y m))
]
in if y < 2

View File

@@ -1,14 +1,16 @@
{-# LANGUAGE QuasiQuotes #-}
module Multiply(
safeMultiplyOps
, unsafeMultiplyOps
)
module Multiply
-- (
-- safeMultiplyOps
-- , unsafeMultiplyOps
-- )
where
import Data.Bits((.&.))
import Data.List(union)
import Data.List(foldl')
import Data.Map.Strict(Map)
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import Gen(toLit)
import Generators
import Karatsuba
@@ -25,7 +27,7 @@ safeMultiplyOps = RustModule {
outputName = "safe_mul",
isUnsigned = True,
generator = declareSafeMulOperators,
testCase = Just generateSafeTest
testCase = Nothing -- Just generateSafeTest
}
unsafeMultiplyOps :: RustModule
@@ -34,7 +36,7 @@ unsafeMultiplyOps = RustModule {
outputName = "unsafe_mul",
isUnsigned = True,
generator = declareUnsafeMulOperators,
testCase = Just generateUnsafeTest
testCase = Nothing -- Just generateUnsafeTest
}
declareSafeMulOperators :: Word -> [Word] -> SourceFile Span
@@ -202,7 +204,6 @@ generateMultiplier fullmul size inName outName =
var = mkIdent (vname ++ show i)
in [stmt| $$vec.value[$$(liti)] = $$var; |]
translateInstruction :: Instruction -> Stmt Span
translateInstruction instr =
case instr of
@@ -252,11 +253,16 @@ translateInstruction instr =
in [stmt| let $$outid: u128 = $$inid >> $$(val); |]
releaseUnnecessary :: [String] -> [Instruction] -> [Instruction]
releaseUnnecessary outkeys instrs = snd (foldl check (outkeys, []) (reverse instrs))
releaseUnnecessary outkeys instrs = go (Set.fromList outkeys) [] rInstrs
where
check acc@(required, rest) cur
| outVar cur `elem` required = (union (inVars cur) required, cur : rest)
| otherwise = acc
rInstrs = reverse instrs
--
go _ acc [] = acc
go required acc (cur:rest)
| outVar cur `Set.member` required =
go (foldl' (flip Set.insert) required (inVars cur)) (cur:acc) rest
| otherwise =
go required acc rest
outVar :: Instruction -> String
outVar instr =

View File

@@ -30,7 +30,7 @@ maximumTestCases :: Int
maximumTestCases = 5000
targetTestGenerationTime :: Float
targetTestGenerationTime = 5.0 -- in seconds
targetTestGenerationTime = 2.0 -- in seconds
targetTestGenerationPicos :: Integer
targetTestGenerationPicos =