Free cookie consent management tool by TermsFeed Policy Generator

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

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

#2665 fixed enable/disable issue for single instruction in selection view

File size: 7.0 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.Data.Pool;
9  using HeuristicLab.Problems.ProgramSynthesis.Push.Expressions;
10  using HeuristicLab.Problems.ProgramSynthesis.Push.Generators;
11  using HeuristicLab.Problems.ProgramSynthesis.Push.Interpreter;
12  using HeuristicLab.Problems.ProgramSynthesis.Push.Parser;
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 PushInterpreter(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 PushInterpreter();
63
64      interpreter.Run("5 INTEGER.DUP INTEGER.+");
65
66      interpreter.PrintStacks();
67    }
68
69    static async Task Stepwise() {
70      var interpreter = new PushInterpreter();
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 PushInterpreter();
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
110      var sw = new Stopwatch();
111      var iterations = 100;
112      var amount = 600000;
113      var pool = new PushInterpreterPool(iterations, 1024);
114
115      sw.Start();
116      Parallel.For(0, iterations, i => {
117        using (var interpreter = pool.GetInstance()) {
118
119          for (var j = 0; j < amount; j++) {
120            interpreter.Run(program);
121            interpreter.Clear();
122          }
123        }
124      });
125      sw.Stop();
126
127      Console.WriteLine(sw.Elapsed);
128    }
129
130    static void PerformanceTestCodeGenerator() {
131      var sw = new Stopwatch();
132      var random = new FastRandom(1337);
133
134      sw.Start();
135      var expressions = CodeGenerator.RandomCode(60000000, random).ToList();
136      sw.Stop();
137
138      Console.WriteLine("Generated {0} in {1}", expressions.Count(), sw.Elapsed);
139    }
140
141    static void TestRobustness() {
142      var sw = new Stopwatch();
143      var parallelism = Environment.ProcessorCount;
144      var maxProgramSizeLimit = 1024;
145      var partitionSize = 10000;
146      var execCounters = new int[parallelism];
147
148      var config = new PushConfiguration {
149        EvalPushLimit = 4096,
150        IsCodeStackEnabled = false,
151        //IsExecStackEnable = false,
152        //IsBooleanStackEnabled = false,
153        //IsFloatStackEnabled = false,
154        //IsIntegerStackEnabled = false,
155        IsNameStackEnabled = false,
156      };
157
158      var pool = new PushInterpreterPool(config);
159
160      sw.Start();
161      Parallel.For(0, parallelism, i => {
162        var random = new MersenneTwister(1337);
163        using (var interpreter = pool.GetInstance(random)) {
164          for (var j = 0; j < partitionSize; j++) {
165            var program = CodeGenerator.RandomProgram(interpreter.PushProgramPool, maxProgramSizeLimit, random, config);
166            interpreter.Run(program);
167
168            execCounters[i] += interpreter.ExecCounter;
169            interpreter.Clear();
170          }
171        }
172      });
173      sw.Stop();
174
175      Console.WriteLine("ExecCount: {0}", execCounters.Sum());
176      Console.WriteLine("Duration: {0}", sw.Elapsed);
177    }
178
179    static void TestPool() {
180      var pool = new PushInterpreterPool();
181      var normal = new PushInterpreter();
182      int id;
183
184      using (var interpreter = pool.GetInstance()) {
185        interpreter.Run("( 1 2 INTEGER.+ )");
186
187        id = interpreter.GetHashCode();
188        if (id == normal.GetHashCode()) Console.WriteLine("equal 1");
189      }
190
191      using (var interpreter = pool.GetInstance())
192      using (var interpreter2 = pool.GetInstance()) {
193        interpreter.Run("( 1 2 INTEGER.+ )");
194        if (id == interpreter.GetHashCode()) Console.WriteLine("equal 2");
195        if (id == interpreter2.GetHashCode()) Console.WriteLine("equal 3");
196      }
197    }
198
199    static void TestPoolPerformance() {
200      var sw = new Stopwatch();
201      var iterations = 100000000;
202
203      sw.Start();
204      for (var i = 0; i < iterations; i++) {
205        var interpreter = new PushInterpreter();
206        interpreter.Clear();
207      }
208      sw.Stop();
209
210      Console.WriteLine(sw.Elapsed);
211
212      var pool = new PushInterpreterPool();
213      sw.Restart();
214      for (var i = 0; i < iterations; i++) {
215        using (var interpreter = pool.GetInstance()) {
216          interpreter.Clear();
217        }
218      }
219      sw.Stop();
220
221      Console.WriteLine(sw.Elapsed);
222    }
223
224    //static void TestSimplifier() {
225    //  var interpreter = new PushInterpreter();
226    //  var program = PushParser.Parse("( 5 INTEGER.DUP FLOAT.+ INTEGER.+ )") as PushProgram;
227    //  var simplifier = new RandomSimplifier { Trys = 10 };
228    //  var random = new FastRandom(1337);
229
230    //  var simplerProgram = simplifier.Simplify(
231    //    program,
232    //    random,
233    //    solution => {
234    //      interpreter.Clear();
235    //      interpreter.Run(solution);
236    //      return interpreter.IntegerStack.Top == 10;
237    //    });
238
239    //  Console.WriteLine(simplerProgram);
240    //}
241  }
242}
Note: See TracBrowser for help on using the repository browser.