Changeset 7842 for branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeSimplifier.cs
- Timestamp:
- 05/16/12 16:28:49 (12 years ago)
- Location:
- branches/HeuristicLab.TimeSeries
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.TimeSeries
- Property svn:mergeinfo changed
-
branches/HeuristicLab.TimeSeries/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/SymbolicDataAnalysisExpressionTreeSimplifier.cs
r7463 r7842 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Diagnostics;25 24 using System.Linq; 26 25 using HeuristicLab.Common; … … 41 40 private Exponential expSymbol = new Exponential(); 42 41 private Root rootSymbol = new Root(); 42 private Square sqrSymbol = new Square(); 43 private SquareRoot sqrtSymbol = new SquareRoot(); 43 44 private Power powSymbol = new Power(); 44 45 private Sine sineSymbol = new Sine(); … … 128 129 private bool IsRoot(ISymbolicExpressionTreeNode node) { 129 130 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; 130 137 } 131 138 private bool IsPower(ISymbolicExpressionTreeNode node) { … … 212 219 } else if (IsExp(original)) { 213 220 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); 214 227 } else if (IsRoot(original)) { 215 228 return SimplifyRoot(original); 216 } else if (IsPower(original)) {217 return SimplifyPower(original);218 229 } else if (IsSine(original)) { 219 230 return SimplifySine(original); … … 363 374 return MakeExp(GetSimplifiedTree(original.GetSubtree(0))); 364 375 } 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 } 365 382 366 383 private ISymbolicExpressionTreeNode SimplifyLog(ISymbolicExpressionTreeNode original) { … … 587 604 } 588 605 } 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 589 632 private ISymbolicExpressionTreeNode MakeLog(ISymbolicExpressionTreeNode node) { 590 633 if (IsConstant(node)) { … … 593 636 } else if (IsExp(node)) { 594 637 return node.GetSubtree(0); 638 } else if (IsSquareRoot(node)) { 639 return MakeFraction(MakeLog(node.GetSubtree(0)), MakeConstant(2.0)); 595 640 } else { 596 641 var logNode = logSymbol.CreateTreeNode(); … … 691 736 } else if (IsDivision(a) && IsConstant(b)) { 692 737 // (a1 / a2) / c => (a1 / (a2 * c)) 693 Trace.Assert(a.Subtrees.Count() == 2);694 738 return MakeFraction(a.GetSubtree(0), MakeProduct(a.GetSubtree(1), b)); 695 739 } else if (IsDivision(a) && IsDivision(b)) { 696 740 // (a1 / a2) / (b1 / b2) => 697 Trace.Assert(a.Subtrees.Count() == 2);698 Trace.Assert(b.Subtrees.Count() == 2);699 741 return MakeFraction(MakeProduct(a.GetSubtree(0), b.GetSubtree(1)), MakeProduct(a.GetSubtree(1), b.GetSubtree(0))); 700 742 } else if (IsDivision(a)) { 701 743 // (a1 / a2) / b => (a1 / (a2 * b)) 702 Trace.Assert(a.Subtrees.Count() == 2);703 744 return MakeFraction(a.GetSubtree(0), MakeProduct(a.GetSubtree(1), b)); 704 745 } else if (IsDivision(b)) { 705 746 // a / (b1 / b2) => (a * b2) / b1 706 Trace.Assert(b.Subtrees.Count() == 2);707 747 return MakeFraction(MakeProduct(a, b.GetSubtree(1)), b.GetSubtree(0)); 708 748 } else { … … 829 869 } else if (IsDivision(a) && IsDivision(b)) { 830 870 // (a1 / a2) * (b1 / b2) => (a1 * b1) / (a2 * b2) 831 Trace.Assert(a.Subtrees.Count() == 2);832 Trace.Assert(b.Subtrees.Count() == 2);833 871 return MakeFraction(MakeProduct(a.GetSubtree(0), b.GetSubtree(0)), MakeProduct(a.GetSubtree(1), b.GetSubtree(1))); 834 872 } else if (IsDivision(a)) { 835 873 // (a1 / a2) * b => (a1 * b) / a2 836 Trace.Assert(a.Subtrees.Count() == 2);837 874 return MakeFraction(MakeProduct(a.GetSubtree(0), b), a.GetSubtree(1)); 838 875 } else if (IsDivision(b)) { 839 876 // a * (b1 / b2) => (b1 * a) / b2 840 Trace.Assert(b.Subtrees.Count() == 2);841 877 return MakeFraction(MakeProduct(b.GetSubtree(0), a), b.GetSubtree(1)); 842 878 } else if (IsMultiplication(a) && IsMultiplication(b)) { … … 995 1031 return MakeConstant(1.0 / ((ConstantTreeNode)x).Value); 996 1032 } else if (IsDivision(x)) { 997 Trace.Assert(x.Subtrees.Count() == 2);998 1033 return MakeFraction(x.GetSubtree(1), x.GetSubtree(0)); 999 1034 } else {
Note: See TracChangeset
for help on using the changeset viewer.