Ignore:
Timestamp:
02/26/15 14:38:08 (6 years ago)
Author:
bburlacu
Message:

#2332: Move SolutionVariableName and QualityVariableName properties to ISolutionSimilarityCalculator, implement Equals and GetHashCode in the SolutionSimilarityCalculator

Location:
trunk/sources/HeuristicLab.Optimization.Operators/3.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Optimization.Operators/3.3/SingleObjectiveSolutionSimilarityCalculator.cs

    r12012 r12085  
    3232  [StorableClass]
    3333  public abstract class SingleObjectiveSolutionSimilarityCalculator : SolutionSimilarityCalculator, ISingleObjectiveSolutionSimilarityCalculator {
    34     #region Properties
    35     [Storable]
    36     public string SolutionVariableName { get; set; }
    37     [Storable]
    38     public string QualityVariableName { get; set; }
    39     #endregion
    40 
    4134    [StorableConstructor]
    4235    protected SingleObjectiveSolutionSimilarityCalculator(bool deserializing) : base(deserializing) { }
    4336    protected SingleObjectiveSolutionSimilarityCalculator(SingleObjectiveSolutionSimilarityCalculator original, Cloner cloner)
    4437      : base(original, cloner) {
    45       this.SolutionVariableName = original.SolutionVariableName;
    46       this.QualityVariableName = original.QualityVariableName;
     38
    4739    }
    4840    protected SingleObjectiveSolutionSimilarityCalculator() : base() { }
  • trunk/sources/HeuristicLab.Optimization.Operators/3.3/SolutionSimilarityCalculator.cs

    r12070 r12085  
    2424using HeuristicLab.Common;
    2525using HeuristicLab.Core;
     26using HeuristicLab.Data;
    2627using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2728
     
    3536    protected abstract bool IsCommutative { get; }
    3637
     38    #region Properties
     39    [Storable]
     40    public string SolutionVariableName { get; set; }
     41    [Storable]
     42    public string QualityVariableName { get; set; }
     43    #endregion
     44
    3745    [StorableConstructor]
    3846    protected SolutionSimilarityCalculator(bool deserializing) : base(deserializing) { }
    39     protected SolutionSimilarityCalculator(SolutionSimilarityCalculator original, Cloner cloner) : base(original, cloner) { }
     47
     48    protected SolutionSimilarityCalculator(SolutionSimilarityCalculator original, Cloner cloner)
     49      : base(original, cloner) {
     50      this.SolutionVariableName = original.SolutionVariableName;
     51      this.QualityVariableName = original.QualityVariableName;
     52    }
    4053    protected SolutionSimilarityCalculator() : base() { }
    4154
     
    93106
    94107    public abstract double CalculateSolutionSimilarity(IScope leftSolution, IScope rightSolution);
    95     public abstract bool Equals(IScope x, IScope y);
    96     public abstract int GetHashCode(IScope obj);
     108
     109    public virtual bool Equals(IScope x, IScope y) {
     110      if (ReferenceEquals(x, y)) return true;
     111      if (x == null || y == null) return false;
     112
     113      var q1 = x.Variables[QualityVariableName];
     114      var q2 = x.Variables[QualityVariableName];
     115
     116      return CheckQualityEquality(q1, q2) && CalculateSolutionSimilarity(x, y).IsAlmost(1.0);
     117    }
     118
     119    public virtual int GetHashCode(IScope scope) {
     120      var quality = scope.Variables[QualityVariableName].Value;
     121      var dv = quality as DoubleValue;
     122      if (dv != null)
     123        return dv.Value.GetHashCode();
     124
     125      var da = quality as DoubleArray;
     126      if (da != null) {
     127        int hash = 17;
     128        unchecked {
     129          for (int i = 0; i < da.Length; ++i) {
     130            hash += hash * 23 + da[i].GetHashCode();
     131          }
     132          return hash;
     133        }
     134      }
     135      return 0; // throw exception?
     136    }
     137
     138    private static bool CheckQualityEquality(IItem q1, IItem q2) {
     139      var d1 = q1 as DoubleValue;
     140      var d2 = q2 as DoubleValue;
     141
     142      if (d1 != null && d2 != null)
     143        return d1.Value.IsAlmost(d2.Value);
     144
     145      var da1 = q1 as DoubleArray;
     146      var da2 = q2 as DoubleArray;
     147
     148      if (da1 != null && da2 != null)
     149        return da1.SequenceEqual(da2);
     150
     151      throw new ArgumentException("Could not determine quality equality.");
     152    }
    97153  }
    98154}
Note: See TracChangeset for help on using the changeset viewer.