Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/Program.cs	(revision 5144)
@@ -1,22 +1,20 @@
-﻿using System.Collections.Generic;
-using System.Diagnostics;
+﻿using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
 using System.Linq;
+using System.Text;
+using System.Threading;
+using HeuristicLab.Algorithms.EvolutionStrategy;
 using HeuristicLab.Algorithms.GeneticAlgorithm;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Optimization;
 using HeuristicLab.PluginInfrastructure;
-using HeuristicLab.Parameters;
 using HeuristicLab.Problems.MetaOptimization;
-using HeuristicLab.Data;
-using System;
-using System.Threading;
+using HeuristicLab.Problems.TestFunctions;
 using HeuristicLab.Random;
-using HeuristicLab.Optimization;
-using HeuristicLab.Common;
-using System.IO;
-using HeuristicLab.Problems.TestFunctions;
-using System.Text;
 using HeuristicLab.Selection;
-using HeuristicLab.Algorithms.EvolutionStrategy;
-using HeuristicLab.PluginInfrastructure.Manager;
 
 namespace HeuristicLab.MetaOptimization.Test {
@@ -35,5 +33,9 @@
       //TestTypeDiscovery();
       //TestOperators();
-      
+      //TestCombinations();
+      //TestCombinations2();
+      //TestCombinations3();
+      TestCombinations4();
+
       GeneticAlgorithm baseLevelAlgorithm = new GeneticAlgorithm();
 
@@ -45,8 +47,11 @@
       IValueConfiguration algorithmVc = SetupGAAlgorithm(baseLevelAlgorithm, metaOptimizationProblem);
 
+      //TestToString(algorithmVc);
+
+
       //Console.WriteLine("Press enter to start");
       //Console.ReadLine();
       //TestConfiguration(algorithmVc, baseLevelAlgorithm);
-      
+
       //Console.WriteLine("Press enter to start");
       //Console.ReadLine();
@@ -58,4 +63,85 @@
     }
 
+    private static void TestToString(IValueConfiguration algorithmVc) {
+      var random = new MersenneTwister();
+      Console.WriteLine(algorithmVc.ToParameterInfoString());
+      algorithmVc.Randomize(random);
+      Console.WriteLine(algorithmVc.ToParameterInfoString());
+      algorithmVc.Randomize(random);
+      Console.WriteLine(algorithmVc.ToParameterInfoString());
+      algorithmVc.Randomize(random);
+    }
+
+    private static void TestCombinations() {
+      Console.WriteLine("IntRange 3-18:3");
+      IntValueRange intRange = new IntValueRange(new IntValue(3), new IntValue(18), new IntValue(3));
+      foreach (var val in intRange.GetCombinations()) {
+        Console.WriteLine(val);
+      }
+
+      Console.WriteLine("DoubleRange 1.0-2.5:0.5");
+      var dblRange = new DoubleValueRange(new DoubleValue(0.7), new DoubleValue(2.8), new DoubleValue(0.5));
+      foreach (var val in dblRange.GetCombinations()) {
+        Console.WriteLine(val);
+      }
+
+      Console.WriteLine("PercentRange 33%-66%:33%");
+      var pctRange = new PercentValueRange(new PercentValue(0.32), new PercentValue(0.98), new PercentValue(0.33));
+      foreach (var val in pctRange.GetCombinations()) {
+        Console.WriteLine(val);
+      }
+    }
+
+    private static void TestCombinations3() {
+      Node root = new Node("root");
+      root.ChildNodes.Add(new Node("root.n1"));
+      root.ChildNodes.Add(new Node("root.n2"));
+      Node n3 = new Node("root.n3");
+      n3.ChildNodes.Add(new Node("root.n3.n1"));
+      n3.ChildNodes.Add(new Node("root.n3.n2"));
+      root.ChildNodes.Add(n3);
+
+      Console.WriteLine(root.ToString());
+      Console.WriteLine("--");
+      int cnt = 0;
+      var enumerator = new NodeEnumerator(root);
+      enumerator.Reset();
+      while (enumerator.MoveNext()) {
+        Console.WriteLine(enumerator.Current.ToString());
+        cnt++;
+      }
+      Console.WriteLine("count: " + cnt);
+    }
+
+    private static void TestCombinations4() {
+      GeneticAlgorithm ga = new GeneticAlgorithm();
+      ga.Problem = new SingleObjectiveTestFunctionProblem();
+      ParameterConfigurationTree vc = new ParameterConfigurationTree(ga);
+
+      //ConfigurePopulationSize(vc, 20, 100, 20);
+      //ConfigureMutationRate(vc, 0.10, 0.60, 0.10);
+      ConfigureMutationOperator(vc);
+      ConfigureSelectionOperator(vc, false);
+
+      //foreach (var combination in vc.IterateCombinations()) {
+      //  Console.WriteLine(combination.ToParameterInfoString());
+      //}
+
+      int count = 0;
+      IEnumerator enumerator = new ParameterCombinationsEnumerator(vc);
+      enumerator.Reset();
+      while (enumerator.MoveNext()) {
+        var current = (IValueConfiguration)enumerator.Current;
+        count++;
+        Console.WriteLine(current.ToParameterInfoString());
+      }
+      Console.WriteLine("You are about to create {0} algorithms.", count);
+
+      Experiment experiment = vc.GenerateExperiment(ga);
+      foreach (var opt in experiment.Optimizers) {
+        Console.WriteLine(opt.Name);
+      }
+    }
+
     private static void TestOperators() {
       IRandom random = new MersenneTwister();
@@ -64,5 +150,5 @@
       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")) {
@@ -70,5 +156,5 @@
           var val = new DoubleValue(50);
           NormalDoubleValueManipulator.ApplyStatic(random, val, doubleRange);
-          
+
           sw.WriteLine(val);
         }
