A second crack at fixed-sized numbers.
This commit is contained in:
123
tests/math/GenerateTests.hs
Normal file
123
tests/math/GenerateTests.hs
Normal file
@@ -0,0 +1,123 @@
|
||||
import Control.Monad
|
||||
import Data.Bits(shiftL,(.&.))
|
||||
import Data.Map.Strict(Map)
|
||||
import qualified Data.Map.Strict as Map
|
||||
import Numeric(showHex)
|
||||
import Prelude hiding (log)
|
||||
import System.IO(hFlush,stdout,IOMode(..),withFile,Handle,hClose,hPutStrLn)
|
||||
import System.Random(StdGen,newStdGen,random)
|
||||
|
||||
testTypes :: [(String, Int -> StdGen -> (Map String String, StdGen))]
|
||||
testTypes = [("addition", addTest),
|
||||
("modadd", modaddTest),
|
||||
("subtraction", subTest),
|
||||
("multiplication", mulTest),
|
||||
("expandingmul", expmulTest)
|
||||
]
|
||||
|
||||
bitSizes :: [Int]
|
||||
bitSizes = [192,256,384,512,576,1024,2048,3072,4096,8192,15360]
|
||||
|
||||
numTests :: Int
|
||||
numTests = 1000
|
||||
|
||||
mask :: Int -> Integer
|
||||
mask bitsize = (1 `shiftL` bitsize) - 1
|
||||
|
||||
splitMod :: Int -> [Integer] -> [Integer]
|
||||
splitMod bitsize xs = filtered ++ [m]
|
||||
where
|
||||
xs' = map (\x -> x .&. mask bitsize) xs
|
||||
m = maximum xs'
|
||||
filtered = go xs'
|
||||
go (x:xs) | x == m = xs
|
||||
| otherwise = x : go xs
|
||||
|
||||
addTest :: Int -> StdGen -> (Map String String, StdGen)
|
||||
addTest bitsize gen0 = (res, gen2)
|
||||
where
|
||||
(a, gen1) = random gen0
|
||||
(b, gen2) = random gen1
|
||||
a' = a .&. mask bitsize
|
||||
b' = b .&. mask bitsize
|
||||
c = (a' + b') .&. mask bitsize
|
||||
res = Map.fromList [("a", showHex a' ""),
|
||||
("b", showHex b' ""),
|
||||
("c", showHex c "")]
|
||||
|
||||
modaddTest :: Int -> StdGen -> (Map String String, StdGen)
|
||||
modaddTest bitsize gen0 = (res, gen2)
|
||||
where
|
||||
(a, gen1) = random gen0
|
||||
(b, gen2) = random gen1
|
||||
(m, gen3) = random gen2
|
||||
[a',b',m'] = splitMod bitsize [a,b,m]
|
||||
c = (a' + b') `mod` m'
|
||||
res = Map.fromList [("a", showHex a' ""),
|
||||
("b", showHex b' ""),
|
||||
("m", showHex m' ""),
|
||||
("c", showHex c "")]
|
||||
|
||||
subTest :: Int -> StdGen -> (Map String String, StdGen)
|
||||
subTest bitsize gen0 = (res, gen2)
|
||||
where
|
||||
(a, gen1) = random gen0
|
||||
(b, gen2) = random gen1
|
||||
a' = a .&. mask bitsize
|
||||
b' = b .&. mask bitsize
|
||||
c = (a' - b') .&. mask bitsize
|
||||
res = Map.fromList [("a", showHex a' ""),
|
||||
("b", showHex b' ""),
|
||||
("c", showHex c "")]
|
||||
|
||||
mulTest :: Int -> StdGen -> (Map String String, StdGen)
|
||||
mulTest bitsize gen0 = (res, gen2)
|
||||
where
|
||||
(a, gen1) = random gen0
|
||||
(b, gen2) = random gen1
|
||||
a' = a .&. mask bitsize
|
||||
b' = b .&. mask bitsize
|
||||
c = (a' * b') .&. mask bitsize
|
||||
res = Map.fromList [("a", showHex a' ""),
|
||||
("b", showHex b' ""),
|
||||
("c", showHex c "")]
|
||||
|
||||
expmulTest :: Int -> StdGen -> (Map String String, StdGen)
|
||||
expmulTest bitsize gen0 = (res, gen2)
|
||||
where
|
||||
(a, gen1) = random gen0
|
||||
(b, gen2) = random gen1
|
||||
a' = a .&. mask bitsize
|
||||
b' = b .&. mask bitsize
|
||||
c = (a' * b')
|
||||
res = Map.fromList [("a", showHex a' ""),
|
||||
("b", showHex b' ""),
|
||||
("c", showHex c "")]
|
||||
|
||||
log :: String -> IO ()
|
||||
log str =
|
||||
do putStr str
|
||||
hFlush stdout
|
||||
|
||||
generateData :: Handle -> (StdGen -> (Map String String, StdGen)) ->
|
||||
StdGen -> () ->
|
||||
IO StdGen
|
||||
generateData hndl generator gen () =
|
||||
do let (res, gen') = generator gen
|
||||
forM_ (Map.toList res) $ \ (key,val) ->
|
||||
do hPutStrLn hndl (key ++ ": " ++ val)
|
||||
log "."
|
||||
return gen'
|
||||
|
||||
main :: IO ()
|
||||
main =
|
||||
forM_ testTypes $ \ (testName, testFun) ->
|
||||
forM_ bitSizes $ \ bitsize ->
|
||||
do log ("Generating " ++ show bitsize ++ "-bit " ++ testName ++ " tests")
|
||||
withFile (testName ++ "U" ++ show bitsize ++ ".test") WriteMode $ \ hndl ->
|
||||
do gen <- newStdGen
|
||||
foldM_ (generateData hndl (testFun bitsize))
|
||||
gen
|
||||
(replicate numTests ())
|
||||
hClose hndl
|
||||
log " done\n"
|
||||
3000
tests/math/additionU1024.test
Normal file
3000
tests/math/additionU1024.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU15360.test
Normal file
3000
tests/math/additionU15360.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU192.test
Normal file
3000
tests/math/additionU192.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU2048.test
Normal file
3000
tests/math/additionU2048.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU256.test
Normal file
3000
tests/math/additionU256.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU3072.test
Normal file
3000
tests/math/additionU3072.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU384.test
Normal file
3000
tests/math/additionU384.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU4096.test
Normal file
3000
tests/math/additionU4096.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU512.test
Normal file
3000
tests/math/additionU512.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU576.test
Normal file
3000
tests/math/additionU576.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/additionU8192.test
Normal file
3000
tests/math/additionU8192.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU1024.test
Normal file
3000
tests/math/expandingmulU1024.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU15360.test
Normal file
3000
tests/math/expandingmulU15360.test
Normal file
File diff suppressed because one or more lines are too long
3000
tests/math/expandingmulU192.test
Normal file
3000
tests/math/expandingmulU192.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU2048.test
Normal file
3000
tests/math/expandingmulU2048.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU256.test
Normal file
3000
tests/math/expandingmulU256.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU3072.test
Normal file
3000
tests/math/expandingmulU3072.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU384.test
Normal file
3000
tests/math/expandingmulU384.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU4096.test
Normal file
3000
tests/math/expandingmulU4096.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU512.test
Normal file
3000
tests/math/expandingmulU512.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU576.test
Normal file
3000
tests/math/expandingmulU576.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/expandingmulU8192.test
Normal file
3000
tests/math/expandingmulU8192.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU1024.test
Normal file
4000
tests/math/modaddU1024.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU15360.test
Normal file
4000
tests/math/modaddU15360.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU192.test
Normal file
4000
tests/math/modaddU192.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU2048.test
Normal file
4000
tests/math/modaddU2048.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU256.test
Normal file
4000
tests/math/modaddU256.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU3072.test
Normal file
4000
tests/math/modaddU3072.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU384.test
Normal file
4000
tests/math/modaddU384.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU4096.test
Normal file
4000
tests/math/modaddU4096.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU512.test
Normal file
4000
tests/math/modaddU512.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU576.test
Normal file
4000
tests/math/modaddU576.test
Normal file
File diff suppressed because it is too large
Load Diff
4000
tests/math/modaddU8192.test
Normal file
4000
tests/math/modaddU8192.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU1024.test
Normal file
3000
tests/math/multiplicationU1024.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU15360.test
Normal file
3000
tests/math/multiplicationU15360.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU192.test
Normal file
3000
tests/math/multiplicationU192.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU2048.test
Normal file
3000
tests/math/multiplicationU2048.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU256.test
Normal file
3000
tests/math/multiplicationU256.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU3072.test
Normal file
3000
tests/math/multiplicationU3072.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU384.test
Normal file
3000
tests/math/multiplicationU384.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU4096.test
Normal file
3000
tests/math/multiplicationU4096.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU512.test
Normal file
3000
tests/math/multiplicationU512.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU576.test
Normal file
3000
tests/math/multiplicationU576.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/multiplicationU8192.test
Normal file
3000
tests/math/multiplicationU8192.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU1024.test
Normal file
3000
tests/math/subtractionU1024.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU15360.test
Normal file
3000
tests/math/subtractionU15360.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU192.test
Normal file
3000
tests/math/subtractionU192.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU2048.test
Normal file
3000
tests/math/subtractionU2048.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU256.test
Normal file
3000
tests/math/subtractionU256.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU3072.test
Normal file
3000
tests/math/subtractionU3072.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU384.test
Normal file
3000
tests/math/subtractionU384.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU4096.test
Normal file
3000
tests/math/subtractionU4096.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU512.test
Normal file
3000
tests/math/subtractionU512.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU576.test
Normal file
3000
tests/math/subtractionU576.test
Normal file
File diff suppressed because it is too large
Load Diff
3000
tests/math/subtractionU8192.test
Normal file
3000
tests/math/subtractionU8192.test
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user