using System; using System.Collections.Generic; using System.Linq; using System.Text; using HeuristicLab.Core; using HeuristicLab.Common.Resources; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using HeuristicLab.Common; using HeuristicLab.Encodings.BinaryVectorEncoding; using System.Drawing; using HeuristicLab.Encodings.RealVectorEncoding; using HEAL.Attic; namespace HeuristicLab.Analysis.FitnessLandscape.DistanceCalculators { [Item("RealVectorDistanceCalculator", "Calculates the Euclidian distance of two real vectors")] [StorableType("26271DB0-0868-4363-84AE-46CF583276F0")] public class RealVectorDistanceCalculator: NamedItem, IItemDistanceCalculator { #region Properties public override bool CanChangeName { get { return false; } } public override bool CanChangeDescription { get { return false; } } public static new Image StaticItemImage { get { return VSImageLibrary.Function; } } #endregion #region Construction & Cloning [StorableConstructor] protected RealVectorDistanceCalculator(StorableConstructorFlag _) : base(_) { } protected RealVectorDistanceCalculator(RealVectorDistanceCalculator original, Cloner cloner) : base(original, cloner) { } public RealVectorDistanceCalculator() { name = ItemName; description = ItemDescription; } public override IDeepCloneable Clone(Cloner cloner) { return new RealVectorDistanceCalculator(this, cloner); } #endregion #region IItemDistanceCalculator Members public Type ItemType { get { return typeof(BinaryVector); } } public double Distance(IItem x, IItem y) { RealVector a = (RealVector )x; RealVector b = (RealVector )y; if (a.Length != b.Length) throw new InvalidOperationException("Cannot compare vectors of different lengths"); double sqrSum = 0; for (int i = 0; i < a.Length; i++) { sqrSum = Sqr(a[i] - b[i]); } return Math.Sqrt(sqrSum); } private static double Sqr(double x) { return x*x; } #endregion } }