@@ -98,5 +184,5 @@
     private static void TestTypeDiscovery() {
       PluginLoader.pluginAssemblies.Any();
-      
+
       var items = ApplicationManager.Manager.GetInstances(typeof(DoubleArray)).ToArray();
 
@@ -107,5 +193,5 @@
 
     private static void TestMemoryLeak(GeneticAlgorithm metaLevelAlgorithm) {
-      IValueConfiguration algorithmVc = ((MetaOptimizationProblem)metaLevelAlgorithm.Problem).AlgorithmParameterConfiguration;
+      IValueConfiguration algorithmVc = ((MetaOptimizationProblem)metaLevelAlgorithm.Problem).ParameterConfigurationTree;
 
       Console.WriteLine("Starting Memory Test...");
@@ -160,5 +246,5 @@
 
       metaOptimizationProblem.Algorithm = baseLevelAlgorithm;
-      IValueConfiguration algorithmVc = metaOptimizationProblem.AlgorithmParameterConfiguration;
+      IValueConfiguration algorithmVc = metaOptimizationProblem.ParameterConfigurationTree;
 
       metaOptimizationProblem.Problems.Add(new HeuristicLab.Problems.TestFunctions.SingleObjectiveTestFunctionProblem() {
@@ -171,9 +257,9 @@
       });
 
-      ConfigurePopulationSize(algorithmVc);
-      ConfigureMutationRate(algorithmVc);
+      ConfigurePopulationSize(algorithmVc, 20, 100, 1);
+      ConfigureMutationRate(algorithmVc, 0.0, 1.0, 0.01);
       ConfigureMutationOperator(algorithmVc);
       ConfigureElites(algorithmVc);
-      ConfigureSelectionOperator(algorithmVc);
+      ConfigureSelectionOperator(algorithmVc, true);
       return algorithmVc;
     }
@@ -203,5 +289,5 @@
         GeneticAlgorithm newAlg = (GeneticAlgorithm)baseLevelAlgorithm.Clone();
         //clonedVc.Mutate(rand);
-        
+
         //.Apply(rand, clonedVc); todo
         clonedVc.Parameterize(newAlg);
@@ -259,5 +345,5 @@
     }
 
-    private static void ConfigureSelectionOperator(IValueConfiguration algorithmVc) {
+    private static void ConfigureSelectionOperator(IValueConfiguration algorithmVc, bool configureTournamenSize) {
       var selectionOperatorPc = algorithmVc.ParameterConfigurations.Where(x => x.Name == "Selector").SingleOrDefault();
       selectionOperatorPc.Optimize = true;
@@ -266,6 +352,8 @@
         if (vc.ActualValue.ValueDataType == typeof(TournamentSelector)) {
           selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, true);
-          vc.Optimize = true;
-          ConfigureTournamentGroupSize(vc);
+          if (configureTournamenSize) {
+            vc.Optimize = true;
+            ConfigureTournamentGroupSize(vc);
+          }
         } else if (vc.ActualValue.ValueDataType == typeof(RandomSelector)) {
           selectionOperatorPc.ValueConfigurations.SetItemCheckedState(vc, true);
@@ -286,22 +374,22 @@
     }
 
-    private static void ConfigurePopulationSize(IValueConfiguration algorithmVc) {
+    private static void ConfigurePopulationSize(IValueConfiguration algorithmVc, int lower, int upper, int stepsize) {
       var populationSizePc = algorithmVc.ParameterConfigurations.Where(x => x.Name == "PopulationSize").SingleOrDefault();
       populationSizePc.Optimize = true;
       var populationSizeVc = populationSizePc.ValueConfigurations.First();
       populationSizeVc.Optimize = true;
-      populationSizeVc.RangeConstraint.LowerBound = new IntValue(20);
-      populationSizeVc.RangeConstraint.UpperBound = new IntValue(100);
-      populationSizeVc.RangeConstraint.StepSize = new IntValue(1);
-    }
-
-    private static void ConfigureMutationRate(IValueConfiguration algorithmVc) {
+      populationSizeVc.RangeConstraint.LowerBound = new IntValue(lower);
+      populationSizeVc.RangeConstraint.UpperBound = new IntValue(upper);
+      populationSizeVc.RangeConstraint.StepSize = new IntValue(stepsize);
+    }
+
+    private static void ConfigureMutationRate(IValueConfiguration algorithmVc, double lower, double upper, double stepsize) {
       var mutationRatePc = algorithmVc.ParameterConfigurations.Where(x => x.Name == "MutationProbability").SingleOrDefault();
       mutationRatePc.Optimize = true;
       var mutationRateVc = mutationRatePc.ValueConfigurations.First();
       mutationRateVc.Optimize = true;
-      mutationRateVc.RangeConstraint.LowerBound = new PercentValue(0.0);
-      mutationRateVc.RangeConstraint.UpperBound = new PercentValue(1.0);
-      mutationRateVc.RangeConstraint.StepSize = new PercentValue(0.01);
+      mutationRateVc.RangeConstraint.LowerBound = new PercentValue(lower);
+      mutationRateVc.RangeConstraint.UpperBound = new PercentValue(upper);
+      mutationRateVc.RangeConstraint.StepSize = new PercentValue(stepsize);
     }
 
@@ -446,3 +534,128 @@
     }
   }
