Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/27/14 20:02:35 (10 years ago)
Author:
mkommend
Message:

#2174: Added first version of refactored individuals.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Individual.cs

    r11484 r11598  
    2020#endregion
    2121
     22using System;
    2223using System.Collections.Generic;
    2324using System.Linq;
    2425using HeuristicLab.Common;
     26using HeuristicLab.Core;
    2527using HeuristicLab.Encodings.BinaryVectorEncoding;
    2628using HeuristicLab.Encodings.IntegerVectorEncoding;
    2729using HeuristicLab.Encodings.PermutationEncoding;
    2830using HeuristicLab.Encodings.RealVectorEncoding;
     31using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2932
    3033namespace HeuristicLab.Problems.Programmable {
    31   public sealed class Individual : IDeepCloneable {
    32     private readonly Dictionary<string, BinaryVector> binaryVectors;
    33     private readonly Dictionary<string, IntegerVector> integerVectors;
    34     private readonly Dictionary<string, RealVector> realVectors;
    35     private readonly Dictionary<string, Permutation> permutationVectors;
     34  [StorableClass]
     35  public class Individual : Item {
     36    [Storable]
     37    public IEncoding Encoding { get; private set; }
     38    [Storable]
     39    protected IScope Scope { get; private set; }
    3640
    37     public Individual(IEnumerable<KeyValuePair<string, BinaryVector>> binaryVectors = null,
    38       IEnumerable<KeyValuePair<string, IntegerVector>> integerVectors = null,
    39       IEnumerable<KeyValuePair<string, RealVector>> realVectors = null,
    40       IEnumerable<KeyValuePair<string, Permutation>> permutations = null) {
    41       // prevent unnecessary allocation of dictionaries for unused vectors
    42       if (binaryVectors != null) this.binaryVectors = binaryVectors.ToDictionary(x => x.Key, x => x.Value);
    43       if (integerVectors != null) this.integerVectors = integerVectors.ToDictionary(x => x.Key, x => x.Value);
    44       if (realVectors != null) this.realVectors = realVectors.ToDictionary(x => x.Key, x => x.Value);
    45       if (permutations != null) this.permutationVectors = permutations.ToDictionary(x => x.Key, x => x.Value);
    46     }
    47     private Individual(Individual original, Cloner cloner) {
    48       cloner.RegisterClonedObject(original, this);
    49       if (original.binaryVectors != null) {
    50         binaryVectors = new Dictionary<string, BinaryVector>(original.binaryVectors.Comparer);
    51         foreach (var param in original.binaryVectors)
    52           binaryVectors[param.Key] = cloner.Clone(param.Value);
    53       }
    54       if (original.integerVectors != null) {
    55         integerVectors = new Dictionary<string, IntegerVector>(original.integerVectors.Comparer);
    56         foreach (var param in original.integerVectors)
    57           integerVectors[param.Key] = cloner.Clone(param.Value);
    58       }
    59       if (original.realVectors != null) {
    60         realVectors = new Dictionary<string, RealVector>(original.realVectors.Comparer);
    61         foreach (var param in original.realVectors)
    62           realVectors[param.Key] = cloner.Clone(param.Value);
    63       }
    64       if (original.permutationVectors != null) {
    65         permutationVectors = new Dictionary<string, Permutation>(original.permutationVectors.Comparer);
    66         foreach (var param in original.permutationVectors)
    67           permutationVectors[param.Key] = cloner.Clone(param.Value);
    68       }
     41    public Individual(IEncoding encoding, IScope scope) {
     42      Encoding = encoding;
     43      Scope = scope;
    6944    }
    7045
    71     public object Clone() {
    72       return Clone(new Cloner());
     46    [StorableConstructor]
     47    protected Individual(bool deserializing) : base(deserializing) { }
     48
     49    public override IDeepCloneable Clone(Cloner cloner) { return new Individual(this, cloner); }
     50    protected Individual(Individual original, Cloner cloner)
     51      : base(original, cloner) {
     52      Encoding = cloner.Clone(original.Encoding);
     53      Scope = cloner.Clone(original.Scope);
    7354    }
    7455
    75     public IDeepCloneable Clone(Cloner cloner) {
    76       return new Individual(this, cloner);
     56    public virtual IItem this[string name] {
     57      get { return ExtractScopeValue(name, Encoding.Name, Scope); }
     58      set { SetScopeValue(name, Encoding.Name, Scope, value); }
    7759    }
    7860
    79     public BinaryVector BinaryVector(string name) {
    80       return binaryVectors[name];
     61    internal virtual Individual Copy(IScope scope) {
     62      var individual = Encoding.CreateIndividual(scope);
     63      individual[Encoding.Name] = this[Encoding.Name];
     64      return individual;
    8165    }
    8266
    83     public bool BinaryValue(string name, int index) {
    84       return binaryVectors[name][index];
     67    protected static IItem ExtractScopeValue(string name, string encodingName, IScope scope) {
     68      if (name != encodingName) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
     69      if (!scope.Variables.ContainsKey(name)) throw new ArgumentException(string.Format("Encoding part {0} cannot be found in the provided scope.", name));
     70      var value = scope.Variables[name].Value;
     71      if (value == null) throw new ArgumentException(string.Format("Encoding part {0} is null.", name));
     72      return value;
    8573    }
    8674
    87     public IEnumerable<string> BinaryNames {
    88       get { return binaryVectors != null ? binaryVectors.Keys : Enumerable.Empty<string>(); }
    89     }
     75    protected static void SetScopeValue(string name, string encodingName, IScope scope, IItem value) {
     76      if (name != encodingName) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
     77      if (value == null) throw new ArgumentNullException("value");
    9078
    91     public IntegerVector IntegerVector(string name) {
    92       return integerVectors[name];
    93     }
    94 
    95     public int IntegerValue(string name, int index) {
    96       return integerVectors[name][index];
    97     }
    98 
    99     public IEnumerable<string> IntegerNames {
    100       get { return integerVectors != null ? integerVectors.Keys : Enumerable.Empty<string>(); }
    101     }
    102 
    103     public RealVector RealVector(string name) {
    104       return realVectors[name];
    105     }
    106 
    107     public double RealValue(string name, int index) {
    108       return realVectors[name][index];
    109     }
    110 
    111     public IEnumerable<string> RealNames {
    112       get { return realVectors != null ? realVectors.Keys : Enumerable.Empty<string>(); }
    113     }
    114 
    115     public Permutation Permutation(string name) {
    116       return permutationVectors[name];
    117     }
    118 
    119     public IEnumerable<string> PermutationNames {
    120       get { return permutationVectors != null ? permutationVectors.Keys : Enumerable.Empty<string>(); }
     79      if (!scope.Variables.ContainsKey(name)) scope.Variables.Add(new Variable(name, value));
     80      else scope.Variables[name].Value = value;
     81      var variable = scope.Variables[name];
    12182    }
    12283  }
     84
     85  #region extension methods
     86  public static class IndividualExtensionMethods {
     87    public static BinaryVector BinaryVector(this Individual individual, string name) {
     88      return (BinaryVector)individual[name];
     89    }
     90    public static IntegerVector IntegerVector(this Individual individual, string name) {
     91      return (IntegerVector)individual[name];
     92    }
     93    public static Permutation Permutation(this Individual individual, string name) {
     94      return (Permutation)individual[name];
     95    }
     96    public static RealVector RealVector(this Individual individual, string name) {
     97      return (RealVector)individual[name];
     98    }
     99  }
     100  #endregion
    123101}
Note: See TracChangeset for help on using the changeset viewer.