#region License Information
/* HeuristicLab
* Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using HeuristicLab.Common;
using HeuristicLab.Core;
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
namespace HeuristicLab.Encodings.ParameterConfigurationEncoding {
[Item("ValueConfiguration", "Represents a value configuration.")]
[StorableClass]
public abstract class ValueConfiguration : NamedItem, IValueConfiguration {
public override bool CanChangeName {
get { return true; }
}
public override bool CanChangeDescription {
get { return true; }
}
[Storable]
protected bool isOptimizable;
public virtual bool IsOptimizable {
get { return isOptimizable; }
set {
if (this.isOptimizable != value) {
this.isOptimizable = value;
OnIsOptimizableChanged();
}
}
}
[Storable]
protected bool optimize;
public virtual bool Optimize {
get { return optimize; }
set {
if (optimize != value) {
if (value == true && !this.IsOptimizable)
throw new NotSupportedException("This value is not optimizable.");
optimize = value;
OnOptimizeChanged();
OnCombinationsCountChanged();
OnToStringChanged();
}
}
}
[Storable]
protected ConstrainedValue actualValue;
public virtual ConstrainedValue ActualValue {
get { return actualValue; }
set {
if (this.actualValue != value) {
DeregisterActualValueEvents();
this.actualValue = value;
OnValueChanged();
OnToStringChanged();
RegisterActualValueEvents();
}
}
}
[Storable]
protected int number = 0;
public int Number {
get { return number; }
set {
if (value != number) {
number = value;
OnToStringChanged();
}
}
}
[Storable]
protected bool valuesReadOnly = false;
public virtual bool ValuesReadOnly {
get { return valuesReadOnly; }
set {
if (value != this.valuesReadOnly) {
this.valuesReadOnly = value;
}
}
}
#region Constructors and Cloning
[StorableConstructor]
protected ValueConfiguration(bool deserializing) : base(deserializing) { }
protected ValueConfiguration(ValueConfiguration original, Cloner cloner)
: base(original, cloner) {
this.actualValue = cloner.Clone(original.ActualValue);
this.isOptimizable = original.isOptimizable;
this.optimize = original.optimize;
this.number = original.number;
this.valuesReadOnly = original.valuesReadOnly;
RegisterActualValueEvents();
}
protected ValueConfiguration() : base() { }
protected ValueConfiguration(IItem value, Type valueDataType)
: base() {
this.ActualValue = new ConstrainedValue(value, valueDataType, new ItemSet { value }, false);
this.IsOptimizable = true;
}
#endregion
private void RegisterActualValueEvents() {
if (this.actualValue != null) this.actualValue.ToStringChanged += new EventHandler(actualValue_ToStringChanged);
}
private void DeregisterActualValueEvents() {
if (this.actualValue != null) this.actualValue.ToStringChanged -= new EventHandler(actualValue_ToStringChanged);
}
#region Events
private void actualValue_ToStringChanged(object sender, EventArgs e) {
OnToStringChanged();
}
#endregion
#region IItem Members
public override string ItemDescription {
get { return (actualValue != null && actualValue.Value != null) ? actualValue.Value.ItemDescription : base.ItemDescription; }
}
public override Image ItemImage {
get { return (actualValue != null && actualValue.Value != null) ? actualValue.Value.ItemImage : base.ItemImage; }
}
public override string ItemName {
get { return (actualValue != null && actualValue.Value != null) ? actualValue.Value.ItemDescription : base.ItemName; }
}
#endregion
#region Event Handlers
public virtual event EventHandler ValueChanged;
protected virtual void OnValueChanged() {
var handler = ValueChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public virtual event EventHandler IsOptimizableChanged;
private void OnIsOptimizableChanged() {
var handler = IsOptimizableChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public virtual event EventHandler OptimizeChanged;
protected virtual void OnOptimizeChanged() {
var handler = OptimizeChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
public event EventHandler CombinationsCountChanged;
protected void OnCombinationsCountChanged() {
var handler = CombinationsCountChanged;
if (handler != null) handler(this, EventArgs.Empty);
}
#endregion
public string NumberedName {
get {
if (this.number == 0) {
return (ActualValue != null && ActualValue.Value != null) ? ActualValue.Value.ItemName : base.ToString();
} else {
return string.Format("{0} {1}", ActualValue.Value.ItemName, number);
}
}
}
public abstract void Randomize(IRandom random);
public abstract double CalculateSimilarity(IOptimizable optimizable);
public abstract string ParameterInfoString { get; }
public abstract void CollectOptimizedParameterNames(List parameterNames, string prefix);
public abstract List GetAllOptimizables();
}
}