Index: /trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.Designer.cs	(revision 7984)
+++ /trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.Designer.cs	(revision 7985)
@@ -65,11 +65,7 @@
       this.parametersListView = new System.Windows.Forms.ListView();
       this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
+      this.generateButton = new System.Windows.Forms.Button();
+      this.stringConvertibleArrayView = new HeuristicLab.Data.Views.StringConvertibleArrayView();
       this.detailsTypeLabel = new System.Windows.Forms.Label();
-      this.stepSizeTextBox = new System.Windows.Forms.TextBox();
-      this.maximumTextBox = new System.Windows.Forms.TextBox();
-      this.minimumTextBox = new System.Windows.Forms.TextBox();
-      this.stepSizeLabel = new System.Windows.Forms.Label();
-      this.maximumLabel = new System.Windows.Forms.Label();
-      this.minimumLabel = new System.Windows.Forms.Label();
       this.choicesListView = new System.Windows.Forms.ListView();
       this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
@@ -80,6 +76,6 @@
       this.variationsLabel = new System.Windows.Forms.Label();
       this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      this.warningProvider = new System.Windows.Forms.ErrorProvider(this.components);
       this.experimentCreationProgressBar = new System.Windows.Forms.ProgressBar();
-      this.warningProvider = new System.Windows.Forms.ErrorProvider(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.repetitionsNumericUpDown)).BeginInit();
       this.tabControl.SuspendLayout();
@@ -273,11 +269,7 @@
       // parametersSplitContainer.Panel2
       // 
+      this.parametersSplitContainer.Panel2.Controls.Add(this.generateButton);
+      this.parametersSplitContainer.Panel2.Controls.Add(this.stringConvertibleArrayView);
       this.parametersSplitContainer.Panel2.Controls.Add(this.detailsTypeLabel);
-      this.parametersSplitContainer.Panel2.Controls.Add(this.stepSizeTextBox);
-      this.parametersSplitContainer.Panel2.Controls.Add(this.maximumTextBox);
-      this.parametersSplitContainer.Panel2.Controls.Add(this.minimumTextBox);
-      this.parametersSplitContainer.Panel2.Controls.Add(this.stepSizeLabel);
-      this.parametersSplitContainer.Panel2.Controls.Add(this.maximumLabel);
-      this.parametersSplitContainer.Panel2.Controls.Add(this.minimumLabel);
       this.parametersSplitContainer.Panel2.Controls.Add(this.choicesListView);
       this.parametersSplitContainer.Size = new System.Drawing.Size(314, 267);
@@ -306,4 +298,27 @@
       this.columnHeader1.Width = 150;
       // 
+      // generateButton
+      // 
+      this.generateButton.Location = new System.Drawing.Point(16, 10);
+      this.generateButton.Name = "generateButton";
+      this.generateButton.Size = new System.Drawing.Size(75, 23);
+      this.generateButton.TabIndex = 8;
+      this.generateButton.Text = "Generate...";
+      this.generateButton.UseVisualStyleBackColor = true;
+      this.generateButton.Click += new System.EventHandler(this.generateButton_Click);
+      // 
+      // stringConvertibleArrayView
+      // 
+      this.stringConvertibleArrayView.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.stringConvertibleArrayView.Caption = "StringConvertibleArray View";
+      this.stringConvertibleArrayView.Content = null;
+      this.stringConvertibleArrayView.Location = new System.Drawing.Point(16, 39);
+      this.stringConvertibleArrayView.Name = "stringConvertibleArrayView";
+      this.stringConvertibleArrayView.ReadOnly = false;
+      this.stringConvertibleArrayView.Size = new System.Drawing.Size(155, 215);
+      this.stringConvertibleArrayView.TabIndex = 7;
+      // 
       // detailsTypeLabel
       // 
@@ -314,61 +329,4 @@
       this.detailsTypeLabel.TabIndex = 0;
       this.detailsTypeLabel.Text = "Choices:";
