Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/16/12 16:28:49 (12 years ago)
Author:
gkronber
Message:

merged r7609:7840 from trunk into time series branch

Location:
branches/HeuristicLab.TimeSeries
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.TimeSeries

  • branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeSimplifier.cs

    r7463 r7842  
    2222using System;
    2323using System.Collections.Generic;
    24 using System.Diagnostics;
    2524using System.Linq;
    2625using HeuristicLab.Common;
     
    4140    private Exponential expSymbol = new Exponential();
    4241    private Root rootSymbol = new Root();
     42    private Square sqrSymbol = new Square();
     43    private SquareRoot sqrtSymbol = new SquareRoot();
    4344    private Power powSymbol = new Power();
    4445    private Sine sineSymbol = new Sine();
     
    128129    private bool IsRoot(ISymbolicExpressionTreeNode node) {
    129130      return node.Symbol is Root;
     131    }
     132    private bool IsSquare(ISymbolicExpressionTreeNode node) {
     133      return node.Symbol is Square;
     134    }
     135    private bool IsSquareRoot(ISymbolicExpressionTreeNode node) {
     136      return node.Symbol is SquareRoot;
    130137    }
    131138    private bool IsPower(ISymbolicExpressionTreeNode node) {
     
    212219      } else if (IsExp(original)) {
    213220        return SimplifyExp(original);
     221      } else if (IsSquare(original)) {
     222        return SimplifySquare(original);
     223      } else if (IsSquareRoot(original)) {
     224        return SimplifySquareRoot(original);
     225      } else if (IsPower(original)) {
     226        return SimplifyPower(original);
    214227      } else if (IsRoot(original)) {
    215228        return SimplifyRoot(original);
    216       } else if (IsPower(original)) {
    217         return SimplifyPower(original);
    218229      } else if (IsSine(original)) {
    219230        return SimplifySine(original);
     
    363374      return MakeExp(GetSimplifiedTree(original.GetSubtree(0)));
    364375    }
     376    private ISymbolicExpressionTreeNode SimplifySquare(ISymbolicExpressionTreeNode original) {
     377      return MakeSquare(GetSimplifiedTree(original.GetSubtree(0)));
     378    }
     379    private ISymbolicExpressionTreeNode SimplifySquareRoot(ISymbolicExpressionTreeNode original) {
     380      return MakeSquareRoot(GetSimplifiedTree(original.GetSubtree(0)));
     381    }
    365382
    366383    private ISymbolicExpressionTreeNode SimplifyLog(ISymbolicExpressionTreeNode original) {
     
    587604      }
    588605    }
     606
     607    private ISymbolicExpressionTreeNode MakeSquare(ISymbolicExpressionTreeNode node) {
     608      if (IsConstant(node)) {
     609        var constT = node as ConstantTreeNode;
     610        return MakeConstant(constT.Value * constT.Value);
     611      } else if (IsSquareRoot(node)) {
     612        return node.GetSubtree(0);
     613      } else {
     614        var sqrNode = sqrSymbol.CreateTreeNode();
     615        sqrNode.AddSubtree(node);
     616        return sqrNode;
     617      }
     618    }
     619    private ISymbolicExpressionTreeNode MakeSquareRoot(ISymbolicExpressionTreeNode node) {
     620      if (IsConstant(node)) {
     621        var constT = node as ConstantTreeNode;
     622        return MakeConstant(Math.Sqrt(constT.Value));
     623      } else if (IsSquare(node)) {
     624        return node.GetSubtree(0);
     625      } else {
     626        var sqrtNode = sqrtSymbol.CreateTreeNode();
     627        sqrtNode.AddSubtree(node);
     628        return sqrtNode;
     629      }
     630    }
     631
    589632    private ISymbolicExpressionTreeNode MakeLog(ISymbolicExpressionTreeNode node) {
    590633      if (IsConstant(node)) {
     
    593636      } else if (IsExp(node)) {
    594637        return node.GetSubtree(0);
     638      } else if (IsSquareRoot(node)) {
     639        return MakeFraction(MakeLog(node.GetSubtree(0)), MakeConstant(2.0));
    595640      } else {
    596641        var logNode = logSymbol.CreateTreeNode();
     
    691736      } else if (IsDivision(a) && IsConstant(b)) {
    692737        // (a1 / a2) / c => (a1 / (a2 * c))
    693         Trace.Assert(a.Subtrees.Count() == 2);
    694738        return MakeFraction(a.GetSubtree(0), MakeProduct(a.GetSubtree(1), b));
    695739      } else if (IsDivision(a) && IsDivision(b)) {
    696740        // (a1 / a2) / (b1 / b2) =>
    697         Trace.Assert(a.Subtrees.Count() == 2);
    698         Trace.Assert(b.Subtrees.Count() == 2);
    699741        return MakeFraction(MakeProduct(a.GetSubtree(0), b.GetSubtree(1)), MakeProduct(a.GetSubtree(1), b.GetSubtree(0)));
    700742      } else if (IsDivision(a)) {
    701743        // (a1 / a2) / b => (a1 / (a2 * b))
    702         Trace.Assert(a.Subtrees.Count() == 2);
    703744        return MakeFraction(a.GetSubtree(0), MakeProduct(a.GetSubtree(1), b));
    704745      } else if (IsDivision(b)) {
    705746        // a / (b1 / b2) => (a * b2) / b1
    706         Trace.Assert(b.Subtrees.Count() == 2);
    707747        return MakeFraction(MakeProduct(a, b.GetSubtree(1)), b.GetSubtree(0));
    708748      } else {
     
    829869      } else if (IsDivision(a) && IsDivision(b)) {
    830870        // (a1 / a2) * (b1 / b2) => (a1 * b1) / (a2 * b2)
    831         Trace.Assert(a.Subtrees.Count() == 2);
    832         Trace.Assert(b.Subtrees.Count() == 2);
    833871        return MakeFraction(MakeProduct(a.GetSubtree(0), b.GetSubtree(0)), MakeProduct(a.GetSubtree(1), b.GetSubtree(1)));
    834872      } else if (IsDivision(a)) {
    835873        // (a1 / a2) * b => (a1 * b) / a2
    836         Trace.Assert(a.Subtrees.Count() == 2);
    837874        return MakeFraction(MakeProduct(a.GetSubtree(0), b), a.GetSubtree(1));
    838875      } else if (IsDivision(b)) {
    839876        // a * (b1 / b2) => (b1 * a) / b2
    840         Trace.Assert(b.Subtrees.Count() == 2);
    841877        return MakeFraction(MakeProduct(b.GetSubtree(0), a), b.GetSubtree(1));
    842878      } else if (IsMultiplication(a) && IsMultiplication(b)) {
     
    9951031        return MakeConstant(1.0 / ((ConstantTreeNode)x).Value);
    9961032      } else if (IsDivision(x)) {
    997         Trace.Assert(x.Subtrees.Count() == 2);
    9981033        return MakeFraction(x.GetSubtree(1), x.GetSubtree(0));
    9991034      } else {
Note: See TracChangeset for help on using the changeset viewer.