+
+  public class Node {
+    public string Name { get; set; }
+    public int ActualValue { get; set; }
+    public int[] PossibleValues { get; set; }
+    public List<Node> ChildNodes { get; set; }
+
+    public Node(string name) {
+      this.Name = name;
+      PossibleValues = new int[] { 1, 2, 3 };
+      ChildNodes = new List<Node>();
+    }
+
+    public void Init() {
+      this.ActualValue = PossibleValues.First();
+      foreach (var child in ChildNodes) {
+        child.Init();
+      }
+    }
+
+    public IEnumerable<Node> IterateCombinations() {
+      foreach (int val in PossibleValues) {
+        this.ActualValue = val;
+        if (ChildNodes.Count > 0) {
+          List<IEnumerable<Node>> lists = new List<IEnumerable<Node>>();
+          List<IEnumerator<Node>> enumerators = new List<IEnumerator<Node>>();
+
+          foreach (Node child in ChildNodes) {
+            IEnumerable<Node> combinations = child.IterateCombinations();
+            IEnumerator<Node> enumerator = combinations.GetEnumerator();
+            enumerator.MoveNext(); // initialize
+            lists.Add(combinations);
+            enumerators.Add(enumerator);
+          }
+
+
+          bool abort = false;
+          while (!abort) {
+            abort = true;
+            foreach (var enumerator in enumerators) {
+              if (enumerator.MoveNext()) {
+                abort = false;
+                yield return this;
+              }
+            }
+          }
+
+        } else {
+          yield return this;
+        }
+      }
+    }
+
+    public override string ToString() {
+      StringBuilder sb = new StringBuilder();
+      sb.Append(string.Format("{0}:{1}", this.Name, this.ActualValue));
+      if (this.ChildNodes.Count() > 0) {
+        sb.Append(" (");
+        var lst = new List<string>();
+        foreach (Node child in ChildNodes) {
+          lst.Add(child.ToString());
+        }
+        sb.Append(string.Join(", ", lst.ToArray()));
+        sb.Append(")");
+      }
+
+      return sb.ToString();
+    }
+  }
+
+  public class NodeEnumerator : IEnumerator<Node> {
+    private Node node;
+    private List<IEnumerator> enumerators;
+
+    public NodeEnumerator(Node node) {
+      this.node = node;
+      this.enumerators = new List<IEnumerator>();
+    }
+
+    public Node Current {
+      get { return node; }
+    }
+    object IEnumerator.Current {
+      get { return Current; }
+    }
+
+    public void Dispose() { }
+
+    public bool MoveNext() {
+      int i = 0;
+      bool ok = false;
+      while(!ok && i < enumerators.Count) {
+        if(enumerators[i].MoveNext()) {
+          ok = true;
+        } else {
+          i++;
+        }
+      }
+
+      if (ok) {
+        for (int k = i-1; k >= 0; k--) {
+          enumerators[k].Reset();
+          enumerators[k].MoveNext();
+        }
+      } else {
+        return false;
+      }
+
+      node.ActualValue = (int)enumerators[0].Current;
+      return true;
+    }
+
+    public void Reset() {
+      enumerators.Clear();
+      enumerators.Add(node.PossibleValues.GetEnumerator());
+      enumerators[0].Reset();
+
+      foreach (var child in node.ChildNodes) {
+        var enumerator = new NodeEnumerator(child);
+        enumerator.Reset();
+        enumerator.MoveNext();
+        enumerators.Add(enumerator);
+      }
+    }
+  }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/app.config
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/app.config	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.MetaOptimization.Test/app.config	(revision 5144)
@@ -13,3 +13,3 @@
 		</assemblyBinding>
 	</runtime>
-</configuration>
+<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
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 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/HeuristicLab.Problems.MetaOptimization.Views-3.3.csproj	(revision 5144)
@@ -99,4 +99,10 @@
       <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.MainForm.WindowsForms-3.3.dll</HintPath>
     </Reference>
+    <Reference Include="HeuristicLab.Optimization-3.3, Version=3.3.0.0, Culture=neutral, PublicKeyToken=ba48961d6f65dcec, processorArchitecture=MSIL">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization-3.3.dll</HintPath>
+    </Reference>
+    <Reference Include="HeuristicLab.Optimization.Views-3.3">
+      <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Optimization.Views-3.3.dll</HintPath>
+    </Reference>
     <Reference Include="HeuristicLab.Parameters-3.3">
       <HintPath>..\..\..\..\..\..\..\..\Program Files\HeuristicLab 3.3\HeuristicLab.Parameters-3.3.dll</HintPath>
@@ -126,4 +132,10 @@
       <DependentUpon>ConstrainedItemListView.cs</DependentUpon>
     </Compile>
+    <Compile Include="MetaOptimizationProblemView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="MetaOptimizationProblemView.Designer.cs">
+      <DependentUpon>MetaOptimizationProblemView.cs</DependentUpon>
+    </Compile>
     <Compile Include="OptimizableView.cs">
       <SubType>UserControl</SubType>
@@ -133,9 +145,9 @@
     </Compile>
     <None Include="Properties\AssemblyInfo.cs.frame" />
-    <Compile Include="RootValueConfigurationView.cs">
-      <SubType>UserControl</SubType>
-    </Compile>
-    <Compile Include="RootValueConfigurationView.Designer.cs">
-      <DependentUpon>RootValueConfigurationView.cs</DependentUpon>
+    <Compile Include="ParameterConfigurationTreeView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="ParameterConfigurationTreeView.Designer.cs">
+      <DependentUpon>ParameterConfigurationTreeView.cs</DependentUpon>
     </Compile>
     <Compile Include="ValueConfigurationViews\ValueConfigurationCheckedItemList.cs">
@@ -171,9 +183,12 @@
   </ItemGroup>
   <ItemGroup>
+    <EmbeddedResource Include="MetaOptimizationProblemView.resx">
+      <DependentUpon>MetaOptimizationProblemView.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="OptimizableView.resx">
       <DependentUpon>OptimizableView.cs</DependentUpon>
     </EmbeddedResource>
-    <EmbeddedResource Include="RootValueConfigurationView.resx">
-      <DependentUpon>RootValueConfigurationView.cs</DependentUpon>
+    <EmbeddedResource Include="ParameterConfigurationTreeView.resx">
+      <DependentUpon>ParameterConfigurationTreeView.cs</DependentUpon>
     </EmbeddedResource>
     <EmbeddedResource Include="ValueConfigurationViews\RangeView.resx">
@@ -187,7 +202,5 @@
     </EmbeddedResource>
   </ItemGroup>