-      // 
-      // stepSizeTextBox
-      // 
-      this.stepSizeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.stepSizeTextBox.Location = new System.Drawing.Point(73, 86);
-      this.stepSizeTextBox.Name = "stepSizeTextBox";
-      this.stepSizeTextBox.Size = new System.Drawing.Size(98, 20);
-      this.stepSizeTextBox.TabIndex = 5;
-      this.stepSizeTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.detailsTextBox_Validating);
-      // 
-      // maximumTextBox
-      // 
-      this.maximumTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.maximumTextBox.Location = new System.Drawing.Point(73, 60);
-      this.maximumTextBox.Name = "maximumTextBox";
-      this.maximumTextBox.Size = new System.Drawing.Size(98, 20);
-      this.maximumTextBox.TabIndex = 3;
-      this.maximumTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.detailsTextBox_Validating);
-      // 
-      // minimumTextBox
-      // 
-      this.minimumTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
-                  | System.Windows.Forms.AnchorStyles.Right)));
-      this.minimumTextBox.Location = new System.Drawing.Point(73, 34);
-      this.minimumTextBox.Name = "minimumTextBox";
-      this.minimumTextBox.Size = new System.Drawing.Size(98, 20);
-      this.minimumTextBox.TabIndex = 1;
-      this.minimumTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.detailsTextBox_Validating);
-      // 
-      // stepSizeLabel
-      // 
-      this.stepSizeLabel.AutoSize = true;
-      this.stepSizeLabel.Location = new System.Drawing.Point(13, 89);
-      this.stepSizeLabel.Name = "stepSizeLabel";
-      this.stepSizeLabel.Size = new System.Drawing.Size(53, 13);
-      this.stepSizeLabel.TabIndex = 4;
-      this.stepSizeLabel.Text = "Step size:";
-      // 
-      // maximumLabel
-      // 
-      this.maximumLabel.AutoSize = true;
-      this.maximumLabel.Location = new System.Drawing.Point(13, 63);
-      this.maximumLabel.Name = "maximumLabel";
-      this.maximumLabel.Size = new System.Drawing.Size(54, 13);
-      this.maximumLabel.TabIndex = 2;
-      this.maximumLabel.Text = "Maximum:";
-      // 
-      // minimumLabel
-      // 
-      this.minimumLabel.AutoSize = true;
-      this.minimumLabel.Location = new System.Drawing.Point(13, 37);
-      this.minimumLabel.Name = "minimumLabel";
-      this.minimumLabel.Size = new System.Drawing.Size(51, 13);
-      this.minimumLabel.TabIndex = 0;
-      this.minimumLabel.Text = "Minimum:";
       // 
       // choicesListView
@@ -456,4 +414,10 @@
       this.errorProvider.ContainerControl = this;
       // 
+      // warningProvider
+      // 
+      this.warningProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
+      this.warningProvider.ContainerControl = this;
+      this.warningProvider.Icon = ((System.Drawing.Icon)(resources.GetObject("warningProvider.Icon")));
+      // 
       // experimentCreationProgressBar
       // 
@@ -466,14 +430,7 @@
       this.experimentCreationProgressBar.Visible = false;
       // 
-      // warningProvider
-      // 
-      this.warningProvider.BlinkStyle = System.Windows.Forms.ErrorBlinkStyle.NeverBlink;
-      this.warningProvider.ContainerControl = this;
-      this.warningProvider.Icon = ((System.Drawing.Icon)(resources.GetObject("warningProvider.Icon")));
-      // 
       // CreateExperimentDialog
       // 
       this.AcceptButton = this.okButton;
-      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
       this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Inherit;
       this.CancelButton = this.cancelButton;
@@ -542,15 +499,11 @@
     private System.Windows.Forms.ListView choicesListView;
     private System.Windows.Forms.ColumnHeader columnHeader2;
-    private System.Windows.Forms.TextBox stepSizeTextBox;
-    private System.Windows.Forms.TextBox maximumTextBox;
-    private System.Windows.Forms.TextBox minimumTextBox;
-    private System.Windows.Forms.Label stepSizeLabel;
-    private System.Windows.Forms.Label maximumLabel;
-    private System.Windows.Forms.Label minimumLabel;
     private System.Windows.Forms.Label label1;
     private System.Windows.Forms.ErrorProvider errorProvider;
-    private System.Windows.Forms.ProgressBar experimentCreationProgressBar;
     private System.Windows.Forms.ErrorProvider warningProvider;
     private System.Windows.Forms.TreeView instancesTreeView;
+    private Data.Views.StringConvertibleArrayView stringConvertibleArrayView;
+    private System.Windows.Forms.ProgressBar experimentCreationProgressBar;
+    private System.Windows.Forms.Button generateButton;
 
   }
Index: /trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs	(revision 7984)
+++ /trunk/sources/HeuristicLab.Optimizer/3.3/CreateExperimentDialog.cs	(revision 7985)
@@ -56,6 +56,6 @@
     private int repetitions;
     private Dictionary<IProblemInstanceProvider, HashSet<IDataDescriptor>> instances;
-    private Dictionary<IValueParameter, Tuple<int, int, int>> intParameters;
-    private Dictionary<IValueParameter, Tuple<double, double, double>> doubleParameters;
+    private Dictionary<IValueParameter, IntArray> intParameters;
+    private Dictionary<IValueParameter, DoubleArray> doubleParameters;
     private HashSet<IValueParameter> boolParameters;
     private Dictionary<IValueParameter, HashSet<IItem>> multipleChoiceParameters;
@@ -77,6 +77,6 @@
 
       instances = new Dictionary<IProblemInstanceProvider, HashSet<IDataDescriptor>>();
-      intParameters = new Dictionary<IValueParameter, Tuple<int, int, int>>();
-      doubleParameters = new Dictionary<IValueParameter, Tuple<double, double, double>>();
+      intParameters = new Dictionary<IValueParameter, IntArray>();
+      doubleParameters = new Dictionary<IValueParameter, DoubleArray>();
       boolParameters = new HashSet<IValueParameter>();
       multipleChoiceParameters = new Dictionary<IValueParameter, HashSet<IItem>>();
