diff -uNr a/mt_adalib/lib/README b/mt_adalib/lib/README --- a/mt_adalib/lib/README false +++ b/mt_adalib/lib/README d0a1425d243ca61b62bf2d184348d3c314b43ed8ae83cd03ff466b3a1d7bb9d04bb5172f4c4d6368a354c04213e3fd5bfe826437db1b5b8c0fa6b633303e27b4 @@ -0,0 +1 @@ +lib diff -uNr a/mt_adalib/manifest b/mt_adalib/manifest --- a/mt_adalib/manifest false +++ b/mt_adalib/manifest 3023d57d5bd04cd7c864a2d71ff7f6a358d622308ae9e84f5aff82dfb6d9c7109add1c308c84a5952274c575ce94d55f07b2b4e68002b94b48a641fb9ff53ec2 @@ -0,0 +1 @@ +660482 mt_adalib_genesis diana_coman The Mersenne Twister pseudo-random number generator implemented as an Ada lib with tests against known values from the reference C implementation. diff -uNr a/mt_adalib/mt.adb b/mt_adalib/mt.adb --- a/mt_adalib/mt.adb false +++ b/mt_adalib/mt.adb f575ef380dd1d7b8ccb62a4e65642ec068790b76a9c7ee00652b72d3d80d3c04bcd845b8d1e174d1ed96f95305175f2d611f0b768b43b2191475edf5b4acce41 @@ -0,0 +1,128 @@ + -- Ada implementation of the Mersenne Twister Pseudo-Random number generator + -- S.MG, 2018 + + +package body MT is + + procedure Init_Genrand(Seed : in U32) is + begin + State(0) := Seed; + for I in State'First + 1 .. State'Last loop + State(I) := U32(1812433253) * + ( State(I - 1) xor + ( Shift_Right(State(I - 1), 30) ) + ) + U32(I) ; + end loop; + Mti_Flag := N; + end Init_Genrand; + + procedure Init_Genrand(Seed : in Init_Array_Type) is + Default_Seed: constant U32 := U32(19650218); -- magic value! + I, J, K : Integer; + begin + Init_Genrand(Default_Seed); + I := 1; + J := 0; + if N > Seed'Length then + K := N; + else + K := Seed'Length; + end if; + + while K > 0 loop + State(I) := (State(I) xor + ( (State(I-1) xor + Shift_Right(State(I-1), 30) + ) * U32(1664525) + )) + Seed(J) + U32(J); + I := I + 1; + J := J + 1; + if I >= N then + State(0) := State(N-1); + I := 1; + end if; + if J >= Seed'Length then + J := 0; + end if; + K := K - 1; + end loop; + + K := N -1; + while K > 0 loop + State(I) := (State(I) xor + ( (State(I-1) xor + Shift_Right(State(I-1), 30) + ) * U32(1566083941) + )) - U32(I); + I := I + 1; + if I >= N then + State(0) := State(N-1); + I := 1; + end if; + K := K - 1; + end loop; + State(0) := 16#8000_0000#; -- MSB is 1 to ensure non-zero initial state + end Init_Genrand; + + function Gen_U32 return U32 is + Y : U32; + MASK1 : constant U32 := U32(1); + Mag01 : Array ( 0 .. 1 ) of U32; + begin + -- Mag01[x] is x * Matrix_A of the algorithm for x 0 or 1 + Mag01(0) := U32(0); + Mag01(1) := MATRIX_MASK; + + -- if no numbers available, generate another set of N words + if Mti_Flag >= N then + + -- check it's not a non-initialised generator + if Mti_Flag = (N + 1) then + -- Generator was NOT initialised! + -- Original C code initialises with default seed 5489 + -- This code will simply raise exception and abort + raise No_Init_Exception; + end if; + + for K in 0 .. N - M - 1 loop + Y := ( State(K) and UPPER_MASK ) or + ( State(K+1) and LOWER_MASK ); + State(K) := State(K+M) xor + Shift_Right(Y, 1) xor + Mag01(Integer(Y and MASK1)); + end loop; + for K in N-M .. N - 2 loop + Y := ( State(K) and UPPER_MASK ) or + ( State(K+1) and LOWER_MASK); + State(K) := State(K + M - N) xor + Shift_Right(Y, 1) xor + Mag01(Integer(Y and MASK1)); + end loop; + Y := (State(N-1) and UPPER_MASK ) or + (State(0) and LOWER_MASK ); + State(N - 1) := State(M-1) xor + Shift_Right(Y, 1) xor + Mag01(Integer(Y and MASK1)); + Mti_Flag := 0; + end if; + + -- retrieve next available number + Y := State(Integer(Mti_Flag)); + Mti_Flag := Mti_Flag + 1; + + -- tempering + Y := Y xor Shift_Right(Y, 11); + Y := Y xor (Shift_Left(Y, 7) and 16#9d2c_5680#); + Y := Y xor (Shift_Left(Y, 15) and 16#efc6_0000#); + Y := Y xor Shift_Right(Y, 18); + + -- return tempered number + return Y; + end Gen_U32; + + function Get_State return State_Type is + begin + return State; + end Get_State; + +end MT; diff -uNr a/mt_adalib/mt.ads b/mt_adalib/mt.ads --- a/mt_adalib/mt.ads false +++ b/mt_adalib/mt.ads 2a2a6496322f36c7f65161f1c614bfbfa6415fa2a0e8b233fc0f4ddd2d813c1ee58e225e1f87e6b30a45f5846385ece503114806cd1100f79eeaee1f4f91a6b5 @@ -0,0 +1,47 @@ + -- Ada implementation of the Mersenne Twister Pseudo-Random number generator + -- S.MG, 2018 + +with Interfaces; use Interfaces; + +package MT is + -- Interfaces.Unsigned_32 in GNAT is mod 2**32 and has bitwise shifts defined + subtype U32 is Interfaces.Unsigned_32; + + -- period parameters + N : constant := 624; + M : constant := 397; + MATRIX_MASK: constant U32 := 16#9908_b0df#; + UPPER_MASK : constant U32 := 16#8000_0000#; + LOWER_MASK : constant U32 := 16#7fff_ffff#; + + -- array type for storing the state vector of the generator + type State_Type is Array( 0 .. N-1 ) of U32; + + -- array type for initialization by array - change key len here if needed + KEY_LEN : constant := 4; + type Init_Array_Type is Array( 0 .. KEY_LEN - 1 ) of U32; + + -- exception raised by a call to generator before initializing it + No_Init_Exception : exception; + + -- initialize the generator with a seed (number) + procedure Init_Genrand(Seed : in U32); + + -- initialize the generator with array of 8-octets elements + procedure Init_Genrand(Seed : in Init_Array_Type); + + -- generate the next pseudo-random 32 bits number in the sequence + function Gen_U32 return U32; + + -- for testing + function Get_State return State_Type; + + -- internals of the generator, NOT for direct access +private + -- actual state of the generator + State : State_Type; + + -- flag for generator routine + Mti_Flag : U32 := N + 1; -- default value -> state(N) is not initialised + +end MT; diff -uNr a/mt_adalib/mt.gpr b/mt_adalib/mt.gpr --- a/mt_adalib/mt.gpr false +++ b/mt_adalib/mt.gpr 321b9d52963856c21ede0ef975ad899910029a055c6a8cc5469296837a14c97ea56f7e71223cec668e92f35892bd976b0af7ed8dbac91babb640a1c2a845f1d1 @@ -0,0 +1,52 @@ + -- Ada implementation of the Mersenne Twister Pseudo-Random number generator + -- S.MG, 2018 + -- + -- Implementing the algorithm as described by Matsumoto, M. and Nishimura, T.: + -- www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html + -- M.M and N.T, "Mersenne Twister: A 623-dimensionally equidistributed uniform + -- pseudorandom number generator", ACM Transactions on Modeling and Computer + -- Simulations: Special Issue on Uniform Random Number Generation, 1998. + +project MT is + for Object_Dir use "obj"; + + type Mode_Type is ("debug", "release"); + Mode : Mode_Type := external ("mode", "release"); + + for Languages use ("Ada"); + for Source_Dirs use ("."); + for Library_Dir use "lib"; + for Library_Name use "MT"; + for Library_Kind use "static"; + + package Compiler is + + case Mode is + when "debug" => + for Switches ("Ada") + use ("-g"); + when "release" => + for Switches ("Ada") + use ("-O2", "-fdump-scos", "-gnata", "-fstack-check", + "-gnatyd", "-gnatym", + "-fdata-sections", "-ffunction-sections", "-gnatwr", "-gnatw.d", + "-gnatec=" & MT'Project_Dir & "restrict.adc"); + end case; + end Compiler; + + package Builder is + for Switches ("Ada") + use ("-nostdlib"); + end Builder; + + package Binder is + case Mode is + when "debug" => + for Switches ("Ada") + use (); + when "release" => + for Switches ("Ada") + use ("-static"); + end case; + end Binder; +end MT; diff -uNr a/mt_adalib/obj/README b/mt_adalib/obj/README --- a/mt_adalib/obj/README false +++ b/mt_adalib/obj/README 50f9b127e6ae2019779520d8998bea7f559496b1847c7c66b6ce6a6f3fc20db67d45f1fbf7a9318c86ebba0694db73de168f409d8328a751f3104c1474a83a0d @@ -0,0 +1 @@ +obj diff -uNr a/mt_adalib/restrict.adc b/mt_adalib/restrict.adc --- a/mt_adalib/restrict.adc false +++ b/mt_adalib/restrict.adc 332e61ee3cc293852038ac23ff469907d1f05df9355689d6916008bb501f8de9281af06bb3f3fded3f1d6cadd0e42a05709fe539fd982b983e35e4b5f0e07593 @@ -0,0 +1,63 @@ +pragma Restrictions(Immediate_Reclamation); +pragma Restrictions(Max_Asynchronous_Select_Nesting => 0); +pragma Restrictions(Max_Protected_Entries => 0); +pragma Restrictions(Max_Select_Alternatives => 0); +--pragma Restrictions(Max_Task_Entries => 0); +--pragma Restrictions(Max_Tasks => 0); +pragma Restrictions(No_Abort_Statements); +pragma Restrictions(No_Access_Parameter_Allocators); +pragma Restrictions(No_Allocators); +pragma Restrictions(No_Asynchronous_Control); +--pragma Restrictions(No_Calendar); +pragma Restrictions(No_Coextensions); +pragma Restrictions(No_Default_Stream_Attributes); +--pragma Restrictions(No_Delay); +pragma Restrictions(No_Dispatch); +pragma Restrictions(No_Dispatching_Calls); +pragma Restrictions(No_Dynamic_Attachment); +pragma Restrictions(No_Dynamic_Priorities); +pragma Restrictions(No_Entry_Calls_In_Elaboration_Code); +pragma Restrictions(No_Entry_Queue); +pragma Restrictions(No_Enumeration_Maps); +pragma Restrictions(No_Exception_Propagation); +pragma Restrictions(No_Exception_Registration); +pragma Restrictions(No_Finalization); +pragma Restrictions(No_Fixed_Io); +pragma Restrictions(No_Floating_Point); +pragma Restrictions(No_Implementation_Aspect_Specifications); +pragma Restrictions(No_Implementation_Units); +pragma Restrictions(No_Implicit_Dynamic_Code); +pragma Restrictions(No_Implicit_Heap_Allocations); +pragma Restrictions(No_Implicit_Protected_Object_Allocations); +pragma Restrictions(No_Implicit_Task_Allocations); +pragma Restrictions(No_Initialize_Scalars); +pragma Restrictions(No_Local_Protected_Objects); +pragma Restrictions(No_Local_Timing_Events); +pragma Restrictions(No_Multiple_Elaboration); +pragma Restrictions(No_Nested_Finalization); +pragma Restrictions(No_Protected_Type_Allocators); +pragma Restrictions(No_Protected_Types); +--pragma Restrictions(No_Relative_Delay); +pragma Restrictions(No_Requeue_Statements); +pragma Restrictions(No_Secondary_Stack); +pragma Restrictions(No_Select_Statements); +pragma Restrictions(No_Specific_Termination_Handlers); +pragma Restrictions(No_Standard_Allocators_After_Elaboration); +pragma Restrictions(No_Stream_Optimizations); +pragma Restrictions(No_Streams); +pragma Restrictions(No_Task_Allocators); +pragma Restrictions(No_Task_At_Interrupt_Priority); +pragma Restrictions(No_Task_Attributes_Package); +--pragma Restrictions(No_Task_Hierarchy); +--pragma Restrictions(No_Tasking); +pragma Restrictions(No_Task_Termination); +pragma Restrictions(No_Terminate_Alternatives); +pragma Restrictions(No_Unchecked_Access); +pragma Restrictions(No_Unchecked_Conversion); +pragma Restrictions(No_Unchecked_Deallocation); +pragma Restrictions(No_Wide_Characters); +pragma Restrictions(Pure_Barriers); +pragma Restrictions(Simple_Barriers); +pragma Restrictions(Static_Priorities); +pragma Restrictions(Static_Storage_Size); +pragma Validity_Checks(ALL_CHECKS); diff -uNr a/mt_adalib/testmt/obj/README b/mt_adalib/testmt/obj/README --- a/mt_adalib/testmt/obj/README false +++ b/mt_adalib/testmt/obj/README 50f9b127e6ae2019779520d8998bea7f559496b1847c7c66b6ce6a6f3fc20db67d45f1fbf7a9318c86ebba0694db73de168f409d8328a751f3104c1474a83a0d @@ -0,0 +1 @@ +obj diff -uNr a/mt_adalib/testmt/tests_mt.adb b/mt_adalib/testmt/tests_mt.adb --- a/mt_adalib/testmt/tests_mt.adb false +++ b/mt_adalib/testmt/tests_mt.adb c81542759e44b87d366fba44d5974664a5e7fc96d6b7f73a8ba015e2b838e8da257b36a1138bc694b36a312f6f72224ac7b96b37ddfe2001f880ac9e37451fad @@ -0,0 +1,239 @@ + --S.MG, 2018 + +with Ada.Text_IO; use Ada.Text_IO; +with Interfaces; use Interfaces; +with MT; + +procedure Tests_MT is + Seeds : MT.Init_Array_Type; + X : MT.U32; + No : constant Integer := 1000; + Result: Array(0..No-1) of MT.U32 := ( + 1067595299, 955945823, 477289528, 4107218783, 4228976476, + 3344332714, 3355579695, 227628506, 810200273, 2591290167, + 2560260675, 3242736208, 646746669, 1479517882, 4245472273, + 1143372638, 3863670494, 3221021970, 1773610557, 1138697238, + 1421897700, 1269916527, 2859934041, 1764463362, 3874892047, + 3965319921, 72549643, 2383988930, 2600218693, 3237492380, + 2792901476, 725331109, 605841842, 271258942, 715137098, + 3297999536, 1322965544, 4229579109, 1395091102, 3735697720, + 2101727825, 3730287744, 2950434330, 1661921839, 2895579582, + 2370511479, 1004092106, 2247096681, 2111242379, 3237345263, + 4082424759, 219785033, 2454039889, 3709582971, 835606218, + 2411949883, 2735205030, 756421180, 2175209704, 1873865952, + 2762534237, 4161807854, 3351099340, 181129879, 3269891896, + 776029799, 2218161979, 3001745796, 1866825872, 2133627728, + 34862734, 1191934573, 3102311354, 2916517763, 1012402762, + 2184831317, 4257399449, 2899497138, 3818095062, 3030756734, + 1282161629, 420003642, 2326421477, 2741455717, 1278020671, + 3744179621, 271777016, 2626330018, 2560563991, 3055977700, + 4233527566, 1228397661, 3595579322, 1077915006, 2395931898, + 1851927286, 3013683506, 1999971931, 3006888962, 1049781534, + 1488758959, 3491776230, 104418065, 2448267297, 3075614115, + 3872332600, 891912190, 3936547759, 2269180963, 2633455084, + 1047636807, 2604612377, 2709305729, 1952216715, 207593580, + 2849898034, 670771757, 2210471108, 467711165, 263046873, + 3569667915, 1042291111, 3863517079, 1464270005, 2758321352, + 3790799816, 2301278724, 3106281430, 7974801, 2792461636, + 555991332, 621766759, 1322453093, 853629228, 686962251, + 1455120532, 957753161, 1802033300, 1021534190, 3486047311, + 1902128914, 3701138056, 4176424663, 1795608698, 560858864, + 3737752754, 3141170998, 1553553385, 3367807274, 711546358, + 2475125503, 262969859, 251416325, 2980076994, 1806565895, + 969527843, 3529327173, 2736343040, 2987196734, 1649016367, + 2206175811, 3048174801, 3662503553, 3138851612, 2660143804, + 1663017612, 1816683231, 411916003, 3887461314, 2347044079, + 1015311755, 1203592432, 2170947766, 2569420716, 813872093, + 1105387678, 1431142475, 220570551, 4243632715, 4179591855, + 2607469131, 3090613241, 282341803, 1734241730, 1391822177, + 1001254810, 827927915, 1886687171, 3935097347, 2631788714, + 3905163266, 110554195, 2447955646, 3717202975, 3304793075, + 3739614479, 3059127468, 953919171, 2590123714, 1132511021, + 3795593679, 2788030429, 982155079, 3472349556, 859942552, + 2681007391, 2299624053, 647443547, 233600422, 608168955, + 3689327453, 1849778220, 1608438222, 3968158357, 2692977776, + 2851872572, 246750393, 3582818628, 3329652309, 4036366910, + 1012970930, 950780808, 3959768744, 2538550045, 191422718, + 2658142375, 3276369011, 2927737484, 1234200027, 1920815603, + 3536074689, 1535612501, 2184142071, 3276955054, 428488088, + 2378411984, 4059769550, 3913744741, 2732139246, 64369859, + 3755670074, 842839565, 2819894466, 2414718973, 1010060670, + 1839715346, 2410311136, 152774329, 3485009480, 4102101512, + 2852724304, 879944024, 1785007662, 2748284463, 1354768064, + 3267784736, 2269127717, 3001240761, 3179796763, 895723219, + 865924942, 4291570937, 89355264, 1471026971, 4114180745, + 3201939751, 2867476999, 2460866060, 3603874571, 2238880432, + 3308416168, 2072246611, 2755653839, 3773737248, 1709066580, + 4282731467, 2746170170, 2832568330, 433439009, 3175778732, + 26248366, 2551382801, 183214346, 3893339516, 1928168445, + 1337157619, 3429096554, 3275170900, 1782047316, 4264403756, + 1876594403, 4289659572, 3223834894, 1728705513, 4068244734, + 2867840287, 1147798696, 302879820, 1730407747, 1923824407, + 1180597908, 1569786639, 198796327, 560793173, 2107345620, + 2705990316, 3448772106, 3678374155, 758635715, 884524671, + 486356516, 1774865603, 3881226226, 2635213607, 1181121587, + 1508809820, 3178988241, 1594193633, 1235154121, 326117244, + 2304031425, 937054774, 2687415945, 3192389340, 2003740439, + 1823766188, 2759543402, 10067710, 1533252662, 4132494984, + 82378136, 420615890, 3467563163, 541562091, 3535949864, + 2277319197, 3330822853, 3215654174, 4113831979, 4204996991, + 2162248333, 3255093522, 2219088909, 2978279037, 255818579, + 2859348628, 3097280311, 2569721123, 1861951120, 2907080079, + 2719467166, 998319094, 2521935127, 2404125338, 259456032, + 2086860995, 1839848496, 1893547357, 2527997525, 1489393124, + 2860855349, 76448234, 2264934035, 744914583, 2586791259, + 1385380501, 66529922, 1819103258, 1899300332, 2098173828, + 1793831094, 276463159, 360132945, 4178212058, 595015228, + 177071838, 2800080290, 1573557746, 1548998935, 378454223, + 1460534296, 1116274283, 3112385063, 3709761796, 827999348, + 3580042847, 1913901014, 614021289, 4278528023, 1905177404, + 45407939, 3298183234, 1184848810, 3644926330, 3923635459, + 1627046213, 3677876759, 969772772, 1160524753, 1522441192, + 452369933, 1527502551, 832490847, 1003299676, 1071381111, + 2891255476, 973747308, 4086897108, 1847554542, 3895651598, + 2227820339, 1621250941, 2881344691, 3583565821, 3510404498, + 849362119, 862871471, 797858058, 2867774932, 2821282612, + 3272403146, 3997979905, 209178708, 1805135652, 6783381, + 2823361423, 792580494, 4263749770, 776439581, 3798193823, + 2853444094, 2729507474, 1071873341, 1329010206, 1289336450, + 3327680758, 2011491779, 80157208, 922428856, 1158943220, + 1667230961, 2461022820, 2608845159, 387516115, 3345351910, + 1495629111, 4098154157, 3156649613, 3525698599, 4134908037, + 446713264, 2137537399, 3617403512, 813966752, 1157943946, + 3734692965, 1680301658, 3180398473, 3509854711, 2228114612, + 1008102291, 486805123, 863791847, 3189125290, 1050308116, + 3777341526, 4291726501, 844061465, 1347461791, 2826481581, + 745465012, 2055805750, 4260209475, 2386693097, 2980646741, + 447229436, 2077782664, 1232942813, 4023002732, 1399011509, + 3140569849, 2579909222, 3794857471, 900758066, 2887199683, + 1720257997, 3367494931, 2668921229, 955539029, 3818726432, + 1105704962, 3889207255, 2277369307, 2746484505, 1761846513, + 2413916784, 2685127085, 4240257943, 1166726899, 4215215715, + 3082092067, 3960461946, 1663304043, 2087473241, 4162589986, + 2507310778, 1579665506, 767234210, 970676017, 492207530, + 1441679602, 1314785090, 3262202570, 3417091742, 1561989210, + 3011406780, 1146609202, 3262321040, 1374872171, 1634688712, + 1280458888, 2230023982, 419323804, 3262899800, 39783310, + 1641619040, 1700368658, 2207946628, 2571300939, 2424079766, + 780290914, 2715195096, 3390957695, 163151474, 2309534542, + 1860018424, 555755123, 280320104, 1604831083, 2713022383, + 1728987441, 3639955502, 623065489, 3828630947, 4275479050, + 3516347383, 2343951195, 2430677756, 635534992, 3868699749, + 808442435, 3070644069, 4282166003, 2093181383, 2023555632, + 1568662086, 3422372620, 4134522350, 3016979543, 3259320234, + 2888030729, 3185253876, 4258779643, 1267304371, 1022517473, + 815943045, 929020012, 2995251018, 3371283296, 3608029049, + 2018485115, 122123397, 2810669150, 1411365618, 1238391329, + 1186786476, 3155969091, 2242941310, 1765554882, 279121160, + 4279838515, 1641578514, 3796324015, 13351065, 103516986, + 1609694427, 551411743, 2493771609, 1316337047, 3932650856, + 4189700203, 463397996, 2937735066, 1855616529, 2626847990, + 55091862, 3823351211, 753448970, 4045045500, 1274127772, + 1124182256, 92039808, 2126345552, 425973257, 386287896, + 2589870191, 1987762798, 4084826973, 2172456685, 3366583455, + 3602966653, 2378803535, 2901764433, 3716929006, 3710159000, + 2653449155, 3469742630, 3096444476, 3932564653, 2595257433, + 318974657, 3146202484, 853571438, 144400272, 3768408841, + 782634401, 2161109003, 570039522, 1886241521, 14249488, + 2230804228, 1604941699, 3928713335, 3921942509, 2155806892, + 134366254, 430507376, 1924011722, 276713377, 196481886, + 3614810992, 1610021185, 1785757066, 851346168, 3761148643, + 2918835642, 3364422385, 3012284466, 3735958851, 2643153892, + 3778608231, 1164289832, 205853021, 2876112231, 3503398282, + 3078397001, 3472037921, 1748894853, 2740861475, 316056182, + 1660426908, 168885906, 956005527, 3984354789, 566521563, + 1001109523, 1216710575, 2952284757, 3834433081, 3842608301, + 2467352408, 3974441264, 3256601745, 1409353924, 1329904859, + 2307560293, 3125217879, 3622920184, 3832785684, 3882365951, + 2308537115, 2659155028, 1450441945, 3532257603, 3186324194, + 1225603425, 1124246549, 175808705, 3009142319, 2796710159, + 3651990107, 160762750, 1902254979, 1698648476, 1134980669, + 497144426, 3302689335, 4057485630, 3603530763, 4087252587, + 427812652, 286876201, 823134128, 1627554964, 3745564327, + 2589226092, 4202024494, 62878473, 3275585894, 3987124064, + 2791777159, 1916869511, 2585861905, 1375038919, 1403421920, + 60249114, 3811870450, 3021498009, 2612993202, 528933105, + 2757361321, 3341402964, 2621861700, 273128190, 4015252178, + 3094781002, 1621621288, 2337611177, 1796718448, 1258965619, + 4241913140, 2138560392, 3022190223, 4174180924, 450094611, + 3274724580, 617150026, 2704660665, 1469700689, 1341616587, + 356715071, 1188789960, 2278869135, 1766569160, 2795896635, + 57824704, 2893496380, 1235723989, 1630694347, 3927960522, + 428891364, 1814070806, 2287999787, 4125941184, 3968103889, + 3548724050, 1025597707, 1404281500, 2002212197, 92429143, + 2313943944, 2403086080, 3006180634, 3561981764, 1671860914, + 1768520622, 1803542985, 844848113, 3006139921, 1410888995, + 1157749833, 2125704913, 1789979528, 1799263423, 741157179, + 2405862309, 767040434, 2655241390, 3663420179, 2172009096, + 2511931187, 1680542666, 231857466, 1154981000, 157168255, + 1454112128, 3505872099, 1929775046, 2309422350, 2143329496, + 2960716902, 407610648, 2938108129, 2581749599, 538837155, + 2342628867, 430543915, 740188568, 1937713272, 3315215132, + 2085587024, 4030765687, 766054429, 3517641839, 689721775, + 1294158986, 1753287754, 4202601348, 1974852792, 33459103, + 3568087535, 3144677435, 1686130825, 4134943013, 3005738435, + 3599293386, 426570142, 754104406, 3660892564, 1964545167, + 829466833, 821587464, 1746693036, 1006492428, 1595312919, + 1256599985, 1024482560, 1897312280, 2902903201, 691790057, + 1037515867, 3176831208, 1968401055, 2173506824, 1089055278, + 1748401123, 2941380082, 968412354, 1818753861, 2973200866, + 3875951774, 1119354008, 3988604139, 1647155589, 2232450826, + 3486058011, 3655784043, 3759258462, 847163678, 1082052057, + 989516446, 2871541755, 3196311070, 3929963078, 658187585, + 3664944641, 2175149170, 2203709147, 2756014689, 2456473919, + 3890267390, 1293787864, 2830347984, 3059280931, 4158802520, + 1561677400, 2586570938, 783570352, 1355506163, 31495586, + 3789437343, 3340549429, 2092501630, 896419368, 671715824, + 3530450081, 3603554138, 1055991716, 3442308219, 1499434728, + 3130288473, 3639507000, 17769680, 2259741420, 487032199, + 4227143402, 3693771256, 1880482820, 3924810796, 381462353, + 4017855991, 2452034943, 2736680833, 2209866385, 2128986379, + 437874044, 595759426, 641721026, 1636065708, 3899136933, + 629879088, 3591174506, 351984326, 2638783544, 2348444281, + 2341604660, 2123933692, 143443325, 1525942256, 364660499, + 599149312, 939093251, 1523003209, 106601097, 376589484, + 1346282236, 1297387043, 764598052, 3741218111, 933457002, + 1886424424, 3219631016, 525405256, 3014235619, 323149677, + 2038881721, 4100129043, 2851715101, 2984028078, 1888574695, + 2014194741, 3515193880, 4180573530, 3461824363, 2641995497, + 3179230245, 2902294983, 2217320456, 4040852155, 1784656905, + 3311906931, 87498458, 2752971818, 2635474297, 2831215366, + 3682231106, 2920043893, 3772929704, 2816374944, 309949752, + 2383758854, 154870719, 385111597, 1191604312, 1840700563, + 872191186, 2925548701, 1310412747, 2102066999, 1504727249, + 3574298750, 1191230036, 3330575266, 3180292097, 3539347721, + 681369118, 3305125752, 3648233597, 950049240, 4173257693, + 1760124957, 512151405, 681175196, 580563018, 1169662867, + 4015033554, 2687781101, 699691603, 2673494188, 1137221356, + 123599888, 472658308, 1053598179, 1012713758, 3481064843, + 3759461013, 3981457956, 3830587662, 1877191791, 3650996736, + 988064871, 3515461600, 4089077232, 2225147448, 1249609188, + 2643151863, 3896204135, 2416995901, 1397735321, 3460025646); + + Errors: Natural := 0; +begin + Seeds(0) := MT.U32(16#123#); + Seeds(1) := MT.U32(16#234#); + Seeds(2) := MT.U32(16#345#); + Seeds(3) := MT.U32(16#456#); + MT.Init_Genrand(Seeds); + + Put_Line("Generating numbers..."); + for I in 0 .. No-1 loop + X := MT.Gen_U32; + Put("."); + if X /= Result(I) then + Put_Line(""); + Put_Line("ERROR at position " & Integer'Image(I) & + "; expected " & MT.U32'Image(Result(I)) & + " but result is " & MT.U32'Image(X)); + Errors := Errors + 1; + end if; + end loop; + + if Errors /= 0 then + Put_Line("FAIL: " & Natural'Image(Errors) & " errors found."); + else + Put_Line("PASS: no errors found."); + end if; +end Tests_MT; diff -uNr a/mt_adalib/testmt/tests_mt.gpr b/mt_adalib/testmt/tests_mt.gpr --- a/mt_adalib/testmt/tests_mt.gpr false +++ b/mt_adalib/testmt/tests_mt.gpr cf4eb98a6be3a379f871f87aee40ac21b15aa228fb6aead54a7f9db1f6f8b830ffdc16b2eace07426eccc10c5395e0b473d441c597870fef4e362855050af2f6 @@ -0,0 +1,44 @@ + -- Tests for Ada implementation of the Mersenne Twister PRNG + -- S.MG, 2018 + -- + -- Tests results against published PRNG numbers at + -- www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html + +with "../mt.gpr"; + +project Tests_MT is + + for Main use ("tests_mt.adb"); + + type Mode_Type is ("debug", "release"); + Mode : Mode_Type := external ("mode", "release"); + + for Languages use ("Ada"); + for Source_Dirs use ("."); + for Object_Dir use "obj"; + for Exec_Dir use "."; + + package Compiler is + case Mode is + when "debug" => + for Switches ("Ada") + use ("-g"); + when "release" => + for Switches ("Ada") + use ("-O2", "-fdump-scos", "-gnata", "-fstack-check", + "-gnatyd", "-gnatym", "-fdata-sections", + "-ffunction-sections", "-gnatwr", "-gnatw.d"); + end case; + end Compiler; + + package Binder is + case Mode is + when "debug" => + for Switches ("Ada") + use (); + when "release" => + for Switches ("Ada") + use ("-static"); + end case; + end Binder; +end Tests_MT;