Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/13/10 20:44:31 (14 years ago)
Author:
gkronber
Message:

Fixed bugs related to dynamic symbol constraints with ADFs. #290 (Implement ADFs)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.3/SymbolicExpressionTreeNode.cs

    r3294 r3338  
    3838    private Symbol symbol;
    3939
    40     public SymbolicExpressionTreeNode() { }
     40    public SymbolicExpressionTreeNode() {
     41      subTrees = new List<SymbolicExpressionTreeNode>();
     42    }
    4143
    42     public SymbolicExpressionTreeNode(Symbol symbol) {
    43       subTrees = new List<SymbolicExpressionTreeNode>();
     44    public SymbolicExpressionTreeNode(Symbol symbol)
     45      : this() {
    4446      this.symbol = symbol;
    4547    }
     
    4951      symbol = original.symbol;
    5052      subTrees = new List<SymbolicExpressionTreeNode>();
     53      grammar = original.grammar;
    5154      foreach (var subtree in original.SubTrees) {
    52         AddSubTree((SymbolicExpressionTreeNode)subtree.Clone());
     55        SubTrees.Add((SymbolicExpressionTreeNode)subtree.Clone());
    5356      }
    54       dynamicSymbols = new Dictionary<string, int>(original.dynamicSymbols);
    5557    }
    5658
     
    6870    }
    6971
     72    private ISymbolicExpressionGrammar grammar;
     73    public virtual ISymbolicExpressionGrammar Grammar {
     74      get { return grammar; }
     75      set {
     76        grammar = value;
     77        foreach (var subtree in subTrees)
     78          subtree.Grammar = value;
     79      }
     80    }
     81
    7082    public int GetSize() {
    7183      int size = 1;
     
    8092    }
    8193
    82     [Storable]
    83     private Dictionary<string, int> dynamicSymbols = new Dictionary<string, int>();
    84     public void AddDynamicSymbol(string symbolName) {
    85       Debug.Assert(!dynamicSymbols.ContainsKey(symbolName));
    86       dynamicSymbols[symbolName] = 0;
    87     }
    88 
    89     public void AddDynamicSymbol(string symbolName, int nArguments) {
    90       AddDynamicSymbol(symbolName);
    91       SetDynamicSymbolArgumentCount(symbolName, nArguments);
    92     }
    93 
    94     public void RemoveDynamicSymbol(string symbolName) {
    95       dynamicSymbols.Remove(symbolName);
    96     }
    97 
    98     public IEnumerable<string> DynamicSymbols {
    99       get { return dynamicSymbols.Keys; }
    100     }
    101 
    102     public int GetDynamicSymbolArgumentCount(string symbolName) {
    103       return dynamicSymbols[symbolName];
    104     }
    105     public void SetDynamicSymbolArgumentCount(string symbolName, int nArguments) {
    106       Debug.Assert(dynamicSymbols.ContainsKey(symbolName));
    107       dynamicSymbols[symbolName] = nArguments;
    108     }
    109 
    11094    public virtual void ResetLocalParameters(IRandom random) { }
    11195    public virtual void ShakeLocalParameters(IRandom random, double shakingFactor) { }
    11296
    113     protected internal virtual void AddSubTree(SymbolicExpressionTreeNode tree) {
     97    public virtual void AddSubTree(SymbolicExpressionTreeNode tree) {
    11498      SubTrees.Add(tree);
     99      //if (tree != null)
     100      tree.Grammar = Grammar;
    115101    }
    116102
    117     protected internal virtual void InsertSubTree(int index, SymbolicExpressionTreeNode tree) {
     103    public virtual void InsertSubTree(int index, SymbolicExpressionTreeNode tree) {
    118104      SubTrees.Insert(index, tree);
     105      //if (tree != null)
     106      tree.Grammar = Grammar;
    119107    }
    120108
    121     protected internal virtual void RemoveSubTree(int index) {
     109    public virtual void RemoveSubTree(int index) {
     110      //if (SubTrees[index] != null)
     111      SubTrees[index].Grammar = null;
    122112      SubTrees.RemoveAt(index);
    123113    }
     114
     115    public IEnumerable<SymbolicExpressionTreeNode> IterateNodesPrefix() {
     116      yield return this;
     117      foreach (var subtree in subTrees) {
     118        foreach (var n in subtree.IterateNodesPrefix())
     119          yield return n;
     120      }
     121    }
     122
     123    public IEnumerable<SymbolicExpressionTreeNode> IterateNodesPostfix() {
     124      foreach (var subtree in subTrees) {
     125        foreach (var n in subtree.IterateNodesPrefix())
     126          yield return n;
     127      }
     128      yield return this;
     129    }
     130    //public int GetMinExpressionLength() {
     131    //  return Grammar.GetMinExpressionLength(Symbol);
     132    //}
     133    //public int GetMaxExpressionLength() {
     134    //  return Grammar.GetMaxExpressionLength(Symbol);
     135    //}
     136    //public int GetMinExpressionDepth() {
     137    //  return Grammar.GetMinExpressionDepth(Symbol);
     138    //}
     139    public IEnumerable<Symbol> GetAllowedSymbols(int argumentIndex) {
     140      return Grammar.Symbols.Where(s => Grammar.IsAllowedChild(Symbol, s, argumentIndex));
     141    }
     142    public int GetMinSubtreeCount() {
     143      return Grammar.GetMinSubtreeCount(Symbol);
     144    }
     145    public int GetMaxSubtreeCount() {
     146      return Grammar.GetMaxSubtreeCount(Symbol);
     147    }
     148    //public int GetMaxExpressionLength(Symbol s) {
     149    //  return Grammar.GetMaxExpressionLength(s);
     150    //}
     151    //public int GetMinExpressionLength(Symbol s) {
     152    //  return Grammar.GetMinExpressionLength(s);
     153    //}
     154    //public int GetMinExpressionDepth(Symbol s) {
     155    //  return Grammar.GetMinExpressionDepth(s);
     156    //}
    124157
    125158    #region ICloneable Members
     
    130163
    131164    #endregion
     165
     166
     167    public bool IsValidTree() {
     168      var matchingSymbol = (from symb in Grammar.Symbols
     169                            where symb.Name == Symbol.Name
     170                            select symb).SingleOrDefault();
     171
     172      if (SubTrees.Count < Grammar.GetMinSubtreeCount(matchingSymbol)) return false;
     173      else if (SubTrees.Count > Grammar.GetMaxSubtreeCount(matchingSymbol)) return false;
     174      else for (int i = 0; i < SubTrees.Count; i++) {
     175          if (!GetAllowedSymbols(i).Select(x => x.Name).Contains(SubTrees[i].Symbol.Name)) return false;
     176          if (!SubTrees[i].IsValidTree()) return false;
     177        }
     178      return true;
     179    }
    132180  }
    133181}
Note: See TracChangeset for help on using the changeset viewer.