@@ -118,9 +118,6 @@
 
       if (isConstrainedValueParameter) {
-        if (e.Item.Checked) {
-          multipleChoiceParameters.Add(parameter, new HashSet<IItem>());
-        } else {
-          multipleChoiceParameters.Remove(parameter);
-        }
+        if (e.Item.Checked) multipleChoiceParameters.Add(parameter, new HashSet<IItem>());
+        else multipleChoiceParameters.Remove(parameter);
       }
 
@@ -128,8 +125,6 @@
       if (intValue != null) {
         if (e.Item.Checked) {
-          int minimum = intValue.Value;
-          int maximum = intValue.Value;
-          int step = 1;
-          intParameters.Add(parameter, new Tuple<int, int, int>(minimum, maximum, step));
+          intParameters.Add(parameter, new IntArray());
+          intParameters[parameter].Reset += new EventHandler(ValuesArray_Reset);
         } else intParameters.Remove(parameter);
       }
@@ -138,8 +133,6 @@
       if (doubleValue != null) {
         if (e.Item.Checked) {
-          double minimum = doubleValue.Value;
-          double maximum = doubleValue.Value;
-          double step = 1;
-          doubleParameters.Add(parameter, new Tuple<double, double, double>(minimum, maximum, step));
+          doubleParameters.Add(parameter, new DoubleArray());
+          doubleParameters[parameter].Reset += new EventHandler(ValuesArray_Reset);
         } else doubleParameters.Remove(parameter);
       }
@@ -174,9 +167,6 @@
       if (isConstrainedValueParameter) {
         detailsTypeLabel.Text = "Choices:";
-        choicesListView.Enabled = true;
-        choicesListView.Visible = true;
         choicesListView.Tag = parameter;
 
-        if (!multipleChoiceParameters.ContainsKey(parameter)) return;
         dynamic constrainedValuedParameter = parameter;
         dynamic validValues = constrainedValuedParameter.ValidValues;
@@ -184,24 +174,28 @@
           choicesListView.Items.Add(new ListViewItem(choice.ToString()) {
             Tag = choice,
-            Checked = multipleChoiceParameters[parameter].Contains(choice)
+            Checked = multipleChoiceParameters.ContainsKey(parameter)
+            && multipleChoiceParameters[parameter].Contains(choice)
           });
         }
+        choicesListView.Enabled = multipleChoiceParameters.ContainsKey(parameter);
+        detailsTypeLabel.Visible = true;
+        choicesListView.Visible = true;
         return;
       }
 
-      if (!(parameter.Value is ValueTypeValue<bool>)) {
-        minimumLabel.Visible = true; minimumTextBox.Visible = true;
-        maximumLabel.Visible = true; maximumTextBox.Visible = true;
-        stepSizeLabel.Visible = true; stepSizeTextBox.Visible = true;
-      } else detailsTypeLabel.Text = "Boolean parameter: True / False";
+      if (parameter.Value is ValueTypeValue<bool>) {
+        detailsTypeLabel.Text = "Boolean parameter: True / False";
+        detailsTypeLabel.Visible = true;
+      }
 
       var intValue = parameter.Value as ValueTypeValue<int>;
       if (intValue != null) {
-        detailsTypeLabel.Text = "Integer parameter:";
-        if (!intParameters.ContainsKey(parameter)) return;
-        string min = intParameters[parameter].Item1.ToString();
-        string max = intParameters[parameter].Item2.ToString();
-        string step = intParameters[parameter].Item3.ToString();
-        UpdateMinMaxStepSize(parameter, min, max, step);
+        if (intParameters.ContainsKey(parameter))
+          stringConvertibleArrayView.Content = intParameters[parameter];
+        stringConvertibleArrayView.Visible = true;
+        stringConvertibleArrayView.ReadOnly = !intParameters.ContainsKey(parameter);
+        generateButton.Tag = parameter;
+        generateButton.Enabled = intParameters.ContainsKey(parameter);
+        generateButton.Visible = true;
         return;
       }
@@ -209,10 +203,11 @@
       var doubleValue = parameter.Value as ValueTypeValue<double>;
       if (doubleValue != null) {
-        detailsTypeLabel.Text = "Double parameter:";
-        if (!doubleParameters.ContainsKey(parameter)) return;
-        string min = doubleParameters[parameter].Item1.ToString();
-        string max = doubleParameters[parameter].Item2.ToString();
-        string step = doubleParameters[parameter].Item3.ToString();
-        UpdateMinMaxStepSize(parameter, min, max, step);
+        if (doubleParameters.ContainsKey(parameter))
+          stringConvertibleArrayView.Content = doubleParameters[parameter];
+        stringConvertibleArrayView.Visible = true;
+        stringConvertibleArrayView.ReadOnly = !doubleParameters.ContainsKey(parameter);
+        generateButton.Tag = parameter;
+        generateButton.Enabled = doubleParameters.ContainsKey(parameter);
+        generateButton.Visible = true;
         return;
       }
@@ -222,47 +217,54 @@
     private void choiceListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
       var parameter = (IValueParameter)choicesListView.Tag;
