Index: /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedUpDownWalkAnalyzer.cs
===================================================================
--- /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedUpDownWalkAnalyzer.cs	(revision 9143)
+++ /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Algorithms/RepeatedUpDownWalkAnalyzer.cs	(revision 9143)
@@ -0,0 +1,90 @@
+﻿using System;
+using System.Linq;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+
+namespace HeuristicLab.Analysis.FitnessLandscape.Algorithms {
+
+  [Item("RepeatedUpDownWalkAnalyzer", "Analyzes and consolidates repeated up down walk analyses.")]
+  [StorableClass]
+  public class RepeatedUpDownWalkAnalyzer : SingleSuccessorOperator, IRepeatsAnalyzer {
+
+    #region Parameters
+    public ScopeTreeLookupParameter<DoubleValue> DownWalkLengthValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["DownWalkLengthValues"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> UpWalkLengthValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["UpWalkLengthValues"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> DownWalkLenVarValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["DownWalkLenVarValues"]; }
+    }
+    public ScopeTreeLookupParameter<DoubleValue> UpWalkLenVarValuesParameter {
+      get { return (ScopeTreeLookupParameter<DoubleValue>)Parameters["UpWalkLenVarValues"]; }
+    }
+    public LookupParameter<DoubleValue> DownWalkLengthParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["DownWalkLength"]; }
+    }
+    public LookupParameter<DoubleValue> UpWalkLengthParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["UpWalkLength"]; }
+    }
+    public LookupParameter<DoubleValue> DownWalkLenVarParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["DownWalkLenVar"]; }
+    }
+    public LookupParameter<DoubleValue> UpWalkLenVarParameter {
+      get { return (LookupParameter<DoubleValue>)Parameters["UpWalkLenVar"]; }
+    }
+    public LookupParameter<ResultCollection> ResultsParameter {
+      get { return (LookupParameter<ResultCollection>)Parameters["Results"]; }
+    }
+    #endregion
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected RepeatedUpDownWalkAnalyzer(bool deserializing) : base(deserializing) { }
+    protected RepeatedUpDownWalkAnalyzer(RepeatedUpDownWalkAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public RepeatedUpDownWalkAnalyzer() {
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("DownWalkLengthValues", "average down length values of repeats.", "DownWalkLength", 2));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("UpWalkLengthValues", "average up walk length values of repeats.", "UpWalkLength", 2));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("DownWalkLenVarValues", "down length variance values of repeats.", "DownWalkLenVar", 2));
+      Parameters.Add(new ScopeTreeLookupParameter<DoubleValue>("UpWalkLenVarValues", "down length variance values of repeats.", "UpWalkLenVar", 2));
+
+      Parameters.Add(new LookupParameter<DoubleValue>("DownWalkLength", "Consolidated average down walk length."));
+      Parameters.Add(new LookupParameter<DoubleValue>("UpWalkLength", "Consolidated average up walk length."));
+      Parameters.Add(new LookupParameter<DoubleValue>("DownWalkLenVar", "Consolidated down walk length variance."));
+      Parameters.Add(new LookupParameter<DoubleValue>("UpWalkLenVar", "Consolidated up walk length variance."));
+
+      Parameters.Add(new LookupParameter<ResultCollection>("Results", "The collection of all results."));
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new RepeatedUpDownWalkAnalyzer(this, cloner);
+    }
+    #endregion
+
+    public override IOperation Apply() {
+      AggregateValues(DownWalkLengthValuesParameter, DownWalkLengthParameter);
+      AggregateValues(UpWalkLengthValuesParameter, UpWalkLengthParameter);
+      AggregateValues(DownWalkLenVarValuesParameter, DownWalkLenVarParameter);
+      AggregateValues(UpWalkLenVarValuesParameter, UpWalkLenVarParameter);
+      return base.Apply();
+    }
+
+    private void AggregateValues(ILookupParameter<ItemArray<DoubleValue>> valuesParameter, ILookupParameter<DoubleValue> averageParameter) {
+      var results = ResultsParameter.ActualValue;
+      var values = valuesParameter.ActualValue.Select(v => v.Value).ToList();
+      if (values.Count > 0) {
+        var avg = new DoubleValue(values.Average());
+        averageParameter.ActualValue = avg;
+        results.Remove(averageParameter.ActualName);
+        results.Add(new Result(averageParameter.ActualName, avg));
+      }
+    }
+
+  }
+}
Index: /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/UpDownAggregatorAggregator.cs
===================================================================
--- /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/UpDownAggregatorAggregator.cs	(revision 9143)
+++ /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/Analysis/Aggregators/UpDownAggregatorAggregator.cs	(revision 9143)
@@ -0,0 +1,96 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Common;
+using HeuristicLab.Common.Resources;
+using HeuristicLab.Analysis.FitnessLandscape.DataTables;
+using System.Drawing;
+using HeuristicLab.Analysis.FitnessLandscape.Analysis;
+
+namespace HeuristicLab.Analysis.FitnessLandscape {
+
+  [Item("Up Down Aggregator", "Aggregates scalar up down analyses.")]
+  [StorableClass]
+  public class UpDownAggregator : NamedItem, IAggregator {
+
+    public static new Image StaticItemImage { get { return VSImageLibrary.Database; } }
+    public override bool CanChangeName { get { return false; } }
+
+    [Storable]
+    private List<double> downWalkLengths = new List<double>();
+    [Storable]
+    private List<double> upWalkLengths = new List<double>();
+    [Storable]
+    private List<double> downWalkLenVars = new List<double>();
+    [Storable]
+    private List<double> upWalkLenVars = new List<double>();
+
+    #region Construction & Cloning
+    [StorableConstructor]
+    protected UpDownAggregator(bool deserializing) : base(deserializing) { }
+    protected UpDownAggregator(UpDownAggregator original, Cloner cloner) : base(original, cloner) {
+      downWalkLengths = original.downWalkLengths.ToList();
+      upWalkLengths = original.upWalkLengths.ToList();
+      downWalkLenVars = original.downWalkLenVars.ToList();
+      upWalkLenVars = original.upWalkLenVars.ToList();
+    }
+    public UpDownAggregator() {
+      name = ItemName;
+      description = ItemDescription;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UpDownAggregator(this, cloner);
+    }
+    #endregion
+
+    #region IAggregator interface    
+    public virtual void MaybeAddResult(IResult result) {
+      MaybeAddValue(downWalkLengths, "DownWalkLength", result);
+      MaybeAddValue(upWalkLengths, "UpWalkLength", result);
+      MaybeAddValue(downWalkLenVars, "DownWalkLenVar", result);
+      MaybeAddValue(upWalkLenVars, "UpWalkLenVar", result);
+    }
+
+    private void MaybeAddValue(List<double> values, string resultName, IResult result) {
+      if (result.Name != resultName) return;
+      var value = result.Value as DoubleValue;
+      if (value != null)
+        values.Add(value.Value);
+    }
+
+    public virtual IResult CreateResult() {
+      var results = new ResultCollection();
+      results.AddRange(CreateSummary("DownWalkLength", downWalkLengths));
+      results.AddRange(CreateSummary("UpWalkLength", upWalkLengths));
+      results.AddRange(CreateSummary("DownWalkLenVar", downWalkLenVars));
+      results.AddRange(CreateSummary("UpWalkLenVar", upWalkLenVars));
+      return new Result("UpDown", results);
+    }
+
+    public virtual void Reset() {
+      downWalkLengths.Clear();
+      upWalkLengths.Clear();
+      downWalkLenVars.Clear();
+      upWalkLenVars.Clear();
+    }
+    #endregion
+
+    private IEnumerable<IResult> CreateSummary(string name, IEnumerable<double> values) {
+      DistributionAnalyzer analyzer = new DistributionAnalyzer(values);      
+      return new[] {
+        new Result(name + " Avg", new DoubleValue(analyzer.Mean)),
+        new Result(name + " Quartile-Spread", new DoubleValue(analyzer[0.75]-analyzer[0.25])),
+        new Result(name + " 90%-Spread", new DoubleValue(analyzer[0.95]-analyzer[0.05])),
+        new Result(name + " Range", new DoubleValue(analyzer[1]-analyzer[0])),
+      };
+    }
+
+    
+
+  }
+}
Index: /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/HeuristicLab.Analysis.FitnessLandscape.csproj
===================================================================
--- /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/HeuristicLab.Analysis.FitnessLandscape.csproj	(revision 9142)
+++ /branches/FitnessLandscapeAnalysis/HeuristicLab.Analysis.FitnessLandscape/HeuristicLab.Analysis.FitnessLandscape.csproj	(revision 9143)
@@ -165,4 +165,5 @@
   </ItemGroup>
   <ItemGroup>
+    <Compile Include="Algorithms\RepeatedUpDownWalkAnalyzer.cs" />
     <Compile Include="Algorithms\EvolvabilityAnalyzer.cs" />
     <Compile Include="Algorithms\RepeatedInformationAnalyzer.cs" />
@@ -173,4 +174,5 @@
     <Compile Include="Analysis\Aggregators\Aggregator.cs" />
     <Compile Include="Analysis\Aggregators\AutoCorrelationAggregator.cs" />
+    <Compile Include="Analysis\Aggregators\UpDownAggregatorAggregator.cs" />
     <Compile Include="Analysis\Aggregators\EvolvabilityAggregator.cs" />
     <Compile Include="Analysis\Aggregators\InformationAnalysisPeakAggregator.cs" />
