/* * JaamSim Discrete Event Simulation * Copyright (C) 2014 Ausenco Engineering Canada Inc. * * Licensed 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 com.jaamsim.rng; import static org.junit.Assert.assertTrue; import org.junit.Test; public class TestMRG1999a { @Test public void testKnownStreams() { long[] seeds1 = { 0, 0, 1, 0, 0, 1 }; String[] known1 = { "0, 0, 1, 0, 0, 1", "949770784, 3580155704, 1230515664, 1610723613, 1022607788, 2093834863", "3106427820, 3199155377, 4290900039, 3167429889, 3572939265, 698814233", "693938118, 3153461912, 1636264737, 2581649800, 1834943086, 290967548", "3188270128, 1934119675, 826363896, 4070445105, 1933248566, 3962062826", "3757485922, 572568472, 2395114552, 3590438463, 538674679, 2165238291", "4075809725, 1035961073, 56103715, 329763193, 1230302420, 3869031993", "687667041, 1179017059, 5861898, 3354556565, 1742222303, 2941424961", "2481284279, 4288164505, 1177260757, 567967482, 784865788, 3134382704", "1515873698, 4089072055, 163684167, 1094056604, 3798743924, 3295131466", "920035025, 408996081, 2433373148, 673478093, 1620020757, 2269902114" }; String test1 = String.format("%d, %d, %d, %d, %d, %d", seeds1[0], seeds1[1], seeds1[2], seeds1[3], seeds1[4], seeds1[5]); assertTrue(test1.equals(known1[0])); for (int i = 1; i < known1.length; i++) { MRG1999a.advanceStream(seeds1); test1 = String.format("%d, %d, %d, %d, %d, %d", seeds1[0], seeds1[1], seeds1[2], seeds1[3], seeds1[4], seeds1[5]); assertTrue(test1.equals(known1[i])); } String[] known2 = { "12345, 12345, 12345, 12345, 12345, 12345", "3692455944, 1366884236, 2968912127, 335948734, 4161675175, 475798818", "1015873554, 1310354410, 2249465273, 994084013, 2912484720, 3876682925", "2338701263, 1119171942, 2570676563, 317077452, 3194180850, 618832124", "1597262096, 3906379055, 3312112953, 1016013135, 4099474108, 275305423", "97147054, 3131372450, 829345164, 3691032523, 3006063034, 4259826321", "796079799, 2105258207, 955365076, 2923159030, 4116632677, 3067683584", "3281794178, 2616230133, 1457051261, 2762791137, 2480527362, 2282316169", "3777646647, 1837464056, 4204654757, 664239048, 4190510072, 2959195122", "4215590817, 3862461878, 1087200967, 1544910132, 936383720, 1611370123", "1683636369, 362165168, 814316280, 869382050, 980203903, 2062101717" }; long[] seeds2 = { 12345, 12345, 12345, 12345, 12345, 12345 }; String test2 = String.format("%d, %d, %d, %d, %d, %d", seeds2[0], seeds2[1], seeds2[2], seeds2[3], seeds2[4], seeds2[5]); assertTrue(test2.equals(known2[0])); for (int i = 1; i < known2.length; i++) { MRG1999a.advanceStream(seeds2); test2 = String.format("%d, %d, %d, %d, %d, %d", seeds2[0], seeds2[1], seeds2[2], seeds2[3], seeds2[4], seeds2[5]); assertTrue(test2.equals(known2[i])); } } @Test public void testKnownSubstreams() { long[] seeds1 = { 0, 0, 1, 0, 0, 1 }; String[] known1 = { "0, 0, 1, 0, 0, 1", "4127413238, 1871391091, 69195019, 1610795712, 3889917532, 3708466080", "99651939, 2329303404, 2931758910, 878035866, 1926628839, 3196114006", "230171794, 3210181465, 3536018417, 2865846472, 1249197731, 3331097822", "1314332382, 1588259595, 2508077280, 3182508868, 3038399593, 2980208068", "4010413858, 401645099, 2106045662, 384279948, 1923026173, 564222425", "2307614257, 2703042396, 2823695054, 2384208331, 3412123799, 1365035178", "520437440, 4210727080, 3707259965, 804702670, 2645232736, 4072194992", "4049009082, 4183591379, 1453913233, 4095757548, 789475914, 2145357457", "2828141255, 752526256, 2097509046, 2724043008, 84549310, 1412103825", "2040707498, 3221815101, 1825015381, 3287341287, 2602801723, 4228411920" }; String test1 = String.format("%d, %d, %d, %d, %d, %d", seeds1[0], seeds1[1], seeds1[2], seeds1[3], seeds1[4], seeds1[5]); assertTrue(test1.equals(known1[0])); for (int i = 1; i < known1.length; i++) { MRG1999a.advanceSubstream(seeds1); test1 = String.format("%d, %d, %d, %d, %d, %d", seeds1[0], seeds1[1], seeds1[2], seeds1[3], seeds1[4], seeds1[5]); assertTrue(test1.equals(known1[i])); } String[] known2 = { "12345, 12345, 12345, 12345, 12345, 12345", "870504860, 2641697727, 884013853, 339352413, 2374306706, 3651603887", "460387934, 1532391390, 877287553, 120103512, 2153115941, 335837774", "3775110060, 3208296044, 1257177538, 378684317, 2867112178, 2201306083", "1870130441, 490396226, 1081325149, 3685085721, 2348042618, 1094489500", "934940479, 1950100692, 4183308048, 1834563867, 1457690863, 2911850358", "36947768, 3877286680, 1490366786, 2869536097, 1753150659, 575546150", "2591627614, 2744298060, 626085041, 644044487, 2091171169, 3539660345", "2906523984, 140710505, 1144258739, 2076719571, 1742524362, 768984958", "2483450279, 3767309577, 2486764677, 4056403678, 792164890, 998062628", "1065618315, 827657608, 299165607, 461289958, 2074659312, 274796520" }; long[] seeds2 = { 12345, 12345, 12345, 12345, 12345, 12345 }; String test2 = String.format("%d, %d, %d, %d, %d, %d", seeds2[0], seeds2[1], seeds2[2], seeds2[3], seeds2[4], seeds2[5]); assertTrue(test2.equals(known2[0])); for (int i = 1; i < known2.length; i++) { MRG1999a.advanceSubstream(seeds2); test2 = String.format("%d, %d, %d, %d, %d, %d", seeds2[0], seeds2[1], seeds2[2], seeds2[3], seeds2[4], seeds2[5]); assertTrue(test2.equals(known2[i])); } } @Test public void testKnownStates() { MRG1999a test1 = new MRG1999a(0, 0, 1, 0, 0, 1); String[] known1 = { "0, 0, 1, 0, 0, 1", "0, 1, 0, 0, 1, 527612", "1, 0, 1403580, 1, 527612, 3497978192", "0, 1403580, 4294156359, 527612, 3497978192, 3281754271", "1403580, 4294156359, 2941890554, 3497978192, 3281754271, 1673476130", "4294156359, 2941890554, 489343630, 3281754271, 1673476130, 1430724370", "2941890554, 489343630, 1831234280, 1673476130, 1430724370, 893509979", "489343630, 1831234280, 2758233149, 1430724370, 893509979, 3280220074", "1831234280, 2758233149, 939574583, 893509979, 3280220074, 361718588", "2758233149, 939574583, 3228066636, 3280220074, 361718588, 951529882", "939574583, 3228066636, 513534955, 361718588, 951529882, 856588367" }; assertTrue(test1.toString().equals(known1[0])); for (int i = 1; i < known1.length; i++) { test1.nextUniform(); // advance the state assertTrue(test1.toString().equals(known1[i])); } MRG1999a test2 = new MRG1999a(12345, 12345, 12345, 12345, 12345, 12345); String[] known2 = { "12345, 12345, 12345, 12345, 12345, 12345", "12345, 12345, 3023790853, 12345, 12345, 2478282264", "12345, 3023790853, 3023790853, 12345, 2478282264, 1655725443", "3023790853, 3023790853, 3385359573, 2478282264, 1655725443, 2057415812", "3023790853, 3385359573, 1322208174, 1655725443, 2057415812, 2070190165", "3385359573, 1322208174, 2930192941, 2057415812, 2070190165, 1978299747", "1322208174, 2930192941, 2462079208, 2070190165, 1978299747, 171163572", "2930192941, 2462079208, 2386811717, 1978299747, 171163572, 321902337", "2462079208, 2386811717, 2989318136, 171163572, 321902337, 1462200156", "2386811717, 2989318136, 3378525425, 321902337, 1462200156, 2794459678", "2989318136, 3378525425, 1773647758, 1462200156, 2794459678, 2822254363" }; assertTrue(test2.toString().equals(known2[0])); for (int i = 1; i < known2.length; i++) { test2.nextUniform(); // advance the state assertTrue(test2.toString().equals(known2[i])); } } @Test public void testCachedSeeds() { MRG1999a test1 = new MRG1999a(0, 0); MRG1999a test2 = new MRG1999a(12345, 12345, 12345, 12345, 12345, 12345); assertTrue(test1.toString().equals(test2.toString())); // test stream 1 for each test1 = new MRG1999a(1, 0); long[] seeds2 = { 12345, 12345, 12345, 12345, 12345, 12345 }; MRG1999a.advanceStream(seeds2); test2 = new MRG1999a(seeds2[0], seeds2[1], seeds2[2], seeds2[3], seeds2[4], seeds2[5]); assertTrue(test1.toString().equals(test2.toString())); // test stream 10500 for each test1 = new MRG1999a(10500, 0); long[] seeds3 = { 12345, 12345, 12345, 12345, 12345, 12345 }; for (int i = 0; i < 10500; i++) { MRG1999a.advanceStream(seeds3); } test2 = new MRG1999a(seeds3[0], seeds3[1], seeds3[2], seeds3[3], seeds3[4], seeds3[5]); assertTrue(test1.toString().equals(test2.toString())); // test stream 20000 for each test1 = new MRG1999a(20000, 0); long[] seeds4 = { 12345, 12345, 12345, 12345, 12345, 12345 }; for (int i = 0; i < 20000; i++) { MRG1999a.advanceStream(seeds4); } test2 = new MRG1999a(seeds4[0], seeds4[1], seeds4[2], seeds4[3], seeds4[4], seeds4[5]); assertTrue(test1.toString().equals(test2.toString())); } }