/// <summary> /// Initializes an evolutionary run given the parameters and a random seed adjustment (added to each random seed), /// with the Output pre-constructed. /// The adjustment offers a convenient way to change the seeds of the random number generators each time you /// do a new evolutionary run. You are of course welcome to replace the random number generators after initialize(...) /// but before startFresh(...). /// </summary> /// <param name="parameters"></param> /// <param name="randomSeedOffset"></param> /// <param name="output"></param> /// <returns></returns> public static EvolutionState Initialize(IParameterDatabase parameters, int randomSeedOffset, Output output) { var breedthreads = 1; var evalthreads = 1; //bool store; //int x; // output was already created for us. output.SystemMessage(ECVersion.Message()); // 2. set up thread values breedthreads = DetermineThreads(output, parameters, new Parameter(P_BREEDTHREADS)); evalthreads = DetermineThreads(output, parameters, new Parameter(P_EVALTHREADS)); var auto = (V_THREADS_AUTO.ToUpper().Equals(parameters.GetString(new Parameter(P_BREEDTHREADS), null).ToUpper()) || V_THREADS_AUTO.ToUpper().Equals( parameters.GetString(new Parameter(P_EVALTHREADS), null).ToUpper())); // at least one thread is automatic. Seeds may need to be dynamic. // 3. create the Mersenne Twister random number generators, // one per thread var random = new MersenneTwisterFast[1]; var seedMessage = "Seed: "; // Get time in milliseconds var time = (int)DateTimeHelper.CurrentTimeMilliseconds; var seed = 0; seed = DetermineSeed(output, parameters, new Parameter(P_SEED).Push("" + 0), time + 0, random.Length * randomSeedOffset, auto); random[0] = PrimeGenerator(new MersenneTwisterFast(seed)); // we prime the generator to be more sure of randomness. seedMessage = seedMessage + seed + " "; // 4. Start up the evolution // what evolution state to use? var state = (EvolutionState)parameters.GetInstanceForParameter(new Parameter(P_STATE), null, typeof(IEvolutionState)); state.Parameters = parameters; state.Random = random; state.Output = output; state.EvalThreads = evalthreads; state.BreedThreads = breedthreads; state.RandomSeedOffset = randomSeedOffset; output.SystemMessage($"Threads: breed/{breedthreads} eval/{evalthreads}"); output.SystemMessage(seedMessage); return(state); }
/// <summary>Loads the number of threads. </summary> public static int DetermineThreads(Output output, IParameterDatabase parameters, IParameter threadParameter) { var thread = 1; var tmp_s = parameters.GetString(threadParameter, null); if (tmp_s == null) // uh oh { output.Fatal("Threads number must exist.", threadParameter, null); } else if (V_THREADS_AUTO.ToUpper().Equals(tmp_s.ToUpper())) { } else { try { thread = parameters.GetInt(threadParameter, null); } catch (FormatException) { output.Fatal("Invalid, non-integer threads value (" + thread + ")", threadParameter, null); } } return(thread); }
/// <summary> /// Loads the number of threads. /// </summary> public static int DetermineThreads(Output output, IParameterDatabase parameters, IParameter threadParameter) { var thread = 1; var tmp_s = parameters.GetString(threadParameter, null); if (tmp_s == null) // uh oh { output.Fatal("Threads number must exist.", threadParameter, null); } else if (V_THREADS_AUTO.ToUpper().Equals(tmp_s.ToUpper())) { var runtime = Process.GetCurrentProcess(); try { return(Environment.ProcessorCount); } catch (Exception) { output.Fatal("Whoa! Problem getting processor count.", threadParameter, null); } } else { try { thread = parameters.GetInt(threadParameter, null); if (thread <= 0) { output.Fatal("Threads value must be > 0", threadParameter, null); } } catch (FormatException) { output.Fatal("Invalid, non-integer threads value (" + thread + ")", threadParameter, null); } } return(thread); }
/// <summary> /// Loads a random generator seed. First, the seed is loaded from the seedParameter. If the parameter /// is V_SEED_TIME, the seed is set to the currentTime value. Then the seed is incremented by the offset. /// This method is broken out of initialize(...) primarily to share code with ec.eval.MasterProblem. /// </summary> public static int DetermineSeed(Output output, IParameterDatabase parameters, IParameter seedParameter, long currentTime, int offset, bool auto) { var seed = 1; // have to initialize to make the compiler happy var tmp_s = parameters.GetString(seedParameter, null); if (tmp_s == null && !auto) // uh oh { output.Fatal("Seed must exist.", seedParameter, null); } //else if (V_SEED_TIME.Equals(tmp_s, StringComparison.InvariantCultureIgnoreCase) || (tmp_s == null && auto)) else if (tmp_s == null && auto || V_SEED_TIME.Equals(tmp_s, StringComparison.InvariantCultureIgnoreCase)) // BRS : Just flipped { if (tmp_s == null && auto) // BRS : What? { output.WarnOnce("Using automatic determination number of threads, but not all seeds are defined." + "\nThe rest will be defined using the wall clock time."); } seed = (int)currentTime; // using low-order bits so it's probably okay if (seed == 0) { output.Fatal("Whoa! This Java version is returning 0 for currentTimeMillis(), which ain't right." + " This means you can't use '" + V_SEED_TIME + "' as a seed ", seedParameter, null); } } else { try { seed = parameters.GetInt(seedParameter, null); } catch (FormatException) { output.Fatal("Invalid, non-integer seed value (" + seed + ")", seedParameter, null); } } return(seed + offset); }
/// <summary> /// Initializes an evolutionary run given the parameters and a random seed adjustment (added to each random seed), /// with the Output pre-constructed. /// The adjustment offers a convenient way to change the seeds of the random number generators each time you /// do a new evolutionary run. You are of course welcome to replace the random number generators after initialize(...) /// but before startFresh(...). /// </summary> public static EvolutionState Initialize(IParameterDatabase parameters, int randomSeedOffset, Output output) { var breedthreads = 1; var evalthreads = 1; // Should we muzzle stdout and stderr? if (parameters.ParameterExists(new Parameter(P_MUZZLE), null)) { output.Warning("" + new Parameter(P_MUZZLE) + " has been deprecated. We suggest you use " + new Parameter(P_SILENT) + " or similar newer options."); } if (parameters.GetBoolean(new Parameter(P_SILENT), null, false) || parameters.GetBoolean(new Parameter(P_MUZZLE), null, false)) { output.GetLog(0).Silent = true; output.GetLog(1).Silent = true; } //bool store; int x; // output was already created for us. output.SystemMessage(ECVersion.Message()); // 2. set up thread values breedthreads = DetermineThreads(output, parameters, new Parameter(P_BREEDTHREADS)); evalthreads = DetermineThreads(output, parameters, new Parameter(P_EVALTHREADS)); var auto = (V_THREADS_AUTO.ToUpper().Equals( parameters.GetString(new Parameter(P_BREEDTHREADS), null).ToUpper()) || V_THREADS_AUTO.ToUpper().Equals( parameters.GetString(new Parameter(P_EVALTHREADS), null).ToUpper())); // at least one thread is automatic. Seeds may need to be dynamic. // 3. create the Mersenne Twister random number generators, // one per thread var random = new IMersenneTwister[breedthreads > evalthreads ? breedthreads : evalthreads]; var seeds = new int[random.Length]; var seedMessage = "Seed: "; // Get time in milliseconds var time = (int)DateTimeHelper.CurrentTimeMilliseconds; for (x = 0; x < random.Length; x++) { seeds[x] = DetermineSeed(output, parameters, new Parameter(P_SEED).Push("" + x), time + x, random.Length * randomSeedOffset, auto); for (var y = 0; y < x; y++) { if (seeds[x] == seeds[y]) { output.Fatal(P_SEED + "." + x + " (" + seeds[x] + ") and " + P_SEED + "." + y + " (" + seeds[y] + ") ought not be the same seed.", null, null); } } random[x] = PrimeGenerator(new MersenneTwisterFast(seeds[x])); // we prime the generator to be more sure of randomness. seedMessage = seedMessage + seeds[x] + " "; } // 4. Start up the evolution // what evolution state to use? var state = (EvolutionState)parameters.GetInstanceForParameter(new Parameter(P_STATE), null, typeof(IEvolutionState)); state.Parameters = parameters; state.Random = random; state.Output = output; state.EvalThreads = evalthreads; state.BreedThreads = breedthreads; state.RandomSeedOffset = randomSeedOffset; output.SystemMessage($"Threads: breed/{breedthreads} eval/{evalthreads}"); output.SystemMessage(seedMessage); return(state); }