- Timestamp:
- 01/22/14 21:05:46 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Problems.GPDL/CodeGenerator/RandomSearchCodeGen.cs
r10386 r10387 33 33 // terminals 34 34 if(Grammar.subtreeCount[state] == 0) { 35 t = Grammar.CreateTerminalNode(state, random, problem);35 t = CreateTerminalNode(state, random, problem); 36 36 } else { 37 37 // if the symbol has alternatives then we must choose one randomly (only one sub-tree in this case) … … 52 52 curDepth -=1; 53 53 return t; 54 } 55 56 public static Tree CreateTerminalNode(int state, Random random, ?IDENT?Problem problem) { 57 switch(state) { 58 ?CREATETERMINALNODECODE? 59 default: { throw new ArgumentException(""Unknown state index"" + state); } 60 } 54 61 } 55 62 … … 144 151 }"; 145 152 146 public void Generate(IGrammar grammar, bool maximization, SourceBuilder problemSourceCode) {153 public void Generate(IGrammar grammar, IEnumerable<TerminalNode> terminals, bool maximization, SourceBuilder problemSourceCode) { 147 154 var solverSourceCode = new SourceBuilder(); 148 155 solverSourceCode.Append(solverTemplate) 149 156 .Replace("?MAXIMIZATION?", maximization.ToString().ToLowerInvariant()) 150 157 .Replace("?SAMPLEALTERNATIVECODE?", GenerateSampleAlternativeSource(grammar)) 158 .Replace("?CREATETERMINALNODECODE?", GenerateCreateTerminalCode(grammar, terminals)) 151 159 ; 152 160 … … 188 196 return sb.ToString(); 189 197 } 198 private string GenerateCreateTerminalCode(IGrammar grammar, IEnumerable<TerminalNode> terminals) { 199 Debug.Assert(grammar.Symbols.First().Equals(grammar.StartSymbol)); 200 var sb = new SourceBuilder(); 201 var allSymbols = grammar.Symbols.ToList(); 202 foreach (var s in grammar.Symbols) { 203 if (grammar.IsTerminal(s)) { 204 sb.AppendFormat("case {0}: {{", allSymbols.IndexOf(s)).BeginBlock(); 205 sb.AppendFormat("var t = new {0}Tree();", s.Name).AppendLine(); 206 var terminal = terminals.Single(t => t.Ident == s.Name); 207 foreach (var constr in terminal.Constraints) { 208 if (constr.Type == ConstraintNodeType.Set) { 209 sb.Append("{").BeginBlock(); 210 sb.AppendFormat("var elements = problem.GetAllowed{0}_{1}().ToArray();", terminal.Ident, constr.Ident).AppendLine(); 211 sb.AppendFormat("t.{0} = elements[random.Next(elements.Length)]; ", constr.Ident).EndBlock(); 212 sb.AppendLine("}"); 213 } else { 214 sb.Append("{").BeginBlock(); 215 sb.AppendFormat(" var max = problem.GetMax{0}_{1}();", terminal.Ident, constr.Ident).AppendLine(); 216 sb.AppendFormat(" var min = problem.GetMin{0}_{1}();", terminal.Ident, constr.Ident).AppendLine(); 217 sb.AppendFormat("t.{0} = random.NextDouble() * (max - min) + min;", constr.Ident).EndBlock(); 218 sb.AppendLine("}"); 219 } 220 } 221 sb.AppendLine("return t;").EndBlock(); 222 sb.Append("}"); 223 } 224 } 225 return sb.ToString(); 226 } 190 227 private void GenerateReturnStatement(IEnumerable<int> idxs, SourceBuilder sb) { 191 228 if (idxs.Count() == 1) {
Note: See TracChangeset
for help on using the changeset viewer.