Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/22/14 21:05:46 (10 years ago)
Author:
gkronber
Message:

#2025 reintegrated initialization of terminal values into the random search solver.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.Problems.GPDL/CodeGenerator/RandomSearchCodeGen.cs

    r10386 r10387  
    3333      // terminals
    3434      if(Grammar.subtreeCount[state] == 0) {
    35         t = Grammar.CreateTerminalNode(state, random, problem);
     35        t = CreateTerminalNode(state, random, problem);
    3636      } else {
    3737        // if the symbol has alternatives then we must choose one randomly (only one sub-tree in this case)
     
    5252      curDepth -=1;
    5353      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      }
    5461    }
    5562
     
    144151}";
    145152
    146     public void Generate(IGrammar grammar, bool maximization, SourceBuilder problemSourceCode) {
     153    public void Generate(IGrammar grammar, IEnumerable<TerminalNode> terminals, bool maximization, SourceBuilder problemSourceCode) {
    147154      var solverSourceCode = new SourceBuilder();
    148155      solverSourceCode.Append(solverTemplate)
    149156        .Replace("?MAXIMIZATION?", maximization.ToString().ToLowerInvariant())
    150157        .Replace("?SAMPLEALTERNATIVECODE?", GenerateSampleAlternativeSource(grammar))
     158        .Replace("?CREATETERMINALNODECODE?", GenerateCreateTerminalCode(grammar, terminals))
    151159      ;
    152160
     
    188196      return sb.ToString();
    189197    }
     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    }
    190227    private void GenerateReturnStatement(IEnumerable<int> idxs, SourceBuilder sb) {
    191228      if (idxs.Count() == 1) {
Note: See TracChangeset for help on using the changeset viewer.