-  <ItemGroup>
-    <Folder Include="ParameterConfigurationViews\" />
-  </ItemGroup>
+  <ItemGroup />
   <ItemGroup>
     <ProjectReference Include="..\..\HeuristicLab.Problems.MetaOptimization\3.3\HeuristicLab.Problems.MetaOptimization-3.3.csproj">
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.Designer.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.Designer.cs	(revision 5144)
@@ -0,0 +1,79 @@
+﻿namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class MetaOptimizationProblemView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.createExperimentButton = new System.Windows.Forms.Button();
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // parameterCollectionView
+      // 
+      this.parameterCollectionView.Size = new System.Drawing.Size(604, 353);
+      // 
+      // nameTextBox
+      // 
+      this.errorProvider.SetIconAlignment(this.nameTextBox, System.Windows.Forms.ErrorIconAlignment.MiddleLeft);
+      this.errorProvider.SetIconPadding(this.nameTextBox, 2);
+      this.nameTextBox.Size = new System.Drawing.Size(532, 20);
+      // 
+      // descriptionTextBox
+      // 
+      this.descriptionTextBox.Size = new System.Drawing.Size(532, 20);
+      // 
+      // createExperimentButton
+      // 
+      this.createExperimentButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.createExperimentButton.Location = new System.Drawing.Point(0, 405);
+      this.createExperimentButton.Name = "createExperimentButton";
+      this.createExperimentButton.Size = new System.Drawing.Size(604, 31);
+      this.createExperimentButton.TabIndex = 5;
+      this.createExperimentButton.Text = "Create Experiment";
+      this.createExperimentButton.UseVisualStyleBackColor = true;
+      this.createExperimentButton.Click += new System.EventHandler(this.createExperimentButton_Click);
+      // 
+      // MetaOptimizationProblemView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.createExperimentButton);
+      this.Name = "MetaOptimizationProblemView";
+      this.Size = new System.Drawing.Size(604, 437);
+      this.Controls.SetChildIndex(this.createExperimentButton, 0);
+      this.Controls.SetChildIndex(this.nameTextBox, 0);
+      this.Controls.SetChildIndex(this.nameLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionLabel, 0);
+      this.Controls.SetChildIndex(this.descriptionTextBox, 0);
+      this.Controls.SetChildIndex(this.parameterCollectionView, 0);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.Button createExperimentButton;
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.cs	(revision 5144)
@@ -0,0 +1,72 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using HeuristicLab.MainForm;
+using HeuristicLab.Optimization.Views;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  [View("MetaOptimization View")]
+  [Content(typeof(MetaOptimizationProblem), IsDefaultView = true)]
+  public sealed partial class MetaOptimizationProblemView : ProblemView {
+    public new MetaOptimizationProblem Content {
+      get { return (MetaOptimizationProblem)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public MetaOptimizationProblemView() {
+      InitializeComponent();
+    }
+
+    protected override void DeregisterContentEvents() {
+      // TODO: Deregister your event handlers here
+      base.DeregisterContentEvents();
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      // TODO: Register your event handlers here
+    }
+
+    #region Event Handlers (Content)
+    // TODO: Put event handlers of the content here
+    #endregion
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content == null) {
+        // TODO: Add code when content has been changed and is null
+      } else {
+        // TODO: Add code when content has been changed and is not null
+      }
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+      // TODO: Enable or disable controls based on whether the content is null or the view is set readonly
+    }
+
+    #region Event Handlers (child controls)
+
+    private void createExperimentButton_Click(object sender, EventArgs e) {
+      if (Content != null) {
+        long count = Content.ParameterConfigurationTree.GetCombinationCount();
+
+        System.Windows.Forms.DialogResult result = System.Windows.Forms.DialogResult.OK;
+        if (count > 512) {
+          result = System.Windows.Forms.MessageBox.Show(string.Format("Do you really want to create {0} optimizers? Be aware that this might take a significant amount of time and memory.", count), "Create Experiment", System.Windows.Forms.MessageBoxButtons.OKCancel);
+        }
+        if (result == System.Windows.Forms.DialogResult.OK) {
+          Experiment experiment = Content.ParameterConfigurationTree.GenerateExperiment(Content.Algorithm);
+          MainFormManager.MainForm.ShowContent(experiment);
+        }
+      }
+    }
+
+    #endregion
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.resx
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.resx	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/MetaOptimizationProblemView.resx	(revision 5144)
@@ -0,0 +1,126 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="errorProvider.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>107, 17</value>
+  </metadata>
+  <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>17, 17</value>
+  </metadata>
+</root>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.Designer.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.Designer.cs	(revision 5144)
@@ -0,0 +1,61 @@
+﻿using HeuristicLab.Core.Views;
+using System.Windows.Forms;
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  partial class ParameterConfigurationTreeView {
+    /// <summary> 
+    /// Required designer variable.
+    /// </summary>
+    private System.ComponentModel.IContainer components = null;
+
+    /// <summary> 
+    /// Clean up any resources being used.
+    /// </summary>
+    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+    protected override void Dispose(bool disposing) {
+      if (disposing && (components != null)) {
+        components.Dispose();
+      }
+      base.Dispose(disposing);
+    }
+
+    #region Component Designer generated code
+
+    /// <summary> 
+    /// Required method for Designer support - do not modify 
+    /// the contents of this method with the code editor.
+    /// </summary>
+    private void InitializeComponent() {
+      this.listView = new ItemCollectionView<IParameterConfiguration>();
+      this.SuspendLayout();
+
+    	//
+	    // listView
+	    //
+	    this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+	                | System.Windows.Forms.AnchorStyles.Left)
+	                | System.Windows.Forms.AnchorStyles.Right)));
+	    this.listView.Caption = "ParameterConfigurationList View";
+	    this.listView.Content = null;
+	    this.listView.Location = new System.Drawing.Point(0, 0);
+	    this.listView.Name = "listView";
+	    this.listView.ReadOnly = false;
+	    this.listView.Size = new System.Drawing.Size(556, 473);
+	    this.listView.TabIndex = 1;
+      // 
+      // ParameterConfigurationTreeView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(listView);
+      this.Name = "ParameterConfigurationTreeView";
+      this.Size = new System.Drawing.Size(556, 473);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private ItemCollectionView<IParameterConfiguration> listView;
+
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.cs	(revision 5144)
@@ -0,0 +1,49 @@
+﻿using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using HeuristicLab.MainForm;
+using HeuristicLab.Core.Views;
+using HeuristicLab.Core;
+using HeuristicLab.Optimization;
+
+namespace HeuristicLab.Problems.MetaOptimization.Views {
+  /// <summary>
+  /// The visual representation of a <see cref="ParameterConfiguration"/>.
+  /// </summary>
+  [View("ParameterConfiguration View")]
+  [Content(typeof(ParameterConfigurationTree), true)]
+  public partial class ParameterConfigurationTreeView : ItemView {
+    /// <summary>
+    /// Gets or sets the variable to represent visually.
+    /// </summary>
+    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
+    /// No own data storage present.</remarks>
+    public new ParameterConfigurationTree Content {
+      get { return (ParameterConfigurationTree)base.Content; }
+      set { base.Content = value; }
+    }
+
+    public ParameterConfigurationTreeView() {
+      InitializeComponent();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      if (Content != null) {
+        listView.Content = Content.ParameterConfigurations;
+      } else {
+        listView.Content = null;
+      }
+      SetEnabledStateOfControls();
+    }
+
+    protected override void SetEnabledStateOfControls() {
+      base.SetEnabledStateOfControls();
+    }
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.resx
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.resx	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/ParameterConfigurationTreeView.resx	(revision 5144)
@@ -0,0 +1,120 @@
+﻿<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootValueConfigurationView.Designer.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootValueConfigurationView.Designer.cs	(revision 5142)
+++ 	(revision )
@@ -1,59 +1,0 @@
-﻿using HeuristicLab.Core.Views;
-namespace HeuristicLab.Problems.MetaOptimization.Views {
-  partial class RootValueConfigurationView {
-    /// <summary> 
-    /// Required designer variable.
-    /// </summary>
-    private System.ComponentModel.IContainer components = null;
-
-    /// <summary> 
-    /// Clean up any resources being used.
-    /// </summary>
-    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
-    protected override void Dispose(bool disposing) {
-      if (disposing && (components != null)) {
-        components.Dispose();
-      }
-      base.Dispose(disposing);
-    }
-
-    #region Component Designer generated code
-
-    /// <summary> 
-    /// Required method for Designer support - do not modify 
-    /// the contents of this method with the code editor.
-    /// </summary>
-    private void InitializeComponent() {
-      this.listView = new ItemCollectionView<IParameterConfiguration>();
-      this.SuspendLayout();
-      // 
-      // listView
-      // 
-      this.listView.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
-                  | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.listView.Caption = "ParameterConfigurationList View";
-      this.listView.Content = null;
-      this.listView.Location = new System.Drawing.Point(0, 0);
-      this.listView.Name = "listView";
-      this.listView.ReadOnly = false;
-      this.listView.Size = new System.Drawing.Size(556, 473);
-      this.listView.TabIndex = 0;
-      // 
-      // RootParameterConfigurationView
-      // 
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
-      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
-      this.Controls.Add(this.listView);
-      this.Name = "RootParameterConfigurationView";
-      this.Size = new System.Drawing.Size(556, 473);
-      this.ResumeLayout(false);
-
-    }
-
-    #endregion
-
-    private ItemCollectionView<IParameterConfiguration> listView;
-
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootValueConfigurationView.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootValueConfigurationView.cs	(revision 5142)
+++ 	(revision )
@@ -1,50 +1,0 @@
-﻿using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Drawing;
-using System.Data;
-using System.Linq;
-using System.Text;
-using System.Windows.Forms;
-using HeuristicLab.MainForm;
-using HeuristicLab.Core.Views;
-using HeuristicLab.Core;
-
-namespace HeuristicLab.Problems.MetaOptimization.Views {
-  /// <summary>
-  /// The visual representation of a <see cref="ParameterConfiguration"/>.
-  /// </summary>
-  [View("ParameterConfiguration View")]
-  [Content(typeof(ParameterConfigurationTree), true)]
-  public partial class RootValueConfigurationView : ItemView {
-    /// <summary>
-    /// Gets or sets the variable to represent visually.
-    /// </summary>
-    /// <remarks>Uses property <see cref="ViewBase.Item"/> of base class <see cref="ViewBase"/>.
-    /// No own data storage present.</remarks>
-    public new ParameterConfigurationTree Content {
-      get { return (ParameterConfigurationTree)base.Content; }
-      set { base.Content = value; }
-    }
-
-    public RootValueConfigurationView() {
-      InitializeComponent();
-    }
-
-    protected override void OnContentChanged() {
-      base.OnContentChanged();
-      if (Content != null) {
-        listView.Content = Content.ParameterConfigurations;
-      } else {
-        listView.Content = null;
-      }
-      SetEnabledStateOfControls();
-    }
-
-    protected override void SetEnabledStateOfControls() {
-      base.SetEnabledStateOfControls();
-    }
-
-
-  }
-}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootValueConfigurationView.resx
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization.Views/3.3/RootValueConfigurationView.resx	(revision 5142)
+++ 	(revision )
@@ -1,120 +1,0 @@
-﻿<?xml version="1.0" encoding="utf-8"?>
-<root>
-  <!-- 
-    Microsoft ResX Schema 
-    
-    Version 2.0
-    
-    The primary goals of this format is to allow a simple XML format 
-    that is mostly human readable. The generation and parsing of the 
-    various data types are done through the TypeConverter classes 
-    associated with the data types.
-    
-    Example:
-    
-    ... ado.net/XML headers & schema ...
-    <resheader name="resmimetype">text/microsoft-resx</resheader>
-    <resheader name="version">2.0</resheader>
-    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
-    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
-    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
-    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
-    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
-        <value>[base64 mime encoded serialized .NET Framework object]</value>
-    </data>
-    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
-        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
-        <comment>This is a comment</comment>
-    </data>
-                
-    There are any number of "resheader" rows that contain simple 
-    name/value pairs.
-    
-    Each data row contains a name, and value. The row also contains a 
-    type or mimetype. Type corresponds to a .NET class that support 
-    text/value conversion through the TypeConverter architecture. 
-    Classes that don't support this are serialized and stored with the 
-    mimetype set.
-    
-    The mimetype is used for serialized objects, and tells the 
-    ResXResourceReader how to depersist the object. This is currently not 
-    extensible. For a given mimetype the value must be set accordingly:
-    
-    Note - application/x-microsoft.net.object.binary.base64 is the format 
-    that the ResXResourceWriter will generate, however the reader can 
-    read any of the formats listed below.
-    
-    mimetype: application/x-microsoft.net.object.binary.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
-            : and then encoded with base64 encoding.
-    
-    mimetype: application/x-microsoft.net.object.soap.base64
-    value   : The object must be serialized with 
-            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
-            : and then encoded with base64 encoding.
-
-    mimetype: application/x-microsoft.net.object.bytearray.base64
-    value   : The object must be serialized into a byte array 
-            : using a System.ComponentModel.TypeConverter
-            : and then encoded with base64 encoding.
-    -->
-  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
-    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
-    <xsd:element name="root" msdata:IsDataSet="true">
-      <xsd:complexType>
-        <xsd:choice maxOccurs="unbounded">
-          <xsd:element name="metadata">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" />
-              </xsd:sequence>
-              <xsd:attribute name="name" use="required" type="xsd:string" />
-              <xsd:attribute name="type" type="xsd:string" />
-              <xsd:attribute name="mimetype" type="xsd:string" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="assembly">
-            <xsd:complexType>
-              <xsd:attribute name="alias" type="xsd:string" />
-              <xsd:attribute name="name" type="xsd:string" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="data">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
-              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
-              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
-              <xsd:attribute ref="xml:space" />
-            </xsd:complexType>
-          </xsd:element>
-          <xsd:element name="resheader">
-            <xsd:complexType>
-              <xsd:sequence>
-                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
-              </xsd:sequence>
-              <xsd:attribute name="name" type="xsd:string" use="required" />
-            </xsd:complexType>
-          </xsd:element>
-        </xsd:choice>
-      </xsd:complexType>
-    </xsd:element>
-  </xsd:schema>
-  <resheader name="resmimetype">
-    <value>text/microsoft-resx</value>
-  </resheader>
-  <resheader name="version">
-    <value>2.0</value>
-  </resheader>
-  <resheader name="reader">
-    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-  <resheader name="writer">
-    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
-  </resheader>
-</root>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterCombinationsEnumerator.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterCombinationsEnumerator.cs	(revision 5144)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterCombinationsEnumerator.cs	(revision 5144)
@@ -0,0 +1,101 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Collections;
+using HeuristicLab.Core;
+
+namespace HeuristicLab.Problems.MetaOptimization {
+  public class ParameterCombinationsEnumerator : IEnumerator<IOptimizable> {
+    private IOptimizable node;
+    private List<IEnumerator> enumerators;
+    IEnumerator valueEnumerator;
+
+    public ParameterCombinationsEnumerator(IOptimizable node) {
+      this.node = node;
+      this.enumerators = new List<IEnumerator>();
+    }
+
+    public IOptimizable Current {
+      get { return node; }
+    }
+    object IEnumerator.Current {
+      get { return Current; }
+    }
+
+    public void Dispose() { }
+
+    public bool MoveNext() {
+      int i = 0;
+      bool ok = false;
+      while (!ok && i < enumerators.Count) {
+        if (enumerators[i].MoveNext()) {
+          ok = true;
+        } else {
+          i++;
+        }
+      }
+
+      if (ok) {
+        for (int k = i - 1; k >= 0; k--) {
+          enumerators[k].Reset();
+          enumerators[k].MoveNext();
+        }
+      } else {
+        return false;
+      }
+
+      var pc = node as IParameterConfiguration;
+      if (pc != null && valueEnumerator != null) {
+        pc.ActualValue = ((IValueConfiguration)valueEnumerator.Current).ActualValue;
+        pc.UpdateActualValueIndexToItem((IValueConfiguration)valueEnumerator.Current);
+      }
+      var vc = node as IValueConfiguration;
+      if (vc != null && valueEnumerator != null) {
+        vc.ActualValue.Value = (IItem)valueEnumerator.Current;
+      }
+      return true;
+    }
+
+    public void Reset() {
+      enumerators.Clear();
+      valueEnumerator = null;
+
+      var pc = node as IParameterConfiguration;
+      if (pc != null) {
+        valueEnumerator = pc.ValueConfigurations.CheckedItems.ToArray().GetEnumerator();
+        //valueEnumerator.Reset();
+        enumerators.Add(valueEnumerator);
+
+        foreach (var valueConfiguration in pc.ValueConfigurations.CheckedItems) {
+          if (valueConfiguration.Optimize) {
+            var enumerator = new ParameterCombinationsEnumerator(valueConfiguration);
+            enumerator.Reset();
+            enumerator.MoveNext();
+            enumerators.Add(enumerator);
+          }
+        }
+      }
+
+      var vc = node as IValueConfiguration;
+      if (vc != null) {
+        if (vc.RangeConstraint != null) {
+          valueEnumerator = vc.RangeConstraint.GetCombinations().ToArray().GetEnumerator();
+          //valueEnumerator.Reset();
+          //enumerator.MoveNext();
+          enumerators.Add(valueEnumerator);
+        } else {
+          foreach (var parameterConfiguration in vc.ParameterConfigurations) {
+            if (parameterConfiguration.Optimize) {
+              var enumerator = new ParameterCombinationsEnumerator(parameterConfiguration);
+              enumerator.Reset();
+              enumerator.MoveNext();
+              enumerators.Add(enumerator);
+            }
+          }
+        }
+      }
+    }
+
+  }
+}
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurationTree.cs	(revision 5144)
@@ -8,9 +8,10 @@
 using HeuristicLab.Optimization;
 using HeuristicLab.Data;
+using System.Collections;
 
 namespace HeuristicLab.Problems.MetaOptimization {
   // todo: storable, name, descr, ...
   [StorableClass]
-  public class ParameterConfigurationTree : ValueConfiguration {
+  public class ParameterConfigurationTree : ValueConfiguration, IEnumerable {
     //[Storable]
     //public EngineAlgorithm Algorithm {
@@ -180,4 +181,29 @@
       ((IAlgorithm)item).CollectParameterValues(this.Parameters);
     }
+
+    public Experiment GenerateExperiment(IAlgorithm algorithm) {
+      Experiment experiment = new Experiment();
+      foreach (IValueConfiguration combination in this) {
+        IAlgorithm clonedAlg = (IAlgorithm)algorithm.Clone();
+        clonedAlg.Name = combination.ToParameterInfoString();
+        combination.Parameterize(clonedAlg);
+        experiment.Optimizers.Add(clonedAlg);
+      }
+      return experiment;
+    }
+
+    public IEnumerator GetEnumerator() {
+      IEnumerator enumerator = new ParameterCombinationsEnumerator(this);
+      enumerator.Reset();
+      return enumerator;
+    }
+
+    public long GetCombinationCount() {
+      long cnt = 0;
+      foreach (var c in this) {
+        cnt++;
+      }
+      return cnt;
+    }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ParameterConfigurations/ParameterConfiguration.cs	(revision 5144)
@@ -9,4 +9,5 @@
 using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
 using HeuristicLab.PluginInfrastructure;
+using System.Text;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -299,4 +300,19 @@
     }
 
+    public string ToParameterInfoString() {
+      StringBuilder sb = new StringBuilder();
+      if (this.Optimize) {
+        sb.Append(string.Format("{0}: {1}", parameterName, this.ActualValue.Value));
+        //sb.Append(" (");
+        //var subParams = new List<string>();
+        //if (this.ActualValue.Value is IParameterizedItem) {
+        //  subParams.Add(this.ValueConfigurations.CheckedItems.ElementAt(actualValueConfigurationIndex).ToParameterInfoString());
+        //}
+        //sb.Append(string.Join(", ", subParams.ToArray()));
+        //sb.Append(")");
+      }
+      return sb.ToString();
+    }
+
     public static IParameterConfiguration Create(IParameterizedNamedItem parent, IParameter parameter) {
       if (parameter is IValueParameter) {
@@ -348,4 +364,14 @@
       }
     }
+
+    public void UpdateActualValueIndexToItem(IValueConfiguration vc) {
+      for (int i = 0; i < this.ValueConfigurations.CheckedItems.Count(); i++) {
+        if (this.ValueConfigurations.CheckedItems.ElementAt(i) == vc) {
+          this.actualValueConfigurationIndex = i;
+          return;
+        }
+      }
+    }
+
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/DoubleValueRange.cs	(revision 5144)
@@ -37,4 +37,17 @@
       if (value.Value < this.LowerBound.Value) value.Value = this.LowerBound.Value;
     }
+
+    public override IEnumerable<DoubleValue> GetCombinations() {
+      var solutions = new List<DoubleValue>();
+      double value = ((int)Math.Round(LowerBound.Value / StepSize.Value, 0)) * StepSize.Value;
+      if (value < LowerBound.Value) value += StepSize.Value;
+
+      while (value <= UpperBound.Value) {
+        //yield return new DoubleValue(value);
+        solutions.Add(new DoubleValue(value));
+        value += StepSize.Value;
+      }
+      return solutions;
+    }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/IntValueRange.cs	(revision 5144)
@@ -37,4 +37,17 @@
       if (value.Value < this.LowerBound.Value) value.Value = this.LowerBound.Value;
     }
+
+    public override IEnumerable<IntValue> GetCombinations() {
+      var solutions = new List<IntValue>();
+      int value = (this.LowerBound.Value / StepSize.Value) * StepSize.Value;
+      if (value < this.LowerBound.Value) value += StepSize.Value;
+
+      while (value <= this.UpperBound.Value) {
+        //yield return new IntValue(value);
+        solutions.Add(new IntValue(value));
+        value += this.StepSize.Value;
+      }
+      return solutions;
+    }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/PercentValueRange.cs	(revision 5144)
@@ -32,4 +32,17 @@
       return new DoubleValueRange(LowerBound, UpperBound, StepSize);
     }
+
+    public override IEnumerable<PercentValue> GetCombinations() {
+      var solutions = new List<PercentValue>();
+      double value = ((int)Math.Round(LowerBound.Value / StepSize.Value, 0)) * StepSize.Value;
+      if (value < LowerBound.Value) value += StepSize.Value;
+
+      while (value <= UpperBound.Value) {
+        //yield return new PercentValue(value);
+        solutions.Add(new PercentValue(value));
+        value += StepSize.Value;
+      }
+      return solutions;
+    }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/Range.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/Range.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/RangeConstraints/Range.cs	(revision 5144)
@@ -1,3 +1,5 @@
 ﻿using System;
+using System.Collections.Generic;
+using System.Linq;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
@@ -206,8 +208,12 @@
 
     protected abstract T GetRandomSample(IRandom random);
-
     IItem IRange.GetRandomValue(IRandom random) {
       return GetRandomValue(random);
     }
+
+    public abstract IEnumerable<T> GetCombinations();
+    IEnumerable<IItem> IRange.GetCombinations() {
+      return GetCombinations().Cast<IItem>().ToArray();
+    }
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Encoding/ValueConfigurations/ValueConfiguration.cs	(revision 5144)
@@ -9,4 +9,6 @@
 using HeuristicLab.Encodings.IntegerVectorEncoding;
 using HeuristicLab.PluginInfrastructure;
+using System.Collections.Generic;
+using System.Text;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -89,15 +91,14 @@
       this.IsOptimizable = true;
       if (actualValue.ValueDataType == typeof(IntValue)) {
-        rangeConstraint = new IntValueRange(new IntValue(0), (IntValue)value, new IntValue(1));
+        RangeConstraint = new IntValueRange(new IntValue(0), (IntValue)value, new IntValue(1));
       } else if (actualValue.ValueDataType == typeof(DoubleValue)) {
-        rangeConstraint = new DoubleValueRange(new DoubleValue(0), (DoubleValue)value, new DoubleValue(0.01));
+        RangeConstraint = new DoubleValueRange(new DoubleValue(0), (DoubleValue)value, new DoubleValue(0.01));
       } else if (actualValue.ValueDataType == typeof(PercentValue)) {
-        rangeConstraint = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(0.001));
+        RangeConstraint = new PercentValueRange(new PercentValue(0), new PercentValue(1), new PercentValue(0.001));
       } else if (actualValue.ValueDataType == typeof(BoolValue)) {
         this.IsOptimizable = false; // there is nothing to configure for bools
       } else {
-        rangeConstraint = null;
-      }
-      RegisterRangeConstraintEvents();
+        RangeConstraint = null;
+      }
     }
 
