1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.rng.examples.stress; 18 19 import org.apache.commons.rng.UniformRandomProvider; 20 import org.apache.commons.rng.simple.RandomSource; 21 22 /** 23 * Encapsulate the data needed to create and test a random generator. This includes: 24 * 25 * <ul> 26 * <li>An identifier for the random source 27 * <li>The random source 28 * <li>The constructor arguments 29 * <li>The number of trials for each random source 30 * </ul> 31 */ 32 class StressTestData { 33 /** The identifier. */ 34 private final String id; 35 /** The random source. */ 36 private final RandomSource randomSource; 37 /** The arguments used to construct the random source. */ 38 private final Object[] args; 39 /** The number of trials. */ 40 private final int trials; 41 42 /** 43 * Creates a new instance. 44 * 45 * @param randomSource The random source. 46 * @param args The arguments used to construct the random source (can be {@code null}). 47 */ 48 StressTestData(RandomSource randomSource, 49 Object[] args) { 50 // The default ID is defined by the enum order. 51 this(Integer.toString(randomSource.ordinal() + 1), 52 randomSource, 53 args, 54 // Ignore by default (trials = 0) any source that has arguments 55 args == null ? 1 : 0); 56 } 57 58 /** 59 * Creates a new instance. 60 * 61 * @param id The identifier. 62 * @param randomSource The random source. 63 * @param args The arguments used to construct the random source (can be 64 * {@code null}). 65 * @param trials The number of trials. 66 */ 67 StressTestData(String id, 68 RandomSource randomSource, 69 Object[] args, 70 int trials) { 71 this.id = id; 72 this.randomSource = randomSource; 73 this.args = args; 74 this.trials = trials; 75 } 76 77 /** 78 * Create a new instance with the given ID prefix prepended to the current ID. 79 * 80 * @param idPrefix The ID prefix. 81 * @return the stress test data 82 */ 83 StressTestData withIDPrefix(String idPrefix) { 84 return new StressTestData(idPrefix + id, randomSource, args, trials); 85 } 86 87 /** 88 * Create a new instance with the given number of trials. 89 * 90 * @param numberOfTrials The number of trials. 91 * @return the stress test data 92 */ 93 StressTestData withTrials(int numberOfTrials) { 94 return new StressTestData(id, randomSource, args, numberOfTrials); 95 } 96 97 /** 98 * Creates the random generator. 99 * 100 * <p>It is recommended the seed is generated using {@link RandomSource#createSeed()}.</p> 101 * 102 * @param seed the seed (use {@code null} to automatically create a seed) 103 * @return the uniform random provider 104 */ 105 UniformRandomProvider createRNG(byte[] seed) { 106 return randomSource.create(seed, args); 107 } 108 109 /** 110 * Gets the identifier. 111 * 112 * @return the id 113 */ 114 String getId() { 115 return id; 116 } 117 118 /** 119 * Gets the random source. 120 * 121 * @return the random source 122 */ 123 RandomSource getRandomSource() { 124 return randomSource; 125 } 126 127 /** 128 * Gets the arguments used to construct the random source. 129 * 130 * @return the arguments 131 */ 132 Object[] getArgs() { 133 return args; 134 } 135 136 /** 137 * Gets the number of trials. 138 * 139 * @return the number of trials 140 */ 141 int getTrials() { 142 return trials; 143 } 144 }