Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Optimization/3.3/RunCollectionModificationEvaluator.cs @ 6677

Last change on this file since 6677 was 6677, checked in by epitzer, 13 years ago

Enable modifications of order and number of runs in RunCollectionModificationEvaluator and implement RunCollectionSorter (#1622)

File size: 3.3 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using HeuristicLab.Common;
6using HeuristicLab.Core;
7using HeuristicLab.Parameters;
8using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
9
10namespace HeuristicLab.Optimization {
11  [Item("RunCollection Modification Evaluator", "Applies a series of RunCollection modifiers.")]
12  [Creatable("Testing & Analysis")]
13  [StorableClass]
14  public class RunCollectionModificationEvaluator : ParameterizedNamedItem, IStorableContent {
15
16    public string Filename { get; set; }
17
18    #region Parameters
19    public ValueParameter<RunCollection> RunCollectionParameter {
20      get { return (ValueParameter<RunCollection>)Parameters["RunCollection"]; }
21    }
22
23    public ValueParameter<CheckedItemList<IRunCollectionModifier>> ModifiersParameter {
24      get { return (ValueParameter<CheckedItemList<IRunCollectionModifier>>)Parameters["Modifiers"]; }
25    }
26    #endregion
27
28    #region Parameter Values
29    public RunCollection RunCollection {
30      get { return RunCollectionParameter.Value; }
31    }
32    public CheckedItemList<IRunCollectionModifier> Modifiers {
33      get { return ModifiersParameter.Value; }
34    }
35    #endregion
36
37    #region Construction & Cloning
38    [StorableConstructor]
39    protected RunCollectionModificationEvaluator(bool deserializing) : base(deserializing) { }
40    protected RunCollectionModificationEvaluator(RunCollectionModificationEvaluator original, Cloner cloner) : base(original, cloner) { }
41    public RunCollectionModificationEvaluator() {
42      Parameters.Add(new ValueParameter<RunCollection>("RunCollection", "The RunCollection to be modified.", new RunCollection()));
43      Parameters.Add(new ValueParameter<CheckedItemList<IRunCollectionModifier>>("Modifiers", "A list of modifiers to be applied to the run collection.", new CheckedItemList<IRunCollectionModifier>()));
44    }
45    public override IDeepCloneable Clone(Cloner cloner) {
46      return new RunCollectionModificationEvaluator(this, cloner);
47    }
48    #endregion
49
50    public void Evaluate() {
51      RunCollection.UpdateOfRunsInProgress = true;
52      var runs = RunCollection.Select((r, i) => new {Run = r, r.Visible, Index = i}).ToList();
53      var visibleRuns = runs.Where(r => r.Visible).Select(r => r.Run).ToList();
54      int n = visibleRuns.Count;
55      if (n == 0)
56        return;
57      foreach (var modifier in Modifiers.CheckedItems)
58        modifier.Value.Modify(visibleRuns);
59      if (n != visibleRuns.Count ||
60          runs.Where(r => r.Visible).Zip(visibleRuns, (r1, r2) => r1.Run != r2).Any()) {
61        var runIt = runs.GetEnumerator();
62        var visibleRunIt = visibleRuns.GetEnumerator();
63        var newRuns = new List<IRun>();
64        while (runIt.MoveNext()) {
65          if (!runIt.Current.Visible)
66            newRuns.Add(runIt.Current.Run);
67          else if (visibleRunIt.MoveNext())
68            newRuns.Add(visibleRunIt.Current);
69        }
70        while (visibleRunIt.MoveNext())
71          newRuns.Add(visibleRunIt.Current);
72        RunCollection.Clear();
73        RunCollection.AddRange(newRuns);
74      } else if (runs.Count > 0) { // force update
75        var run = (IRun) runs[0].Run.Clone();
76        RunCollection.Add(run);
77        RunCollection.Remove(run);
78      }
79      RunCollection.UpdateOfRunsInProgress = false;
80    }
81  }
82}
Note: See TracBrowser for help on using the repository browser.