Changeset 11310 for branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisModelComplexityAnalyzer.cs
- Timestamp:
- 08/27/14 10:29:38 (10 years ago)
- Location:
- branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic
- Property svn:mergeinfo changed
-
branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisModelComplexityAnalyzer.cs
r10751 r11310 23 23 24 24 using System; 25 using System.Linq;26 25 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; 27 26 … … 29 28 public class SymbolicDataAnalysisModelComplexityAnalyzer { 30 29 public static double CalculateComplexity(ISymbolicExpressionTreeNode node) { 31 if (node is ConstantTreeNode) return 0; 32 if (node is VariableTreeNode) return 1; 30 switch (OpCodes.MapSymbolToOpCode(node)) { 31 case OpCodes.Constant: { 32 return 1; 33 } 34 case OpCodes.Variable: { 35 return 2; 36 } 37 case OpCodes.Add: { 38 double complexity = 0; 39 for (int i = 0; i < node.SubtreeCount; i++) { 40 complexity += CalculateComplexity(node.GetSubtree(i)); 41 } 42 return complexity; 43 } 44 case OpCodes.Sub: { 45 double complexity = 0; 46 for (int i = 0; i < node.SubtreeCount; i++) { 47 complexity += CalculateComplexity(node.GetSubtree(i)); 48 } 49 return complexity; 50 } 51 case OpCodes.Mul: { 52 double complexity = 1; 53 for (int i = 0; i < node.SubtreeCount; i++) { 54 complexity *= CalculateComplexity(node.GetSubtree(i)); 55 } 56 return complexity == 1 ? node.SubtreeCount : complexity; 57 } 58 case OpCodes.Div: { 59 double complexity = 1; 60 for (int i = 0; i < node.SubtreeCount; i++) { 61 complexity *= CalculateComplexity(node.GetSubtree(i)) * 2; 62 } 63 return complexity; 64 } 65 case OpCodes.Sin: { 66 double complexity = CalculateComplexity(node.GetSubtree(0)); 67 return complexity * 10; 68 } 69 case OpCodes.Cos: { 70 double complexity = CalculateComplexity(node.GetSubtree(0)); 71 return complexity * 10; 72 } 73 case OpCodes.Tan: { 74 double complexity = CalculateComplexity(node.GetSubtree(0)); 75 return complexity * 10; 76 } 77 case OpCodes.Exp: { 78 double complexity = CalculateComplexity(node.GetSubtree(0)); 79 return complexity * 10; 80 } 81 case OpCodes.Log: { 82 double complexity = CalculateComplexity(node.GetSubtree(0)); 83 return complexity * 10; 84 } 85 case OpCodes.Square: { 86 double complexity = CalculateComplexity(node.GetSubtree(0)); 87 return 2 * complexity; 88 } 89 case OpCodes.SquareRoot: { 90 double complexity = CalculateComplexity(node.GetSubtree(0)); 91 return 10 * complexity; 92 } 93 case OpCodes.Power: { 94 double complexity = CalculateComplexity(node.GetSubtree(0)); 95 var exponentNode = node.GetSubtree(1) as ConstantTreeNode; 96 if (exponentNode != null) { 97 double exponent = exponentNode.Value; 98 if (exponent < 0) exponent = Math.Abs(exponent); 99 if (exponent < 1) exponent = 1 / exponent; 100 return Math.Pow(complexity, Math.Round(exponent)); 101 } 33 102 34 var subtreeComplexities = node.Subtrees.Select(CalculateComplexity); 103 double exponentComplexity = CalculateComplexity(node.GetSubtree(1)); 104 return Math.Pow(complexity, 2 * exponentComplexity); 105 } 106 case OpCodes.Root: { 107 double complexity = CalculateComplexity(node.GetSubtree(0)); 108 var rootNode = node.GetSubtree(1) as ConstantTreeNode; 109 if (rootNode != null) { 110 double root = rootNode.Value; 111 if (root < 0) root = Math.Abs(root); 112 if (root < 1) root = 1 / root; 113 return Math.Pow(complexity, Math.Round(root)); 114 } 35 115 36 double result = 0.0; 37 switch (OpCodes.MapSymbolToOpCode(node)) { 38 case OpCodes.Add: 39 case OpCodes.Sub: 40 foreach (var comp in subtreeComplexities) { 41 result += comp; 116 double rootComplexity = CalculateComplexity(node.GetSubtree(1)); 117 return Math.Pow(complexity, 2 * rootComplexity); 42 118 } 43 break; 44 case OpCodes.Mul: 45 result = 1; 46 foreach (var comp in subtreeComplexities) { 47 result *= comp + 1; 48 } 49 break; 50 //return subtreeComplexities.Aggregate((a, b) => a == 0 ? b : b == 0 ? a : (a + 1) * (b + 1)); 51 case OpCodes.Div: 52 result = 1; 53 foreach (var comp in subtreeComplexities) { 54 result *= comp + 1; 55 } 56 result *= 2; 57 break; 58 //return subtreeComplexities.Aggregate((a, b) => a == 0 ? b * 2 : b == 0 ? a : (a + 1) * (b + 1) * 2); 119 59 120 default: 60 121 throw new NotSupportedException(); 61 122 } 62 return result;63 123 } 64 124 }
Note: See TracChangeset
for help on using the changeset viewer.