Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PushGP/HeuristicLab.PushGP/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/CodeGeneratorUtils.cs @ 15273

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

#2665 Started Plush Encoding, Added Zero Error Individual Count Analyzer

File size: 5.7 KB
Line 
1using System.Collections.Generic;
2using System.Linq;
3
4namespace HeuristicLab.Problems.ProgramSynthesis.Push.Generators.CodeGenerator {
5  using Core;
6  using Expressions;
7
8  using HeuristicLab.Problems.ProgramSynthesis.Base.Erc;
9  using HeuristicLab.Problems.ProgramSynthesis.Base.Extensions;
10  using HeuristicLab.Problems.ProgramSynthesis.Push.Configuration;
11  using HeuristicLab.Problems.ProgramSynthesis.Push.SolutionCreator;
12
13  using Stack;
14
15  internal static class CodeGeneratorUtils {
16    private static readonly Expression Noop = ExpressionTable.GetStatelessExpression<ExecNoopExpression>();
17
18    internal static Expression MapToExpression(
19      IRandom random,
20      IReadOnlyErcOptions ercOptions,
21      IReadOnlyExpressionsConfiguration config,
22      IDictionary<string, Expression> customExpressions = null) {
23      var customCount = customExpressions == null ? 0 : customExpressions.Count;
24      var enabledExpressionCount = config.EnabledExpressions.Count;
25      var index = random.Next(enabledExpressionCount + customCount);
26
27      return index >= config.EnabledExpressions.Count
28        ? customExpressions.Values.ElementAt(index - enabledExpressionCount)
29        : MapToExpression(index, random, ercOptions, config);
30    }
31
32    internal static Expression MapToExpression(
33      int index,
34      IRandom random,
35      IReadOnlyErcOptions ercOptions,
36      IReadOnlyExpressionsConfiguration config) {
37
38      switch (index) {
39        case PushSolutionEncoding.Noop:
40          return Noop;
41
42        case PushSolutionEncoding.Erc:
43          var stackType = config.ExpressionsPerStackCount.RandomWeightedOrDefault(random, pair => pair.Value).Key;
44
45          if (stackType == default(StackTypes))
46            break;
47
48          return CreateRandomErcExpression(stackType, random, ercOptions);
49
50        case PushSolutionEncoding.In:
51          if (config.InExpressionCount == 0) break;
52
53          var nr = random.Next(0, config.InExpressionCount) + 1;
54          return ExpressionTable.InExpressionTable[nr];
55      }
56
57      var name = config.EnabledExpressions[index];
58      return ExpressionTable.GetExpression(name);
59    }
60
61    //private static Expression CreateExpressionOrErc(
62    //  string expressionName,
63    //  IRandom random,
64    //  IReadOnlyErcOptions ercOptions) {
65    //  var x = random.NextDouble();
66    //  Expression expression = null;
67
68    //  if (x < ercOptions.ErcProbability) {
69    //    var expressionType = ExpressionTable.NameToTypeTable[expressionName];
70    //    expression = CreateRandomErcExpression(
71    //        ExpressionTable.TypeToAttributeTable[expressionType].StackType,
72    //        random,
73    //        ercOptions);
74    //  }
75
76    //  if (expression == null || expression is ExecNoopExpression) {
77    //    expression = ExpressionTable.GetExpression(expressionName);
78    //  }
79
80    //  return expression;
81    //}
82
83    /// <summary>
84    /// Create a ErcExpression whereby the type of the expression conforms to the passed stack type.
85    /// </summary>
86    /// <param name="type"></param>
87    /// <param name="random"></param>
88    /// <param name="pushConfiguration"></param>
89    /// <returns>ErcExpression or Noop if the required ErcOptionConstants is not configured or enabled in the passed config.</returns>
90    internal static Expression CreateRandomErcExpression(StackTypes type, IRandom random, IReadOnlyErcOptions ercOptions) {
91      switch (type) {
92        case StackTypes.Integer:
93          return ercOptions.IntegerErcOptions == null || !ercOptions.IntegerErcOptions.IsEnabled
94             ? Noop
95             : new IntegerPushExpression(ercOptions.IntegerErcOptions.GetErcValue(random));
96
97        case StackTypes.Float:
98          return ercOptions.FloatErcOptions == null || !ercOptions.FloatErcOptions.IsEnabled
99            ? Noop
100            : new FloatPushExpression(ercOptions.FloatErcOptions.GetErcValue(random));
101
102        case StackTypes.Boolean:
103          return ercOptions.BooleanErcOptions == null || !ercOptions.BooleanErcOptions.IsEnabled
104            ? Noop
105            : new BooleanPushExpression(ercOptions.BooleanErcOptions.GetErcValue(random));
106
107        case StackTypes.Name:
108          return ercOptions.NameErcOptions == null || !ercOptions.NameErcOptions.IsEnabled
109            ? Noop
110            : new NamePushExpression(ercOptions.NameErcOptions.GetErcValue(random));
111
112        case StackTypes.String:
113          return ercOptions.StringErcOptions == null || !ercOptions.StringErcOptions.IsEnabled
114            ? Noop
115            : new StringPushExpression(ercOptions.StringErcOptions.GetErcValue(random));
116
117        case StackTypes.Char:
118          return ercOptions.CharErcOptions == null || !ercOptions.CharErcOptions.IsEnabled
119            ? Noop
120            : new CharPushExpression(ercOptions.CharErcOptions.GetErcValue(random));
121
122        case StackTypes.IntegerVector:
123          return ercOptions.IntegerVectorErcOptions == null || !ercOptions.IntegerVectorErcOptions.IsEnabled
124            ? Noop
125            : new IntegerVectorPushExpression(ercOptions.IntegerVectorErcOptions.GetErcValue(random).Select(i => (long)i).ToList());
126
127        case StackTypes.FloatVector:
128          return ercOptions.FloatVectorErcOptions == null || !ercOptions.FloatVectorErcOptions.IsEnabled
129            ? Noop
130            : new FloatVectorPushExpression(ercOptions.FloatVectorErcOptions.GetErcValue(random));
131
132        case StackTypes.StringVector:
133          return ercOptions.StringVectorErcOptions == null || !ercOptions.StringVectorErcOptions.IsEnabled
134            ? Noop
135            : new StringVectorPushExpression(ercOptions.StringVectorErcOptions.GetErcValue(random));
136
137        default:
138          return Noop;
139      }
140    }
141  }
142}
Note: See TracBrowser for help on using the repository browser.