Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Problem/BenchmarkSuite/BenchmarkSuitePushSolutionView.cs @ 15032

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

#2665 Fixed bias 0 issue, PushExpressionFrequencyAnalyzer, Fixed probability for ERC settings, Fixed enable/disable instructions, Added expression descriptions

File size: 11.0 KB
Line 
1namespace HeuristicLab.Problems.ProgramSynthesis.Push.Problem.BenchmarkSuite {
2  using System;
3  using System.Collections.Generic;
4  using System.Drawing;
5  using System.Globalization;
6  using System.Linq;
7  using System.Windows.Forms;
8  using Core.Views;
9  using HeuristicLab.BenchmarkSuite;
10  using HeuristicLab.BenchmarkSuite.Views;
11  using HeuristicLab.Common;
12  using HeuristicLab.Problems.ProgramSynthesis.Push.Constants;
13
14  using Interpreter;
15  using MainForm;
16  using Problem;
17  using Stack;
18
19  [View("Push Program Debugger")]
20  [Content(typeof(PushSolution), true)]
21  public partial class BenchmarkSuitePushSolutionView : NamedItemView {
22
23    private const string Separator = ", ";
24
25    private const string exampleSplitter = " => ";
26    private const string AbsoluteDiffHeaderText = "Absolute Diff.";
27    private const string RelativeDiffHeaderText = "Relative Diff.";
28    private const string InputHeaderStringFormat = "Input {0} : {1}";
29    private const string EstimatedOutputHeaderStringFormat = "Estimated Output {0} : {1}";
30    private const string OutputHeaderStringFormat = "Output {0} : {1}";
31    private static readonly Color correctExampleFontColor = Color.FromArgb(0x5cb85c);
32    private PooledPushInterpreter interpreter;
33    private PushInterpreterPool pool;
34
35    public BenchmarkSuitePushSolutionView() {
36      InitializeComponent();
37      Name = "Push Program Debugger";
38      InitEvents();
39    }
40
41    ~BenchmarkSuitePushSolutionView() {
42      interpreter.Dispose();
43    }
44
45    private void InitEvents() {
46      exampleComboBox.SelectedIndexChanged += SelectedExampleIndexChanged;
47      pushDebugger.OnReset += PushDebuggerReset;
48    }
49
50    private void PushDebuggerReset(object sender, IPushInterpreter interpreter) {
51      if (exampleComboBox.SelectedIndex < 0) return;
52
53      var example = Evaluator.Data.Examples[exampleComboBox.SelectedIndex];
54
55      interpreter.BooleanStack.Push(example.InputBoolean);
56      interpreter.IntegerStack.Push(example.InputInteger);
57      interpreter.FloatStack.Push(example.InputFloat);
58      interpreter.CharStack.Push(example.InputChar);
59      interpreter.StringStack.Push(example.InputString);
60      interpreter.IntegerVectorStack.Push(example.InputIntegerVector.Select(x => x.ToList()).ToArray());
61      interpreter.FloatVectorStack.Push(example.InputFloatVector.Select(x => x.ToList()).ToArray());
62      interpreter.StringVectorStack.Push(example.InputStringVector.Select(x => x.ToList()).ToArray());
63      interpreter.BooleanVectorStack.Push(example.InputBooleanVector.Select(x => x.ToList()).ToArray());
64    }
65
66    private void SelectedExampleIndexChanged(object sender, EventArgs e) {
67      pushDebugger.ResetDebugging();
68    }
69
70    public new PushBenchmarkSuiteSolution Content
71    {
72      get { return (PushBenchmarkSuiteSolution)base.Content; }
73      set
74      {
75        base.Content = value;
76      }
77    }
78
79    public PushBenchmarkSuiteEvaluator Evaluator
80    {
81      get { return (PushBenchmarkSuiteEvaluator)Content.Evaluator; }
82    }
83
84    protected override void OnContentChanged() {
85      if (Content == null) return;
86
87      Name = "Push Solution";
88      nameTextBox.Text = Name;
89
90      pool = new PushInterpreterPool(Content.Config);
91
92      if (interpreter != null) {
93        interpreter.Dispose();
94      }
95
96      interpreter = pool.Create(Content.Random);
97      UpdateExamples(Evaluator.Data);
98
99      if (exampleComboBox.SelectedIndex < 0) {
100        exampleComboBox.SelectedIndex = 0; // Triggers ResetDebugging via event
101      }
102
103      InitResultGrid(trainingResultsDataGrid, Evaluator.DataBounds.TrainingRange.Start, Evaluator.DataBounds.TrainingRange.End);
104      InitResultGrid(testResultsDataGrid, Evaluator.DataBounds.TestRange.Start, Evaluator.DataBounds.TestRange.End);
105
106      pushDebugger.Content = Content;
107    }
108
109    private void InitResultGrid(DataGridView grid, int start, int end) {
110      grid.Columns.Clear();
111      grid.Rows.Clear();
112
113      var cellTemplate = new DataGridViewTextBoxCell { Style = { WrapMode = DataGridViewTriState.True } };
114      var data = Evaluator.Data;
115
116      for (var i = 0; i < data.InputArgumentTypes.Length; i++) {
117        var headerTypeName = ViewHelper.GetHeaderTypeName(data.InputArgumentTypes[i]);
118        var column = new DataGridViewColumn {
119          HeaderText = string.Format(InputHeaderStringFormat, i + 1, headerTypeName),
120          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
121          CellTemplate = cellTemplate,
122          DefaultCellStyle = { Alignment = DataGridViewContentAlignment.MiddleRight },
123          SortMode = DataGridViewColumnSortMode.Automatic
124        };
125
126        grid.Columns.Add(column);
127      }
128
129      for (var i = 0; i < data.OutputArgumentTypes.Length; i++) {
130        var headerTypeName = ViewHelper.GetHeaderTypeName(data.OutputArgumentTypes[i]);
131
132        var estimatedOutputColumn = new DataGridViewColumn {
133          HeaderText = string.Format(EstimatedOutputHeaderStringFormat, i + 1, headerTypeName),
134          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
135          CellTemplate = cellTemplate,
136          SortMode = DataGridViewColumnSortMode.Automatic
137        };
138
139        var outputColumn = new DataGridViewColumn {
140          HeaderText = string.Format(OutputHeaderStringFormat, i + 1, headerTypeName),
141          AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill,
142          CellTemplate = cellTemplate,
143          SortMode = DataGridViewColumnSortMode.Automatic
144        };
145
146        estimatedOutputColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
147        outputColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
148
149        grid.Columns.Add(estimatedOutputColumn);
150        grid.Columns.Add(outputColumn);
151      }
152
153      var absoluteDiffColumn = new DataGridViewColumn {
154        HeaderText = AbsoluteDiffHeaderText,
155        AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
156        CellTemplate = cellTemplate,
157        SortMode = DataGridViewColumnSortMode.Automatic
158      };
159
160      var relativeDiffColumn = new DataGridViewColumn {
161        HeaderText = RelativeDiffHeaderText,
162        AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader,
163        CellTemplate = cellTemplate,
164        SortMode = DataGridViewColumnSortMode.Automatic
165      };
166
167      absoluteDiffColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
168      relativeDiffColumn.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
169
170      grid.Columns.Add(absoluteDiffColumn);
171      grid.Columns.Add(relativeDiffColumn);
172
173      using (var pushInterpreter = pool.Create(Content.Random)) {
174        var rowIndex = 1;
175        for (var i = start; i < end; i++, rowIndex++) {
176          var example = data.Examples[i];
177          var row = new DataGridViewRow {
178            HeaderCell = {
179              Value = rowIndex.ToString(),
180            }
181          };
182
183          row.CreateCells(grid);
184
185          var absoluteDiff = Evaluator.Evaluate(pushInterpreter, Content.Program, i);
186          var relativeDiff = absoluteDiff / Math.Abs(data.BestResult - data.WorstResult) * 100d;
187
188          var inputArgumentCountDict = ViewHelper.CreateArgumentCountDict();
189          for (var j = 0; j < data.InputArgumentTypes.Length; j++) {
190            var type = data.InputArgumentTypes[j];
191            var offset = inputArgumentCountDict[type];
192            row.Cells[j].Value = ViewHelper.StringifyInput(type, offset, Content.Config.FloatStringFormat, example, Separator);
193            inputArgumentCountDict[type]++;
194          }
195
196          var outputArgumentCountDict = ViewHelper.CreateArgumentCountDict();
197          for (var j = 0; j < data.OutputArgumentTypes.Length; j++) {
198            var type = data.OutputArgumentTypes[j];
199            var offset = outputArgumentCountDict[type];
200            row.Cells[data.InputArgumentTypes.Length + j * 2].Value = ViewHelper.StringifyOutput(type, offset, Content.Config.FloatStringFormat, example, Separator);
201            row.Cells[data.InputArgumentTypes.Length + j * 2 + 1].Value = StringifyResult(type, offset, pushInterpreter, example, Separator);
202            outputArgumentCountDict[type]++;
203          }
204
205          row.Cells[data.TotalArgumentCount + 1].Value = absoluteDiff.ToString("0.####");
206          row.Cells[data.TotalArgumentCount + 2].Value = relativeDiff.ToString("0.##") + "%";
207
208          if (absoluteDiff.IsAlmost(data.BestResult)) {
209            for (var j = 0; j < row.Cells.Count; j++) {
210              row.Cells[j].Style.ForeColor = correctExampleFontColor;
211            }
212          }
213
214          grid.Rows.Add(row);
215          pushInterpreter.Reset();
216        }
217      }
218    }
219
220    private string StringifyResult(ExampleArgumentType type, int offset, IPushInterpreter interpreter, Example example, string valueSeparator) {
221      var emptyString = string.Empty;
222
223      switch (type) {
224        case ExampleArgumentType.Integer:
225          return GetEntryAsString(offset, interpreter.IntegerStack);
226
227        case ExampleArgumentType.IntegerVector:
228          return GetVectorEntryAsString(offset, interpreter.IntegerVectorStack);
229
230        case ExampleArgumentType.Float:
231          return interpreter.FloatStack.Count > offset
232            ? interpreter.FloatStack[offset].ToString(CultureInfo.CurrentUICulture)
233            : emptyString;
234
235        case ExampleArgumentType.FloatVector:
236          return GetVectorEntryAsString(offset, interpreter.FloatVectorStack);
237
238        case ExampleArgumentType.Boolean:
239          return GetEntryAsString(offset, interpreter.BooleanStack);
240
241        case ExampleArgumentType.Char:
242          return GetEntryAsString(offset, interpreter.CharStack);
243
244        case ExampleArgumentType.Print:
245          return string.Join(valueSeparator, string.Join(PushEnvironment.NewLine, interpreter.PrintStack.Take(example.OutputPrintLineCount)));
246
247        case ExampleArgumentType.String:
248          return GetEntryAsString(offset, interpreter.StringStack);
249
250        case ExampleArgumentType.StringVector:
251          return GetVectorEntryAsString(offset, interpreter.StringVectorStack);
252
253        default: return string.Empty;
254      }
255    }
256
257    private static string GetEntryAsString<T>(int offset, IPushStack<T> stack) {
258      return stack.Count > offset
259       ? stack[offset].ToString()
260       : string.Empty;
261    }
262
263    private static string GetVectorEntryAsString<T>(int offset, IPushStack<IReadOnlyList<T>> vectorStack) {
264      return vectorStack.Count > offset
265       ? "[" + string.Join(",", vectorStack[offset]) + "]"
266       : string.Empty;
267    }
268
269    private void UpdateExamples(ProblemData data) {
270      exampleComboBox.Items.Clear();
271      if (data == null) return;
272
273      var stringRepresentations = data.Examples.Select(e =>
274        string.Join(Separator, e.InputArgs) +
275        exampleSplitter +
276        string.Join(Separator, e.OutputArgs));
277
278      foreach (var str in stringRepresentations) {
279        exampleComboBox.Items.Add(str);
280      }
281    }
282  }
283}
Note: See TracBrowser for help on using the repository browser.