Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/27/13 20:17:17 (10 years ago)
Author:
gkronber
Message:

#2026 worked on random search solver (now all examples are working)

File:
1 edited

Legend:

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

    r10080 r10086  
    8181            nextAlternative = (nextAlternative + 1) % subTrees.Length;
    8282          } while (subTrees[nextAlternative] != null && subTrees[nextAlternative].Done);
    83 
    84           // from the nodes which are not done take the first with minimum count
    85           //nextAlternative = (from i in Enumerable.Range(0, subTrees.Length)
    86           //                   where subTrees[i] == null || !subTrees[i].Done
    87           //                   orderby subTrees[i]==null?0:subTrees[i].Count ascending
    88           //                   select i).FirstOrDefault(); // possibly there are no children left that can be tried
    8983        } else {
    9084          // for sequenceNodes update all sub-trees
     
    177171
    178172    private AttributedGrammar CreateGrammarFromAst(GPDefNode ast) {
     173
     174      var nonTerminals = ast.NonTerminals.Select(t => new Symbol(t.Ident, GetSymbolAttributes(t.FormalParameters))).ToArray();
     175      var terminals = ast.Terminals.Select(t => new Symbol(t.Ident, GetSymbolAttributes(t.FormalParameters))).ToArray();
    179176      string startSymbolName = ast.Rules.First().NtSymbol;
    180       var startSymbolNode = ast.NonTerminals.Single(nt => nt.Ident == startSymbolName);
     177
    181178      // create startSymbol
    182       var g = new AttributedGrammar(new Symbol(startSymbolName, ParseSymbolAttributes(startSymbolNode.FormalParameters)));
     179      var startSymbol = nonTerminals.Single(s => s.Name == startSymbolName);
     180      var g = new AttributedGrammar(startSymbol, nonTerminals, terminals);
     181
     182      // add all production rules
    183183      foreach (var rule in ast.Rules) {
    184         // create nt-symbol
    185         var ntSymbolName = rule.NtSymbol;
    186         var ntSymbolNode = ast.NonTerminals.Single(nt => nt.Ident == ntSymbolName);
    187         var attributes = ParseSymbolAttributes(ntSymbolNode.FormalParameters);
    188         var ntSymbol = new Symbol(ntSymbolName, attributes);
    189         foreach (var alt in GetAlternatives(rule.Alternatives)) {
     184        var ntSymbol = nonTerminals.Single(s => s.Name == rule.NtSymbol);
     185        foreach (var alt in GetAlternatives(rule.Alternatives, nonTerminals.Concat(terminals))) {
    190186          g.AddProductionRule(ntSymbol, alt);
    191187        }
     
    196192    }
    197193
    198     private IEnumerable<IAttribute> ParseSymbolAttributes(string formalParameters) {
     194    private IEnumerable<IAttribute> GetSymbolAttributes(string formalParameters) {
    199195      return (from fieldDef in Util.ExtractParameters(formalParameters)
    200196              select new Attribute(fieldDef.Identifier, fieldDef.Type, AttributeType.Parse(fieldDef.RefOrOut))).
     
    202198    }
    203199
    204     private IEnumerable<Sequence> GetAlternatives(AlternativesNode altNode) {
     200    private IEnumerable<Sequence> GetAlternatives(AlternativesNode altNode, IEnumerable<ISymbol> allSymbols) {
    205201      foreach (var alt in altNode.Alternatives) {
    206         yield return GetSequence(alt.Sequence);
    207       }
    208     }
    209 
    210     private Sequence GetSequence(IEnumerable<RuleExprNode> sequence) {
     202        yield return GetSequence(alt.Sequence, allSymbols);
     203      }
     204    }
     205
     206    private Sequence GetSequence(IEnumerable<RuleExprNode> sequence, IEnumerable<ISymbol> allSymbols) {
    211207      Debug.Assert(sequence.All(s => s is CallSymbolNode || s is RuleActionNode));
    212208      var l = new List<ISymbol>();
     
    215211        var actionNode = node as RuleActionNode;
    216212        if (callSymbolNode != null) {
    217           l.Add(new Symbol(callSymbolNode.Ident, ParseSymbolAttributes(callSymbolNode.ActualParameter)));
     213          Debug.Assert(allSymbols.Any(s => s.Name == callSymbolNode.Ident));
     214          // create a new symbol with actual parameters
     215          l.Add(new Symbol(callSymbolNode.Ident, GetSymbolAttributes(callSymbolNode.ActualParameter)));
    218216        } else if (actionNode != null) {
    219217          l.Add(new SemanticSymbol("SEM", actionNode.SrcCode));
     
    313311
    314312      // make sure we first descent into terminal alternatives -> we just order by number of non-terminals in the alternative
    315       var altsWithSemActions = g.GetAlternativesWithSemanticActions(s).OrderBy(alt => alt.Count(symb => g.IsNonTerminal(symb))).ToArray();
     313      var altsWithSemActions = g.GetAlternativesWithSemanticActions(s)
     314        .OrderBy(alt => alt.Count(symb => g.IsNonTerminal(symb))).ToArray();
    316315
    317316      if (altsWithSemActions.Length > 1) {
Note: See TracChangeset for help on using the changeset viewer.