-      if (e.Item.Checked) {
-        multipleChoiceParameters[parameter].Add((IItem)e.Item.Tag);
-      } else multipleChoiceParameters[parameter].Remove((IItem)e.Item.Tag);
-
-      UpdateVariationsLabel();
-    }
-
-    private void detailsTextBox_Validating(object sender, CancelEventArgs e) {
-      var parameter = (IValueParameter)((TextBox)sender).Tag;
-      errorProvider.Clear();
-
-      var intValue = parameter.Value as ValueTypeValue<int>;
-      if (intValue != null) {
-        int value;
-        if (!int.TryParse(((TextBox)sender).Text, out value)) {
-          errorProvider.SetError(((TextBox)sender), "Please enter a valid integer number.");
-          e.Cancel = true;
-        } else {
-          var before = intParameters[parameter];
-          var after = default(Tuple<int, int, int>);
-          if (sender == minimumTextBox) after = new Tuple<int, int, int>(value, before.Item2, before.Item3);
-          else if (sender == maximumTextBox) after = new Tuple<int, int, int>(before.Item1, value, before.Item3);
-          else if (sender == stepSizeTextBox) after = new Tuple<int, int, int>(before.Item1, before.Item2, value);
-          intParameters[parameter] = after;
-        }
-      }
-
-      var doubleValue = parameter.Value as ValueTypeValue<double>;
-      if (doubleValue != null) {
-        double value;
-        if (!double.TryParse(((TextBox)sender).Text, NumberStyles.Float, CultureInfo.CurrentCulture.NumberFormat, out value)) {
-          errorProvider.SetError(((TextBox)sender), "Please enter a valid number.");
-          e.Cancel = true;
-        } else {
-          var before = doubleParameters[parameter];
-          var after = default(Tuple<double, double, double>);
-          if (sender == minimumTextBox) after = new Tuple<double, double, double>(value, before.Item2, before.Item3);
-          else if (sender == maximumTextBox) after = new Tuple<double, double, double>(before.Item1, value, before.Item3);
-          else if (sender == stepSizeTextBox) after = new Tuple<double, double, double>(before.Item1, before.Item2, value);
-          doubleParameters[parameter] = after;
-        }
-      }
-
+      if (multipleChoiceParameters.ContainsKey(parameter)) {
+        if (e.Item.Checked) {
+          multipleChoiceParameters[parameter].Add((IItem)e.Item.Tag);
+        } else multipleChoiceParameters[parameter].Remove((IItem)e.Item.Tag);
+
+        UpdateVariationsLabel();
+      }
+    }
+
+    private void generateButton_Click(object sender, EventArgs e) {
+      var parameter = (IValueParameter)generateButton.Tag;
+      bool integerOnly = intParameters.ContainsKey(parameter);
+      double min = 0, max = 1, step = 1;
+      #region Try to calculate some meaningful values
+      if (integerOnly) {
+        int len = intParameters[parameter].Length;
+        if (len > 0) {
+          min = intParameters[parameter].Min();
+          max = intParameters[parameter].Max();
+          step = len >= 2 ? Math.Abs((intParameters[parameter][len - 1] - intParameters[parameter][len - 2])) : 1;
+        }
+      } else {
+        int len = doubleParameters[parameter].Length;
+        if (len > 0) {
+          min = doubleParameters[parameter].Min();
+          max = doubleParameters[parameter].Max();
+          step = len >= 2 ? Math.Abs((doubleParameters[parameter][len - 1] - doubleParameters[parameter][len - 2])) : 1;
+        }
+      }
+      #endregion
+      using (var dialog = new DefineArithmeticProgressionDialog(integerOnly, min, max, step)) {
+        if (dialog.ShowDialog() == DialogResult.OK) {
+          var values = dialog.Values;
+          if (integerOnly) {
+            intParameters[parameter].Reset -= new EventHandler(ValuesArray_Reset);
+            intParameters[parameter] = new IntArray(values.Select(x => (int)x).ToArray());
+            intParameters[parameter].Reset += new EventHandler(ValuesArray_Reset);
+            stringConvertibleArrayView.Content = intParameters[parameter];
+          } else {
+            doubleParameters[parameter].Reset -= new EventHandler(ValuesArray_Reset);
+            doubleParameters[parameter] = new DoubleArray(values.ToArray());
+            doubleParameters[parameter].Reset += new EventHandler(ValuesArray_Reset);
+            stringConvertibleArrayView.Content = doubleParameters[parameter];
+          }
+          UpdateVariationsLabel();
+        }
+      }
+    }
+
+    private void ValuesArray_Reset(object sender, EventArgs e) {
       UpdateVariationsLabel();
     }
@@ -459,11 +461,9 @@
       int intParameterVariations = 1;
       foreach (var intParam in intParameters.Values) {
-        if (intParam.Item3 == 0) continue;
-        intParameterVariations *= (intParam.Item2 - intParam.Item1) / intParam.Item3 + 1;
+        intParameterVariations *= Math.Max(intParam.Length, 1);
       }
       int doubleParameterVariations = 1;
       foreach (var doubleParam in doubleParameters.Values) {
-        if (doubleParam.Item3 == 0) continue;
-        doubleParameterVariations *= (int)Math.Floor((doubleParam.Item2 - doubleParam.Item1) / doubleParam.Item3) + 1;
+        doubleParameterVariations *= Math.Max(doubleParam.Length, 1);
       }
       int boolParameterVariations = 1;
