示例#1
0
 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);
     }
 }
示例#2
0
 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;
     }
 }
示例#3
0
 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;
     }
 }
示例#4
0
 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;
     }
 }