private bool VerifyProgram(string programText, CancellationToken cancellationToken, out bool shouldContinue) { try { var program = new BFProgram(programText, new BFMemory(MemorySize)); foreach (var testcase in Testcases) { if (cancellationToken.IsCancellationRequested) { shouldContinue = false; return(false); } var output = program.Execute(testcase.Input, cancellationToken); if (!Enumerable.SequenceEqual(testcase.Output, output)) { shouldContinue = true; return(false); } } shouldContinue = true; return(true); } catch (InvalidBFProgramException ex) { shouldContinue = ex.Recoverable; return(false); } }
private static bool ValidateIndividual(LinkedList <BrainfuckGen> individual) { try { var programText = new string(individual.Select(ToBFChar).ToArray()); var cancellationToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)).Token; var task = Task.Run(() => { try { var program = new BFProgram(programText, new BFMemory(100)); int instructions = 0; program.Execute(Testcases[0].Input, cancellationToken, ref instructions); return(true); } catch (InvalidBFProgramException) { return(false); } }, cancellationToken); return(task.Result); } catch (AggregateException ex) { if (ex.InnerException is TaskCanceledException) { return(false); } throw; } }
private static int CalculateFitness(LinkedList <BrainfuckGen> individual) { try { var cancellationToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)).Token; var task = Task.Run(() => { int fitness = 0; int instructions = 0; var programText = new string(individual.Select(ToBFChar).ToArray()); try { var program = new BFProgram(programText, new BFMemory(100)); foreach (var testcase in Testcases) { int testcaseInstructions = 0; fitness += CalculateOutputScore(testcase.Output, program.Execute(testcase.Input, cancellationToken, ref testcaseInstructions)); // we only want to add if the program didn't run infinitely long instructions += testcaseInstructions; } checked { fitness *= 10; // ensure that length penalty is not as harsh as getting closer to the solution fitness -= (instructions / 100); fitness -= programText.Length; fitness = (fitness > 0) ? fitness : 0; } } catch (InvalidBFProgramException) { fitness = 0; } return(fitness); }, cancellationToken); return(task.Result); } catch (AggregateException ex) { if (ex.InnerException is TaskCanceledException) { return(0); } throw; } }
private static bool IsCorrectProgram(string programText) { try { var cancellationToken = new CancellationTokenSource(TimeSpan.FromMilliseconds(100)).Token; var task = Task.Run(() => { try { var program = new BFProgram(programText, new BFMemory(100)); foreach (var testcase in Testcases) { int instructions = 0; if (!Enumerable.SequenceEqual(testcase.Output, program.Execute(testcase.Input, cancellationToken, ref instructions))) { return(false); } } return(true); } catch (InvalidBFProgramException) { return(false); } }, cancellationToken); return(task.Result); } catch (AggregateException ex) { if (ex.InnerException is TaskCanceledException) { return(false); } throw; } }