@@ -480,32 +480,28 @@
 
     private void SetMode(DialogMode mode) {
-      createBatchRunCheckBox.Enabled = mode == DialogMode.Normal;
-      repetitionsNumericUpDown.Enabled = mode == DialogMode.Normal;
-      parametersSplitContainer.Enabled = mode == DialogMode.Normal || mode == DialogMode.DiscoveringInstances;
-      selectAllCheckBox.Enabled = mode == DialogMode.Normal;
-      selectNoneCheckBox.Enabled = mode == DialogMode.Normal;
-      instancesTreeView.Enabled = mode == DialogMode.Normal;
-      instancesTreeView.Visible = mode == DialogMode.Normal || mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment;
-      okButton.Enabled = mode == DialogMode.Normal;
-      okButton.Visible = mode != DialogMode.CreatingExperiment && mode != DialogMode.PreparingExperiment;
-      cancelButton.Enabled = mode != DialogMode.PreparingExperiment;
-      instanceDiscoveryProgressLabel.Visible = mode == DialogMode.DiscoveringInstances;
-      instanceDiscoveryProgressBar.Visible = mode == DialogMode.DiscoveringInstances;
-      experimentCreationProgressBar.Visible = mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment;
+      if (InvokeRequired) Invoke((Action<DialogMode>)SetMode, mode);
+      else {
+        createBatchRunCheckBox.Enabled = mode == DialogMode.Normal;
+        repetitionsNumericUpDown.Enabled = mode == DialogMode.Normal;
+        parametersSplitContainer.Enabled = mode == DialogMode.Normal || mode == DialogMode.DiscoveringInstances;
+        selectAllCheckBox.Enabled = mode == DialogMode.Normal;
+        selectNoneCheckBox.Enabled = mode == DialogMode.Normal;
+        instancesTreeView.Enabled = mode == DialogMode.Normal;
+        instancesTreeView.Visible = mode == DialogMode.Normal || mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment;
+        okButton.Enabled = mode == DialogMode.Normal;
+        okButton.Visible = mode != DialogMode.CreatingExperiment && mode != DialogMode.PreparingExperiment;
+        cancelButton.Enabled = mode != DialogMode.PreparingExperiment;
+        instanceDiscoveryProgressLabel.Visible = mode == DialogMode.DiscoveringInstances;
+        instanceDiscoveryProgressBar.Visible = mode == DialogMode.DiscoveringInstances;
+        experimentCreationProgressBar.Visible = mode == DialogMode.CreatingExperiment || mode == DialogMode.PreparingExperiment;
+      }
     }
 
     private void ClearDetailsView() {
-      minimumLabel.Visible = false;
-      minimumTextBox.Text = string.Empty;
-      minimumTextBox.Enabled = false;
-      minimumTextBox.Visible = false;
-      maximumLabel.Visible = false;
-      maximumTextBox.Text = string.Empty;
-      maximumTextBox.Enabled = false;
-      maximumTextBox.Visible = false;
-      stepSizeLabel.Visible = false;
-      stepSizeTextBox.Text = string.Empty;
-      stepSizeTextBox.Enabled = false;
-      stepSizeTextBox.Visible = false;
+      stringConvertibleArrayView.Visible = false;
+      stringConvertibleArrayView.Content = null;
+      stringConvertibleArrayView.ReadOnly = true;
+      generateButton.Visible = false;
+      detailsTypeLabel.Visible = false;
       choicesListView.Items.Clear();
       choicesListView.Enabled = false;
@@ -513,22 +509,4 @@
     }
 
