Changeset 14399 for branches/symbreg-factors-2650/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding
- Timestamp:
- 11/17/16 15:30:11 (8 years ago)
- Location:
- branches/symbreg-factors-2650
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/symbreg-factors-2650
- Property svn:mergeinfo changed
/trunk/sources merged: 14352-14358,14367-14369,14371-14372,14376
- Property svn:mergeinfo changed
-
branches/symbreg-factors-2650/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding
- Property svn:mergeinfo changed
/trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding merged: 14352-14357
- Property svn:mergeinfo changed
-
branches/symbreg-factors-2650/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/Grammars/GrammarUtils.cs
r14351 r14399 25 25 using System.Collections.Generic; 26 26 using System.Linq; 27 28 27 namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding { 29 28 public static class GrammarUtils { 29 private static IEnumerable<ISymbol> GetTopmostSymbols(this ISymbolicExpressionGrammarBase grammar) { 30 // build parents list so we can find out the topmost symbol(s) 31 var parents = new Dictionary<ISymbol, List<ISymbol>>(); 32 foreach (var symbol in grammar.Symbols.Where(x => grammar.GetMinimumSubtreeCount(x) > 0)) { 33 var minSubtreeCount = grammar.GetMinimumSubtreeCount(symbol); 34 for (int argIndex = 0; argIndex < minSubtreeCount; ++argIndex) { 35 foreach (var childSymbol in grammar.GetAllowedActiveSymbols(symbol, argIndex)) { 36 if (!parents.ContainsKey(childSymbol)) 37 parents[childSymbol] = new List<ISymbol>(); 38 parents[childSymbol].Add(symbol); 39 } 40 } 41 } 42 // the topmost symbols have no parents 43 return parents.Values.SelectMany(x => x).Distinct().Where(x => !parents.ContainsKey(x)); 44 } 45 46 private static IReadOnlyCollection<ISymbol> IterateBreadthReverse(this ISymbolicExpressionGrammarBase grammar, ISymbol topSymbol) { 47 // sort symbols in reverse breadth order (starting from the topSymbol) 48 // each symbol is visited only once (this avoids infinite recursion) 49 var symbols = new List<ISymbol> { topSymbol }; 50 var visited = new HashSet<ISymbol> { topSymbol }; 51 int i = 0; 52 while (i < symbols.Count) { 53 var symbol = symbols[i]; 54 var minSubtreeCount = grammar.GetMinimumSubtreeCount(symbol); 55 56 for (int argIndex = 0; argIndex < minSubtreeCount; ++argIndex) { 57 foreach (var childSymbol in grammar.GetAllowedActiveSymbols(symbol, argIndex)) { 58 if (grammar.GetMinimumSubtreeCount(childSymbol) == 0) 59 continue; 60 61 if (visited.Add(childSymbol)) 62 symbols.Add(childSymbol); 63 } 64 } 65 ++i; 66 } 67 symbols.Reverse(); 68 return symbols; 69 } 70 71 private static IEnumerable<ISymbol> GetAllowedActiveSymbols(this ISymbolicExpressionGrammarBase grammar, ISymbol symbol, int argIndex) { 72 return grammar.GetAllowedChildSymbols(symbol, argIndex).Where(s => s.InitialFrequency > 0); 73 } 30 74 31 75 public static void CalculateMinimumExpressionLengths(ISymbolicExpressionGrammarBase grammar, 32 76 Dictionary<string, int> minimumExpressionLengths) { 33 34 77 minimumExpressionLengths.Clear(); 35 78 //terminal symbols => minimum expression length = 1 36 foreach (var s in grammar.Symbols.Where(s => grammar.GetMinimumSubtreeCount(s) == 0)) 37 minimumExpressionLengths[s.Name] = 1; 79 foreach (var s in grammar.Symbols) { 80 if (grammar.GetMinimumSubtreeCount(s) == 0) 81 minimumExpressionLengths[s.Name] = 1; 82 else 83 minimumExpressionLengths[s.Name] = int.MaxValue; 84 } 38 85 39 var symbolAdded = true; 40 while (symbolAdded) { 41 symbolAdded = false; 42 foreach (var remainingSymbol in grammar.Symbols) { 43 if (minimumExpressionLengths.ContainsKey(remainingSymbol.Name)) continue; 44 45 var arguments = grammar.GetMinimumSubtreeCount(remainingSymbol); 46 int minLength = 1; 47 48 foreach (int argumentIndex in Enumerable.Range(0, arguments)) { 49 var capturedMinimumLengths = minimumExpressionLengths; 50 var childSymbols = grammar.GetAllowedChildSymbols(remainingSymbol, argumentIndex) 51 .Where(c => c.InitialFrequency > 0.0 && capturedMinimumLengths.ContainsKey(c.Name)); 52 53 if (!childSymbols.Any()) { 54 minLength = -1; 55 break; 86 foreach (var topSymbol in grammar.GetTopmostSymbols()) { 87 // get all symbols below in reverse breadth order 88 // this way we ensure lengths are calculated bottom-up 89 var symbols = grammar.IterateBreadthReverse(topSymbol); 90 foreach (var symbol in symbols) { 91 long minLength = 1; 92 for (int argIndex = 0; argIndex < grammar.GetMinimumSubtreeCount(symbol); ++argIndex) { 93 long length = grammar.GetAllowedActiveSymbols(symbol, argIndex) 94 .Where(x => minimumExpressionLengths.ContainsKey(x.Name)) 95 .Select(x => minimumExpressionLengths[x.Name]).DefaultIfEmpty(int.MaxValue).Min(); 96 minLength += length; 97 } 98 int oldLength; 99 if (minimumExpressionLengths.TryGetValue(symbol.Name, out oldLength)) 100 minLength = Math.Min(minLength, oldLength); 101 minimumExpressionLengths[symbol.Name] = (int)Math.Min(int.MaxValue, minLength); 102 } 103 // correction step for cycles 104 bool changed = true; 105 while (changed) { 106 changed = false; 107 foreach (var symbol in symbols) { 108 long minLength = Enumerable.Range(0, grammar.GetMinimumSubtreeCount(symbol)) 109 .Sum(x => grammar.GetAllowedActiveSymbols(symbol, x) 110 .Select(s => (long)minimumExpressionLengths[s.Name]).DefaultIfEmpty(int.MaxValue).Min()) + 1; 111 if (minLength < minimumExpressionLengths[symbol.Name]) { 112 minimumExpressionLengths[symbol.Name] = (int)Math.Min(minLength, int.MaxValue); 113 changed = true; 56 114 } 57 var minLengthPerArgument = childSymbols.Min(c => capturedMinimumLengths[c.Name]);58 minLength += minLengthPerArgument;59 }60 61 if (minLength != -1) {62 minimumExpressionLengths[remainingSymbol.Name] = minLength;63 symbolAdded = true;64 115 } 65 116 } 66 117 } 67 68 //set minLength to int.Maxvalue for all symbols that are not reacheable69 foreach (var remainingSymbols in grammar.Symbols) {70 if (!minimumExpressionLengths.ContainsKey(remainingSymbols.Name))71 minimumExpressionLengths[remainingSymbols.Name] = int.MaxValue;72 }73 118 } 74 75 119 76 120 public static void CalculateMinimumExpressionDepth(ISymbolicExpressionGrammarBase grammar, … … 79 123 minimumExpressionDepths.Clear(); 80 124 //terminal symbols => minimum expression depth = 1 81 foreach (var s in grammar.Symbols.Where(s => grammar.GetMinimumSubtreeCount(s) == 0)) 82 minimumExpressionDepths[s.Name] = 1; 125 foreach (var s in grammar.Symbols) { 126 if (grammar.GetMinimumSubtreeCount(s) == 0) 127 minimumExpressionDepths[s.Name] = 1; 128 else 129 minimumExpressionDepths[s.Name] = int.MaxValue; 130 } 83 131 84 var symbolAdded = true; 85 while (symbolAdded) { 86 symbolAdded = false; 87 foreach (var remainingSymbol in grammar.Symbols) { 88 if (minimumExpressionDepths.ContainsKey(remainingSymbol.Name)) continue; 89 90 var arguments = grammar.GetMinimumSubtreeCount(remainingSymbol); 91 int minDepth = -1; 92 93 foreach (int argumentIndex in Enumerable.Range(0, arguments)) { 94 var capturedMinimumDepths = minimumExpressionDepths; 95 var childSymbols = grammar.GetAllowedChildSymbols(remainingSymbol, argumentIndex) 96 .Where(c => c.InitialFrequency > 0.0 && capturedMinimumDepths.ContainsKey(c.Name)); 97 if (!childSymbols.Any()) { 98 minDepth = -1; 99 break; 132 foreach (var topSymbol in grammar.GetTopmostSymbols()) { 133 // get all symbols below in reverse breadth order 134 // this way we ensure lengths are calculated bottom-up 135 var symbols = grammar.IterateBreadthReverse(topSymbol); 136 foreach (var symbol in symbols) { 137 long minDepth = -1; 138 for (int argIndex = 0; argIndex < grammar.GetMinimumSubtreeCount(symbol); ++argIndex) { 139 long depth = grammar.GetAllowedActiveSymbols(symbol, argIndex) 140 .Where(x => minimumExpressionDepths.ContainsKey(x.Name)) 141 .Select(x => (long)minimumExpressionDepths[x.Name]).DefaultIfEmpty(int.MaxValue).Min() + 1; 142 minDepth = Math.Max(minDepth, depth); 143 } 144 int oldDepth; 145 if (minimumExpressionDepths.TryGetValue(symbol.Name, out oldDepth)) 146 minDepth = Math.Min(minDepth, oldDepth); 147 minimumExpressionDepths[symbol.Name] = (int)Math.Min(int.MaxValue, minDepth); 148 } 149 // correction step for cycles 150 bool changed = true; 151 while (changed) { 152 changed = false; 153 foreach (var symbol in symbols) { 154 long minDepth = Enumerable.Range(0, grammar.GetMinimumSubtreeCount(symbol)) 155 .Max(x => grammar.GetAllowedActiveSymbols(symbol, x) 156 .Select(s => (long)minimumExpressionDepths[s.Name]).DefaultIfEmpty(int.MaxValue).Min()) + 1; 157 if (minDepth < minimumExpressionDepths[symbol.Name]) { 158 minimumExpressionDepths[symbol.Name] = (int)Math.Min(minDepth, int.MaxValue); 159 changed = true; 100 160 } 101 var minDepthPerArgument = childSymbols.Min(c => capturedMinimumDepths[c.Name]);102 minDepth = Math.Max(minDepth, 1 + minDepthPerArgument);103 }104 105 if (minDepth != -1) {106 minimumExpressionDepths[remainingSymbol.Name] = minDepth;107 symbolAdded = true;108 161 } 109 162 } 110 }111 112 //set minDepth to int.Maxvalue for all symbols that are not reacheable113 foreach (var remainingSymbols in grammar.Symbols) {114 if (!minimumExpressionDepths.ContainsKey(remainingSymbols.Name))115 minimumExpressionDepths[remainingSymbols.Name] = int.MaxValue;116 163 } 117 164 }
Note: See TracChangeset
for help on using the changeset viewer.