Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/02/14 11:44:18 (9 years ago)
Author:
mkommend
Message:

#2174: Refactored individuals.

Location:
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Individuals
Files:
2 added
2 moved

Legend:

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

    r11614 r11619  
    2121
    2222using System;
    23 using System.Collections.Generic;
    24 using System.Linq;
    25 using HeuristicLab.Common;
    2623using HeuristicLab.Core;
    2724using HeuristicLab.Encodings.BinaryVectorEncoding;
     
    2926using HeuristicLab.Encodings.PermutationEncoding;
    3027using HeuristicLab.Encodings.RealVectorEncoding;
    31 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    3228
    3329namespace HeuristicLab.Problems.Programmable {
    34   [StorableClass]
    35   public class Individual : Item {
    36     [Storable]
     30  public abstract class Individual {
    3731    public IEncoding Encoding { get; private set; }
    38     [Storable]
    3932    protected IScope Scope { get; private set; }
    4033
    41     public Individual(IEncoding encoding, IScope scope) {
     34    public string Name { get { return Encoding.Name; } }
     35
     36    protected Individual(IEncoding encoding, IScope scope) {
    4237      Encoding = encoding;
    4338      Scope = scope;
    4439    }
    4540
    46     [StorableConstructor]
    47     protected Individual(bool deserializing) : base(deserializing) { }
     41    public abstract IItem this[string name] { get; set; }
    4842
    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);
     43    public Individual Copy() {
     44      return Copy(new Scope());
    5445    }
     46    internal abstract Individual Copy(IScope scope);
    5547
    56     public virtual IItem this[string name] {
    57       get { return ExtractScopeValue(name, Encoding.Name, Scope); }
    58       set { SetScopeValue(name, Encoding.Name, Scope, value); }
    59     }
    60 
    61     internal virtual Individual Copy(IScope scope) {
    62       var individual = Encoding.CreateIndividual(scope);
    63       individual[Encoding.Name] = this[Encoding.Name];
    64       return individual;
    65     }
    66 
    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));
     48    protected static IItem ExtractScopeValue(string name, IScope scope) {
     49      if (!scope.Variables.ContainsKey(name)) throw new ArgumentException(string.Format(" {0} cannot be found in the provided scope.", name));
    7050      var value = scope.Variables[name].Value;
    71       if (value == null) throw new ArgumentException(string.Format("Encoding part {0} is null.", name));
     51      if (value == null) throw new InvalidOperationException(string.Format("Value of {0} is null.", name));
    7252      return value;
    7353    }
    7454
    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));
     55    protected static void SetScopeValue(string name, IScope scope, IItem value) {
    7756      if (value == null) throw new ArgumentNullException("value");
    78 
    7957      if (!scope.Variables.ContainsKey(name)) scope.Variables.Add(new Variable(name, value));
    8058      else scope.Variables[name].Value = value;
    81       var variable = scope.Variables[name];
    8259    }
    8360  }
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Individuals/MultiEncodingIndividual.cs

    r11599 r11619  
    2323using System.Collections.Generic;
    2424using System.Linq;
    25 using System.Text;
    26 using HeuristicLab.Common;
    2725using HeuristicLab.Core;
    28 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2926
    30 namespace HeuristicLab.Problems.Programmable.Encodings {
     27namespace HeuristicLab.Problems.Programmable {
    3128  public sealed class MultiEncodingIndividual : Individual {
    3229    public new MultiEncoding Encoding {
     
    3431    }
    3532
    36     public MultiEncodingIndividual(IEncoding encoding, IScope scope)
     33    private readonly IEnumerable<Individual> individuals;
     34    public MultiEncodingIndividual(MultiEncoding encoding, IScope scope)
    3735      : base(encoding, scope) {
    38       if (encoding.GetType() != typeof(MultiEncoding))
    39         throw new ArgumentException("Encoding must be of type MultiEncoding.k");
     36      individuals = encoding.Encodings.Select(e => e.GetIndividual(scope)).ToArray();
    4037    }
    4138
    42     [StorableConstructor]
    43     private MultiEncodingIndividual(bool deserializing) : base(deserializing) { }
     39    private MultiEncodingIndividual(MultiEncoding encoding, IScope scope, IEnumerable<Individual> individuals)
     40      : base(encoding, scope) {
     41      this.individuals = individuals;
     42    }
    4443
    45     public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncodingIndividual(this, cloner); }
    46     private MultiEncodingIndividual(Individual original, Cloner cloner) : base(original, cloner) { }
    4744
    4845    public override IItem this[string name] {
    4946      get {
    50         var encoding = Encoding.Encodings.FirstOrDefault(e => e.Name == name);
    51         if (encoding == null) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
    52         return ExtractScopeValue(name, encoding.Name, Scope);
     47        var individual = individuals.FirstOrDefault(i => i.Name == name);
     48        if (individual == null) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
     49        return individual[name];
    5350      }
    5451      set {
    55         var encoding = Encoding.Encodings.FirstOrDefault(e => e.Name == name);
    56         if (encoding == null) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
    57         SetScopeValue(name, encoding.Name, Scope, value);
     52        var individual = individuals.FirstOrDefault(i => i.Name == name);
     53        if (individual == null) throw new ArgumentException(string.Format("{0} is not part of the specified encoding.", name));
     54        individual[name] = value;
    5855      }
    5956    }
    6057
    6158    internal override Individual Copy(IScope scope) {
    62       var individual = Encoding.CreateIndividual(scope);
    63       foreach (var encoding in Encoding.Encodings)
    64         individual[encoding.Name] = this[encoding.Name];
    65       return individual;
     59      var copies = individuals.Select(i => i.Copy(scope)).ToArray();
     60      return new MultiEncodingIndividual(Encoding, scope, copies);
    6661    }
    6762  }
Note: See TracChangeset for help on using the changeset viewer.