using System.Collections.Generic; using System.Linq; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using HeuristicLab.Problems.DataAnalysis.Symbolic; namespace HeuristicLab.Problems.MetaOptimization { [StorableClass] public class SymbolValueConfiguration : ParameterizedValueConfiguration { #region Constructors and Cloning [StorableConstructor] protected SymbolValueConfiguration(bool deserializing) : base(deserializing) { } public SymbolValueConfiguration() : base() { } public SymbolValueConfiguration(Symbol symbol) : base() { this.IsOptimizable = true; this.Optimize = false; this.Name = symbol.Name; this.actualValue = new ConstrainedValue(symbol, symbol.GetType(), new ItemSet { symbol }, false); } protected SymbolValueConfiguration(SymbolValueConfiguration original, Cloner cloner) : base(original, cloner) { } public override IDeepCloneable Clone(Cloner cloner) { return new SymbolValueConfiguration(this, cloner); } #endregion protected override void PopulateParameterConfigurations(IItem item, bool discoverValidValues) { this.ClearParameterConfigurations(); var symbol = (Symbol)item; var initialFrequencyValueConfigurations = new List(); initialFrequencyValueConfigurations.Add(new RangeValueConfiguration(new DoubleValue(0), typeof(DoubleValue))); initialFrequencyValueConfigurations.Add(new RangeValueConfiguration(new DoubleValue(1), typeof(DoubleValue))); var initialFrequencyParameterConfiguration = new ParameterConfiguration("InitialFrequency", typeof(Symbol), new DoubleValue(symbol.InitialFrequency), initialFrequencyValueConfigurations); this.parameterConfigurations.Add(initialFrequencyParameterConfiguration); var constant = symbol as Constant; if (constant != null) { var minValueParameterConfiguration = new ParameterConfiguration("MinValue", typeof(DoubleValue), new DoubleValue(constant.MinValue)); var maxValueParameterConfiguration = new ParameterConfiguration("MaxValue", typeof(DoubleValue), new DoubleValue(constant.MaxValue)); var manipulatorMuParameterConfiguration = new ParameterConfiguration("ManipulatorMu", typeof(DoubleValue), new DoubleValue(constant.ManipulatorMu)); var manipulatorSigmaParameterConfiguration = new ParameterConfiguration("ManipulatorSigma", typeof(DoubleValue), new DoubleValue(constant.ManipulatorSigma)); var multiplicativeManipulatorSigmaParameterConfiguration = new ParameterConfiguration("MultiplicativeManipulatorSigma", typeof(DoubleValue), new DoubleValue(constant.MultiplicativeManipulatorSigma)); this.parameterConfigurations.Add(minValueParameterConfiguration); this.parameterConfigurations.Add(maxValueParameterConfiguration); this.parameterConfigurations.Add(manipulatorMuParameterConfiguration); this.parameterConfigurations.Add(manipulatorSigmaParameterConfiguration); this.parameterConfigurations.Add(multiplicativeManipulatorSigmaParameterConfiguration); } var variable = symbol as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable; if (variable != null) { var weightMuParameterConfiguration = new ParameterConfiguration("WeightMu", typeof(DoubleValue), new DoubleValue(variable.WeightMu)); var weightSigmaParameterConfiguration = new ParameterConfiguration("WeightSigma", typeof(DoubleValue), new DoubleValue(variable.WeightSigma)); var weightManipulatorMuParameterConfiguration = new ParameterConfiguration("WeightManipulatorMu", typeof(DoubleValue), new DoubleValue(variable.WeightManipulatorMu)); var weightManipulatorSigmaParameterConfiguration = new ParameterConfiguration("WeightManipulatorSigma", typeof(DoubleValue), new DoubleValue(variable.WeightManipulatorSigma)); var multiplicativeWeightManipulatorSigmaParameterConfiguration = new ParameterConfiguration("MultiplicativeWeightManipulatorSigma", typeof(DoubleValue), new DoubleValue(variable.MultiplicativeWeightManipulatorSigma)); this.parameterConfigurations.Add(weightMuParameterConfiguration); this.parameterConfigurations.Add(weightSigmaParameterConfiguration); this.parameterConfigurations.Add(weightManipulatorMuParameterConfiguration); this.parameterConfigurations.Add(weightManipulatorSigmaParameterConfiguration); this.parameterConfigurations.Add(multiplicativeWeightManipulatorSigmaParameterConfiguration); } } public virtual void Parameterize(Symbol symbol) { symbol.InitialFrequency = GetDoubleValue("InitialFrequency"); var constant = symbol as Constant; if (constant != null) { constant.MinValue = GetDoubleValue("MinValue"); constant.MaxValue = GetDoubleValue("MaxValue"); constant.ManipulatorMu = GetDoubleValue("ManipulatorMu"); constant.ManipulatorSigma = GetDoubleValue("ManipulatorSigma"); constant.MultiplicativeManipulatorSigma = GetDoubleValue("MultiplicativeManipulatorSigma"); } var variable = symbol as HeuristicLab.Problems.DataAnalysis.Symbolic.Variable; if (variable != null) { variable.WeightMu = GetDoubleValue("WeightMu"); variable.WeightSigma = GetDoubleValue("WeightSigma"); variable.WeightManipulatorMu = GetDoubleValue("WeightManipulatorMu"); variable.WeightManipulatorSigma = GetDoubleValue("WeightManipulatorSigma"); variable.MultiplicativeWeightManipulatorSigma = GetDoubleValue("MultiplicativeWeightManipulatorSigma"); } } private double GetDoubleValue(string name) { return ((DoubleValue)ParameterConfigurations.Single(x => x.Name == name).ActualValue.Value).Value; } public override string ToString() { return string.Format("{0}: {1}", this.Name, parameterConfigurations.Single(pc => pc.Name == "InitialFrequency").ActualValue.Value); } public override void Mutate(IRandom random, MutateDelegate mutate, IIntValueManipulator intValueManipulator, IDoubleValueManipulator doubleValueManipulator) { base.Mutate(random, mutate, intValueManipulator, doubleValueManipulator); } public override void Cross(IRandom random, IOptimizable other, CrossDelegate cross, IIntValueCrossover intValueCrossover, IDoubleValueCrossover doubleValueCrossover) { base.Cross(random, other, cross, intValueCrossover, doubleValueCrossover); } } }