Repository: commons-math Updated Branches: refs/heads/develop 03661de17 -> baae2a6f3
http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/test/java/org/apache/commons/math4/rng/internal/source32/Well44497bTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/rng/internal/source32/Well44497bTest.java b/src/test/java/org/apache/commons/math4/rng/internal/source32/Well44497bTest.java new file mode 100644 index 0000000..b850be5 --- /dev/null +++ b/src/test/java/org/apache/commons/math4/rng/internal/source32/Well44497bTest.java @@ -0,0 +1,109 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.rng.internal.source32; + +import org.junit.Assert; +import org.junit.Test; + +public class Well44497bTest { + @Test + public void testReferenceCode() { + final int[] base = { + 740849862, 1202665156, -199039369, -259008301, -291878969, -1164428990, -1565918811, 491009864, + -1883086670, 1383450241, 1244617256, 689006653, -1576746370, -1307940314, 1421489086, 1742094000, + -595495729, 1047766204, 1875773301, -1637793284, 1379017098, 262792705, 191880010, -251000180, + -1753047622, -972355720, 90626881, 1644693418, 1503365577, 439653419, 1806361562, 1268823869 + }; + final int[] init = new int[1391]; + for (int i = 0; i < init.length; ++i) { + init[i] = base[i % base.length] + i; + } + + final Well44497b rng = new Well44497b(init); + + final int[] refInt = { + -102003638, -1254584449, 836441550, 1949705484, 653000494, 1579400718, 699652570, -140738233, 1164288466, 419933874, 366568847, 780567309, 1867405910, -350557801, -964350642, -1323492759, + 191502468, 398676344, 1568976991, 1005053759, 199053603, 31083944, 74697788, -1343941248, -1205631880, -1637961625, 361813531, -1706096179, -403340909, 1666226814, -2034962600, 1237102662, + -1833248535, 1584255126, 1295661745, -1753848945, 1208145993, 930278953, -733716134, 192752767, 1692463060, 1727273316, 2122952931, -809025255, -992081044, -895539688, -419372543, -1835478922, + 2089629419, 1646590742, -1261083717, -1005462992, 1619627287, -1437723182, 1619689210, 1319393089, -1816963183, -150214444, -513482220, 1897815796, -1861960936, -1766444468, 2034653890, 585657634, + 1867016559, 696942260, -1536237241, -527055447, -1554805020, -1063992566, 1024799415, 1782080572, -1884276362, 129028272, 1427925968, -1154222271, -1383146732, -1580532830, -1907049616, -104299169, + -1780913000, -2090815339, -1789809502, -1521443849, 1226625769, 1126090676, -2117094290, -449575109, -218982833, -695554478, 35923022, 1386126825, -95031305, -168657023, 436674049, -1137917876, + -2045134053, -1025629865, 133144659, 64226081, -1966942130, 700813483, 344058910, -910646033, -212789479, 740360859, -1269028713, 1517763679, -664178514, -683718472, -71951996, 86583727, + -1235669348, -1426987265, -166598353, 214190040, -1436967644, 233824411, 710927452, -1939548641, -433607408, -1075939594, -1549702826, -1310827917, -640604762, -696863672, -1282162126, -546470833, + -1516734192, -513809904, -458526835, 708926727, -476643096, -2108375037, -2870478, -1460116421, 436587555, -948939610, 1891375124, 1944216545, 959034236, -1267038790, -1695098736, 1853748495, + 1594424552, 1270099319, 1139585482, 1837434635, -709909535, -457524230, -887118113, -241703912, -1888225819, -751575804, 1122280146, 1194255209, 949350188, 892826516, -791212042, -151203035, + -859297731, -1979039938, 323603119, -1022065097, -1804294506, -385802891, -2127523442, -720380255, -1315859127, 999649487, 335041941, -1732821688, -1833409827, 535715225, -1285355653, 1206723386, + -1141619270, 759796285, -1599504546, -1988521411, 1056668895, -852564594, 1056509609, -1831687977, 754168875, -1301144422, 922880446, -1502666503, -949791898, -1043870198, -1136941938, -1649670259, + 1342769348, 1692605059, -132279148, -1108038310, -14355545, -1611387086, 1651826569, 877600127, 1356160799, -759125205, -1300490081, -414938486, -201479285, 1958709363, 1513313540, -1396836908, + 1352702612, 1142506253, 52969438, -365142357, -1619054179, -1368514102, 1470750417, -1420830959, -843909462, -1679570143, 1447444607, 234551752, -1507452115, -1433234579, -680890000, -497305145, + 860408898, 263376761, 1537070218, -592353956, 1587852989, 1756653749, -2081320633, -1547020311, 723771611, -883819383, 1899879513, -268417584, 1058606451, 1665941493, -1630340612, -614737477, + 891313237, 1368950660, -1166187089, 296322368, -1908770726, -2120378408, 1245479677, 1879710487, -1705947124, 1018371589, -1715010575, -1096078094, -1749891454, 2130888667, 318647750, 554592231, + -489121568, -1809605233, -1697905160, -953926536, -2013960553, -148884919, 1822739964, -1466301760, 141999978, 1946526064, 1323036718, 864390149, -2141665227, 1510602225, 1468408474, 1277039721, + -1368096647, 180965986, 2140852057, -688071899, 819713016, -154385940, -1182972611, 1257224305, 1392607672, 1364245931, -1768434401, 323522132, -555278604, 474186520, -1178901665, -2137343658, + 1636421121, 1398987084, 1276656225, 1013316006, -955917865, -1537149363, -179145358, 342862050, 1172728007, 736300054, -1114656959, -1831840325, -1882353535, -442915191, -1206488416, -1818534411, + 25312311, 2100297098, -1562767719, 1762553519, -1853194231, -1152612739, -2020055792, -809572150, 848584579, -535789699, 1817604709, 1343773216, -602234204, 1739930964, -833790834, 501215449, + -730104057, 1217783189, -681773267, -611951354, 978387629, -1516811237, 974303980, -1389665696, 2091099075, -727528826, 2116026151, 271935854, 613242379, -2100429856, 190004963, -1629612570, + -1362888327, 175094223, -917873219, -2008308245, -401946815, 504218792, -1966525201, 4106248, 164895454, 226502921, 655865257, -610528718, 189428750, 1055978898, 17603028, 591024369, + 1127922501, -1546639293, 1994174637, -724136988, -673919372, -1665002120, -612145705, -793102882, -1904763558, 757565058, -2091240021, -2123324826, -1518702766, -802889839, -223045921, -1509216579, + 1195556261, 2079259971, -903969953, -1781800655, 1834950463, -956531922, -1152550807, -1116052662, -348802884, -1395330117, -91758501, -19115285, 1926930669, -1015793599, 545904386, 1617858191, + 716963473, 1917089719, -980914811, -212646927, -1634695647, -1857924568, -1462257477, 1273750178, 1060328454, -361604424, 867932749, 451213698, 405780152, 1165233215, 1877230909, 2103114395, + 1644330815, 1252998537, 1961603970, -1533101488, 1790456024, -38226118, -1306744489, 713676418, -1535871838, 1378109935, -338185548, 1647669762, -477465913, 203482277, -1949756706, -503326093, + -638704909, 320186309, -1435581459, 907446649, -77384645, 537368928, -335347295, -1912061924, 547819174, -225549827, 1089455486, 463516297, -240127764, -85895271, 2053179697, -287394931, + 921878827, -933362608, -1178670275, -1200942874, -672571265, 574422382, 1441734039, -1814493454, 165751640, -176907245, -1170992192, -2123252090, -1435971541, 1591853830, -885477992, -792847559, + 1359875286, 1038392904, -2027255124, 687291425, -165513490, 1391146576, -1387080955, 794663652, -807189965, 667820962, -545384499, -1371368854, -689031878, 1504805541, -752825823, -1920047745, + -1884874017, -350566320, -197152911, -181743050, -798415949, -915922276, 1790690149, -363997181, 1923116185, -1326427198, -1621079427, -1997440997, 1798118127, -2053110382, -159879848, -1286787216, + 1046436411, 1832030471, -389092059, 71686169, -76025260, 1914270607, 1854169353, 872157826, -1774323792, -575165717, -1919931724, 2051498109, -1176174934, -883578901, -1253047270, -1310573900, + 245466682, -1784824328, -1319912821, 1377340217, 1364313761, -408687373, 142333378, -1952335763, -1703126184, 316314678, 2030555423, 488640834, -1783293306, 2116925005, -428337460, -42966447, + -476226114, -325172903, -1690748475, 852791569, 26490302, 85251337, -1374975770, -376283969, 982639600, 595119792, 376403422, 1574509912, -1509664496, -1901241749, -59019104, 358566667, + 341667214, 184541206, -550950854, -1897143732, 1595753537, -1236127928, 2014297822, -2033179270, -669806121, -1927596980, 1010735700, -581795164, 1922398838, -1456743538, -1633813803, 323177707, + 2002098813, -2099067658, 277393729, -671911622, -384463053, 2028267908, 367391785, 1270052637, -172839030, -650486693, -831800809, -1255138113, -137512799, 1904317942, -8229811, 707361898, + -276859812, 50417442, 1487081728, 1577776181, 1994451303, 1237303035, -602016235, -1905218276, -1895725672, 1172978849, 801129953, -1819485071, -587985848, -2010386741, -1645226427, -850866837, + 816998708, 357665811, 1955856762, 1617902189, -1013761306, 146782652, 904185608, -500146809, 2085848310, 1917713975, -1823786899, 1994184748, 789196322, 1766857258, 1770685286, 58213029, + -1699628994, 346827379, -1274423227, -5079670, -193099487, 1020296939, -1795904054, -1951053094, -43782418, -375403393, 1026761026, -207269610, 1364563521, 1578793454, 457809423, -534138380, + -1052938788, -1897101526, 1449976516, 2052800058, -1145169719, 1476303269, 370625650, -325249282, 2165984, 1631432802, 1032336355, -1292978191, -1810172401, 725725820, -1162678778, 702624490, + 1387673527, 981825943, -556408212, -1108487850, -1782136935, 1582316425, -1752682164, 307235003, 1386486299, -1343636074, 1936875586, -1265279891, -345847069, 928241171, 239050350, 1859358526, + -664776217, -823267892, 346651710, -867656288, -1907921425, 1362445801, 541145461, -192727350, 1649366606, 244694627, -488180018, 214008256, 2032125437, -1678591993, -264593820, 1309017286, + -652451998, 1845366657, -703990120, -550186406, -630285276, 1782372955, 1650564210, -1127904234, -1407983860, -1119422877, -1565976361, -1913545385, 549841420, -1410323732, -1964467146, 228296551, + -421026422, 1929094398, -266906424, 264810315, -2008122665, -1088278148, 141242192, 1871293282, 234634067, 1724159838, 1638271051, -837713428, -657941661, 168093988, 708605363, -1881612509, + -1810496006, -193495322, 1889982309, -2050702012, -693694192, -1249780322, 718733403, -76349730, -188217051, 920912090, -1814078273, 2013358456, -1948845521, -198407575, -1248904632, 1182772565, + 1236791612, -1297489171, -1958468586, 1437011007, 390460941, 113068796, 1247982993, 2102889679, -1563524844, -128174212, -754095070, -1461699362, 943615640, -1013270737, 221253920, 1514140013, + 1596946745, 674222984, 616356702, 1811224435, -1764322023, -1653707581, -1702404459, 390678142, -209506765, -1398278531, -117061517, 1625861343, 659048069, -1490678943, 846536668, 210715637, + 1855458786, 1727745280, 1086729456, 1109111683, -985298098, -1813777567, -954599702, -1522494031, 1166103515, -191868965, -1048777852, -661271058, 1161457421, 1509090409, -919753558, -155431193, + -1774302994, -366390263, 2090138916, -693431491, -1693888428, 1846774454, 925855693, 474383470, 208889079, 382195164, -283005634, -2095134392, 579927985, 1390765326, -1766119865, 900457129, + -1503703236, 974952690, -107714111, 381338452, 1187256613, -860560742, 524103620, 1499506130, 197755276, -790802926, -406920967, -1972219791, -665721155, -113336203, 1037154436, -1185441801, + -745541706, -546274471, 1988928457, -1975403782, -1167172845, 777779004, -1560935061, -140258712, -1243598232, -1394149587, -785002782, 311842991, -1025469277, -605350463, -1251538057, 537203966, + 597777961, -1845767072, -1556349193, -1491015509, -1935936671, 2093498487, 1908270236, -315396187, 1356362300, -2025658518, 630119678, 276190559, 510123398, -1266145363, -170152124, -151540077, + -477900187, 1895894303, 1870333068, -1169891437, 353366620, 2111175941, 1691245786, 1318765802, -90993610, 921309517, 118241505, 367005284, 1624861072, 2010785894, 865255951, 1717799691, + -80757664, -644944841, 136999836, -341686875, -1908076090, -1968934200, -346397811, -184213520, -511811333, -2118173466, -1086490399, 1795322855, -635494328, 415716276, 851044432, -904636831, + -1972230341, -64337858, 571177016, 1248814747, -1351030778, 457872680, 1843549954, 1718960038, 815088665, 1812961065, 360686952, -1356586646, 1657802416, 1776192945, -786723490, -342254407, + -236653811, 771014701, 906386785, -308057635, 1907957462, 206000440, -42143480, 900403654, -917549795, -310520796, -1713627766, 2061136240, -377977839, 891282946, -821163030, 328143584, + 1503793080, 551621842, -2086273683, -2070526343, 91195293, -1654389038, -1035734266, -336619597, -1220221027, -1468468844, 2105626873, -841372573, -122707018, -2013073683, 494461000, -2054807734, + -67946259, 1914163407, 1941835405, -1027244745, -768123277, 419129844, -275750260, -171533009, 97756174, -17651409, -1578102255, 995291430, -1587462977, 692904675, 951632643, 1882101293, + -1546298756, 2018418068, -1790777661, 1542305514, -1437624383, 469587009, -1647853474, -1318279028, 497228822, 726733469, 1693133452, -2091185798, -209017732, 126386499, 1056958932, -2105494133, + 754067324, 96463951, 83701151, 1101658289, 1485852701, 553783806, 1898769881, -1072031442, 1438062141, 1992540265, 1152252136, 1019391719, -175951257, -6691216, 989789689, 968359367, + -1330392786, 1704963399, -998432914, -948060232, -1921688855, -975840920, 1360273515, -872810459, 12676907, -1908050756, 883609616, 65641549, -200365398, 1386653304, -1203665071, 1878689007, + 426262328, 315375145, 1900325181, 703658494, -765404895, 1070155172, 1399748900, -804264234, -1619419026, 1347225486, 230635292, 1093717835, 14020583, -2107039873, -968325341, -1679158691, + 1959784097, 1065690797, 1090615161, 1311445364, 865835426, 870016646, 574122879, 1842697922, -1289210431, -1914001560, 1672467629, -900366331, -1524066872, 136503816, -1910431892, -1431958329, + -830367152, -1316233970, -801974860, 1560669382, -81784810, 401822577, -949103202, 943897151, -722666726, -96825841, -1092898846, 230567004, -70355840, -1398069192, -312953142, 1475420133, + -622491023, 1661205388, -19071322, 6024591, 1473041593, 2053897978, -1346768903, 1484764721, -1552461890, 1287146711, 1613069307, 902497864, -1504480063, 375292915, -836353108, 2047602411 + }; + + for (int i = 0; i < refInt.length; ++i) { + Assert.assertEquals(refInt[i], rng.nextInt()); + } + } +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/test/java/org/apache/commons/math4/rng/internal/source32/Well512aTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/rng/internal/source32/Well512aTest.java b/src/test/java/org/apache/commons/math4/rng/internal/source32/Well512aTest.java new file mode 100644 index 0000000..a1eb7ca --- /dev/null +++ b/src/test/java/org/apache/commons/math4/rng/internal/source32/Well512aTest.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.rng.internal.source32; + +import org.junit.Assert; +import org.junit.Test; + +public class Well512aTest { + @Test + public void testReferenceCode() { + final Well512a rng = new Well512a(new int[] { + 740849862, 1202665156, -199039369, -259008301, -291878969, -1164428990, -1565918811, 491009864, + -1883086670, 1383450241, 1244617256, 689006653, -1576746370, -1307940314, 1421489086, 1742094000 + }); + + final int[] refInt = { + 1634813289, 1876773016, -973836208, -2130023652, -1045460084, -1834384857, 1691032973, 609714289, + 2033920362, 555915483, 6680992, 1958127415, 1866469645, -1471336965, 2049178762, -192324811, + -2056050066, 810879705, 1405046309, -781317118, 1012782311, -1045081032, 728377508, 1473511660, + 290489070, 326666761, 2018299979, -1876688058, 1239968501, 1464625040, 2025151042, -101397407, + 1387902041, 210959839, 1366359326, -476473433, 153180037, -1607631523, -506743495, 17888738, + 313865008, -340504498, 586684079, 1243699375, 753162229, -646761694, -739189655, -210120185, + -1856358726, -628255542, -1812798197, 1416288088, 1077967722, -846846208, 1379850409, -580183344, + -1858959, 210859778, 295841424, 1492774865, -1415543680, -344870570, -1942779197, 1549510646, + -389544849, 314254218, 11784988, -1311757368, 1719514841, -764610517, 1296788970, -994707050, + 783854563, 422654144, 387639079, 1219688425, 2144352572, -834212874, -1036550358, 935909479, + -568610842, 1327498837, -588933178, 1910065754, -40851599, -182063170, 1302731458, 541311559, + -1647345522, 805224371, -1721196679, 1518507830, -952689880, -433276260, 509675254, -777259954, + 1277810106, 284054896, 936042202, 2036836351, 1956412426, -1186403024, 287795400, 2135311211, + 720485927, 1500695024, -281656583, -1277937322, -1628968482, 1242814831, -2030700974, 1473867890, + 440813549, -1357033971, 28384076, 1602731216, -641465746, -609054347, 635938444, 1472898176, + 1476894555, -747974186, -1590337055, -884242108, -389736197, -2066984505, 1087103272, -1236446290, + 31657463, 1835715432, -468439078, -2132633204, -434609235, 258308151, 1851926761, -1630139159, + -1344617241, 1969204215, 619463174, -174392624, 207475487, -1619828078, 1327980298, -83968178, + 445951782, -1786230541, 6279288, -580982231, 1550645552, 2006533941, 275746007, 455676647, + 2019637349, 1115547704, -1313120106, -516213449, 73752461, -1382448112, 398589620, 1319888048, + -1595572334, 1566934536, -1735685764, -1509545339, 1458173912, -549395819, -618827040, 1516624531, + 1900757187, -1454200688, 965524719, 488355065, -1869294316, -810641680, -2059428251, 1454656431, + 1329120541, -232185900, -994996943, 1855980910, -452077812, 1565630611, 759842266, 1241435187, + -1390456063, 1946400597, -2032319771, 683667881, 905911106, 1983310786, 120010546, 526018017, + -1946881912, 205004987, -1307250612, 2130980818, 2052864161, 189839787, 1789478047, 406168885, + -1145186347, 8507675, 1277188815, 1492619042, 2009819675, -1627411598, -851016743, -1828234956, + 1962622506, 2140398255, 236935165, -337237772, 1263419111, 516775236, -335741025, 1391328225, + 455979249, -1457534664, -657606241, 485648133, 1762116343, 1194889600, 817834937, 321150162, + 131159182, 290277758, -1876924740, -1770401129, 1291602973, -1003642974, -1580211929, 1520422021, + -399171579, -24315308, 453805396, -659197747, -205656847, 466526550, 1444397201, 1178091401, + -1157268826, -602394028, -1370668795, 1614896435, 1699071659, 1864753793, 1888518358, -1721244514, + 1812776767, 668822227, -297283057, 2130183333, -1169618692, 912860240, -2028253096, 1244694278 + }; + + for (int i = 0; i < refInt.length; ++i) { + Assert.assertEquals(refInt[i], rng.nextInt()); + } + } +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/test/java/org/apache/commons/math4/rng/internal/source64/MersenneTwister64Test.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/rng/internal/source64/MersenneTwister64Test.java b/src/test/java/org/apache/commons/math4/rng/internal/source64/MersenneTwister64Test.java new file mode 100644 index 0000000..dd3ffca --- /dev/null +++ b/src/test/java/org/apache/commons/math4/rng/internal/source64/MersenneTwister64Test.java @@ -0,0 +1,239 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.rng.internal.source64; + +import org.junit.Assert; +import org.junit.Test; + +public class MersenneTwister64Test { + @Test + public void testMakotoNishimura() { + final MersenneTwister64 rng = new MersenneTwister64(new long[] { 0x12345L, 0x23456L, 0x34567L, 0x45678L }); + + /* + * Data from + * http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt19937-64.out.txt + * converted to hexadecimal. + */ + final long[] refLong = { + 0x64d79b552a559d7fL, 0x44a572665a6ee240L, 0xeb2bf6dc3d72135cL, 0xe3836981f9f82ea0L, 0x43a38212350ee392L, + 0xce77502bffcacf8bL, 0x5d8a82d90126f0e7L, 0xc0510c6f402c1e3cL, 0x48d895bf8b69f77bL, 0x8d9fbb371f1de07fL, + 0x1126b97be8c91ce2L, 0xf05e1c9dc2674be2L, 0xe4d5327a12874c1eL, 0x7c1951ea43a7500dL, 0xbba2bbfbecbc239aL, + 0xc5704350b17f0215L, 0x823a67c5f88337e7L, 0xd9bf140bfeb4c1a9L, 0x9fbe3cfcd1f08059L, 0xdc29309412e352b9L, + 0x5a0ff7908b1b3c57L, 0x46f39cb43b126c55L, 0x9648168491f3b126L, 0xdd3e72538fd39a1cL, 0xd65a3663fc9b0898L, + 0x421ee7823c2af2ebL, 0xcba3a4b69b6ed152L, 0x348399b7d2b8428L, 0xbdb750bf00c34a38L, 0xcf36d95eae514f52L, + 0x7b9231d5308d7534L, 0xb225e28cfc5aa663L, 0xa833f6d5c72448a4L, 0xdaa565f5815de899L, 0x4b051d1e4cc78eb8L, + 0x97fcd1b4d342e575L, 0xef6a48be001729c7L, 0x3982f1fa31afeab8L, 0xfdc570ba2fe979fbL, 0xb57697121dfdfe93L, + 0x96524e209b767c29L, 0x55aad0ebca994043L, 0xb22687b88856b63eL, 0xb313b667a4d999d6L, 0x7c7fa1bd6fd7deaL, + 0xee9f4c15c57e92aL, 0xc5fb71b8f4bf5f56L, 0xa251f93a4b335492L, 0xb9bad7f9e5b07befL, 0x62fc9ac35ccde7aaL, + 0x933792382b0218a3L, 0x7d497d2f7a15eaf8L, 0xb2f0624214f522a2L, 0xd9895bbb810ec3d6L, 0x22d91b683f251121L, + 0xc8fe9a347247affdL, 0x3462898a2ae7b001L, 0x468bc3a10a34890cL, 0x84ff6ce56552b185L, 0xed95ff232c511188L, + 0x4869be47a8137c83L, 0x934606951e6fcd81L, 0x1ab5e8e453bde710L, 0x6386b61b30fa1157L, 0x97f3a778e242d0cfL, + 0xd870d281b293af3dL, 0xc3a5f903a836fafdL, 0x88bd6a24d49cd77L, 0x4e38ddc2719162a5L, 0xf48286b4f22cad94L, + 0x80f6f650c337557L, 0x5e6daf6aae1ad59L, 0x7450f7229f336762L, 0xb75b43fb4c81784aL, 0xebd37a514f153148L, + 0xd4b3a39e0bc52c7L, 0x562f36fae610a2e1L, 0xe0e413e555bd736L, 0xd452549efe08402dL, 0xf2e2ff7be2c75e21L, + 0xf2385606c18aaf0dL, 0xdb609b507d8c6b8bL, 0x74ac5663c6c4f45bL, 0xd84c9a356858060L, 0x19d5b3643bc029b6L, + 0xdd8131e97ffc842L, 0xfa7303606bfffc05L, 0xf98c6d63ff48a16eL, 0x34df46aa2d610767L, 0x83490ef054537f7eL, + 0xe071f833e55ebfe6L, 0xd4b94537ed4a6aaL, 0x3cf85e4e333966fdL, 0xba15364649384016L, 0xc0e6bd623ca72405L, + 0xdae6e879b8eab74aL, 0xe4a41f17e70d3e0aL, 0x56e10c00dd580f70L, 0xa9a66bb41781d872L, 0x58e42dbdffe21573L, + 0x69450e1ce9674e6aL, 0x47fe345a350aa605L, 0xac958aa80455a5a4L, 0xbc1abca3fbeeb2f3L, 0x8f760d9228900a4L, + 0x9e1eb8a2dfec4387L, 0xe91bd1321f5fdc89L, 0xda11a24c514b9dc7L, 0xb1f63d976e0e639bL, 0x41c11098f6123861L, + 0x3d7736979f978f68L, 0x820685b38c926beL, 0xe8c3dcab075b112L, 0x5e37299d89089ba4L, 0xa1f735eb8235b32fL, + 0x2289d719e7b146eeL, 0x1c9c9d0284d96719L, 0x5f8b358546775be8L, 0x317e34c009a07a39L, 0xb16b073eb0ee0a19L, + 0x423b36fd459f2a66L, 0x5f45053666f3f84fL, 0x63e7074f03c73d92L, 0x22080cf23288e895L, 0xba4e71bf61dac16fL, + 0x9643b3707db2cfb5L, 0x98e2db6c665e7178L, 0xcbc57de0ef3eabb6L, 0x6239a2197582a8a8L, 0xf2ae968e55fda13dL, + 0x36e7ac11d1f3a617L, 0x508f0acb609bd756L, 0x6f42d435193a1ac2L, 0x2df2cab9d65e0b00L, 0x4584c1fde5f1ad55L, + 0x602c500bdc8317c2L, 0xc80d5b04f6337337L, 0x98abcf971892a773L, 0x5d33cf557e6c4475L, 0x5b5a78be74ccd40L, + 0x3ec2cce5290785f4L, 0x2eef1e9c4b36828bL, 0xdd274241a0ce8c55L, 0x3c4cb919b35c221cL, 0xc1fd68d779db9923L, + 0x7ff345b4eb7f3639L, 0x804d5881b2eefef3L, 0xa15f9c2826cb34dbL, 0x64822b68adefa772L, 0x761e92f8d279850dL, + 0xa5d049ab1061dba3L, 0x5f46fb02d10d2219L, 0xc1cdaa5f9ca79b19L, 0xdd713a74701ebe60L, 0x6b626ec963951798L, + 0x1d3ec8d78b96d16dL, 0xdb885d52960e7f34L, 0xe39849cf3ea178f8L, 0xc1e37acdf807130bL, 0x3645880ebf333913L, + 0x3af81a7bec346c22L, 0x871c563e94324804L, 0xac55fb5e2817db4cL, 0x35b04c42565ebe2L, 0x5094cafab11cbc3aL, + 0x94d40a57481346b5L, 0xf91a8492df723e3L, 0x126a70b84f779accL, 0x4409e9a5d5c3f133L, 0xb1655339864151efL, + 0x6564e506d11e9de1L, 0xd9a06f7b8860b488L, 0xd493e410b68b6c6L, 0x4e6fbf4b3b985a07L, 0x71c1b0ba9e52a2deL, + 0x5775784ad3cb99d9L, 0xbab84cec312107a6L, 0xd9066f5ccd59cf9eL, 0x8c656651dbb3ed84L, 0xa7448d0059484568L, + 0x2819237e5e8cb03aL, 0xd57eaf5239931b4bL, 0x6cd436fd5f7c1e73L, 0xf03b845f2a584931L, 0x8847b9f1f2d55b7aL, + 0xd49a38f8e59db8faL, 0xd5052cc47685dbfaL, 0x91e060fb399ecf2cL, 0x5748fbea12dd2869L, 0xd0cee85adb889226L, + 0xa35e9dfa5a64f56aL, 0x3118398bd0e3cbf0L, 0x5e650b9a3cb34308L, 0xf575ccbebf49b91cL, 0xb3f8dd73257c80e2L, + 0x13d7954e8294819bL, 0x90b57ccd00f1591dL, 0xa8b13ef52ca7e284L, 0xe482d24e5b239833L, 0xb0648475f2b4d63fL, + 0x847e8fc889e2389bL, 0xa8b501ee1fc59ba6L, 0x29702f6acba4379eL, 0xfaba9600f3d2cd0fL, 0x52ed7d9f45c6b578L, + 0xa02b167546d6e2d0L, 0x9a41cb166618a390L, 0x83d464d7349d9f3aL, 0x805485c9d2c70c6cL, 0x332f7ce3e077ecceL, + 0x1ead372c068ebb04L, 0xd6866c5b3b5eb82cL, 0x5b057c64bda94a33L, 0x11e1388f59653c66L, 0xffd2aca771c0abb8L, + 0x2fabdd0e8e8ba606L, 0xe974ffd57219e5e6L, 0x2b4e5c1e5f98e506L, 0xe7819b2cb44db4c0L, 0x6cbd78c408376520L, + 0x244285f39307f083L, 0xd152927f3a3af853L, 0x5b799885a8ba66e3L, 0x9300da64ea1a0644L, 0x67399bf8688a0cabL, + 0x47c301af4a94bb2L, 0x6750ecdf35c8471bL, 0x7598ae5c876d4080L, 0x269e0cf307467534L, 0x2ef4d8dcaedbc549L, + 0x2c6983c911c958afL, 0xb2fd7c07ae0bfa60L, 0x3220a56d67450e80L, 0x7385883420eb9f69L, 0xdb1fd2951f15b047L, + 0xf08b35df55977bcL, 0x42939b9f2e58127eL, 0x4d1d77e72414aa9aL, 0xfd8137f8b59bd084L, 0x167cc7f46a511504L, + 0x263de0c6b50290dL, 0x2a1c2feb488ffab8L, 0x1194815038360d85L, 0x36374630d0ecb4e8L, 0x609d38e22c59a974L, + 0xee23867f7c9b5f54L, 0x40e53a7804b0ef15L, 0x8f287f1a3be6e458L, 0xba7334b0f0af9e75L, 0x9f003e8e0e9c6c0L, + 0xc02dd0d35c42bc56L, 0x63dca83acd6be04aL, 0x9617b58a79fdd826L, 0x563d25e6f891bb33L, 0xe3c3d3f3f6d58588L, + 0x359977baa315b1b4L, 0xdf431301d9e6bc5L, 0x4074bb10d0003ca5L, 0xf440159140f2b453L, 0x3a6cc6e14820f5e2L, + 0x4b352bdacf3a37c4L, 0x9ef3b8df89ea4c29L, 0x8a1b2495a1414892L, 0x670b7f423f78b7c9L, 0x7513c7ccf6ee3c3aL, + 0x9ba96cb53c24408bL, 0x3316c3dc4ec859f0L, 0x501337e1a7f1e218L, 0x9a1544a6029c1eb5L, 0x9b43b15859c3e96fL, + 0x58011e22698bd4bL, 0x589b8eaea60d54a4L, 0x68ccb8c6cd7ec24dL, 0xe55beb5896455705L, 0xba6069cf90a8f1e2L, + 0x896a18c3eb90a6d6L, 0x870d3d80ae0b9323L, 0x48688d8b457f501bL, 0x8f1a8c1b84b3ba62L, 0xd1b7b64dc136f6b3L, + 0x3c6a7025428547e9L, 0x199bcc50a190fb6fL, 0xa5de0eed4bda0979L, 0x31041667821cddb5L, 0xe9df34e2678fb4e3L, + 0xdd7222eaee54e524L, 0xaae6488b26c7af56L, 0xe8a560dbbd2eb6b3L, 0xe37c99a7f5defceaL, 0x1572be8d78f3afacL, + 0xf69ffb64131633aeL, 0xa837ae34963616fbL, 0xaf0a9f03d137c170L, 0xd3e02b464018a48L, 0x11753aea03bb0ecdL, + 0x32d9cca610dceb34L, 0x2622bb6a6e7a11e3L, 0xdc99a44c515ec8b3L, 0xd7d720ad0a770b28L, 0xe322f742d6d051c2L, + 0x745f2b6e3ea9cd2bL, 0x951f21478e6b9662L, 0x227f21d8c0713385L, 0xcb729235e6876eeL, 0xd323b857d9721a53L, + 0xb2f5f599eb743346L, 0xefb30babe65a283L, 0x94c1190da321d470L, 0x117c63209fba9efeL, 0x738cf92baa4bc2cdL, + 0xc3bdd29b33277165L, 0xd78a2fab38f6dc46L, 0x35c44aafdefb91e2L, 0x321e26bf321fb60bL, 0x12db436288b37172L, + 0x158a2d49e51c261aL, 0xc9202ac8ba71c873L, 0xd02fa93dc97cc7b7L, 0x1f8bd11b747e901eL, 0xf7a17b2f74aa321cL, + 0x284d02d7552a3e90L, 0xeb86a8251533c574L, 0xb3fd774eaf4e77f8L, 0x31df2951c3ff37b1L, 0x86e38546195a69e7L, + 0x6737aaf165a1389aL, 0x2e2e925079feee0fL, 0xf7bd5a988596c1bbL, 0xccf835db6a10d2dfL, 0x6f42700f37c94701L, + 0xa6e86f7ba2779a5cL, 0xa43a4f7036d1ec2L, 0xd798bd6d52ad26daL, 0x218f6912af38b818L, 0xd48684f266f2e186L, + 0x8f675048b7b012e5L, 0xe5e469aac68eaf1dL, 0xe2740035697de79eL, 0xc22d6bd6d08baf1dL, 0x341774636bdc8f41L, + 0x7dfc6b73f7ba322bL, 0x7566343607bb525bL, 0xae94d116ccf1e74bL, 0x6ca1b59934cc2697L, 0x4c2fb1c45b749cedL, + 0x989999bbdd2ec893L, 0xcc4e27afa81bc8a8L, 0x6ddadf15ebf85830L, 0x38fa9cb2ce72bc16L, 0xacdaffe39db4bbdaL, + 0xbcc4682ebd095d93L, 0x483f539d354559adL, 0x45de92e997e2915cL, 0x7ec5c881c5344a55L, 0x9d1844fffa091545L, + 0xcd9b08d4dcda27baL, 0x1f7495a5f36c34ceL, 0x4f0fc9647d99afd7L, 0x5ac375ec59321cf2L, 0x5c07ce6df7e1d9a2L, + 0x49f211880d688b4cL, 0xf85fdd8ccad0867aL, 0x7d510164d8f197a8L, 0xc64108c5732cfa0eL, 0xb262d660d3a2c648L, + 0xd5d5614571dd2efaL, 0xec1a6d0dd5d5391L, 0xbf07d939d2535f02L, 0x35bce3021e51045L, 0x423ae115ec99d154L, + 0x22ea1d3abd893838L, 0x517fc1107eaa6a83L, 0xc5967cdf353aeac6L, 0x96ae2c3dff65ce6L, 0xab1b908b97dc911bL, + 0xf3d84c286f22611cL, 0x256823815030d8a2L, 0x3bd9b119887342e4L, 0x59926f3401f437d4L, 0x74edf41038d3986fL, + 0xe2b35bf615038253L, 0x4d09740a6b44db89L, 0xa37edaf089c0eeabL, 0x8263ba2c23e2d62dL, 0x8784aff57d390c3cL, + 0xfb49ab0635d66c3aL, 0xdeba73c2562bff1cL, 0xe2e6bf8cb6e29717L, 0xe70431c63d86e46L, 0x20d717e16aae6010L, + 0x31af57cdcf2cd36L, 0xd55fbeef1c5357feL, 0xd361d871f4e393feL, 0xb3416e718d32d214L, 0x7b351f93f909fc00L, + 0x16916de7b96a26bdL, 0x4fec1248b5dedb65L, 0xfae1aa9a62bfa096L, 0x92e7910a6b0084a9L, 0xd12bba8672e8aaa9L, + 0x316558d69efc8f6bL, 0xb0dde29eb96fee87L, 0x2125a2be5bf67eb3L, 0x5905903f46531fe4L, 0x2a9927e8175ff60fL, + 0x794376f2bb5d6d96L, 0xfa9f65d2b4848b12L, 0x2b92665a263a5091L, 0xabcaccfab8464c65L, 0x5b2fb2a46d1a0bdL, + 0xa879920d28c0d54cL, 0x50394088a8ea4953L, 0x61b0c87f0084129dL, 0x29ebcd1078d6e2b0L, 0x2440c652f6bacf89L, + 0xbd74d596cf4c8eb1L, 0xe4b009e5c334766bL, 0x7db26843cf72cb8L, 0x4171d5edd5468876L, 0x608d5c2c348c143cL, + 0xa19e0a2b81da6eb5L, 0xb65a7be9354c1390L, 0xf4f4c437cb9bb324L, 0xfc24806650c823bdL, 0x4c2331521e7f2966L, + 0x54f66e42eb73bafeL, 0xf06c11f3d2fe29aeL, 0x8ba8d0f28cbb0fcbL, 0xf3617850d1ae7976L, 0x96463b47cd9a7286L, + 0x8edc2133b35c3779L, 0xae43f70f181d9371L, 0xe7628d75c9a3c2e7L, 0x978499ba4193b333L, 0x99bb4bf79b0a46c1L, + 0x4c52676d7e4d0a58L, 0x2064ee3910693deeL, 0xfc43514d16633997L, 0x1bc1741ce05c4cceL, 0x6e9588d40f3396f6L, + 0x146fe816bb3a3708L, 0x2b3db8ee05eefa87L, 0x6ec21a91189ec0c0L, 0xa8a907b34108faf1L, 0x708b80912235684fL, + 0x2bc8ba70edfe680cL, 0x4d118826481266efL, 0x8f93a3a5de887175L, 0x3308e9133a950fe3L, 0x939ed8b0d7e91f87L, + 0x666beee64002b6b0L, 0xc8f129ec69ce7811L, 0xd57593c68ce93ea0L, 0x2d6a3e66edcc862L, 0xbe1d00d16a2271a6L, + 0x34fbeaf95e0c673fL, 0x9845ab59483a0e86L, 0x257d47d5abf88962L, 0x28af39f39319545bL, 0xe3fce03abd8171eeL, + 0xa4c5f606dccc96f1L, 0x4d414846267c4962L, 0x6ccf77f81d9dbf70L, 0x947bf43c729a71ecL, 0xfd656c39c4fa824cL, + 0x8f652cf2d1e04fd6L, 0x8cb11929a65b6aeeL, 0x94948f16a8064daL, 0x7434e703a4d03d5fL, 0x9361d3f63af4aa35L, + 0xa998c1eeec3fb422L, 0x51eb94754b5992a2L, 0x6e109c0347ef6979L, 0xe3c9738d67c582e2L, 0x9c735e3857ec57bfL, + 0xbe6415659e12c64bL, 0x73924584e31b9099L, 0x8f676821e60b0945L, 0x5614e3a695d5289dL, 0x7ecd448787517ebaL, + 0xc96db02038dbaf5bL, 0x69299ed774fa6c8L, 0xb4ace5a8ea16ac8L, 0xbf2f4f23a6c92295L, 0x90bdc4f1e931656cL, + 0x7cd5b0b95ac34d3aL, 0x2032bc59d3dc1710L, 0x702c1a0cd5609379L, 0x609d33abc01ff3feL, 0x8ae5d8f283b2748bL, + 0x2cf3778fa7eaae1dL, 0xe8a0d7b1919df9e3L, 0xe487894f6d602a0bL, 0x929858549609626aL, 0x46e540cd86bf46e7L, + 0xd1daf4382128d9eaL, 0xc47239c06b22ef75L, 0x8b7aad8ffea1b991L, 0xd6c1d2e315273fa0L, 0x2fda11cd74177e6bL, + 0x333cb0a145919fd7L, 0x5970b31a49f37b16L, 0x7890bc68793bb959L, 0x2a060f45a1719347L, 0xeb298f0264bf379dL, + 0xd7c4fd7921707400L, 0x374635e7713ed165L, 0xc60c008df0296d05L, 0xbf13739a8d3c7dbbL, 0xbfb945ef1cf94d1dL, + 0x75fe953c3a3a8315L, 0x9f83064f4150c02L, 0x6784a3b452055343L, 0x73ed26d185738f51L, 0x6c59094e8c998390L, + 0xeade93e19d60d4b5L, 0x8cf7cc8e62bc869dL, 0x22f85626f7f69298L, 0x6679c449ac22edc0L, 0x7017d0003e897435L, + 0x308fc450a6c62bf8L, 0x2578b45bc6f34cabL, 0xcbb936c9d253db39L, 0xc4e70e5bbc5e002cL, 0x29db6985be6c9459L, + 0x96afe876f5f6250cL, 0x829f766f138f95e6L, 0x4369632017c8fa0dL, 0xda90c817ca890a2L, 0x38d160dd675e2376L, + 0x20df15ad986408eaL, 0xd192623c3d9b3f41L, 0xd846f79123baf4aaL, 0x6cb058a0edfbf056L, 0x1b192f0be8dc77a7L, + 0x3a11b3dfcc81a441L, 0xe914410093ad7767L, 0x3126257e578bdf60L, 0xd5d5e470410cb6eaL, 0x4e1bf5d4209248aeL, + 0xe1e4c2924f35192eL, 0xac9944825cb7ef5eL, 0x8d2cbe6996eb3475L, 0x1bc05d2a079592d7L, 0x564a9f06755e71f3L, + 0x9bb767d68e9f2537L, 0xe4b045acf13978a2L, 0x4b7519cb9028ac83L, 0x9df655284198b85cL, 0xdc32ab4d421a2b61L, + 0x4c5d7f5323c1960cL, 0xe4273ff318f5c7b3L, 0xd73ef5ea88a3e99eL, 0xda2ffb6a863c850bL, 0x9555a4144e05ad82L, + 0x950104dc15092ebfL, 0x39d121a61f19dbfeL, 0xc6804e29d60d7814L, 0x7e98bec5ba17d58bL, 0x8b2c6b0e6c3b749aL, + 0x301a07c84aaccdbL, 0x93dee719932225a3L, 0x381611a50bac0ae1L, 0x572a8816f6e407b4L, 0x420efe85aa75232L, + 0xc1f53f78b9ffcf4dL, 0xbeda53bc95b96ec3L, 0x9f357114059c8eabL, 0xe38239260b584150L, 0xccbca17f4eed2ad0L, + 0x1528080b61f54198L, 0x5b8cdc4c40d49f30L, 0x1617db48eb6640d0L, 0x6fed27f88a516c99L, 0x37056e05b4724179L, + 0xec7bc122da9538d8L, 0x9fbfe01ca2c0fd57L, 0x2fc96b31dccafd9fL, 0xe26a72009daa1249L, 0xe9fb2e3998d16a25L, + 0x4a87dc39d24133aeL, 0xd5340e98fde806deL, 0x272b62b5dd0d7fe3L, 0xca4625581bf9dbe1L, 0x8677af77de374a90L, + 0x27dbec9e28f857edL, 0xb4aefc44d036612aL, 0xcf2e8ebdb0f6bb11L, 0x76023506c94e0532L, 0x864e72d4488c7a7aL, + 0xb81058fdac18fd3L, 0xdf93ee5b6674a0f4L, 0xdb30565511789d77L, 0xcf5fe22dc0375f30L, 0xa6e62e6e4edb4043L, + 0xbce383957a728669L, 0xfe4dd4e9633db2c6L, 0x24e68818b2a6d6cdL, 0x48a89c5424b4cdbL, 0x7fc7bc75bbbe5768L, + 0x79596343191e0ff2L, 0x5510b9cd8306839fL, 0xff2668b4eae7bb53L, 0xb4c03e6363c9e244L, 0xc9e3c0c1c015eb6fL, + 0x52531f5f898a744fL, 0x484005b2a805083L, 0x31673b70c6f23c53L, 0x5bffe158f323a7c2L, 0xc742bc0d0c55f125L, + 0xd95c32fe7e18379dL, 0xc1f2f613ee3c2e21L, 0x3217a43ff0daaa0eL, 0x3a9fa27258257e53L, 0x80b42af5a393bcf2L, + 0xb6967fd6a302f65eL, 0xfdc07bc592dbb125L, 0xcb83b8b9f64c3c3bL, 0x9cb572b041015355L, 0xc12dc512aedc530cL, + 0xc8db824276c083ceL, 0x86923b0e2903627fL, 0x1385cf2be22827cdL, 0x21b7616ced869ef1L, 0xc74d497d079901e6L, + 0x9e03c843bb13f658L, 0x915b89077a81ec7fL, 0x288a10b00768d244L, 0xd88eb6745a557569L, 0xb3c98071a3d13b20L, + 0x8f23aff44d352f03L, 0x2bf39ca10e45bdbbL, 0xf1bea47e2c68a4cL, 0xf8d5ab01c1ad6b55L, 0x679e0601953d1e31L, + 0xd793f3aacb3c520fL, 0x96fc350ccdb76eabL, 0x9fa0178362df447bL, 0xc11c63febf83598aL, 0x3aa88df3a1a71323L, + 0xab2f8338a09ca82aL, 0x32a2133050a71357L, 0xffecf97ca3ff65e1L, 0xfb6fd13318f5cb79L, 0x3acf76875acad366L, + 0xc577ffff529f74cfL, 0x368a90182031dd12L, 0xafbf2311ad656d52L, 0x80cd4f9f23fcafddL, 0x451717a061972d1fL, + 0xbbcbdae779cfbf3L, 0x133ca541293fd40dL, 0x6f241a21fc40b108L, 0x9adecbcf0c28110bL, 0xfab528d93bac6d3aL, + 0xf4ea3d459b0654aaL, 0x7e2e9ef35a5aafbaL, 0x28730469eded0fc7L, 0x3cbae97a12632fbeL, 0xded6960c0be007a8L, + 0x2a11758a7c52c43eL, 0x289de4875bda262dL, 0x6e13eea58caf3fa7L, 0x20c8ed0d5d673c1L, 0xdb4b3e7719d523b6L, + 0x49143c819d111fc3L, 0xe07479f9ddf45d8eL, 0x68f4654bcc07435bL, 0x513bd537af510064L, 0xcf956c3a3933ba38L, + 0x97e1eaa33f88eeccL, 0x18be860a2504a1c5L, 0x84408412fc0bf397L, 0xb6bdba7e154bdf7L, 0x1d8f8b446b544be6L, + 0x6f06b3dcdef17a03L, 0x30c6e14df59f8cefL, 0x1c97ba9910219cfL, 0x33ddcc087d1aeb5cL, 0xe31b94300cfbcbcfL, + 0xadeb8a98786bb28L, 0x3f69d5b0e3ec8f17L, 0x99f5a15f635296a6L, 0xce9fac7526862e86L, 0x3a88964201bd7524L, + 0xec94d643ea71be51L, 0xc4257084d97ab1c5L, 0xf369b10a73b4d382L, 0xac02bb473dbc5fd1L, 0x4fe73a86d95d7222L, + 0x858806616fe3d553L, 0x10680debcb0693e4L, 0xcaa9aac77c954093L, 0xf29c7530415d71e5L, 0xc32b319e09de9e48L, + 0x1c67107ed497ebc4L, 0x731da71593324021L, 0x49774770588c055aL, 0xf978dfdc28084220L, 0x58b3f2780b5a7ecL, + 0xe4ebf2ca21410715L, 0xd3841ed97708421fL, 0xdbc9401dc51eb4eL, 0xf47a96de499aa2e1L, 0x224da94d8542ba0cL, + 0xa3426a80b4dd0a4aL, 0x857caef48ef7e5b6L, 0x11356ad6ede44bf5L, 0x1a32471bd26acd7aL, 0x199396e31de7b358L, + 0xb7ca7950dbbb4a92L, 0x6ab23720409790a7L, 0x2abfdb93a3159d10L, 0x23913b403946c4a7L, 0xac7c9f339a822344L, + 0x12cffe9625cbe744L, 0x89558b98548b1946L, 0x77be65945c191139L, 0x3ba8d1fc701f4347L, 0xb143664560327f20L, + 0x48baccc3ef2081ffL, 0x450c379d24beb8e9L, 0x1990b609485db827L, 0x6c6a565d7129ccb4L, 0xf9724a82872bd619L, + 0xcfe629aa56717e20L, 0xfde48d87e844ec93L, 0xb32f79e5dc9ce4c1L, 0x7c9d88364238519fL, 0xe943aceba65150f9L, + 0x5301e8550cbdd076L, 0xabb8392364453b3cL, 0xdfb4b4a3cf84aa2dL, 0x269e45f7a6b48a42L, 0xd6783043ab383fcfL, + 0xe4ec475d296a69e5L, 0xe2e273ef65555361L, 0x6bd3084210a75af7L, 0xf2ebc493b909d8c7L, 0x4d20f3d435e9bc94L, + 0xa465e41c3c36d433L, 0xc1b259456f4341c0L, 0x260093703d6cf2ebL, 0xda68d9dea0aa9bdaL, 0x5662a12a210b2a47L, + 0x54675bd1a1b4b467L, 0x9dbd416302ec2468L, 0x3c7130a5032d823aL, 0xabfdef2d9a4fd92fL, 0xd4034e276021451fL, + 0x13834d3d0e43ab73L, 0xdc181442b438b2d6L, 0x1736ffb392c25e23L, 0x289b94003a946252L, 0x99705629b221ca37L, + 0xa7b22a5bb26775d6L, 0x2dc12f9f04435661L, 0xaadd48b556bc9e7cL, 0xf6992e8e94b68a49L, 0xd50420466c9456e3L, + 0xea8305ecdfb1266L, 0xfe0b1d7e4f0ef297L, 0x563de834c4e56a46L, 0xc62b8099b5b264c6L, 0xf6e76aeaf533c784L, + 0xd4680470b790968L, 0x288a50754707431eL, 0x8ad167ed38df547eL, 0x9052fed81a8ca4faL, 0x5975ac56f0548ef1L, + 0x588bf7d0130111aeL, 0x9ec02036a6688a24L, 0x8c9a454af9e09984L, 0x333ee6727bd12dcbL, 0x9847468f925dc38cL, + 0x446ed5203696abacL, 0x71fddf9ef5b5def6L, 0xd4d61614cc333541L, 0xd08a0694cd7f72a7L, 0x686cfe3ea1889281L, + 0xf039404e0dd3333fL, 0x52c620eb18b4246L, 0x4e4de47f86d84713L, 0xfe0450396b209851L, 0x99d6e893b01ed92bL, + 0xd94cf8705f8eba86L, 0x763451110c00291bL, 0xdf4f60b9aa45d064L, 0xf473d4bfd86ad526L, 0x41b9e3fa1a6dba94L, + 0xbaa7cdeb00796a4aL, 0xf668194c40626450L, 0xb894e0ae40a9c87fL, 0x5bc1eea8587d3ddbL, 0xc4c0ecb91bb50d75L, + 0x819fdfd17ff2917bL, 0x681484e54b6b12f7L, 0x2f510aa2f8977995L, 0x7d1582a293b8fa3dL, 0x3dad5a0f0da45470L, + 0x33c113aefb480520L, 0xbd524b2da7ce6c1fL, 0xe4cc051d00d8ddc0L, 0x2995950e206efa90L, 0x8b0e5dca588e3f50L, + 0xaabb3583f7f87082L, 0x75dbbecfa34cb4d6L, 0xf195977068849ae8L, 0x9223ca6fbb72767cL, 0xda7211029d59f04eL, + 0x18d9987c6566405cL, 0x57833aa39ef75a04L, 0xd1750e36481f654bL, 0xce2b66bc8796acbL, 0xc7e79aa76c96b057L, + 0x68f95b6b3c5cdc1dL, 0x2f5725cf5fc583aeL, 0x6b973013fd4484a6L, 0xaaeb2687f2d8bb96L, 0xad29cce061ba3934L, + 0xcb60dd1c437eb1d9L, 0x5cd6f46b78181bb4L, 0x1561cdc95ace24d9L, 0xbb774e6705806245L, 0xdc29c8df29b2e975L, + 0x6ee5ba502839dccdL, 0x670869bb64c60f69L, 0x8ca2931e927ae7L, 0x35cf6c0a27d8de77L, 0x94a3d86209af3920L, + 0x4095a276475df5b7L, 0x1119e4c257ccf7fbL, 0x33376166d9064fe8L, 0xd68c2399f968b905L, 0xb7bf2902f40fc101L, + 0x4ec18604cfd551e0L, 0xeb8e7fe1b6678e99L, 0xdcfe68fc0e042fa6L, 0xd2e58dfb1a8e3866L, 0xf4322bc57fb9a35aL, + 0xe0c665c8cf1fb49bL, 0x60de1f1050684297L, 0xf400c04cb00784cdL, 0xfc2a216f12016984L, 0xa808b477fd65fb4aL, + 0xd9b614adfcb5d0f1L, 0x50afdbc66e3efad2L, 0x82337b3f1764851cL, 0xdc98850eb93ef45eL, 0xe1c314bbc2c6af27L, + 0xd35614ba27e74a71L, 0xa5d592e04a31bb6fL, 0x3f143cd0bc243fbeL, 0x81641ac25408b21L, 0xd4166b32a26fc1c6L, + 0xccd088ee4d4a1f67L, 0x698c913d46c1ec99L, 0xf6b9086a5b986abL, 0x4a73c05ef72e3595L, 0x307aeeb350ab081L, + 0x43e20045bcb06b0eL, 0x3f58d1d6cd3aa0dcL, 0xd71cd7c996faba80L, 0x4431d8268eebfb71L, 0x254246df109e3dd5L, + 0xa7ca1449a238b06aL, 0x49b40e7b082493e7L, 0x45d80e6bd330d613L, 0xaf3d8a578b6d6232L, 0xa4b98341785262d1L, + 0xf4f1f424af963102L, 0xa84a986395146774L, 0x90da037fb61d5c88L, 0xb645534b2cf5b89fL, 0x3fdb3073310934b4L, + 0x1a0307d01f57f514L, 0x509c9b87a4a1e66cL, 0xbf320cf0888d8aa8L, 0x45a51f76c5f76892L, 0x23eb7a2b99a64402L, + 0x4c600e5675dd7757L, 0x4896757aa01a5c34L, 0xb808dbbda7a8a1daL, 0x762c21058ba50349L, 0x99b0a9d5deeebb37L, + 0xd6d98ef70a1e465dL, 0xb052f2c1163894f6L, 0xc55e73526f8bc8faL, 0xb31a0537f5b3b269L, 0xf09c1819c0c7f78aL, + 0xc36d4e2187e430f8L, 0xf141831a47299c7bL, 0x62f938047903ef34L, 0xf2a0dd678f92e0a5L, 0xc7fe6a53efaaa65L, + 0xcc539fcdcc466310L, 0x55199357cdc55491L, 0x6917fb45babb399eL, 0xb098da3c7b012b1aL, 0x54916438f426c41L, + 0x1a5ff3356d77d43bL, 0x74e71995e0aacf1aL, 0x6562a8da6b5e69eeL, 0xacbc2b8d1fb16ea8L, 0x400ea8e1f3f5535eL, + 0x2ea792dad3a4538fL, 0xf580fe481db60b5cL, 0xcb101198dd0aba9fL, 0x259acbe0461cb837L, 0x30033c3964b56a40L, + 0x6c15d4283eeb6fa6L, 0xdea7b626998ea3eeL, 0xdbb2e1b8c0c2abdbL, 0x3a856a6742b6edc2L, 0x777ed6b1683f48bL, + 0xde72fd7d6db3bb63L, 0xc8766969b599dc68L, 0xb39a5b76dce26160L, 0x97464948ce81d8a2L, 0xae20fda5af404ae6L, + 0xde1100c4f1ae3265L, 0x5a94d43bf60f574L, 0xc087a2116f52d0fcL, 0xfacb3be87e615d89L, 0xe184cb9fba7b0feL, + 0x824779bede6d84ffL, 0xa0852e96875da152L, 0x620046e8ba89baefL, 0x247c32c5f34b08ddL, 0x49294468356e7298L, + 0xaf6d6e0f8b5009ebL, 0x8c25bfcdb8abd77fL, 0x4f5464a1bc417e38L, 0x2df8fbe8993f8c9fL, 0x6540566281dd6d91L, + 0xb90690dcfb03a83L, 0xe270b7c7f8fab463L, 0x898ead41792a7f87L, 0xa1b1248822b7c292L, 0xfa2c0d61dd383eabL, + 0x5574c091830bd677L, 0x43640e20702986e5L, 0x622d0a1c860d0302L, 0x9528ea0051990eb9L, 0x28f057ef30af388fL, + 0x88320e974a2721a0L, 0x8a12cb33cdd88b60L, 0xd91a9763f991780dL, 0xdf22e332867c0e97L, 0xad95801b6c801f10L, + 0xb34e21d4afe2c4a0L, 0xd5465bf172494dd3L, 0x16594af34f1b5767L, 0xa675dceaee1591e6L, 0x53db891db5e1d768L, + 0x39a80f5d365c71afL, 0xdce01c73eac54372L, 0x1087fb03e5ce69e9L, 0x67cac3905594378L, 0x275d24c9aa1607f0L, + 0x9163a77a53e361b8L, 0x17d10f8254fa7f0bL, 0x49efeab6642e9e45L, 0x376e24839b1df1beL, 0xc46221cc408546fL, + 0x98eb5bb7001ebf5cL, 0xc6c4d56e3c9a78efL, 0x23c0723e123a899L, 0x145912ec44b57548L, 0x488a34fe824ff4c3L, + 0xac3bc6de9929c707L, 0x1dbac6e98813a70fL, 0xf566054941858266L, 0x18e0a3a2a8b8f2f1L, 0xcc6245a26564a399L, + 0x14416ca0e1a84a9aL, 0x4eaf095631a6e7bfL, 0xf2f89f104c9d0b8dL, 0x8fb278a5953e52d8L, 0x8fcee83a30a8be30L, + 0xb66850da1a0ceb33L, 0x5f37d31bad76f4dcL, 0xff4d956ffea8dea4L, 0x78c583b396635b3L, 0xad268fb5b1105028L, + 0xa480149a0dcbc5f4L, 0xb0e8d69c8b15c864L, 0x6ed49c46f19bb8eaL, 0x7f1871fdf321818dL, 0x1ec5816f5a9843eaL, + 0x77c8da91b5313675L, 0x4cdb66ad515e0717L, 0x2ec4712b0bfdfcd6L, 0x6c6f5767fff27330L, 0x71083b972d80c0cL, + 0x8d8325e82c4fdcdcL, 0xb47a658dad8e13a4L, 0x88710bf005fda027L, 0x69bd3edaf7111200L, 0xdccdd0c65c810ffL, + }; + + for (int i = 0; i < refLong.length; ++i) { + Assert.assertEquals(refLong[i], rng.nextLong()); + } + } +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/test/java/org/apache/commons/math4/rng/internal/source64/SplitMix64Test.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/rng/internal/source64/SplitMix64Test.java b/src/test/java/org/apache/commons/math4/rng/internal/source64/SplitMix64Test.java new file mode 100644 index 0000000..d2d980f --- /dev/null +++ b/src/test/java/org/apache/commons/math4/rng/internal/source64/SplitMix64Test.java @@ -0,0 +1,45 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.rng.internal.source64; + +import org.junit.Assert; +import org.junit.Test; + +public class SplitMix64Test { + @Test + public void testReferenceCode() { + final long refSeed = 0x1a2b3c4d5e6f7531L; + final SplitMix64 rng = new SplitMix64(refSeed); + + final long[] refValues = { + 0x4141302768c9e9d0L, 0x64df48c4eab51b1aL, 0x4e723b53dbd901b3L, 0xead8394409dd6454L, + 0x3ef60e485b412a0aL, 0xb2a23aee63aecf38L, 0x6cc3b8933c4fa332L, 0x9c9e75e031e6fccbL, + 0x0fddffb161c9f30fL, 0x2d1d75d4e75c12a3L, 0xcdcf9d2dde66da2eL, 0x278ba7d1d142cfecL, + 0x4ca423e66072e606L, 0x8f2c3c46ebc70bb7L, 0xc9def3b1eeae3e21L, 0x8e06670cd3e98bceL, + 0x2326dee7dd34747fL, 0x3c8fff64392bb3c1L, 0xfc6aa1ebe7916578L, 0x3191fb6113694e70L, + 0x3453605f6544dac6L, 0x86cf93e5cdf81801L, 0x0d764d7e59f724dfL, 0xae1dfb943ebf8659L, + 0x012de1babb3c4104L, 0xa5a818b8fc5aa503L, 0xb124ea2b701f4993L, 0x18e0374933d8c782L, + 0x2af8df668d68ad55L, 0x76e56f59daa06243L, 0xf58c016f0f01e30fL, 0x8eeafa41683dbbf4L, + 0x7bf121347c06677fL, 0x4fd0c88d25db5ccbL, 0x99af3be9ebe0a272L, 0x94f2b33b74d0bdcbL, + 0x24b5d9d7a00a3140L, 0x79d983d781a34a3cL, 0x582e4a84d595f5ecL, 0x7316fe8b0f606d20L, + }; + + for (int i = 0; i < refValues.length; ++i) { + Assert.assertEquals(refValues[i], rng.nextLong()); + } + } +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/test/java/org/apache/commons/math4/rng/internal/source64/TwoCmresTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/rng/internal/source64/TwoCmresTest.java b/src/test/java/org/apache/commons/math4/rng/internal/source64/TwoCmresTest.java new file mode 100644 index 0000000..8505e6b --- /dev/null +++ b/src/test/java/org/apache/commons/math4/rng/internal/source64/TwoCmresTest.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.rng.internal.source64; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.commons.math4.exception.InsufficientDataException; +import org.apache.commons.math4.exception.DimensionMismatchException; + +public class TwoCmresTest { + @Test + public void testAsymmetric() { + final int index1 = 2; + final int index2 = 5; + final int seed = -123456789; + + final TwoCmres rng1 = new TwoCmres(seed, index1, index2); + final TwoCmres rng2 = new TwoCmres(seed, index2, index1); + + // Try a few values. + final int n = 1000; + for (int i = 0; i < n; i++) { + Assert.assertNotEquals("i=" + i, rng1.nextLong(), rng2.nextLong()); + } + } + + @Test + public void testSubcycleGeneratorsMustBeDifferent() { + final int max = TwoCmres.numberOfSubcycleGenerators(); + for (int i = 0; i < max; i++) { + try { + new TwoCmres(-97845, i, i); + Assert.fail("Exception expected"); + } catch (InsufficientDataException e) { + // Expected. + } + } + } +} + http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/test/java/org/apache/commons/math4/rng/internal/source64/XorShift1024StarTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/rng/internal/source64/XorShift1024StarTest.java b/src/test/java/org/apache/commons/math4/rng/internal/source64/XorShift1024StarTest.java new file mode 100644 index 0000000..e9f2fa7 --- /dev/null +++ b/src/test/java/org/apache/commons/math4/rng/internal/source64/XorShift1024StarTest.java @@ -0,0 +1,55 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.rng.internal.source64; + +import org.junit.Assert; +import org.junit.Test; + +public class XorShift1024StarTest { + @Test + public void testReferenceCode() { + /* + * Data from running the executable compiled from the author's C code: + * http://xorshift.di.unimi.it/xorshift1024star.c + */ + final long[] refSeed = new long[] { + 0x012de1babb3c4104L, 0xa5a818b8fc5aa503L, 0xb124ea2b701f4993L, 0x18e0374933d8c782L, + 0x2af8df668d68ad55L, 0x76e56f59daa06243L, 0xf58c016f0f01e30fL, 0x8eeafa41683dbbf4L, + 0x7bf121347c06677fL, 0x4fd0c88d25db5ccbL, 0x99af3be9ebe0a272L, 0x94f2b33b74d0bdcbL, + 0x24b5d9d7a00a3140L, 0x79d983d781a34a3cL, 0x582e4a84d595f5ecL, 0x7316fe8b0f606d20L, + }; + + final XorShift1024Star rng = new XorShift1024Star(refSeed); + + final long[] refValues = { + 0xd85e9fc0855614cdL, 0xaf4965c9c1ac6a3dL, 0x067da398791111d8L, 0x2771c41db58d7644L, + 0xf71a471e1ac2b03eL, 0x953449ae275f7409L, 0x8aa570c72de0af5eL, 0xae59db2acdae32beL, + 0x3d46f316b8f97301L, 0x72dc8399b7a70957L, 0xf5624d788b3b6f4eL, 0xb7a79275f6c0e7b1L, + 0xf79354208377d498L, 0x0e5d2f2ac2b4f28fL, 0x0f8f57edc8aa802fL, 0x5e918ea72ece0c36L, + 0xeeb8dbdb00ac7a5aL, 0xf16f88dfef0d6047L, 0x1244c29e0e0d8d2dL, 0xaa94f1cc42691eb7L, + 0xd06425dd329e5de5L, 0x968b1c2e016f159cL, 0x6aadff7055065295L, 0x3bce2efcb0d00876L, + 0xb28d5b69ad8fb719L, 0x1e4040c451376920L, 0x6b0801a8a00de7d7L, 0x891ba2cbe2a4675bL, + 0x6355008481852527L, 0x7a47bcd9960126f3L, 0x07f72fcd4ebe3580L, 0x4658b29c126840ccL, + 0xdc7b36d3037c7539L, 0x9e30aab0410122e8L, 0x7215126e0fce932aL, 0xda63f12a489fc8deL, + 0x769997671b2a0158L, 0xfa9cd84e0ffc174dL, 0x34df1cd959dca211L, 0xccea41a33ec1f763L, + }; + + for (int i = 0; i < refValues.length; ++i) { + Assert.assertEquals(refValues[i], rng.nextLong()); + } + } +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/test/java/org/apache/commons/math4/rng/internal/util/NumberFactoryTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/rng/internal/util/NumberFactoryTest.java b/src/test/java/org/apache/commons/math4/rng/internal/util/NumberFactoryTest.java new file mode 100644 index 0000000..ae9bc8d --- /dev/null +++ b/src/test/java/org/apache/commons/math4/rng/internal/util/NumberFactoryTest.java @@ -0,0 +1,164 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.rng.internal.util; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.commons.math4.exception.DimensionMismatchException; + +/** + * Tests for the {@link NumberFactory}. + */ +public class NumberFactoryTest { + /** sizeof(int). */ + final int INT_SIZE = 4; + /** sizeof(long). */ + final int LONG_SIZE = 8; + + /** Test values. */ + private static final long[] LONG_TEST_VALUES = new long[] { + 0L, + 1L, + -1L, + 19337L, + 1234567891011213L, + -11109876543211L, + Long.valueOf(Integer.MAX_VALUE), + Long.valueOf(Integer.MIN_VALUE), + Long.MAX_VALUE, + Long.MIN_VALUE, + }; + /** Test values. */ + private static final int[] INT_TEST_VALUES = new int[] { + 0, + 1, + -1, + 19337, + 1234567891, + -1110987656, + Integer.MAX_VALUE, + Integer.MIN_VALUE, + }; + + @Test + public void testMakeIntFromLong() { + for (long v : LONG_TEST_VALUES) { + final int vL = NumberFactory.extractLo(v); + final int vH = NumberFactory.extractHi(v); + + final long actual = (((long) vH) << 32) | (vL & 0xffffffffL); + Assert.assertEquals(v, actual); + } + } + + @Test + public void testLong2Long() { + for (long v : LONG_TEST_VALUES) { + final int vL = NumberFactory.extractLo(v); + final int vH = NumberFactory.extractHi(v); + + Assert.assertEquals(v, NumberFactory.makeLong(vH, vL)); + } + } + + @Test + public void testLongFromByteArray2Long() { + for (long expected : LONG_TEST_VALUES) { + final byte[] b = NumberFactory.makeByteArray(expected); + Assert.assertEquals(expected, NumberFactory.makeLong(b)); + } + } + + @Test + public void testLongArrayFromByteArray2LongArray() { + final byte[] b = NumberFactory.makeByteArray(LONG_TEST_VALUES); + Assert.assertArrayEquals(LONG_TEST_VALUES, + NumberFactory.makeLongArray(b)); + } + + @Test + public void testIntFromByteArray2Int() { + for (int expected : INT_TEST_VALUES) { + final byte[] b = NumberFactory.makeByteArray(expected); + Assert.assertEquals(expected, NumberFactory.makeInt(b)); + } + } + + @Test + public void testIntArrayFromByteArray2IntArray() { + final byte[] b = NumberFactory.makeByteArray(INT_TEST_VALUES); + Assert.assertArrayEquals(INT_TEST_VALUES, + NumberFactory.makeIntArray(b)); + } + + @Test + public void testMakeIntPrecondition1() { + for (int i = 0; i <= 10; i++) { + try { + NumberFactory.makeInt(new byte[i]); + if (i != INT_SIZE) { + Assert.fail("Exception expected"); + } + } catch (DimensionMismatchException e) { + // Expected. + } + } + } + + @Test + public void testMakeIntArrayPrecondition1() { + for (int i = 0; i <= 20; i++) { + try { + NumberFactory.makeIntArray(new byte[i]); + if (i != 0 && (i % INT_SIZE != 0)) { + Assert.fail("Exception expected"); + } + } catch (DimensionMismatchException e) { + // Expected. + } + } + } + + @Test + public void testMakeLongPrecondition1() { + for (int i = 0; i <= 10; i++) { + try { + NumberFactory.makeLong(new byte[i]); + if (i != LONG_SIZE) { + Assert.fail("Exception expected"); + } + } catch (DimensionMismatchException e) { + // Expected. + } + } + } + + @Test + public void testMakeLongArrayPrecondition1() { + for (int i = 0; i <= 20; i++) { + try { + NumberFactory.makeLongArray(new byte[i]); + if (i != 0 && (i % LONG_SIZE != 0)) { + Assert.fail("Exception expected"); + } + } catch (DimensionMismatchException e) { + // Expected. + } + } + } +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/test/java/org/apache/commons/math4/rng/internal/util/SeedFactoryTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/commons/math4/rng/internal/util/SeedFactoryTest.java b/src/test/java/org/apache/commons/math4/rng/internal/util/SeedFactoryTest.java new file mode 100644 index 0000000..559f484 --- /dev/null +++ b/src/test/java/org/apache/commons/math4/rng/internal/util/SeedFactoryTest.java @@ -0,0 +1,111 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.rng.internal.util; + +import java.util.Map; +import java.util.HashMap; +import org.junit.Assert; +import org.junit.Test; + +/** + * Tests for {@link SeedFactory}. + */ +public class SeedFactoryTest { + @Test + public void testCreateLong() { + final Map<Long, Integer> values = new HashMap<>(); + + final int n = 100000; + for (int i = 0; i < n; i++) { + final long v = SeedFactory.createLong(); + + Integer count = values.get(v); + if (count == null) { + count = 0; + } + values.put(v, count + 1); + } + + // Check that all seeds are different. + assertDifferentValues(values); + } + + @Test + public void testCreateLongArray() { + final Map<Long, Integer> values = new HashMap<>(); + + final int n = 100000; + final long[] array = SeedFactory.createLongArray(n); + Assert.assertEquals(n, array.length); + + for (long v : array) { + Integer count = values.get(v); + if (count == null) { + count = 0; + } + values.put(v, count + 1); + } + + // Check that all seeds are different. + assertDifferentValues(values); + } + + @Test + public void testCreateIntArray() { + final Map<Long, Integer> values = new HashMap<>(); + + for (int i = 0; i < 50000; i++) { + final int[] a = SeedFactory.createIntArray(2); + final long v = NumberFactory.makeLong(a[0], a[1]); + Integer count = values.get(v); + if (count == null) { + count = 0; + } + values.put(v, count + 1); + } + + // Check that all pairs in are different. + assertDifferentValues(values); + } + + /** + * Asserts that all the keys in given {@code map} have their + * value equal to 1. + * + * @param map Map to counts. + */ + private static <T> void assertDifferentValues(Map<T, Integer> map) { + final StringBuilder sb = new StringBuilder(); + + int duplicates = 0; + for (Map.Entry<T, Integer> entry : map.entrySet()) { + final int count = entry.getValue(); + if (count <= 0) { + throw new IllegalStateException(); + } + + if (count > 1) { + duplicates += count - 1; + sb.append(entry.getKey() + ": " + count + "\n"); + } + } + + if (duplicates > 0) { + Assert.fail(duplicates + " duplicates\n" + sb); + } + } +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/userguide/README ---------------------------------------------------------------------- diff --git a/src/userguide/README b/src/userguide/README index 9aa0238..7ee72a0 100644 --- a/src/userguide/README +++ b/src/userguide/README @@ -5,4 +5,17 @@ examples of use. In order to run one of the applications (a class that must contain a "main" method), you would type (in a shell console) a command similar to the following: - $ mvn -q exec:java -Dexec.mainClass=org.apache.commons.math4.userguide.sofm.ChineseRingsClassifier + $ mvn -q exec:java \ + -Dexec.mainClass=org.apache.commons.math4.userguide.sofm.ChineseRingsClassifier + +Alternatively, a "standalone" JAR can be created with the following +command: + $ mvn -Dmainclass=org.apache.commons.math4.userguide.rng.RandomStressTester \ + -Djarbasename=RandomStressTester \ + clean compile assembly:single +where the value of the "mainclass" argument is the fully-qualified name +of the class whose "main" method will be the program's entry point, and +the "jarbasename" argument is the basename of the JAR file to be created. +Then, the application can be run with the following command: + $ java -jar RandomStressTester [args] +where "[args]" is the list of arguments passed to the "main" method. http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/userguide/c/rng/stdin2testu01.c ---------------------------------------------------------------------- diff --git a/src/userguide/c/rng/stdin2testu01.c b/src/userguide/c/rng/stdin2testu01.c new file mode 100644 index 0000000..d1a4a6a --- /dev/null +++ b/src/userguide/c/rng/stdin2testu01.c @@ -0,0 +1,127 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * Utility for simple interfacing with the "TestU01" library: + * http://simul.iro.umontreal.ca/testu01/tu01.html + * + * It reads from its standard input an infinite sequence of 32-bits + * integers and runs one of the test suites "SmallCrush", "Crush" or + * "BigCrush". + * "TestU01" writes its report to standard output. + */ + +#include <stdint.h> +#include <unistd.h> +#include <string.h> + +#include <testu01/unif01.h> +#include <testu01/bbattery.h> +#include <testu01/util.h> + +#define TU_S "SmallCrush" +#define TU_C "Crush" +#define TU_B "BigCrush" +#define BUFFER_LENGTH 256 + +typedef struct { + unsigned long buffer[BUFFER_LENGTH]; + uint32_t index; +} StdinReader_state; + +unsigned long nextInt(void *par, + void *sta) { + StdinReader_state *state = (StdinReader_state *) sta; + if (state->index >= BUFFER_LENGTH) { + /* Refill. */ + fread(state->buffer, sizeof(unsigned long), BUFFER_LENGTH, stdin); + state->index = 0; + } + + uint32_t random = state->buffer[state->index]; + ++state->index; /* Next request. */ + + return random; +} + +double nextDouble(void *par, + void *sta) { + return nextInt(par, sta) / 4294967296.0; +} + + +static void dummy(void *sta) { + printf("N/A"); + + return; +} + +unif01_Gen *createStdinReader(void) { + unif01_Gen *gen; + StdinReader_state *state; + size_t len; + char name[60]; + + state = util_Malloc(sizeof(StdinReader_state)); + + gen = util_Malloc(sizeof(unif01_Gen)); + gen->state = state; + gen->param = NULL; + gen->Write = dummy; + gen->GetU01 = nextDouble; + gen->GetBits = nextInt; + + strcpy(name, "stdin"); + len = strlen(name); + gen->name = util_Calloc(len + 1, sizeof (char)); + strncpy(gen->name, name, len); + + // Read binary input. + freopen(NULL, "rb", stdin); + state->index = BUFFER_LENGTH; + + return gen; +} + +void deleteStdinReader(unif01_Gen *gen) { + gen->state = util_Free(gen->state); + gen->name = util_Free(gen->name); + util_Free(gen); +} + +int main(int argc, + char **argv) { + unif01_Gen *gen = createStdinReader(); + char *spec = argv[1]; + + if (argc < 2) { + printf("[ERROR] Specify test suite: '%s', '%s' or '%s'\n", TU_S, TU_C, TU_B); + exit(1); + } else if (strcmp(spec, TU_S) == 0) { + bbattery_SmallCrush(gen); + } else if (strcmp(spec, TU_C) == 0) { + bbattery_Crush(gen); + } else if (strcmp(spec, TU_B) == 0) { + bbattery_BigCrush(gen); + } else { + printf("[ERROR] Unknown specification: '%s'\n", spec); + exit(1); + } + + deleteStdinReader(gen); + return 0; +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/userguide/java/org/apache/commons/math4/userguide/rng/GeneratorsList.java ---------------------------------------------------------------------- diff --git a/src/userguide/java/org/apache/commons/math4/userguide/rng/GeneratorsList.java b/src/userguide/java/org/apache/commons/math4/userguide/rng/GeneratorsList.java new file mode 100644 index 0000000..043bce9 --- /dev/null +++ b/src/userguide/java/org/apache/commons/math4/userguide/rng/GeneratorsList.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.userguide.rng; + +import java.util.List; +import java.util.ArrayList; +import java.util.Iterator; + +import org.apache.commons.math4.rng.UniformRandomProvider; +import org.apache.commons.math4.rng.RandomSource; + +/** + * List of generators. + */ +public class GeneratorsList implements Iterable<UniformRandomProvider> { + /** List. */ + private final List<UniformRandomProvider> list = new ArrayList<>(); + + /** + * Creates list. + */ + public GeneratorsList() { + list.add(RandomSource.create(RandomSource.JDK)); + list.add(RandomSource.create(RandomSource.MT)); + list.add(RandomSource.create(RandomSource.WELL_512_A)); + list.add(RandomSource.create(RandomSource.WELL_1024_A)); + list.add(RandomSource.create(RandomSource.WELL_19937_A)); + list.add(RandomSource.create(RandomSource.WELL_19937_C)); + list.add(RandomSource.create(RandomSource.WELL_44497_A)); + list.add(RandomSource.create(RandomSource.WELL_44497_B)); + list.add(RandomSource.create(RandomSource.ISAAC)); + list.add(RandomSource.create(RandomSource.MT_64)); + list.add(RandomSource.create(RandomSource.SPLIT_MIX_64)); + list.add(RandomSource.create(RandomSource.XOR_SHIFT_1024_S)); + list.add(RandomSource.create(RandomSource.TWO_CMRES)); + } + + /** {@inheritDoc} */ + @Override + public Iterator<UniformRandomProvider> iterator() { + return list.iterator(); + } +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/userguide/java/org/apache/commons/math4/userguide/rng/RandomStressTester.java ---------------------------------------------------------------------- diff --git a/src/userguide/java/org/apache/commons/math4/userguide/rng/RandomStressTester.java b/src/userguide/java/org/apache/commons/math4/userguide/rng/RandomStressTester.java new file mode 100644 index 0000000..e257b53 --- /dev/null +++ b/src/userguide/java/org/apache/commons/math4/userguide/rng/RandomStressTester.java @@ -0,0 +1,280 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.math4.userguide.rng; + +import java.util.List; +import java.util.ArrayList; +import java.util.Arrays; +import java.io.IOException; +import java.io.File; +import java.io.PrintWriter; +import java.io.FileWriter; +import java.io.DataOutputStream; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +import org.apache.commons.math4.rng.UniformRandomProvider; + +/** + * Class that can be used for testing a generator by piping the values + * returned by its {@link UniformRandomProvider#nextInt()} method to a + * program that reads {@code int} values from its standard input and + * writes an analysis report to standard output. + * + * <p> + * The <a href="http://www.phy.duke.edu/~rgb/General/dieharder.php"> + * "dieharder"</a> test suite is such a software. + * <br> + * Example of command line, assuming that "examples.jar" specifies this + * class as the "main" class (see {@link #main(String[]) main} method): + * <pre><code> + * $ java -jar examples.jar \ + * report/dh_ \ + * 4 \ + * org.apache.commons.math4.userguide.rng.GeneratorsList \ + * /usr/bin/dieharder -a -g 200 -Y 1 -k 2 + * </code></pre> + * </p> + */ +public class RandomStressTester { + /** Comment prefix. */ + private static final String C = "# "; + /** New line. */ + private static final String N = "\n"; + /** Command line. */ + private final List<String> cmdLine; + /** Output prefix. */ + private final String fileOutputPrefix; + + /** + * Creates the application. + * + * @param cmd Command line. + * @param outputPrefix Output prefix for file reports. + */ + private RandomStressTester(List<String> cmd, + String outputPrefix) { + final File exec = new File(cmd.get(0)); + if (!exec.exists() || + !exec.canExecute()) { + throw new RuntimeException("Program is not executable: " + exec); + } + + cmdLine = new ArrayList<String>(cmd); + fileOutputPrefix = outputPrefix; + + final File reportDir = new File(fileOutputPrefix).getParentFile(); + if (!reportDir.exists() || + !reportDir.isDirectory() || + !reportDir.canWrite()) { + throw new RuntimeException("Invalid output directory: " + reportDir); + } + } + + /** + * Program's entry point. + * + * @param args Application's arguments. + * The order is as follows: + * <ul> + * <li>Output prefix: Filename prefix where the output of the analysis will + * written to. The appended suffix is the index of the instance within the + * list of generators to be tested.</li> + * <li>Number of threads to use concurrently: One thread will process one of + * the generators to be tested.</li> + * <li>Name of a class that implements {@code Iterable<UniformRandomProvider>} + * (and defines a default constructor): Each generator of the list will be + * tested by one instance of the analyzer program</li> + * <li>Path to the executable: this is the analyzer software that reads 32-bits + * integers from stdin.</li> + * <li>All remaining arguments are passed to the executable.</li> + * </ul> + */ + public static void main(String[] args) throws Exception { + final String output = args[0]; + final int numThreads = Integer.valueOf(args[1]); + + final Iterable<UniformRandomProvider> rngList = createGeneratorsList(args[2]); + + final List<String> cmdLine = new ArrayList<>(); + cmdLine.addAll(Arrays.asList(Arrays.copyOfRange(args, 3, args.length))); + + final RandomStressTester app = new RandomStressTester(cmdLine, output); + app.run(rngList, numThreads); + } + + /** + * Creates the tasks and starts the processes. + * + * @param generators List of generators to be analyzed. + * @param numConcurrentTasks Number of concurrent tasks. + * Twice as many threads will be started: one thread for the RNG and one + * for the analyzer. + */ + private void run(Iterable<UniformRandomProvider> generators, + int numConcurrentTasks) + throws IOException { + // Parallel execution. + final ExecutorService service = Executors.newFixedThreadPool(numConcurrentTasks); + + // Placeholder (output will be "null"). + final List<Future<?>> execOutput = new ArrayList<Future<?>>(); + + // Run tasks. + int count = 0; + for (UniformRandomProvider rng : generators) { + final File output = new File(fileOutputPrefix + (++count)); + final Runnable r = new Task(rng, output); + execOutput.add(service.submit(r)); + } + + // Wait for completion (ignoring return value). + try { + for (Future<?> f : execOutput) { + try { + f.get(); + } catch (ExecutionException e) { + System.err.println(e.getCause().getMessage()); + } + } + } catch (InterruptedException ignored) {} + + // Terminate all threads. + service.shutdown(); + } + + /** + * Creates the list of generators to be tested. + * + * @param name Name of the class that contains the generators to be + * analyzed. + * @return the list of generators. + */ + private static Iterable<UniformRandomProvider> createGeneratorsList(String name) + throws ClassNotFoundException, + InstantiationException, + IllegalAccessException { + return (Iterable<UniformRandomProvider>) Class.forName(name).newInstance(); + } + + /** + * Pipes random numbers to the standard input of an analyzer. + */ + private class Task implements Runnable { + /** Directory for reports of the tester processes. */ + private final File output; + /** RNG to be tested. */ + private final UniformRandomProvider rng; + + /** + * Creates the task. + * + * @param random RNG to be tested. + * @param report Report file. + */ + public Task(UniformRandomProvider random, + File report) { + rng = random; + output = report; + } + + /** {@inheritDoc} */ + @Override + public void run() { + try { + // Write header. + printHeader(output, rng); + + // Start test suite. + final ProcessBuilder builder = new ProcessBuilder(cmdLine); + builder.redirectOutput(ProcessBuilder.Redirect.appendTo(output)); + final Process testingProcess = builder.start(); + final DataOutputStream sink = new DataOutputStream(testingProcess.getOutputStream()); + + final long startTime = System.nanoTime(); + + try { + while (true) { + sink.writeInt(rng.nextInt()); + } + } catch (IOException e) { + // Hopefully getting here when the analyzing software terminates. + } + + final long endTime = System.nanoTime(); + + // Write footer. + printFooter(output, endTime - startTime); + + } catch (IOException e) { + throw new RuntimeException("Failed to start task: " + e.getMessage()); + } + } + } + + /** + * @param output File. + * @param rng Generator being tested. + * @param cmdLine + */ + private void printHeader(File output, + UniformRandomProvider rng) + throws IOException { + final StringBuilder sb = new StringBuilder(); + sb.append(C).append(N); + sb.append(C).append("RNG: ").append(rng.toString()).append(N); + sb.append(C).append(N); + sb.append(C).append("Java: ").append(System.getProperty("java.version")).append(N); + sb.append(C).append("Runtime: ").append(System.getProperty("java.runtime.version", "?")).append(N); + sb.append(C).append("JVM: ").append(System.getProperty("java.vm.name")) + .append(" ").append(System.getProperty("java.vm.version")).append(N); + sb.append(C).append("OS: ").append(System.getProperty("os.name")) + .append(" ").append(System.getProperty("os.version")) + .append(" ").append(System.getProperty("os.arch")).append(N); + sb.append(C).append(N); + + sb.append(C).append("Analyzer: "); + for (String s : cmdLine) { + sb.append(s).append(" "); + } + sb.append(N); + sb.append(C).append(N); + + final PrintWriter w = new PrintWriter(new FileWriter(output, true)); + w.print(sb.toString()); + w.close(); + } + + /** + * @param output File. + * @param nanoTime Duration of the run. + */ + private void printFooter(File output, + long nanoTime) + throws IOException { + final PrintWriter w = new PrintWriter(new FileWriter(output, true)); + w.println(C); + + final double duration = ((double) nanoTime) * 1e-9 / 60; + w.println(C + "Test duration: " + duration + " minutes"); + + w.println(C); + w.close(); + } +} http://git-wip-us.apache.org/repos/asf/commons-math/blob/6ddf4769/src/userguide/pom.xml ---------------------------------------------------------------------- diff --git a/src/userguide/pom.xml b/src/userguide/pom.xml index 2f8ac91..4f3c888 100644 --- a/src/userguide/pom.xml +++ b/src/userguide/pom.xml @@ -45,6 +45,36 @@ <build> <sourceDirectory>java</sourceDirectory> + + <plugins> + + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <archive> + <manifest> + <mainClass>${mainclass}</mainClass> + </manifest> + </archive> + <descriptorRefs> + <descriptorRef>jar-with-dependencies</descriptorRef> + </descriptorRefs> + <finalName>${jarbasename}</finalName> + <appendAssemblyId>false</appendAssemblyId> + </configuration> + <executions> + <execution> + <id>make-assembly</id> <!-- this is used for inheritance merges --> + <phase>package</phase> <!-- bind to the packaging phase --> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + </plugin> + + </plugins> + </build> <reporting> </reporting>