Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/26/14 13:24:20 (10 years ago)
Author:
mkommend
Message:

#2174: Implemented multi-encoding operators and adapated wiring of operators in the programmable problems.

Location:
branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings
Files:
6 edited

Legend:

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

    r11582 r11587  
    4848    }
    4949    public override IEnumerable<IValueParameter> Parameters {
    50       get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter }); }
     50      get { return new IValueParameter[] { LengthParameter }; }
    5151    }
    5252    #endregion
     
    7373      : base(name) {
    7474      lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
     75      SolutionCreator = new RandomBinaryVectorCreator();
    7576      RegisterParameterEvents();
    7677      DiscoverOperators();
    77       SolutionCreator = Operators.OfType<RandomBinaryVectorCreator>().Single();
    7878    }
    7979
     
    106106      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, pluginDescription, true, false, false);
    107107      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
    108       var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList();
     108      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
    109109
    110110      ConfigureOperators(newOperators);
    111       encodingOperators.AddRange(newOperators);
     111      foreach (var @operator in newOperators)
     112        encodingOperators.Add(@operator);
    112113    }
    113114    #endregion
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/Encoding.cs

    r11582 r11587  
    3737    }
    3838
    39     public virtual IEnumerable<IValueParameter> Parameters {
    40       get { return Enumerable.Empty<IValueParameter>(); }
    41     }
     39    public abstract IEnumerable<IValueParameter> Parameters { get; }
    4240
    43     protected List<IOperator> encodingOperators = new List<IOperator>();
     41    protected HashSet<IOperator> encodingOperators = new HashSet<IOperator>(new TypeEqualityComparer<IOperator>());
    4442    [Storable]
    4543    public IEnumerable<IOperator> Operators {
    4644      get { return encodingOperators; }
    47       protected set { encodingOperators = new List<IOperator>(value); }
     45      private set { encodingOperators = new HashSet<IOperator>(value, new TypeEqualityComparer<IOperator>()); }
    4846    }
    49 
    5047
    5148    ISolutionCreator IEncoding.SolutionCreator {
    5249      get { return SolutionCreator; }
    5350      set {
    54         if (!(value is T)) throw new ArgumentException("???");
     51        if (!(value is T)) throw new ArgumentException(string.Format("Cannot assign the solution creator {0} to the encoding {1}.", value.GetType().GetPrettyName(), GetType().GetPrettyName()));
    5552        SolutionCreator = (T)value;
    5653      }
     
    6461        if (value == null) throw new ArgumentNullException("SolutionCreator must not be null.");
    6562        if (solutionCreator == value) return;
     63        encodingOperators.Remove(solutionCreator);
     64        encodingOperators.Add(value);
    6665        solutionCreator = value;
    6766        OnSolutionCreatorChanged();
     
    7473    protected Encoding(Encoding<T> original, Cloner cloner)
    7574      : base(original, cloner) {
    76       encodingOperators = original.Operators.Select(cloner.Clone).ToList();
     75      encodingOperators = new HashSet<IOperator>(original.Operators.Select(cloner.Clone));
    7776      solutionCreator = cloner.Clone(original.solutionCreator);
    7877    }
     
    8079
    8180
     81    public abstract void ConfigureOperators(IEnumerable<IOperator> operators);
     82    public void ConfigureOperator(IOperator @operator) { ConfigureOperators(new[] { @operator }); }
    8283
    83     public void ConfigureOperator(IOperator @operator) {
    84       ConfigureOperators(new[] { @operator });
    85     }
    86     public virtual void ConfigureOperators(IEnumerable<IOperator> operators) {
    87 
    88     }
    89 
     84    public event EventHandler SolutionCreatorChanged;
    9085    protected virtual void OnSolutionCreatorChanged() {
    9186      ConfigureOperator(SolutionCreator);
     87      var handler = SolutionCreatorChanged;
     88      if (handler != null) handler(this, EventArgs.Empty);
    9289    }
    9390
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/IntegerEncoding.cs

    r11582 r11587  
    6161
    6262    public override IEnumerable<IValueParameter> Parameters {
    63       get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter, BoundsParameter }); }
     63      get { return new IValueParameter[] { LengthParameter, BoundsParameter }; }
    6464    }
    6565    #endregion
     
    9494      if (min >= max) throw new ArgumentException("min must be less than max", "min");
    9595      if (step.HasValue && step.Value <= 0) throw new ArgumentException("step must be greater than zero or null", "step");
     96
    9697      Length = length;
    9798      Bounds = new IntMatrix(1, step.HasValue ? 3 : 2);
     
    99100      Bounds[0, 1] = max;
    100101      if (step.HasValue) Bounds[0, 2] = step.Value;
     102
     103      SolutionCreator = new UniformRandomIntegerVectorCreator();
    101104      RegisterParameterEvents();
    102105      DiscoverOperators();
    103       SolutionCreator = Operators.OfType<UniformRandomIntegerVectorCreator>().Single();
    104106    }
    105107    public IntegerEncoding(string name, int length, IList<int> min, IList<int> max, IList<int> step = null)
     
    109111      if (step != null && min.Count != step.Count) throw new ArgumentException("step must be of the same length as min or null", "step");
    110112      if (min.Zip(max, (mi, ma) => mi >= ma).Any(x => x)) throw new ArgumentException("min must be less than max in each dimension", "min");
     113
    111114      Length = length;
    112115      Bounds = new IntMatrix(min.Count, step != null ? 3 : 2);
     
    116119        if (step != null) Bounds[i, 2] = step[i];
    117120      }
     121
     122      SolutionCreator = new UniformRandomIntegerVectorCreator();
    118123      RegisterParameterEvents();
    119124      DiscoverOperators();
    120       SolutionCreator = Operators.OfType<UniformRandomIntegerVectorCreator>().Single();
    121125    }
    122126
     
    159163      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, true, false, false);
    160164      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
    161       var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList();
     165      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
    162166
    163167      ConfigureOperators(newOperators);
    164       encodingOperators.AddRange(newOperators);
     168      foreach (var @operator in newOperators)
     169        encodingOperators.Add(@operator);
    165170    }
    166171    #endregion
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/MultiEncoding.cs

    r11559 r11587  
    2222using System;
    2323using System.Collections.Generic;
     24using System.Linq;
    2425using HeuristicLab.Common;
    2526using HeuristicLab.Core;
    26 using HeuristicLab.Encodings.PermutationEncoding;
    2727using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     28using HeuristicLab.PluginInfrastructure;
     29using HeuristicLab.Problems.Programmable.Interfaces;
    2830
    2931namespace HeuristicLab.Problems.Programmable {
     
    3133  [StorableClass]
    3234  public class MultiEncoding : Encoding<MultiEncodingCreator> {
     35
     36    private readonly List<IEncoding> encodings;
     37
    3338    [Storable]
    34     public KeyedItemCollection<string, IEncoding> Encodings { get; protected set; }
     39    public IEnumerable<IEncoding> Encodings {
     40      get { return encodings; }
     41      private set { encodings.AddRange(value); }
     42    }
     43
     44    public override IEnumerable<IValueParameter> Parameters {
     45      get { return Encodings.SelectMany(e => e.Parameters); }
     46    }
    3547
    3648    [StorableConstructor]
    37     protected MultiEncoding(bool deserializing) : base(deserializing) { }
     49    protected MultiEncoding(bool deserializing)
     50      : base(deserializing) {
     51      encodings = new List<IEncoding>();
     52    }
     53
     54    public override IDeepCloneable Clone(Cloner cloner) { return new MultiEncoding(this, cloner); }
    3855    protected MultiEncoding(MultiEncoding original, Cloner cloner)
    3956      : base(original, cloner) {
    40       Encodings = cloner.Clone(original.Encodings);
     57      encodings = new List<IEncoding>(original.Encodings.Select(cloner.Clone));
    4158    }
    4259    public MultiEncoding()
    4360      : base("MultiEncoding") {
    44       Encodings = new NamedItemCollection<IEncoding>();
     61      encodings = new List<IEncoding>();
     62      SolutionCreator = new MultiEncodingCreator();
     63
     64      foreach (var @operator in ApplicationManager.Manager.GetInstances<IMultiEncodingOperator>())
     65        encodingOperators.Add(@operator);
    4566    }
    4667
    47     public override IDeepCloneable Clone(Cloner cloner) {
    48       return new MultiEncoding(this, cloner);
    49     }
     68    public MultiEncoding Add(IEncoding encoding) {
     69      if (encoding is MultiEncoding) throw new InvalidOperationException("Nesting of MultiEncodings is not supported.");
     70      if (Encodings.Any(e => e.Name == encoding.Name)) throw new ArgumentException("Encoding name must be unique", "encoding.Name");
     71      encodings.Add(encoding);
    5072
    51     public MultiEncoding AddBinaryVector(string variableName, int length) {
    52       if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
    53       Encodings.Add(new BinaryEncoding(variableName, length));
     73      foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
     74        @operator.AddEncoding(encoding);
     75      }
    5476      return this;
    5577    }
    5678
    57     public MultiEncoding AddIntegerVector(string variableName, int length, int min, int max, int? step = null) {
    58       if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
    59       Encodings.Add(new IntegerEncoding(variableName, length, min, max, step));
    60       return this;
     79    public bool Remove(IEncoding encoding) {
     80      var success = encodings.Remove(encoding);
     81      foreach (var @operator in Operators.OfType<IMultiEncodingOperator>()) {
     82        @operator.RemoveEncoding(encoding);
     83      }
     84      return success;
    6185    }
    6286
    63     public MultiEncoding AddIntegerVector(string variableName, int length, IList<int> min, IList<int> max, IList<int> step = null) {
    64       if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
    65       Encodings.Add(new IntegerEncoding(variableName, length, min, max, step));
    66       return this;
    67     }
     87    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
    6888
    69     public MultiEncoding AddRealVector(string variableName, int length, double min, double max) {
    70       if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
    71       Encodings.Add(new RealEncoding(variableName, length, min, max));
    72       return this;
    73     }
    74 
    75     public MultiEncoding AddRealVector(string variableName, int length, IList<double> min, IList<double> max) {
    76       if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
    77       Encodings.Add(new RealEncoding(variableName, length, min, max));
    78       return this;
    79     }
    80 
    81     public MultiEncoding AddPermutation(string variableName, int length, PermutationTypes type) {
    82       if (Encodings.ContainsKey(variableName)) throw new ArgumentException("variableName must be unique", "variableName");
    83       Encodings.Add(new PermutationEncoding(variableName, length, type));
    84       return this;
    8589    }
    8690  }
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/PermutationEncoding.cs

    r11582 r11587  
    6060
    6161    public override IEnumerable<IValueParameter> Parameters {
    62       get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter, PermutationTypeParameter }); }
     62      get { return new IValueParameter[] { LengthParameter, PermutationTypeParameter }; }
    6363    }
    6464    #endregion
     
    8989      RegisterParameterEvents();
    9090    }
     91
    9192    public PermutationEncoding(string name, int length, PermutationTypes type)
    9293      : base(name) {
    9394      Length = length;
    9495      Type = type;
     96
     97      SolutionCreator = new RandomPermutationCreator();
    9598      RegisterParameterEvents();
    9699      DiscoverOperators();
    97       SolutionCreator = Operators.OfType<RandomPermutationCreator>().Single();
    98100    }
    99101
     
    138140      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, true, false, false);
    139141      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
    140       var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList();
     142      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
    141143
    142144      ConfigureOperators(newOperators);
    143       encodingOperators.AddRange(newOperators);
     145      foreach (var @operator in newOperators)
     146        encodingOperators.Add(@operator);
    144147    }
    145148    #endregion
    146149
    147150    public override void ConfigureOperators(IEnumerable<IOperator> operators) {
    148       base.ConfigureOperators(operators);
    149151      ConfigureCreators(Operators.OfType<IPermutationCreator>());
    150152      ConfigureCrossovers(Operators.OfType<IPermutationCrossover>());
  • branches/ProgrammableProblem/HeuristicLab.Problems.Programmable/3.3/Encodings/RealEncoding.cs

    r11582 r11587  
    6262
    6363    public override IEnumerable<IValueParameter> Parameters {
    64       get { return base.Parameters.Concat(new IValueParameter[] { LengthParameter, BoundsParameter }); }
     64      get { return new IValueParameter[] { LengthParameter, BoundsParameter }; }
    6565    }
    6666    #endregion
     
    101101      lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
    102102      boundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
     103
     104      SolutionCreator = new UniformRandomRealVectorCreator();
    103105      RegisterParameterEvents();
    104106      DiscoverOperators();
    105       SolutionCreator = Operators.OfType<UniformRandomRealVectorCreator>().Single();
    106107    }
    107108
     
    119120      lengthParameter = new FixedValueParameter<IntValue>(Name + "Length", new IntValue(length));
    120121      boundsParameter = new ValueParameter<DoubleMatrix>(Name + "Bounds", bounds);
     122
     123      SolutionCreator = new UniformRandomRealVectorCreator();
    121124      RegisterParameterEvents();
    122125      DiscoverOperators();
    123       SolutionCreator = Operators.OfType<UniformRandomRealVectorCreator>().Single();
    124126    }
    125127
     
    167169      var discoveredTypes = ApplicationManager.Manager.GetTypes(encodingSpecificOperatorTypes, true, false, false);
    168170      var operators = discoveredTypes.Select(t => (IOperator)Activator.CreateInstance(t));
    169       var newOperators = operators.Except(encodingOperators, new TypeEqualityComparer<IOperator>()).ToList();
     171      var newOperators = operators.Except(Operators, new TypeEqualityComparer<IOperator>()).ToList();
    170172
    171173      ConfigureOperators(newOperators);
    172       encodingOperators.AddRange(newOperators);
     174      foreach (var @operator in newOperators)
     175        encodingOperators.Add(@operator);
    173176
    174177      foreach (var strategyVectorCreator in Operators.OfType<IRealVectorStdDevStrategyParameterCreator>())
Note: See TracChangeset for help on using the changeset viewer.