@@ -155,5 +156,5 @@
     }
     #endregion
-    
+
     #region IItem Members
     public override string ItemDescription {
@@ -169,5 +170,5 @@
     }
     #endregion
-    
+
     #region Event Handlers
     public virtual event EventHandler ValueChanged;
@@ -208,4 +209,18 @@
         return base.ToString();
       }
+    }
+
+    public string ToParameterInfoString() {
+      StringBuilder sb = new StringBuilder();
+      if (this.Optimize) {
+        if (this.ParameterConfigurations.Count > 0) {
+          var parameterInfos = new List<string>();
+          foreach (var pc in this.ParameterConfigurations) {
+            if (pc.Optimize) parameterInfos.Add(pc.ToParameterInfoString());
+          }
+          sb.Append(string.Join(", ", parameterInfos.ToArray()));
+        }
+      }
+      return sb.ToString();
     }
 
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 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/HeuristicLab.Problems.MetaOptimization-3.3.csproj	(revision 5144)
@@ -134,4 +134,5 @@
     <Compile Include="ConstrainedItemList.cs" />
     <Compile Include="Encoding\NullValue.cs" />
+    <Compile Include="Encoding\ParameterCombinationsEnumerator.cs" />
     <Compile Include="Encoding\RangeConstraints\PercentValueRange.cs">
       <SubType>Code</SubType>
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IOptimizable.cs	(revision 5144)
@@ -18,5 +18,6 @@
     void Mutate(IRandom random, MutateDelegate mutate, ParameterConfigurationManipulator pcmanip);
     void Cross(IRandom random, IOptimizable other, CrossDelegate cross, ParameterConfigurationCrossover pccross);
