Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
08/01/11 17:48:53 (13 years ago)
Author:
mkommend
Message:

#1479: Integrated trunk changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/GP.Grammar.Editor/HeuristicLab.Encodings.PermutationEncoding/3.3/PermutationEqualityComparer.cs

    r6377 r6618  
    2222using System;
    2323using System.Collections.Generic;
     24using System.Linq;
     25using System.Text;
    2426using HeuristicLab.PluginInfrastructure;
    2527
    2628namespace HeuristicLab.Encodings.PermutationEncoding {
    2729  [NonDiscoverableType]
    28   public class PermutationEqualityComparer : IEqualityComparer<Permutation> {
    29     public bool Equals(Permutation x, Permutation y) {
     30  public class PermutationEqualityComparer : EqualityComparer<Permutation> {
     31    public override bool Equals(Permutation x, Permutation y) {
    3032      if (x.PermutationType != y.PermutationType) return false;
    3133      if (x.Length != y.Length) return false;
     
    4345
    4446    private bool EqualsAbsolute(Permutation x, Permutation y) {
    45       for (int i = 0; i < x.Length; i++)
    46         if (x[i] != y[i]) return false;
    47       return true;
     47      return x.SequenceEqual(y);
    4848    }
    4949
     
    6666    }
    6767
    68     public int GetHashCode(Permutation obj) {
     68    public override int GetHashCode(Permutation obj) {
    6969      if (obj == null) return 0;
    70       return obj.GetHashCode();
     70      return GenerateHashString(obj).GetHashCode();
     71    }
     72
     73    private string GenerateHashString(Permutation p) {
     74      StringBuilder sb = new StringBuilder();
     75      if (p.PermutationType == PermutationTypes.Absolute) {
     76        for (int i = 0; i < p.Length; i++)
     77          sb.Append(p[i].ToString() + ";");
     78      } else {
     79        int i = 0;
     80        while (p[i] != 0) i++; // always start at element 0
     81        if (p.PermutationType == PermutationTypes.RelativeDirected) {
     82          for (int j = 0; j < p.Length; j++)
     83            sb.Append(p.GetCircular(i + j).ToString() + ";");
     84        } else {
     85          bool goLeft = p.GetCircular(i - 1) < p.GetCircular(i + 1); // go in direction of the lowest edge so that the total inversion and its original return the same hash code
     86          for (int j = 0; j < p.Length; j++) {
     87            if (goLeft) sb.Append(p.GetCircular(i - j).ToString() + ";");
     88            else sb.Append(p.GetCircular(i + j).ToString() + ";");
     89          }
     90        }
     91      }
     92      return sb.ToString();
    7193    }
    7294  }
Note: See TracChangeset for help on using the changeset viewer.