Free cookie consent management tool by TermsFeed Policy Generator

source: branches/2895_PushGP_GenealogyAnalysis/HeuristicLab.Problems.ProgramSynthesis/Push/Generators/CodeGenerator/CodeGeneratorUtils.cs @ 15771

Last change on this file since 15771 was 15771, checked in by bburlacu, 6 years ago

#2895: Add solution skeleton for PushGP with genealogy analysis.

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