-    
+    string ToParameterInfoString();
+
     event EventHandler IsOptimizableChanged;
     event EventHandler OptimizeChanged;
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IParameterConfiguration.cs	(revision 5144)
@@ -14,4 +14,5 @@
 
     void Parameterize(IValueParameter parameter);
+    void UpdateActualValueIndexToItem(IValueConfiguration vc);
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IRange.cs	(revision 5144)
@@ -3,4 +3,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -15,4 +16,6 @@
 
     IItem GetRandomValue(IRandom random);
+
+    IEnumerable<IItem> GetCombinations();
   }
 
@@ -22,4 +25,5 @@
     new T StepSize { get; set; }
     new T GetRandomValue(IRandom random);
+    new IEnumerable<T> GetCombinations();
   }
 }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IValueConfiguration.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IValueConfiguration.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/Interfaces/IValueConfiguration.cs	(revision 5144)
@@ -2,4 +2,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using System.Collections.Generic;
 
 namespace HeuristicLab.Problems.MetaOptimization {
@@ -8,5 +9,5 @@
     IRange RangeConstraint { get; }
     event EventHandler ValueChanged;
-
+    
     void Parameterize(IParameterizedItem item);
   }
Index: branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs
===================================================================
--- branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5142)
+++ branches/HeuristicLab.MetaOptimization/HeuristicLab.Problems.MetaOptimization/3.3/MetaOptimizationProblem.cs	(revision 5144)
@@ -40,5 +40,5 @@
     public const string ProblemTypeParameterName = "ProblemType";
     public const string ProblemsParameterName = "Problems";