-    private void UpdateMinMaxStepSize(IValueParameter parameter, string min, string max, string step) {
-      minimumLabel.Visible = true;
-      minimumTextBox.Text = min;
-      minimumTextBox.Enabled = true;
-      minimumTextBox.Visible = true;
-      minimumTextBox.Tag = parameter;
-      maximumLabel.Visible = true;
-      maximumTextBox.Text = max;
-      maximumTextBox.Enabled = true;
-      maximumTextBox.Visible = true;
-      maximumTextBox.Tag = parameter;
-      stepSizeLabel.Visible = true;
-      stepSizeTextBox.Text = step;
-      stepSizeTextBox.Enabled = true;
-      stepSizeTextBox.Visible = true;
-      stepSizeTextBox.Tag = parameter;
-    }
-
     private void UpdateVariationsLabel() {
       variationsLabel.Text = GetNumberOfVariations().ToString("#,#", CultureInfo.CurrentCulture);
@@ -538,21 +516,22 @@
     private IEnumerable<Dictionary<IValueParameter, int>> GetIntParameterConfigurations() {
       var configuration = new Dictionary<IValueParameter, int>();
-      var indices = new Dictionary<IValueParameter, int>();
+      var enumerators = new Dictionary<IValueParameter, IEnumerator<int>>();
       bool finished;
       do {
         foreach (var p in intParameters) {
-          if (!indices.ContainsKey(p.Key)) indices.Add(p.Key, 0);
-          var value = p.Value.Item1 + p.Value.Item3 * indices[p.Key];
-          configuration[p.Key] = value;
+          if (!enumerators.ContainsKey(p.Key)) {
+            enumerators[p.Key] = p.Value.GetEnumerator();
+            enumerators[p.Key].MoveNext();
+          }
+          configuration[p.Key] = enumerators[p.Key].Current;
         }
         yield return configuration;
 
         finished = true;
-        foreach (var p in intParameters.Keys) {
-          var newValue = intParameters[p].Item1 + intParameters[p].Item3 * (indices[p] + 1);
-          if (newValue > intParameters[p].Item2 || intParameters[p].Item3 == 0)
-            indices[p] = 0;
-          else {
-            indices[p]++;
+        foreach (var p in intParameters) {
+          if (!enumerators[p.Key].MoveNext()) {
+            enumerators[p.Key] = p.Value.GetEnumerator();
+            enumerators[p.Key].MoveNext();
+          } else {
             finished = false;
             break;
@@ -564,21 +543,22 @@
     private IEnumerable<Dictionary<IValueParameter, double>> GetDoubleParameterConfigurations() {
       var configuration = new Dictionary<IValueParameter, double>();
-      var indices = new Dictionary<IValueParameter, int>();
+      var enumerators = new Dictionary<IValueParameter, IEnumerator<double>>();
       bool finished;
       do {
         foreach (var p in doubleParameters) {
-          if (!indices.ContainsKey(p.Key)) indices.Add(p.Key, 0);
-          var value = p.Value.Item1 + p.Value.Item3 * indices[p.Key];
-          configuration[p.Key] = value;
+          if (!enumerators.ContainsKey(p.Key)) {
+            enumerators[p.Key] = p.Value.GetEnumerator();
+            enumerators[p.Key].MoveNext();
+          }
+          configuration[p.Key] = enumerators[p.Key].Current;
         }
         yield return configuration;
 
         finished = true;
-        foreach (var p in doubleParameters.Keys) {
-          var newValue = doubleParameters[p].Item1 + doubleParameters[p].Item3 * (indices[p] + 1);
-          if (newValue > doubleParameters[p].Item2 || doubleParameters[p].Item3 == 0)
-            indices[p] = 0;
-          else {
-            indices[p]++;
+        foreach (var p in doubleParameters) {
+          if (!enumerators[p.Key].MoveNext()) {
+            enumerators[p.Key] = p.Value.GetEnumerator();
+            enumerators[p.Key].MoveNext();
+          } else {
             finished = false;
             break;
@@ -732,6 +712,6 @@
       }
       if (localExperiment != null) {
-        // don't do GUI stuff in do_work
         // this step can take some time
+        SetMode(DialogMode.PreparingExperiment);
         experimentCreationBackgroundWorker.ReportProgress(-1);
         localExperiment.Prepare(true);
@@ -844,6 +824,4 @@
         experimentCreationProgressBar.Value = e.ProgressPercentage;
       } else {
-        SetMode(DialogMode.PreparingExperiment);
-
         experimentCreationProgressBar.Style = ProgressBarStyle.Marquee;
       }
Index: /trunk/sources/HeuristicLab.Optimizer/3.3/DefineArithmeticProgressionDialog.Designer.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimizer/3.3/DefineArithmeticProgressionDialog.Designer.cs	(revision 7985)
+++ /trunk/sources/HeuristicLab.Optimizer/3.3/DefineArithmeticProgressionDialog.Designer.cs	(revision 7985)
@@ -0,0 +1,181 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+namespace HeuristicLab.Optimizer {
+  partial class DefineArithmeticProgressionDialog {
+    /// <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 Windows Form 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.components = new System.ComponentModel.Container();
+      this.stepSizeTextBox = new System.Windows.Forms.TextBox();
+      this.maximumTextBox = new System.Windows.Forms.TextBox();
+      this.minimumTextBox = new System.Windows.Forms.TextBox();
+      this.stepSizeLabel = new System.Windows.Forms.Label();
+      this.maximumLabel = new System.Windows.Forms.Label();
+      this.minimumLabel = new System.Windows.Forms.Label();
+      this.cancelButton = new System.Windows.Forms.Button();
+      this.okButton = new System.Windows.Forms.Button();
+      this.errorProvider = new System.Windows.Forms.ErrorProvider(this.components);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).BeginInit();
+      this.SuspendLayout();
+      // 
+      // stepSizeTextBox
+      // 
+      this.stepSizeTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.stepSizeTextBox.Location = new System.Drawing.Point(75, 64);
+      this.stepSizeTextBox.Name = "stepSizeTextBox";
+      this.stepSizeTextBox.Size = new System.Drawing.Size(184, 20);
+      this.stepSizeTextBox.TabIndex = 11;
+      this.stepSizeTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // maximumTextBox
+      // 
+      this.maximumTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.maximumTextBox.Location = new System.Drawing.Point(75, 38);
+      this.maximumTextBox.Name = "maximumTextBox";
+      this.maximumTextBox.Size = new System.Drawing.Size(184, 20);
+      this.maximumTextBox.TabIndex = 9;
+      this.maximumTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // minimumTextBox
+      // 
+      this.minimumTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.minimumTextBox.Location = new System.Drawing.Point(75, 12);
+      this.minimumTextBox.Name = "minimumTextBox";
+      this.minimumTextBox.Size = new System.Drawing.Size(184, 20);
+      this.minimumTextBox.TabIndex = 7;
+      this.minimumTextBox.Validating += new System.ComponentModel.CancelEventHandler(this.textBox_Validating);
+      // 
+      // stepSizeLabel
+      // 
+      this.stepSizeLabel.AutoSize = true;
+      this.stepSizeLabel.Location = new System.Drawing.Point(15, 67);
+      this.stepSizeLabel.Name = "stepSizeLabel";
+      this.stepSizeLabel.Size = new System.Drawing.Size(53, 13);
+      this.stepSizeLabel.TabIndex = 10;
+      this.stepSizeLabel.Text = "Step size:";
+      // 
+      // maximumLabel
+      // 
+      this.maximumLabel.AutoSize = true;
+      this.maximumLabel.Location = new System.Drawing.Point(15, 41);
+      this.maximumLabel.Name = "maximumLabel";
+      this.maximumLabel.Size = new System.Drawing.Size(54, 13);
+      this.maximumLabel.TabIndex = 8;
+      this.maximumLabel.Text = "Maximum:";
+      // 
+      // minimumLabel
+      // 
+      this.minimumLabel.AutoSize = true;
+      this.minimumLabel.Location = new System.Drawing.Point(15, 15);
+      this.minimumLabel.Name = "minimumLabel";
+      this.minimumLabel.Size = new System.Drawing.Size(51, 13);
+      this.minimumLabel.TabIndex = 6;
+      this.minimumLabel.Text = "Minimum:";
+      // 
+      // cancelButton
+      // 
+      this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+      this.cancelButton.Location = new System.Drawing.Point(184, 96);
+      this.cancelButton.Name = "cancelButton";
+      this.cancelButton.Size = new System.Drawing.Size(75, 23);
+      this.cancelButton.TabIndex = 12;
+      this.cancelButton.Text = "&Cancel";
+      this.cancelButton.UseVisualStyleBackColor = true;
+      // 
+      // okButton
+      // 
+      this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+      this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK;
+      this.okButton.Location = new System.Drawing.Point(103, 96);
+      this.okButton.Name = "okButton";
+      this.okButton.Size = new System.Drawing.Size(75, 23);
+      this.okButton.TabIndex = 12;
+      this.okButton.Text = "&OK";
+      this.okButton.UseVisualStyleBackColor = true;
+      // 
+      // errorProvider
+      // 
+      this.errorProvider.ContainerControl = this;
+      // 
+      // DefineArithmeticProgressionDialog
+      // 
+      this.AcceptButton = this.okButton;
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.CancelButton = this.cancelButton;
+      this.ClientSize = new System.Drawing.Size(271, 131);
+      this.Controls.Add(this.okButton);
+      this.Controls.Add(this.cancelButton);
+      this.Controls.Add(this.stepSizeTextBox);
+      this.Controls.Add(this.maximumTextBox);
+      this.Controls.Add(this.minimumTextBox);
+      this.Controls.Add(this.stepSizeLabel);
+      this.Controls.Add(this.maximumLabel);
+      this.Controls.Add(this.minimumLabel);
+      this.MaximizeBox = false;
+      this.MinimizeBox = false;
+      this.Name = "DefineArithmeticProgressionDialog";
+      this.Text = "Generate Values";
+      this.Load += new System.EventHandler(this.DefineArithmeticProgressionDialog_Load);
+      ((System.ComponentModel.ISupportInitialize)(this.errorProvider)).EndInit();
+      this.ResumeLayout(false);
+      this.PerformLayout();
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.TextBox stepSizeTextBox;
+    private System.Windows.Forms.TextBox maximumTextBox;
+    private System.Windows.Forms.TextBox minimumTextBox;
+    private System.Windows.Forms.Label stepSizeLabel;
+    private System.Windows.Forms.Label maximumLabel;
+    private System.Windows.Forms.Label minimumLabel;
+    private System.Windows.Forms.Button cancelButton;
+    private System.Windows.Forms.Button okButton;
+    private System.Windows.Forms.ErrorProvider errorProvider;
+  }
+}
Index: /trunk/sources/HeuristicLab.Optimizer/3.3/DefineArithmeticProgressionDialog.cs
===================================================================
--- /trunk/sources/HeuristicLab.Optimizer/3.3/DefineArithmeticProgressionDialog.cs	(revision 7985)
+++ /trunk/sources/HeuristicLab.Optimizer/3.3/DefineArithmeticProgressionDialog.cs	(revision 7985)
@@ -0,0 +1,116 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Globalization;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Optimizer {
+  public partial class DefineArithmeticProgressionDialog : Form {
+    private bool allowOnlyInteger;
+
+    public double Minimum { get; private set; }
+    public double Maximum { get; private set; }
+    public double Step { get; private set; }
+
+    public IEnumerable<double> Values {
+      get { return EnumerateProgression().Reverse(); }
+    }
+
+    public DefineArithmeticProgressionDialog() {
+      InitializeComponent();
+      Icon = HeuristicLab.Common.Resources.HeuristicLab.Icon;
+      Minimum = 0; Maximum = 100; Step = 10;
+    }
+    public DefineArithmeticProgressionDialog(bool allowOnlyInteger)
+      : this() {
+      this.allowOnlyInteger = allowOnlyInteger;
+    }
+    public DefineArithmeticProgressionDialog(bool allowOnlyInteger, double minimum, double maximum, double step)
+      : this(allowOnlyInteger) {
+      Minimum = minimum;
+      Maximum = maximum;
+      Step = step;
+    }
+
+    private void DefineArithmeticProgressionDialog_Load(object sender, System.EventArgs e) {
+      minimumTextBox.Text = Minimum.ToString();
+      maximumTextBox.Text = Maximum.ToString();
+      stepSizeTextBox.Text = Step.ToString();
+    }
+
+    private void textBox_Validating(object sender, CancelEventArgs e) {
+      var textBox = (TextBox)sender;
+      double value = 0;
+      if (allowOnlyInteger) {
+        int intValue;
+        if (!int.TryParse(textBox.Text, out intValue)) {
+          errorProvider.SetError(textBox, "Please enter a valid integer value.");
+          e.Cancel = true;
+          return;
+        } else {
+          value = intValue;
+          errorProvider.SetError(textBox, null);
+        }
+      } else {
+        if (!double.TryParse(textBox.Text, NumberStyles.Float, CultureInfo.CurrentCulture.NumberFormat, out value)) {
+          errorProvider.SetError(textBox, "Please enter a valid double value.");
+          e.Cancel = true;
+          return;
+        } else errorProvider.SetError(textBox, null);
+      }
+      if (textBox == minimumTextBox) Minimum = value;
+      else if (textBox == maximumTextBox) Maximum = value;
+      else if (textBox == stepSizeTextBox) Step = value;
+      okButton.Enabled = IsValid();
+    }
+
+    private bool IsValid() {
+      return Minimum <= Maximum && Step >= 0;
+    }
+
+    private IEnumerable<double> EnumerateProgression() {
+      double value = Maximum;
+      bool minimumIncluded = false;
+      int i = 1;
+      while (value >= Minimum) {
+        if (value.IsAlmost(Minimum)) {
+          yield return Minimum;
+          minimumIncluded = true;
+        } else yield return value;
+        
+        if (Step == 0) break; // a step size of 0 will only output maximum and minimum
+        if (allowOnlyInteger) {
+          value = (int)Maximum - i * (int)Step;
+        } else {
+          value = Maximum - i * Step;
+        }
+        i++;
+      }
+      if (!minimumIncluded) {
+        yield return Minimum;
+      }
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj
===================================================================
--- /trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 7984)
+++ /trunk/sources/HeuristicLab.Optimizer/3.3/HeuristicLab.Optimizer-3.3.csproj	(revision 7985)
@@ -125,4 +125,10 @@
     <EmbeddedResource Include="Documents\PSO_Schwefel.hl" />
     <None Include="Plugin.cs.frame" />
+    <Compile Include="DefineArithmeticProgressionDialog.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="DefineArithmeticProgressionDialog.Designer.cs">
+      <DependentUpon>DefineArithmeticProgressionDialog.cs</DependentUpon>
+    </Compile>
     <Compile Include="OptimizerSingleDocumentMainForm.cs">
       <SubType>Form</SubType>
@@ -238,4 +244,8 @@
       <Name>HeuristicLab.Core-3.3</Name>
       <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Data.Views\3.3\HeuristicLab.Data.Views-3.3.csproj">
+      <Project>{72104A0B-90E7-42F3-9ABE-9BBBADD4B943}</Project>
+      <Name>HeuristicLab.Data.Views-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Data\3.3\HeuristicLab.Data-3.3.csproj">
Index: /trunk/sources/HeuristicLab.Optimizer/3.3/Plugin.cs.frame
===================================================================
--- /trunk/sources/HeuristicLab.Optimizer/3.3/Plugin.cs.frame	(revision 7984)
+++ /trunk/sources/HeuristicLab.Optimizer/3.3/Plugin.cs.frame	(revision 7985)
@@ -34,4 +34,5 @@
   [PluginDependency("HeuristicLab.Core.Views", "3.3")]
   [PluginDependency("HeuristicLab.Data", "3.3")]
+  [PluginDependency("HeuristicLab.Data.Views", "3.3")]
   [PluginDependency("HeuristicLab.MainForm", "3.3")]
   [PluginDependency("HeuristicLab.MainForm.WindowsForms", "3.3")]
