Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/27/14 10:29:38 (10 years ago)
Author:
mkommend
Message:

#2175: Merged trunk changes into complexity branch.

Location:
branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic

  • branches/DataAnalysis.ComplexityAnalyzer/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Analyzers/SymbolicDataAnalysisModelComplexityAnalyzer.cs

    r10751 r11310  
    2323
    2424using System;
    25 using System.Linq;
    2625using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
    2726
     
    2928  public class SymbolicDataAnalysisModelComplexityAnalyzer {
    3029    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            }
    33102
    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            }
    35115
    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);
    42118          }
    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
    59120        default:
    60121          throw new NotSupportedException();
    61122      }
    62       return result;
    63123    }
    64124  }
Note: See TracChangeset for help on using the changeset viewer.