Changeset 17573 for branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/WindowedSymbolTreeNode.cs
- Timestamp:
- 05/29/20 12:48:39 (4 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/3040_VectorBasedGP/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/WindowedSymbolTreeNode.cs
r17551 r17573 20 20 #endregion 21 21 22 using System; 22 23 using HeuristicLab.Common; 23 24 using HeuristicLab.Core; … … 25 26 using HEAL.Attic; 26 27 using HeuristicLab.Random; 28 27 29 namespace HeuristicLab.Problems.DataAnalysis.Symbolic { 28 [StorableType(" B92EF904-18EC-41FC-9123-9B9293246815")]29 public abstract class VariableTreeNodeBase : SymbolicExpressionTreeTerminalNode, IVariableTreeNode {30 public new VariableBaseSymbol {31 get { return ( VariableBase)base.Symbol; }30 [StorableType("E79432BB-414D-4535-8751-D0139AF048E1")] 31 public class WindowedSymbolTreeNode : SymbolicExpressionTreeNode, IWindowedSymbolTreeNode { 32 public new WindowedSymbol Symbol { 33 get { return (WindowedSymbol)base.Symbol; } 32 34 } 33 35 [Storable] 34 private double weight;35 public double Weight {36 get { return weight; }37 set { weight = value; }36 private double offset; 37 public double Offset { 38 get { return offset; } 39 set { offset = Math.Min(Math.Max(value, 0.0), 1.0); } 38 40 } 39 41 [Storable] 40 private string variableName;41 public string VariableName{42 get { return variableName; }43 set { variableName = value; }42 private double length; 43 public double Length { 44 get { return length; } 45 set { length = Math.Min(Math.Max(value, 0.0), 1.0); } 44 46 } 45 47 46 48 [StorableConstructor] 47 protected VariableTreeNodeBase(StorableConstructorFlag _) : base(_) { }48 protected VariableTreeNodeBase(VariableTreeNodeBase original, Cloner cloner)49 protected WindowedSymbolTreeNode(StorableConstructorFlag _) : base(_) { } 50 protected WindowedSymbolTreeNode(WindowedSymbolTreeNode original, Cloner cloner) 49 51 : base(original, cloner) { 50 weight = original.weight;51 variableName = original.variableName;52 offset = original.offset; 53 length = original.length; 52 54 } 53 protected VariableTreeNodeBase() { } 54 protected VariableTreeNodeBase(VariableBase variableSymbol) : base(variableSymbol) { } 55 public override IDeepCloneable Clone(Cloner cloner) { 56 return new WindowedSymbolTreeNode(this, cloner); 57 } 58 59 public WindowedSymbolTreeNode(WindowedSymbol windowedSymbol) : base(windowedSymbol) { 60 if (!windowedSymbol.EnableWindowing) { 61 Offset = 0.0; 62 Length = 1.0; 63 } 64 } 55 65 56 66 public override bool HasLocalParameters { 57 get { return true; }67 get { return Symbol.EnableWindowing; } 58 68 } 59 69 60 70 public override void ResetLocalParameters(IRandom random) { 61 71 base.ResetLocalParameters(random); 62 weight = NormalDistributedRandom.NextDouble(random, Symbol.WeightMu, Symbol.WeightSigma);63 72 64 #pragma warning disable 612, 618 65 variableName = Symbol.VariableNames.SelectRandom(random); 66 #pragma warning restore 612, 618 73 if (Symbol.EnableWindowing) { 74 Offset = NormalDistributedRandom.NextDouble(random, Symbol.OffsetMu, Symbol.OffsetSigma); 75 Length = NormalDistributedRandom.NextDouble(random, Symbol.LengthMu, Symbol.LengthSigma); 76 } 67 77 } 68 78 … … 70 80 base.ShakeLocalParameters(random, shakingFactor); 71 81 72 // 50% additive & 50% multiplicative (TODO: BUG in if statement below -> fix in HL 4.0!) 73 if (random.NextDouble() < 0) { 74 double x = NormalDistributedRandom.NextDouble(random, Symbol.WeightManipulatorMu, Symbol.WeightManipulatorSigma); 75 weight = weight + x * shakingFactor; 76 } else { 77 double x = NormalDistributedRandom.NextDouble(random, 1.0, Symbol.MultiplicativeWeightManipulatorSigma); 78 weight = weight * x; 79 } 80 81 if (Symbol.VariableChangeProbability >= 1.0) { 82 // old behaviour for backwards compatibility 83 #region Backwards compatible code, remove with 3.4 84 #pragma warning disable 612, 618 85 variableName = Symbol.VariableNames.SelectRandom(random); 86 #pragma warning restore 612, 618 87 #endregion 88 } else if (random.NextDouble() < Symbol.VariableChangeProbability) { 89 var oldName = variableName; 90 variableName = Symbol.VariableNames.SampleRandom(random); 91 if (oldName != variableName) { 92 // re-initialize weight if the variable is changed 93 weight = NormalDistributedRandom.NextDouble(random, Symbol.WeightMu, Symbol.WeightSigma); 94 } 82 if (Symbol.EnableWindowing) { 83 Offset += NormalDistributedRandom.NextDouble(random, Symbol.ManipulatorOffsetMu, Symbol.ManipulatorOffsetSigma) * shakingFactor; 84 Length += NormalDistributedRandom.NextDouble(random, Symbol.ManipulatorLengthMu, Symbol.ManipulatorLengthSigma) * shakingFactor; 95 85 } 96 86 } 97 87 98 88 public override string ToString() { 99 if (weight.IsAlmost(1.0)) return variableName; 100 else return weight.ToString("E4") + " " + variableName; 89 return Symbol.EnableWindowing 90 ? base.ToString() + $"[{Offset} : {Length}]" 91 : base.ToString(); 101 92 } 102 93 }
Note: See TracChangeset
for help on using the changeset viewer.