Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/PushGP.Cli/Program.cs @ 14733

Last change on this file since 14733 was 14733, checked in by pkimmesw, 7 years ago

#2665 Storable problem data, Renamings due to typos, Removed GP from class names

File size: 7.2 KB
Line 
1using System;
2using System.Diagnostics;
3using System.Linq;
4using System.Threading.Tasks;
5
6namespace HeuristicLab.Algorithms.PushGP.Cli {
7  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
8  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
9  using HeuristicLab.Problems.ProgramSynthesis.Push.Generators;
10  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
11  using HeuristicLab.Problems.ProgramSynthesis.Push.Parser;
12  using HeuristicLab.Problems.ProgramSynthesis.Push.Simplifier;
13  using HeuristicLab.Random;
14
15  class Program {
16    static void Main(string[] args) {
17      //SimpleTest();
18      //Stepwise().Wait();
19      //PerformanceTestInterpreter();
20      PerformanceParallelTestInterpreter();
21      //PerformanceTestCodeGenerator();
22      //TestRobustness();
23      //TestPool();
24      //TestPoolPerformance();
25      //TestSimplifier();
26
27      Console.WriteLine("\nPress any key to continue...");
28
29      //if (args.Length == 0) return;
30
31      //var code = args[0];
32      //EvaluateStepwise(code).Wait();
33
34      Console.ReadKey();
35    }
36
37    static async Task EvaluateStepwise(string code) {
38      var interpreter = new PushGpInterpreter(new PushConfiguration {
39        TopLevelPushCode = false
40      });
41
42      interpreter.RunAsync(code, true).Wait();
43
44      while (!interpreter.IsCompleted) {
45        Console.Clear();
46        interpreter.PrintStacks();
47        interpreter.Step();
48
49        var input = Console.ReadKey();
50        if (input.Key == ConsoleKey.Escape) {
51          break;
52        } else if (input.Key == ConsoleKey.Spacebar) {
53          await interpreter.ResumeAsync();
54        }
55      }
56
57      Console.Clear();
58      interpreter.PrintStacks();
59    }
60
61    static void SimpleTest() {
62      var interpreter = new PushGpInterpreter();
63
64      interpreter.Run("5 INTEGER.DUP INTEGER.+");
65
66      interpreter.PrintStacks();
67    }
68
69    static async Task Stepwise() {
70      var interpreter = new PushGpInterpreter();
71
72      interpreter.RunAsync("( 0 2 CODE.QUOTE ( 1 INTEGER.+ 0 3 CODE.QUOTE ( 1 INTEGER.+ INTEGER.* ) CODE.DO*RANGE INTEGER.+ ) CODE.DO*RANGE )", true).Wait();
73
74      while (!interpreter.IsCompleted) {
75        Console.Clear();
76        interpreter.PrintStacks();
77        interpreter.Step();
78
79        var input = Console.ReadKey();
80        if (input.Key == ConsoleKey.Escape) {
81          break;
82        } else if (input.Key == ConsoleKey.Spacebar) {
83          await interpreter.ResumeAsync();
84        }
85      }
86
87      Console.Clear();
88      interpreter.PrintStacks();
89    }
90
91    static void PerformanceTestInterpreter() {
92      var program = PushParser.Parse("( 5 INTEGER.DUP INTEGER.+ )");
93
94      var interpreter = new PushGpInterpreter();
95      var sw = new Stopwatch();
96
97      sw.Start();
98      for (var i = 0; i < 60000000; i++) {
99        interpreter.Run(program);
100        interpreter.Clear();
101      }
102      sw.Stop();
103
104      Console.WriteLine(sw.Elapsed);
105    }
106
107    static void PerformanceParallelTestInterpreter() {
108      var program = PushParser.Parse("( 5 INTEGER.DUP INTEGER.+ )");
109      //var program = new ExecExpandExpression(new Expression[]
110      //{
111      //  new IntegerPushExpression(5),
112      //  new IntegerDuplicateExpression(),
113      //  new IntegerAddExpression()
114      //});
115
116      var sw = new Stopwatch();
117      var iterations = 100;
118      var amount = 600000;
119      var pool = new PushInterpreterPool(iterations);
120
121      sw.Start();
122      Parallel.For(0, iterations, i => {
123        using (var interpreter = pool.GetInstance()) {
124
125          for (var j = 0; j < amount; j++) {
126            interpreter.Run(program);
127            interpreter.Clear();
128          }
129        }
130      });
131      sw.Stop();
132
133      Console.WriteLine(sw.Elapsed);
134    }
135
136    static void PerformanceTestCodeGenerator() {
137      var sw = new Stopwatch();
138      var random = new FastRandom(1337);
139
140      sw.Start();
141      var expressions = CodeGenerator.RandomCode(60000000, random).ToList();
142      sw.Stop();
143
144      Console.WriteLine("Generated {0} in {1}", expressions.Count(), sw.Elapsed);
145    }
146
147    static void TestRobustness() {
148      var sw = new Stopwatch();
149      var parallelism = Environment.ProcessorCount;
150      var maxProgramSizeLimit = 1024;
151      var partitionSize = 1000;
152      var execCounters = new int[parallelism];
153
154      var config = new PushConfiguration {
155        EvalPushLimit = 4096,
156        //IsCodeStackEnabled = false,
157        IsExecStackEnable = false,
158        IsBooleanStackEnabled = false,
159        IsFloatStackEnabled = false,
160        IsIntegerStackEnabled = false,
161        IsNameStackEnabled = false,
162      };
163
164      var pool = new PushInterpreterPool(config);
165
166      sw.Start();
167      Parallel.For(0, parallelism, i => {
168        var random = new FastRandom(1337);
169        using (var interpreter = pool.GetInstance(random)) {
170          for (var j = 0; j < partitionSize; j++) {
171            var program = CodeGenerator.RandomProgram(maxProgramSizeLimit, random, config);
172
173            interpreter.Run(program);
174
175            execCounters[i] += interpreter.ExecCounter;
176            interpreter.Clear();
177          }
178        }
179      });
180      sw.Stop();
181
182      Console.WriteLine("ExecCount: {0}", execCounters.Sum());
183      Console.WriteLine("Duration: {0}", sw.Elapsed);
184    }
185
186    static void TestPool() {
187      var pool = new PushInterpreterPool();
188      var normal = new PushGpInterpreter();
189      int id;
190
191      using (var interpreter = pool.GetInstance()) {
192        interpreter.Run("( 1 2 INTEGER.+ )");
193
194        id = interpreter.GetHashCode();
195        if (id == normal.GetHashCode()) Console.WriteLine("equal 1");
196      }
197
198      using (var interpreter = pool.GetInstance())
199      using (var interpreter2 = pool.GetInstance()) {
200        interpreter.Run("( 1 2 INTEGER.+ )");
201        if (id == interpreter.GetHashCode()) Console.WriteLine("equal 2");
202        if (id == interpreter2.GetHashCode()) Console.WriteLine("equal 3");
203      }
204    }
205
206    static void TestPoolPerformance() {
207      var sw = new Stopwatch();
208      var iterations = 100000000;
209
210      sw.Start();
211      for (var i = 0; i < iterations; i++) {
212        var interpreter = new PushGpInterpreter();
213        interpreter.Clear();
214      }
215      sw.Stop();
216
217      Console.WriteLine(sw.Elapsed);
218
219      var pool = new PushInterpreterPool();
220      sw.Restart();
221      for (var i = 0; i < iterations; i++) {
222        using (var interpreter = pool.GetInstance()) {
223          interpreter.Clear();
224        }
225      }
226      sw.Stop();
227
228      Console.WriteLine(sw.Elapsed);
229    }
230
231    static void TestSimplifier() {
232      var interpreter = new PushGpInterpreter();
233      var program = PushParser.Parse("( 5 INTEGER.DUP FLOAT.+ INTEGER.+ )") as ExecExpandExpression;
234      var simplifier = new RandomSimplifier() { Trys = 10 };
235      var random = new FastRandom(1337);
236
237      var simplerProgram = simplifier.Simplify(
238        program,
239        random,
240        solution => {
241          interpreter.Clear();
242          interpreter.Run(solution);
243          return interpreter.IntegerStack.Top == 10;
244        });
245
246      Console.WriteLine(simplerProgram);
247    }
248  }
249}
Note: See TracBrowser for help on using the repository browser.