-    public const string ParameterConfigurationParameterName = "InitialParameterConfigurationTree";
+    public const string ParameterConfigurationTreeParameterName = "ParameterConfigurationTree";
     public const string RepetitionsParameterName = "Repetitions";
 
@@ -58,6 +58,6 @@
       get { return (ValueParameter<ConstrainedItemList<ISingleObjectiveProblem>>)Parameters[ProblemsParameterName]; }
     }
-    public IValueParameter<ParameterConfigurationTree> ParameterConfigurationParameter {
-      get { return (ValueParameter<ParameterConfigurationTree>)Parameters[ParameterConfigurationParameterName]; }
+    public IValueParameter<ParameterConfigurationTree> ParameterConfigurationTreeParameter {
+      get { return (ValueParameter<ParameterConfigurationTree>)Parameters[ParameterConfigurationTreeParameterName]; }
     }
     public IValueParameter<IntValue> RepetitionsParameter {
@@ -87,7 +87,7 @@
       set { ProblemsParameter.Value = value; }
     }
-    public ParameterConfigurationTree AlgorithmParameterConfiguration {
-      get { return ParameterConfigurationParameter.Value; }
-      set { ParameterConfigurationParameter.Value = value; }
+    public ParameterConfigurationTree ParameterConfigurationTree {
+      get { return ParameterConfigurationTreeParameter.Value; }
+      set { ParameterConfigurationTreeParameter.Value = value; }
     }
     public IntValue Repetitions {
@@ -101,5 +101,5 @@
       Parameters.Add(new ValueParameter<ISingleObjectiveProblem>(ProblemTypeParameterName, "The problem type.", new SingleObjectiveTestFunctionProblem()));
       Parameters.Add(new ValueParameter<ConstrainedItemList<ISingleObjectiveProblem>>(ProblemsParameterName, "The problems that should be evaluated.", new ConstrainedItemList<ISingleObjectiveProblem>()));
-      Parameters.Add(new ValueParameter<ParameterConfigurationTree>(ParameterConfigurationParameterName, "List of algorithm parameters that should be optimized."));
+      Parameters.Add(new ValueParameter<ParameterConfigurationTree>(ParameterConfigurationTreeParameterName, "List of algorithm parameters that should be optimized."));
       Parameters.Add(new ValueParameter<IntValue>(RepetitionsParameterName, "The number of evaluations for each problem.", new IntValue(3)));
 
@@ -122,5 +122,5 @@
       Problems.Type = Problem.GetType();
       Algorithm.Problem = Problem;
-      ParameterConfigurationParameter.ActualValue = new ParameterConfigurationTree(Algorithm);
+      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(Algorithm);
     }
 
@@ -185,10 +185,10 @@
     void AlgorithmTypeParameter_ValueChanged(object sender, EventArgs e) {
       Algorithm.Problem = Problem;
-      ParameterConfigurationParameter.ActualValue = new ParameterConfigurationTree(Algorithm);
+      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(Algorithm);
     }
     void ProblemTypeParameter_ValueChanged(object sender, EventArgs e) {
       Problems.Type = Problem.GetType();
       Algorithm.Problem = Problem;
-      ParameterConfigurationParameter.ActualValue = new ParameterConfigurationTree(Algorithm);
+      ParameterConfigurationTreeParameter.ActualValue = new ParameterConfigurationTree(Algorithm);
     }
     #endregion
