Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5111)
@@ -22,9 +22,9 @@
 namespace HeuristicLab.MetaOptimization.Test {
   class Program {
-    private static int metaAlgorithmPopulationSize = 3;
+    private static int metaAlgorithmPopulationSize = 50;
     private static int metaAlgorithmMaxGenerations = 30;
-    private static int metaProblemRepetitions = 3;
-
-    private static int baseAlgorithmMaxGenerations = 3;
+    private static int metaProblemRepetitions = 6;
+
+    private static int baseAlgorithmMaxGenerations = 250;
 
     static void Main(string[] args) {
@@ -34,4 +34,5 @@
       //TestDoubleSampling();
       //TestTypeDiscovery();
+      //TestOperators();
       
       GeneticAlgorithm baseLevelAlgorithm = new GeneticAlgorithm();
@@ -53,4 +54,42 @@
 
       //TestMemoryLeak(metaLevelAlgorithm);
+
+      Console.ReadLine();
+    }
+
+    private static void TestOperators() {
+      IRandom random = new MersenneTwister();
+      ParameterConfigurationManipulator manip = new ParameterConfigurationManipulator();
+
+      manip.IntValueManipulatorParameter.ActualValue = new UniformIntValueManipulator();
+      manip.DoubleValueManipulatorParameter.ActualValue = new NormalDoubleValueManipulator();
+      
+      var doubleRange = new DoubleValueRange(new DoubleValue(0), new DoubleValue(100), new DoubleValue(0.1));
+      using (var sw = new StreamWriter("out-DoubleValue.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          var val = new DoubleValue(50);
+          NormalDoubleValueManipulator.ApplyStatic(random, val, doubleRange);
+          
+          sw.WriteLine(val);
+        }
+      }
+
+      var percentRange = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(0.001));
+      using (var sw = new StreamWriter("out-PercentValue.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          var val = new PercentValue(0.5);
+          NormalDoubleValueManipulator.ApplyStatic(random, val, percentRange.AsDoubleValueRange());
+          sw.WriteLine(val);
+        }
+      }
+
+      var intRange = new IntValueRange(new IntValue(0), new IntValue(100), new IntValue(1));
+      using (var sw = new StreamWriter("out-IntValue.txt")) {
+        for (int i = 0; i < 10000; i++) {
+          var val = new IntValue(50);
+          UniformIntValueManipulator.ApplyStatic(random, val, intRange);
+          sw.WriteLine(val);
+        }
+      }
 
       Console.ReadLine();
@@ -145,12 +184,12 @@
       for (int i = 0; i < 10; i++) {
         IValueConfiguration clonedVc = (IValueConfiguration)algorithmVc.Clone();
+        GeneticAlgorithm newAlg = (GeneticAlgorithm)baseLevelAlgorithm.Clone();
         clonedVc.Randomize(rand);
-        clonedVc.Parameterize((GeneticAlgorithm)clonedVc.ActualValue.Value);
-        GeneticAlgorithm newAlg = (GeneticAlgorithm)clonedVc.ActualValue.Value;
+        clonedVc.Parameterize(newAlg);
         Console.WriteLine(string.Format("PopSize: original: {0}, randomized: {1}", baseLevelAlgorithm.PopulationSize, newAlg.PopulationSize));
         Console.WriteLine(string.Format("MutRate: original: {0}, randomized: {1}", baseLevelAlgorithm.MutationProbability, newAlg.MutationProbability));
         Console.WriteLine(string.Format("MutOp: original: {0}, randomized: {1}", baseLevelAlgorithm.Mutator, newAlg.Mutator));
         Console.WriteLine(string.Format("SelOp: original: {0}, randomized: {1}", baseLevelAlgorithm.Selector, newAlg.Selector));
-        Console.WriteLine(string.Format("GrSi: original: {0}, randomized: {1}", "?", ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
+        //Console.WriteLine(string.Format("GrSi: original: {0}, randomized: {1}", "?", ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
         Console.WriteLine("---");
       }
@@ -162,12 +201,14 @@
       for (int i = 0; i < 10; i++) {
         IValueConfiguration clonedVc = (IValueConfiguration)algorithmVc.Clone();
-        clonedVc.Mutate(rand);
-        clonedVc.Parameterize((GeneticAlgorithm)clonedVc.ActualValue.Value);
-        GeneticAlgorithm newAlg = (GeneticAlgorithm)clonedVc.ActualValue.Value;
+        GeneticAlgorithm newAlg = (GeneticAlgorithm)baseLevelAlgorithm.Clone();
+        //clonedVc.Mutate(rand);
+        
+        //.Apply(rand, clonedVc); todo
+        clonedVc.Parameterize(newAlg);
         Console.WriteLine(string.Format("PopSize: original: {0}, mutated: {1}", baseLevelAlgorithm.PopulationSize, newAlg.PopulationSize));
         Console.WriteLine(string.Format("MutRate: original: {0}, mutated: {1}", baseLevelAlgorithm.MutationProbability, newAlg.MutationProbability));
         Console.WriteLine(string.Format("MutOp: original: {0}, mutated: {1}", baseLevelAlgorithm.Mutator, newAlg.Mutator));
         Console.WriteLine(string.Format("SelOp: original: {0}, mutated: {1}", baseLevelAlgorithm.Selector, newAlg.Selector));
-        Console.WriteLine(string.Format("GrSi: original: {0}, mutated: {1}", ((TournamentSelector)baseLevelAlgorithm.Selector).GroupSizeParameter.Value, ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
+        //Console.WriteLine(string.Format("GrSi: original: {0}, mutated: {1}", ((TournamentSelector)baseLevelAlgorithm.Selector).GroupSizeParameter.Value, ((TournamentSelector)newAlg.Selector).GroupSizeParameter.Value));
         Console.WriteLine("---");
       }
@@ -179,6 +220,6 @@
         IValueConfiguration clonedVc2 = (IValueConfiguration)algorithmVc.Clone();
 
-        GeneticAlgorithm first = (GeneticAlgorithm)clonedVc1.ActualValue.Value.Clone();
-        GeneticAlgorithm second = (GeneticAlgorithm)clonedVc2.ActualValue.Value.Clone();
+        GeneticAlgorithm first = (GeneticAlgorithm)baseLevelAlgorithm.Clone();
+        GeneticAlgorithm second = (GeneticAlgorithm)baseLevelAlgorithm.Clone();
 
         clonedVc1.Randomize(rand);
@@ -192,7 +233,7 @@
         var mutOpBefore = first.Mutator;
         var selOpBefore = first.Selector;
-        var groupSizeBefore = ((TournamentSelector)first.Selector).GroupSizeParameter.Value.Value;
-
-        clonedVc1.Cross(clonedVc2, rand);
+        //var groupSizeBefore = ((TournamentSelector)first.Selector).GroupSizeParameter.Value.Value;
+
+        //clonedVc1.Cross(clonedVc2, rand); todo
         clonedVc1.Parameterize(first);
 
@@ -201,5 +242,5 @@
         Console.WriteLine(string.Format("MutOp: first: {0}, second: {1}, crossed: {2}", mutOpBefore, second.Mutator, first.Mutator));
         Console.WriteLine(string.Format("SelOp: first: {0}, second: {1}, crossed: {2}", selOpBefore, second.Selector, first.Selector));
-        Console.WriteLine(string.Format("GrSi: first: {0}, second: {1}, crossed: {2}", groupSizeBefore, ((TournamentSelector)second.Selector).GroupSizeParameter.Value, ((TournamentSelector)first.Selector).GroupSizeParameter.Value));
+        //Console.WriteLine(string.Format("GrSi: first: {0}, second: {1}, crossed: {2}", groupSizeBefore, ((TournamentSelector)second.Selector).GroupSizeParameter.Value, ((TournamentSelector)first.Selector).GroupSizeParameter.Value));
         Console.WriteLine("---");
       }
@@ -306,4 +347,5 @@
             sb.AppendLine("=================================");
 
+            sb.AppendLine(metaLevelAlgorithm.ExecutionState.ToString());
             foreach (var result in metaLevelAlgorithm.Results) {
               sb.AppendLine(result.ToString());
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ClassDiagram1.cd
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ClassDiagram1.cd	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ClassDiagram1.cd	(revision 5111)
@@ -0,0 +1,44 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IOptimizable">
+    <Position X="3.5" Y="1" Width="2.5" />
+    <Members>
+      <Property Name="IsOptimizable" Hidden="true" />
+      <Event Name="IsOptimizableChanged" Hidden="true" />
+      <Event Name="OptimizeChanged" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>AAAAAAAEAAAAAAAAAAAAAACAAMAAAAAACCCAAACAAAA=</HashCode>
+      <FileName>Interfaces\IOptimizable.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IValueConfiguration">
+    <Position X="4.75" Y="3.75" Width="2.25" />
+    <Members>
+      <Method Name="Parameterize" Hidden="true" />
+      <Event Name="ValueChanged" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>AAAQAAAAAAAAAAAAAAAAAAAAAEACAAAAAACAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IValueConfiguration.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IParameterConfiguration">
+    <Position X="2.25" Y="3.75" Width="2.25" />
+    <Members>
+      <Method Name="Parameterize" Hidden="true" />
+    </Members>
+    <TypeIdentifier>
+      <HashCode>AAAAgEAAAAAAAAAAAAAAAIAAAAAAABAAAACAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IParameterConfiguration.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Interface Name="HeuristicLab.Problems.MetaOptimization.IRange&lt;T&gt;">
+    <Position X="7.5" Y="3.25" Width="2" />
+    <TypeIdentifier>
+      <HashCode>AACAAAAAAIAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAA=</HashCode>
+      <FileName>Interfaces\IRange.cs</FileName>
+    </TypeIdentifier>
+  </Interface>
+  <Font Name="Segoe UI" Size="9" />
+</ClassDiagram>
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 5111)
@@ -118,4 +118,5 @@
   </ItemGroup>
   <ItemGroup>
+    <None Include="ClassDiagram1.cd" />
     <None Include="HeuristicLabProblemsMetaOptimizationViewsPlugin.cs.frame" />
     <Compile Include="ConstrainedItemListView.cs">
Index: anches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ClassDiagram1.cd
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/ClassDiagram1.cd	(revision 5110)
+++ 	(revision )
@@ -1,44 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<ClassDiagram MajorVersion="1" MinorVersion="1" MembersFormat="NameAndType">
-  <Interface Name="HeuristicLab.Problems.MetaOptimization.IOptimizable">
-    <Position X="3.5" Y="1" Width="2.5" />
-    <Members>
-      <Property Name="IsOptimizable" Hidden="true" />
-      <Event Name="IsOptimizableChanged" Hidden="true" />
-      <Event Name="OptimizeChanged" Hidden="true" />
-    </Members>
-    <TypeIdentifier>
-      <HashCode>AAAAAAAEAAAAAAAAAAAAAACAAMAAAAAACCCAAACAAAA=</HashCode>
-      <FileName>Interfaces\IOptimizable.cs</FileName>
-    </TypeIdentifier>
-  </Interface>
-  <Interface Name="HeuristicLab.Problems.MetaOptimization.IValueConfiguration">
-    <Position X="4.75" Y="3.75" Width="2.25" />
-    <Members>
-      <Method Name="Parameterize" Hidden="true" />
-      <Event Name="ValueChanged" Hidden="true" />
-    </Members>
-    <TypeIdentifier>
-      <HashCode>AAAQAAAAAAAAAAAAAAAAAAAAAEACAAAAAACAAAAAAAA=</HashCode>
-      <FileName>Interfaces\IValueConfiguration.cs</FileName>
-    </TypeIdentifier>
-  </Interface>
-  <Interface Name="HeuristicLab.Problems.MetaOptimization.IParameterConfiguration">
-    <Position X="2.25" Y="3.75" Width="2.25" />
-    <Members>
-      <Method Name="Parameterize" Hidden="true" />
-    </Members>
-    <TypeIdentifier>
-      <HashCode>AAAAgEAAAAAAAAAAAAAAAIAAAAAAABAAAACAAAAAAAA=</HashCode>
-      <FileName>Interfaces\IParameterConfiguration.cs</FileName>
-    </TypeIdentifier>
-  </Interface>
-  <Interface Name="HeuristicLab.Problems.MetaOptimization.IRange&lt;T&gt;">
-    <Position X="7.5" Y="3.25" Width="2" />
-    <TypeIdentifier>
-      <HashCode>AACAAAAAAIAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAA=</HashCode>
-      <FileName>Interfaces\IRange.cs</FileName>
-    </TypeIdentifier>
-  </Interface>
-  <Font Name="Segoe UI" Size="9" />
-</ClassDiagram>
Index: anches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/MetaOptimizationEvaluator.cs	(revision 5110)
+++ 	(revision )
@@ -1,134 +1,0 @@
-﻿using System;
-using System.Linq;
-using System.Threading;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Operators;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using System.Collections.Generic;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  /// <summary>
-  /// A base class for operators which evaluate TSP solutions.
-  /// </summary>
-  [Item("MetaOptimizationEvaluator", "A base class for operators which evaluate Meta Optimization solutions.")]
-  [StorableClass]
-  public class MetaOptimizationEvaluator : SingleSuccessorOperator, IMetaOptimizationEvaluator {
-    private bool algorithmStopped;
-
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
-    }
-    public ILookupParameter<EngineAlgorithm> AlgorithmParameter {
-      get { return (ILookupParameter<EngineAlgorithm>)Parameters[MetaOptimizationProblem.AlgorithmTypeParameterName]; }
-    }
-    public ILookupParameter<IItemList<ISingleObjectiveProblem>> ProblemsParameter {
-      get { return (ILookupParameter<IItemList<ISingleObjectiveProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
-    }
-    public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
-      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
-    }
-    public LookupParameter<IntValue> RepetitionsParameter {
-      get { return (LookupParameter<IntValue>)Parameters[MetaOptimizationProblem.RepetitionsParameterName]; }
-    }
-
-    public IntValue Repetitions {
-      get { return RepetitionsParameter.ActualValue; }
-    }
-
-    public MetaOptimizationEvaluator()
-      : base() {
-      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the ParameterVector."));
-      Parameters.Add(new LookupParameter<EngineAlgorithm>(MetaOptimizationProblem.AlgorithmTypeParameterName, "Missing description."));
-      Parameters.Add(new LookupParameter<IItemList<ISingleObjectiveProblem>>(MetaOptimizationProblem.ProblemsParameterName, "Missing description."));
-      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", "Missing description."));
-      Parameters.Add(new LookupParameter<IntValue>(MetaOptimizationProblem.RepetitionsParameterName, "Number of evaluations on one problem."));
-    }
-
-    [StorableConstructor]
-    protected MetaOptimizationEvaluator(bool deserializing) : base(deserializing) { }
-    protected MetaOptimizationEvaluator(MetaOptimizationEvaluator original, Cloner cloner)
-      : base(original, cloner) {
-      this.algorithmStopped = original.algorithmStopped;
-    }
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new MetaOptimizationEvaluator(this, cloner);
-    }
-
-    public override IOperation Apply() {
-      EngineAlgorithm algorithm = AlgorithmParameter.ActualValue;
-      IItemList<ISingleObjectiveProblem> problems = ProblemsParameter.ActualValue;
-
-      // set parameters
-      ParameterConfigurationParameter.ActualValue.Parameterize(algorithm);
-      algorithm.Problem = problems.First();
-      algorithm.StoreAlgorithmInEachRun = false;
-
-      algorithmStopped = false;
-      algorithm.Stopped += new EventHandler(ActualValue_Stopped);
-
-      List<double> qualities = new List<double>();
-      List<TimeSpan> executionTimes = new List<TimeSpan>();
-      algorithm.Engine = new SequentialEngine.SequentialEngine();
-      algorithm.Prepare(true);
-
-      foreach (ISingleObjectiveProblem problem in problems) {
-        algorithm.Problem = problem;
-
-        for (int i = 0; i < Repetitions.Value; i++) {
-          algorithm.Prepare();
-          algorithm.Start();
-          while (!algorithmStopped) {
-            Thread.Sleep(200); // wait for algorithm to complete; do not rely on Algorithm.ExecutionState here, because change of ExecutionState happens before Run is added (which causes problems because Algorithm might get cloned when its started already)
-          }
-          qualities.Add(((DoubleValue)algorithm.Results["BestQuality"].Value).Value);
-          executionTimes.Add(algorithm.ExecutionTime);
-
-          // parameters will be stored in ParameterConfigurationTree anyway. they would be redundant in runs
-          algorithm.Runs.Last().Parameters.Clear();
-          // but keep the problem, since this differs in runs
-          algorithm.Runs.Last().Parameters.Add("Problem", problem);
-          algorithmStopped = false;
-        }
-
-      }
-
-
-      algorithm.Stopped -= new EventHandler(ActualValue_Stopped);
-      algorithm.Prepare();
-
-      qualities = qualities.OrderBy(x => x).ToList();  // todo: respect Maximization:true/false
-
-      ParameterConfigurationParameter.ActualValue.AverageExecutionTime = new TimeSpanValue(TimeSpan.FromMilliseconds(executionTimes.Average(t => t.TotalMilliseconds)));
-      ParameterConfigurationParameter.ActualValue.Repetitions = Repetitions;
-      ParameterConfigurationParameter.ActualValue.BestQuality = new DoubleValue(qualities.First());
-      ParameterConfigurationParameter.ActualValue.AverageQuality = new DoubleValue(qualities.Average());
-      ParameterConfigurationParameter.ActualValue.WorstQuality = new DoubleValue(qualities.Last());
-      ParameterConfigurationParameter.ActualValue.QualityVariance = new DoubleValue(qualities.Variance());
-      ParameterConfigurationParameter.ActualValue.QualityStandardDeviation = new DoubleValue(qualities.StandardDeviation());
-      ParameterConfigurationParameter.ActualValue.Runs = algorithm.Runs;
-
-      double quality = ParameterConfigurationParameter.ActualValue.AverageQuality.Value; // todo: also include other measures (executiontime, variance)
-      this.QualityParameter.ActualValue = new DoubleValue(quality);
-
-      return base.Apply();
-    }
-
-    public static double Variance(IEnumerable<double> source) {
-      double avg = source.Average();
-      double d = source.Aggregate(0.0, (total, next) => total += Math.Pow(next - avg, 2));
-      return d / (source.Count() - 1);
-    }
-
-    public static double StandardDeviation(IEnumerable<double> source) {
-      return Math.Sqrt(source.Variance());
-    }
-
-    void ActualValue_Stopped(object sender, EventArgs e) {
-      algorithmStopped = true;
-    }
-  }
-}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Evaluators/ParameterConfigurationEvaluator.cs	(revision 5111)
@@ -0,0 +1,134 @@
+﻿using System;
+using System.Linq;
+using System.Threading;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using System.Collections.Generic;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// A base class for operators which evaluate TSP solutions.
+  /// </summary>
+  [Item("ParameterConfigurationEvaluator", "A base class for operators which evaluate Meta Optimization solutions.")]
+  [StorableClass]
+  public class ParameterConfigurationEvaluator : SingleSuccessorOperator, IParameterConfigurationEvaluator {
+    private bool algorithmStopped;
+
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters["Quality"]; }
+    }
+    public ILookupParameter<EngineAlgorithm> AlgorithmParameter {
+      get { return (ILookupParameter<EngineAlgorithm>)Parameters[MetaOptimizationProblem.AlgorithmTypeParameterName]; }
+    }
+    public ILookupParameter<IItemList<ISingleObjectiveProblem>> ProblemsParameter {
+      get { return (ILookupParameter<IItemList<ISingleObjectiveProblem>>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; }
+    }
+    public ILookupParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
+      get { return (ILookupParameter<ParameterConfigurationTree>)Parameters["ParameterConfigurationTree"]; }
+    }
+    public LookupParameter<IntValue> RepetitionsParameter {
+      get { return (LookupParameter<IntValue>)Parameters[MetaOptimizationProblem.RepetitionsParameterName]; }
+    }
+
+    public IntValue Repetitions {
+      get { return RepetitionsParameter.ActualValue; }
+    }
+
+    public ParameterConfigurationEvaluator()
+      : base() {
+      Parameters.Add(new LookupParameter<DoubleValue>("Quality", "The evaluated quality of the ParameterVector."));
+      Parameters.Add(new LookupParameter<EngineAlgorithm>(MetaOptimizationProblem.AlgorithmTypeParameterName, "Missing description."));
+      Parameters.Add(new LookupParameter<IItemList<ISingleObjectiveProblem>>(MetaOptimizationProblem.ProblemsParameterName, "Missing description."));
+      Parameters.Add(new LookupParameter<ParameterConfigurationTree>("ParameterConfigurationTree", "Missing description."));
+      Parameters.Add(new LookupParameter<IntValue>(MetaOptimizationProblem.RepetitionsParameterName, "Number of evaluations on one problem."));
+    }
+
+    [StorableConstructor]
+    protected ParameterConfigurationEvaluator(bool deserializing) : base(deserializing) { }
+    protected ParameterConfigurationEvaluator(ParameterConfigurationEvaluator original, Cloner cloner)
+      : base(original, cloner) {
+      this.algorithmStopped = original.algorithmStopped;
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new ParameterConfigurationEvaluator(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      EngineAlgorithm algorithm = AlgorithmParameter.ActualValue;
+      IItemList<ISingleObjectiveProblem> problems = ProblemsParameter.ActualValue;
+
+      // set parameters
+      ParameterConfigurationParameter.ActualValue.Parameterize(algorithm);
+      algorithm.Problem = problems.First();
+      algorithm.StoreAlgorithmInEachRun = false;
+
+      algorithmStopped = false;
+      algorithm.Stopped += new EventHandler(ActualValue_Stopped);
+
+      List<double> qualities = new List<double>();
+      List<TimeSpan> executionTimes = new List<TimeSpan>();
+      algorithm.Engine = new SequentialEngine.SequentialEngine();
+      algorithm.Prepare(true);
+
+      foreach (ISingleObjectiveProblem problem in problems) {
+        algorithm.Problem = problem;
+
+        for (int i = 0; i < Repetitions.Value; i++) {
+          algorithm.Prepare();
+          algorithm.Start();
+          while (!algorithmStopped) {
+            Thread.Sleep(200); // wait for algorithm to complete; do not rely on Algorithm.ExecutionState here, because change of ExecutionState happens before Run is added (which causes problems because Algorithm might get cloned when its started already)
+          }
+          qualities.Add(((DoubleValue)algorithm.Results["BestQuality"].Value).Value);
+          executionTimes.Add(algorithm.ExecutionTime);
+
+          // parameters will be stored in ParameterConfigurationTree anyway. they would be redundant in runs
+          algorithm.Runs.Last().Parameters.Clear();
+          // but keep the problem, since this differs in runs
+          algorithm.Runs.Last().Parameters.Add("Problem", problem);
+          algorithmStopped = false;
+        }
+
+      }
+
+
+      algorithm.Stopped -= new EventHandler(ActualValue_Stopped);
+      algorithm.Prepare();
+
+      qualities = qualities.OrderBy(x => x).ToList();  // todo: respect Maximization:true/false
+
+      ParameterConfigurationParameter.ActualValue.AverageExecutionTime = new TimeSpanValue(TimeSpan.FromMilliseconds(executionTimes.Average(t => t.TotalMilliseconds)));
+      ParameterConfigurationParameter.ActualValue.Repetitions = Repetitions;
+      ParameterConfigurationParameter.ActualValue.BestQuality = new DoubleValue(qualities.First());
+      ParameterConfigurationParameter.ActualValue.AverageQuality = new DoubleValue(qualities.Average());
+      ParameterConfigurationParameter.ActualValue.WorstQuality = new DoubleValue(qualities.Last());
+      ParameterConfigurationParameter.ActualValue.QualityVariance = new DoubleValue(qualities.Variance());
+      ParameterConfigurationParameter.ActualValue.QualityStandardDeviation = new DoubleValue(qualities.StandardDeviation());
+      ParameterConfigurationParameter.ActualValue.Runs = algorithm.Runs;
+
+      double quality = ParameterConfigurationParameter.ActualValue.AverageQuality.Value; // todo: also include other measures (executiontime, variance)
+      this.QualityParameter.ActualValue = new DoubleValue(quality);
+
+      return base.Apply();
+    }
+
+    public static double Variance(IEnumerable<double> source) {
+      double avg = source.Average();
+      double d = source.Aggregate(0.0, (total, next) => total += Math.Pow(next - avg, 2));
+      return d / (source.Count() - 1);
+    }
+
+    public static double StandardDeviation(IEnumerable<double> source) {
+      return Math.Sqrt(source.Variance());
+    }
+
+    void ActualValue_Stopped(object sender, EventArgs e) {
+      algorithmStopped = true;
+    }
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5111)
@@ -130,34 +130,44 @@
   <ItemGroup>
     <Compile Include="Analyzers\BestParameterConfigurationAnalyzer.cs" />
-    <None Include="ClassDiagram1.cd" />
     <None Include="Properties\AssemblyInfo.cs.frame" />
     <None Include="HeuristicLabProblemsMetaOptimizationPlugin.cs.frame" />
     <Compile Include="ConstrainedItemList.cs" />
-    <Compile Include="Encodings\NullValue.cs" />
-    <Compile Include="Encodings\ValueConfigurations\NullValueConfiguration.cs" />
-    <Compile Include="Encodings\RangeConstraints\ConstrainedValue.cs">
+    <Compile Include="Encoding\NullValue.cs" />
+    <Compile Include="Encoding\RangeConstraints\PercentValueRange.cs">
       <SubType>Code</SubType>
     </Compile>
-    <Compile Include="Encodings\RangeConstraints\PercentValueRange.cs" />
-    <Compile Include="Encodings\RangeConstraints\DoubleValueRange.cs" />
-    <Compile Include="Encodings\RangeConstraints\IntValueRange.cs" />
-    <Compile Include="Encodings\ParameterConfigurationTree.cs" />
-    <Compile Include="Encodings\ValueConfigurations\ValueConfiguration.cs" />
-    <Compile Include="Encodings\ValueConfigurations\CheckedValueConfigurationCollection.cs" />
+    <Compile Include="Encoding\ValueConfigurations\NullValueConfiguration.cs" />
+    <Compile Include="Encoding\RangeConstraints\ConstrainedValue.cs">
+      <SubType>Code</SubType>
+    </Compile>
+    <Compile Include="Encoding\RangeConstraints\DoubleValueRange.cs" />
+    <Compile Include="Encoding\RangeConstraints\IntValueRange.cs" />
+    <Compile Include="Encoding\ParameterConfigurationTree.cs" />
+    <Compile Include="Encoding\ValueConfigurations\ValueConfiguration.cs" />
+    <Compile Include="Encoding\ValueConfigurations\CheckedValueConfigurationCollection.cs" />
     <Compile Include="Interfaces\ICheckedValueConfigurationCollection.cs" />
+    <Compile Include="Operators\Crossovers\DiscreteIntValueCrossover.cs" />
+    <Compile Include="Operators\Interfaces\IDoubleValueCrossover.cs" />
+    <Compile Include="Operators\Interfaces\IDoubleValueManipulator.cs" />
+    <Compile Include="Operators\Interfaces\IIntValueManipulator.cs" />
     <Compile Include="Interfaces\IOptimizable.cs" />
     <Compile Include="Interfaces\IParameterConfigurationCreator.cs" />
     <Compile Include="Creators\RandomParameterConfigurationCreator.cs" />
-    <Compile Include="Encodings\Crossovers\ParameterConfigurationCrossover.cs" />
+    <Compile Include="Encoding\Crossovers\ParameterConfigurationCrossover.cs" />
     <Compile Include="Interfaces\IParameterConfigurationOperator.cs" />
     <Compile Include="Interfaces\IRange.cs" />
-    <Compile Include="Evaluators\MetaOptimizationEvaluator.cs" />
-    <Compile Include="Interfaces\IMetaOptimizationEvaluator.cs" />
+    <Compile Include="Evaluators\ParameterConfigurationEvaluator.cs" />
+    <Compile Include="Interfaces\IParameterConfigurationEvaluator.cs" />
     <Compile Include="Interfaces\IParameterConfiguration.cs" />
-    <Compile Include="Encodings\ParameterConfigurations\ParameterConfiguration.cs" />
+    <Compile Include="Encoding\ParameterConfigurations\ParameterConfiguration.cs" />
     <Compile Include="Interfaces\IValueConfiguration.cs" />
-    <Compile Include="Encodings\RangeConstraints\Range.cs" />
+    <Compile Include="Encoding\RangeConstraints\Range.cs" />
     <Compile Include="Interfaces\IParameterConfigurationManipulator.cs" />
-    <Compile Include="Manipulators\ParameterConfigurationManipulator.cs" />
+    <Compile Include="Encoding\Manipulators\ParameterConfigurationManipulator.cs" />
+    <Compile Include="Operators\Interfaces\IIntValueCrossover.cs" />
+    <Compile Include="Operators\Interfaces\IValueManipulator.cs" />
+    <Compile Include="Operators\Manipulators\UniformIntValueManipulator.cs" />
+    <Compile Include="Operators\Manipulators\UniformDoubleValueManipulator.cs" />
+    <Compile Include="Operators\Manipulators\NormalDoubleValueManipulator.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="MetaOptimizationProblem.cs" />
Index: anches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IMetaOptimizationEvaluator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IMetaOptimizationEvaluator.cs	(revision 5110)
+++ 	(revision )
@@ -1,8 +1,0 @@
-﻿using HeuristicLab.Optimization;
-
-namespace HeuristicLab.Problems.MetaOptimization {
-  /// <summary>
-  /// An interface which represents an evaluation operator for Meta Optimization Problems.
-  /// </summary>
-  public interface IMetaOptimizationEvaluator : ISingleObjectiveEvaluator {  }
-}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 5111)
@@ -7,12 +7,15 @@
 
 namespace HeuristicLab.Problems.MetaOptimization {
+  public delegate void MutateDelegate(IRandom random, IOptimizable configuartion, ParameterConfigurationManipulator pcmanip);
+  public delegate void CrossDelegate(IRandom random, IOptimizable configuartion, ParameterConfigurationCrossover pccross);
+
   public interface IOptimizable : IItem {
     bool IsOptimizable { get; }
     bool Optimize { get; set; }
     ConstrainedValue ActualValue { get; set; }
-
+    
     void Randomize(IRandom random);
-    void Mutate(IRandom random);
-    void Cross(IOptimizable other, IRandom random);
+    void Mutate(IRandom random, MutateDelegate mutate, ParameterConfigurationManipulator pcmanip);
+    void Cross(IRandom random, IOptimizable other, CrossDelegate cross, ParameterConfigurationCrossover pccross);
     
     event EventHandler IsOptimizableChanged;
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 5111)
@@ -11,4 +11,5 @@
     ICheckedValueConfigurationCollection ValueConfigurations { get; }
     IItemSet<IItem> ValidValues { get; }
+    int ActualValueConfigurationIndex { get; set; }
 
     void Parameterize(IValueParameter parameter);
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationEvaluator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationEvaluator.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationEvaluator.cs	(revision 5111)
@@ -0,0 +1,8 @@
+﻿using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  /// <summary>
+  /// An interface which represents an evaluation operator for Meta Optimization Problems.
+  /// </summary>
+  public interface IParameterConfigurationEvaluator : ISingleObjectiveEvaluator {  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationManipulator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationManipulator.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfigurationManipulator.cs	(revision 5111)
@@ -8,5 +8,5 @@
 namespace HeuristicLab.Problems.MetaOptimization {
   public interface IParameterConfigurationManipulator : IParameterConfigurationOperator, IManipulator {
-    ILookupParameter<ParameterConfigurationTree> ParameterConfigurationTreeParameter { get; }
+    IValueLookupParameter<ParameterConfigurationTree> ParameterConfigurationTreeParameter { get; }
   }
 }
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5110)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5111)
@@ -36,5 +36,5 @@
   [Creatable("Problems")]
   [StorableClass]
-  public sealed class MetaOptimizationProblem : SingleObjectiveProblem<IMetaOptimizationEvaluator, IParameterConfigurationCreator> {
+  public sealed class MetaOptimizationProblem : SingleObjectiveProblem<IParameterConfigurationEvaluator, IParameterConfigurationCreator> {
     public const string AlgorithmTypeParameterName = "AlgorithmType";
     public const string ProblemTypeParameterName = "ProblemType";
@@ -42,4 +42,9 @@
     public const string ParameterConfigurationParameterName = "InitialParameterConfigurationTree";
     public const string RepetitionsParameterName = "Repetitions";
+
+    public const string IntValueManipulatorParameterName = "IntValueManipulator";
+    public const string DoubleValueManipulatorParameterName = "DoubleValueManipulator";
+    public const string IntValueCrossoverParameterName = "IntValueCrossover";
+    public const string DoubleValueCrossoverParameterName = "DoubleValueCrossover";
 
     #region Parameter Properties
@@ -58,4 +63,12 @@
     public IValueParameter<IntValue> RepetitionsParameter {
       get { return (ValueParameter<IntValue>)Parameters[RepetitionsParameterName]; }
+    }
+
+    public IValueParameter<IIntValueManipulator> IntValueManipulatorParameter {
+      get { return (ValueParameter<IIntValueManipulator>)Parameters[IntValueManipulatorParameterName]; }
+    }
+
+    public IValueParameter<IDoubleValueManipulator> DoubleValueManipulatorParameter {
+      get { return (ValueParameter<IDoubleValueManipulator>)Parameters[DoubleValueManipulatorParameterName]; }
     }
     #endregion
@@ -91,7 +104,13 @@
       Parameters.Add(new ValueParameter<IntValue>(RepetitionsParameterName, "The number of evaluations for each problem.", new IntValue(3)));
 
+      var validIntManipulators = new ItemSet<IIntValueManipulator>( ApplicationManager.Manager.GetInstances<IIntValueManipulator>());
+      var validDoubleManipulators = new ItemSet<IDoubleValueManipulator>(ApplicationManager.Manager.GetInstances<IDoubleValueManipulator>());
+      Parameters.Add(new ConstrainedValueParameter<IIntValueManipulator>(IntValueManipulatorParameterName, "", validIntManipulators, new UniformIntValueManipulator()));
+      Parameters.Add(new ConstrainedValueParameter<IDoubleValueManipulator>(DoubleValueManipulatorParameterName, "", validDoubleManipulators, new NormalDoubleValueManipulator()));
+
+
       Maximization = new BoolValue(false);
       SolutionCreator = new RandomParameterConfigurationCreator();
-      Evaluator = new MetaOptimizationEvaluator();
+      Evaluator = new ParameterConfigurationEvaluator();
 
       InitializeOperators();
@@ -136,5 +155,5 @@
     }
     private void ParameterizeEvaluator() {
-      ((MetaOptimizationEvaluator)Evaluator).ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
+      ((ParameterConfigurationEvaluator)Evaluator).ParameterConfigurationParameter.ActualName = ((RandomParameterConfigurationCreator)SolutionCreator).ParameterConfigurationParameter.ActualName;
     }
     private void ParameterizeAnalyzer() {
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DiscreteIntValueCrossover.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DiscreteIntValueCrossover.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Crossovers/DiscreteIntValueCrossover.cs	(revision 5111)
@@ -0,0 +1,38 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class DiscreteIntValueCrossover : SingleSuccessorOperator, IIntValueCrossover, IStochasticOperator {
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public DiscreteIntValueCrossover() { }
+    [StorableConstructor]
+    protected DiscreteIntValueCrossover(bool deserializing) : base(deserializing) { }
+    protected DiscreteIntValueCrossover(DiscreteIntValueCrossover original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new DiscreteIntValueCrossover(this, cloner);
+    }
+
+    public void Apply(IRandom random, IntValue value, IntValueRange range) {
+      Apply(random, value, range);
+    }
+
+    public static void ApplyStatic(IRandom random, IntValue value, IntValueRange range) {
+
+    }
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueCrossover.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueCrossover.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueCrossover.cs	(revision 5111)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IDoubleValueCrossover : ICrossover {
+    void Apply(IRandom random, DoubleValue value, DoubleValueRange range);
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueManipulator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueManipulator.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IDoubleValueManipulator.cs	(revision 5111)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IDoubleValueManipulator : IValueManipulator {
+    void Apply(IRandom random, DoubleValue value, DoubleValueRange range);
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueCrossover.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueCrossover.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueCrossover.cs	(revision 5111)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Optimization;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IIntValueCrossover : ICrossover {
+    void Apply(IRandom random, IntValue value, IntValueRange range);
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueManipulator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueManipulator.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IIntValueManipulator.cs	(revision 5111)
@@ -0,0 +1,13 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IIntValueManipulator : IValueManipulator {
+    void Apply(IRandom random, IntValue value, IntValueRange range);
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IValueManipulator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IValueManipulator.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Interfaces/IValueManipulator.cs	(revision 5111)
@@ -0,0 +1,10 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public interface IValueManipulator : IManipulator {
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/NormalDoubleValueManipulator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/NormalDoubleValueManipulator.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/NormalDoubleValueManipulator.cs	(revision 5111)
@@ -0,0 +1,45 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class NormalDoubleValueManipulator : SingleSuccessorOperator, IDoubleValueManipulator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public NormalDoubleValueManipulator() { }
+    [StorableConstructor]
+    protected NormalDoubleValueManipulator(bool deserializing) : base(deserializing) { }
+    protected NormalDoubleValueManipulator(NormalDoubleValueManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new NormalDoubleValueManipulator(this, cloner);
+    }
+    
+    // todo: override apply
+    public void Apply(IRandom random, DoubleValue value, DoubleValueRange range) {
+      ApplyStatic(random, value, range);
+    }
+
+    public static void ApplyStatic(IRandom random, DoubleValue value, DoubleValueRange range) {
+      var vector = new RealVector(new double[] { value.Value });
+      var strategy = new RealVector(new double[] { (range.UpperBound.Value - range.LowerBound.Value) / 5});
+      NormalAllPositionsManipulator.Apply(random, vector, strategy);
+      value.Value = vector[0];
+      range.Fix(value);
+    }
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformDoubleValueManipulator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformDoubleValueManipulator.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformDoubleValueManipulator.cs	(revision 5111)
@@ -0,0 +1,47 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class UniformDoubleValueManipulator : SingleSuccessorOperator, IDoubleValueManipulator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public UniformDoubleValueManipulator() { }
+    [StorableConstructor]
+    protected UniformDoubleValueManipulator(bool deserializing) : base(deserializing) { }
+    protected UniformDoubleValueManipulator(UniformDoubleValueManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UniformDoubleValueManipulator(this, cloner);
+    }
+
+    // todo: override apply
+    public void Apply(IRandom random, DoubleValue value, DoubleValueRange range) {
+      ApplyStatic(random, value, range);
+    }
+
+    public static void ApplyStatic(IRandom random, DoubleValue value, DoubleValueRange range) {
+      var vector = new RealVector(new double[] { value.Value });
+      var bounds = new DoubleMatrix(1, 2);
+      bounds[0, 0] = range.LowerBound.Value;
+      bounds[0, 1] = range.UpperBound.Value;
+      UniformOnePositionManipulator.Apply(random, vector, bounds);
+      value.Value = vector[0];
+      range.Fix(value);
+    }
+  }
+}
Index: /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformIntValueManipulator.cs
===================================================================
--- /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformIntValueManipulator.cs	(revision 5111)
+++ /branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Operators/Manipulators/UniformIntValueManipulator.cs	(revision 5111)
@@ -0,0 +1,45 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Core;
+using HeuristicLab.Parameters;
+using HeuristicLab.Common;
+using HeuristicLab.Encodings.IntegerVectorEncoding;
+using HeuristicLab.Data;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  [StorableClass]
+  public class UniformIntValueManipulator : SingleSuccessorOperator, IIntValueManipulator, IStochasticOperator {
+
+    public ILookupParameter<IRandom> RandomParameter {
+      get { return (LookupParameter<IRandom>)Parameters["Random"]; }
+    }
+
+    public UniformIntValueManipulator() { }
+    [StorableConstructor]
+    protected UniformIntValueManipulator(bool deserializing) : base(deserializing) { }
+    protected UniformIntValueManipulator(UniformIntValueManipulator original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new UniformIntValueManipulator(this, cloner);
+    }
+
+    // todo: override apply
+    
+    public void Apply(IRandom random, IntValue value, IntValueRange range) {
+      ApplyStatic(random, value, range);
+    }
+
+    public static void ApplyStatic(IRandom random, IntValue value, IntValueRange range) {
+      var vector = new IntegerVector(new int[] { value.Value });
+      UniformOnePositionManipulator.Apply(random, vector, range.LowerBound, new IntValue(range.UpperBound.Value + 1));
+      value.Value = vector[0];
+      range.Fix(value);
+    }
+  }
+}
