[10562] | 1 | using System;
|
---|
| 2 | using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
|
---|
| 3 |
|
---|
| 4 | namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
|
---|
| 5 | // this comparer considers that a < b if the type of a is "greater" than the type of b, for example:
|
---|
| 6 | // - A function node is "greater" than a terminal node
|
---|
| 7 | // - A variable terminal is "greater" than a constant terminal
|
---|
| 8 | // - used for bringing subtrees to a "canonical" form when the operation allows reordering of arguments
|
---|
| 9 | public class SymbolicExpressionTreeNodeComparer : ISymbolicExpressionTreeNodeComparer {
|
---|
| 10 | public int Compare(ISymbolicExpressionTreeNode a, ISymbolicExpressionTreeNode b) {
|
---|
| 11 | if (!(a is SymbolicExpressionTreeTerminalNode)) {
|
---|
| 12 | return b is SymbolicExpressionTreeTerminalNode
|
---|
| 13 | ? -1
|
---|
| 14 | : string.Compare(a.Symbol.Name, b.Symbol.Name, StringComparison.Ordinal);
|
---|
| 15 | }
|
---|
| 16 | if (!(b is SymbolicExpressionTreeTerminalNode)) return 1;
|
---|
| 17 | // at this point we know a and b are terminal nodes
|
---|
| 18 | var va = a as VariableTreeNode;
|
---|
| 19 | if (va != null) {
|
---|
| 20 | if (b is ConstantTreeNode) return -1;
|
---|
| 21 | var vb = (VariableTreeNode)b;
|
---|
| 22 | return (va.VariableName.Equals(vb.VariableName)
|
---|
| 23 | ? va.Weight.CompareTo(vb.Weight)
|
---|
| 24 | : string.Compare(va.VariableName, vb.VariableName, StringComparison.Ordinal));
|
---|
| 25 | }
|
---|
| 26 | // at this point we know for sure that a is a constant tree node
|
---|
| 27 | if (b is VariableTreeNode) return 1;
|
---|
| 28 | var ca = (ConstantTreeNode)a;
|
---|
| 29 | var cb = (ConstantTreeNode)b;
|
---|
| 30 | return ca.Value.CompareTo(cb.Value);
|
---|
| 31 | }
|
---|
| 32 | }
|
---|
| 33 | }
|
---|