Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Symbols/Variable.cs @ 8853

Last change on this file since 8853 was 8853, checked in by sforsten, 11 years ago

#1865: An additional property has been added, which contains all possible variable names. The old property "VariableNames" contains the variable names which can be used with a certain symbol (which are checked in the view).
The "AfterDeserialization" method makes sure that the new property is set.

File size: 6.2 KB
RevLine 
[3253]1#region License Information
2/* HeuristicLab
[7259]3 * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
[3253]4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
[4068]22using System;
23using System.Collections.Generic;
[3376]24using HeuristicLab.Common;
[3269]25using HeuristicLab.Core;
[4068]26using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
[3269]27using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
[5532]28namespace HeuristicLab.Problems.DataAnalysis.Symbolic {
[3269]29  [StorableClass]
30  [Item("Variable", "Represents a variable value.")]
[4022]31  public class Variable : Symbol {
[3269]32    #region Properties
[3485]33    [Storable]
[4989]34    private double weightMu;
35    public double WeightMu {
36      get { return weightMu; }
[3824]37      set {
[4989]38        if (value != weightMu) {
39          weightMu = value;
[3824]40          OnChanged(EventArgs.Empty);
41        }
42      }
[3269]43    }
[3485]44    [Storable]
[3294]45    private double weightSigma;
46    public double WeightSigma {
47      get { return weightSigma; }
48      set {
49        if (weightSigma < 0.0) throw new ArgumentException("Negative sigma is not allowed.");
[3824]50        if (value != weightSigma) {
51          weightSigma = value;
52          OnChanged(EventArgs.Empty);
53        }
[3294]54      }
[3269]55    }
[3485]56    [Storable]
[4989]57    private double weightManipulatorMu;
58    public double WeightManipulatorMu {
59      get { return weightManipulatorMu; }
[3824]60      set {
[4989]61        if (value != weightManipulatorMu) {
62          weightManipulatorMu = value;
[3824]63          OnChanged(EventArgs.Empty);
64        }
65      }
[3512]66    }
67    [Storable]
68    private double weightManipulatorSigma;
69    public double WeightManipulatorSigma {
70      get { return weightManipulatorSigma; }
71      set {
72        if (weightManipulatorSigma < 0.0) throw new ArgumentException("Negative sigma is not allowed.");
[3824]73        if (value != weightManipulatorSigma) {
74          weightManipulatorSigma = value;
75          OnChanged(EventArgs.Empty);
76        }
[3512]77      }
78    }
[5326]79    [Storable(DefaultValue = 0.0)]
80    private double multiplicativeWeightManipulatorSigma;
81    public double MultiplicativeWeightManipulatorSigma {
82      get { return multiplicativeWeightManipulatorSigma; }
83      set {
84        if (multiplicativeWeightManipulatorSigma < 0.0) throw new ArgumentException("Negative sigma is not allowed.");
85        if (value != multiplicativeWeightManipulatorSigma) {
86          multiplicativeWeightManipulatorSigma = value;
87          OnChanged(EventArgs.Empty);
88        }
89      }
90    }
[3541]91    private List<string> variableNames;
[3512]92    [Storable]
[3442]93    public IEnumerable<string> VariableNames {
[3294]94      get { return variableNames; }
95      set {
96        if (value == null) throw new ArgumentNullException();
97        variableNames.Clear();
98        variableNames.AddRange(value);
[3824]99        OnChanged(EventArgs.Empty);
[3294]100      }
[3269]101    }
[6803]102
[8853]103    private List<string> allVariableNames;
104    [Storable]
105    public IEnumerable<string> AllVariableNames {
106      get { return allVariableNames; }
107      set {
108        if (value == null) throw new ArgumentNullException();
109        allVariableNames.Clear();
110        allVariableNames.AddRange(value);
111        VariableNames = value;
112      }
113    }
114
[8798]115    public override bool Enabled {
116      get {
117        if (variableNames.Count == 0) return false;
118        return base.Enabled;
119      }
120      set {
121        if (variableNames.Count == 0) base.Enabled = false;
122        else base.Enabled = value;
123      }
124    }
125
[6803]126    private const int minimumArity = 0;
127    private const int maximumArity = 0;
128
129    public override int MinimumArity {
130      get { return minimumArity; }
131    }
132    public override int MaximumArity {
133      get { return maximumArity; }
134    }
[3269]135    #endregion
[6803]136
[8853]137    [StorableHook(HookType.AfterDeserialization)]
138    private void AfterDeserialization() {
139      if (allVariableNames == null || (allVariableNames.Count == 0 && variableNames.Count > 0)) {
140        allVariableNames = variableNames;
141      }
142    }
143
[4722]144    [StorableConstructor]
[5326]145    protected Variable(bool deserializing)
146      : base(deserializing) {
[4722]147      variableNames = new List<string>();
[8853]148      allVariableNames = new List<string>();
[4722]149    }
150    protected Variable(Variable original, Cloner cloner)
151      : base(original, cloner) {
[4989]152      weightMu = original.weightMu;
[4722]153      weightSigma = original.weightSigma;
154      variableNames = new List<string>(original.variableNames);
[8853]155      allVariableNames = new List<string>(original.allVariableNames);
[4989]156      weightManipulatorMu = original.weightManipulatorMu;
[4722]157      weightManipulatorSigma = original.weightManipulatorSigma;
[5326]158      multiplicativeWeightManipulatorSigma = original.multiplicativeWeightManipulatorSigma;
[4722]159    }
[4022]160    public Variable() : this("Variable", "Represents a variable value.") { }
161    public Variable(string name, string description)
162      : base(name, description) {
[4989]163      weightMu = 1.0;
[3294]164      weightSigma = 1.0;
[4989]165      weightManipulatorMu = 0.0;
[5334]166      weightManipulatorSigma = 0.05;
[5326]167      multiplicativeWeightManipulatorSigma = 0.03;
[3294]168      variableNames = new List<string>();
[8853]169      allVariableNames = new List<string>();
[3269]170    }
171
[6803]172    protected override void OnChanged(EventArgs e) {
173      if (@Fixed) {
174        weightManipulatorMu = 1;
175        weightManipulatorSigma = 0;
176        weightMu = 1;
177        weightSigma = 0;
178        multiplicativeWeightManipulatorSigma = 0;
179      }
180      base.OnChanged(e);
181    }
182
[5532]183    public override ISymbolicExpressionTreeNode CreateTreeNode() {
[3253]184      return new VariableTreeNode(this);
185    }
[3485]186
187    public override IDeepCloneable Clone(Cloner cloner) {
[4722]188      return new Variable(this, cloner);
[3485]189    }
[3253]190  }
191}
Note: See TracBrowser for help on using the repository browser.