Index: /branches/3.0/sources/HeuristicLab.Core/VariablesScopeView.Designer.cs
===================================================================
--- /branches/3.0/sources/HeuristicLab.Core/VariablesScopeView.Designer.cs	(revision 277)
+++ /branches/3.0/sources/HeuristicLab.Core/VariablesScopeView.Designer.cs	(revision 278)
@@ -70,4 +70,5 @@
                   | System.Windows.Forms.AnchorStyles.Left)
                   | System.Windows.Forms.AnchorStyles.Right)));
+      this.splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
       this.splitContainer1.Location = new System.Drawing.Point(0, 0);
       this.splitContainer1.Name = "splitContainer1";
Index: /branches/3.0/sources/HeuristicLab.DataAnalysis/Dataset.cs
===================================================================
--- /branches/3.0/sources/HeuristicLab.DataAnalysis/Dataset.cs	(revision 277)
+++ /branches/3.0/sources/HeuristicLab.DataAnalysis/Dataset.cs	(revision 278)
@@ -39,4 +39,6 @@
     private double[] samples;
     private int rows;
+    Dictionary<int, Dictionary<int, double>>[] cachedMeans;
+    Dictionary<int, Dictionary<int, double>>[] cachedRanges;
 
     public int Rows {
@@ -50,6 +52,4 @@
       set { columns = value; }
     }
-    private Dictionary<int, double[]>[] ranges;
-    private Dictionary<int, double[]>[] means;
 
     public double GetValue(int i, int j) {
@@ -94,10 +94,10 @@
       // keep a means and ranges dictionary for each column (possible target variable) of the dataset.
 
-      means = new Dictionary<int, double[]>[columns];
-      ranges = new Dictionary<int, double[]>[columns];
+      cachedMeans = new Dictionary<int, Dictionary<int, double>>[columns];
+      cachedRanges = new Dictionary<int, Dictionary<int, double>>[columns];
 
       for(int i = 0; i < columns; i++) {
-        means[i] = new Dictionary<int, double[]>();
-        ranges[i] = new Dictionary<int, double[]>();
+        cachedMeans[i] = new Dictionary<int, Dictionary<int, double>>();
+        cachedRanges[i] = new Dictionary<int, Dictionary<int, double>>();
       }
     }
@@ -200,37 +200,17 @@
     }
 
-    // return value of GetMean should be memoized because it is called repeatedly in Evaluators
     public double GetMean(int column, int from, int to) {
-      Dictionary<int, double[]> columnMeans = means[column];
-      if(columnMeans.ContainsKey(from)) {
-        double[] fromMeans = columnMeans[from];
-        if(fromMeans[to-from] >= 0.0) {
-          // already calculated
-          return fromMeans[to-from];
-        } else {
-          // not yet calculated => calculate
-          fromMeans[to-from] = CalculateMean(column, from, to);
-          return fromMeans[to-from];
-        }
+      if(!cachedMeans[column].ContainsKey(from) || !cachedMeans[column][from].ContainsKey(to)) {
+        double[] values = new double[to - from + 1];
+        for(int sample = from; sample <= to; sample++) {
+          values[sample - from] = GetValue(sample, column);
+        }
+        double mean = Statistics.Mean(values);
+        if(!cachedMeans[column].ContainsKey(from)) cachedMeans[column][from] = new Dictionary<int, double>();
+        cachedMeans[column][from][to] = mean;
+        return mean;
       } else {
-        // never saw this from-index => create a new array, initialize and recalculate for to-index
-        double[] fromMeans = new double[rows - from];
-        // fill with negative values to indicate which means have already been calculated
-        for(int i=0;i<fromMeans.Length;i++) {fromMeans[i] = -1.0;}
-        // store new array in the dictionary
-        columnMeans[from] = fromMeans;
-        // calculate for specific to-index
-        fromMeans[to-from] = CalculateMean(column, from, to);
-        return fromMeans[to-from];
-      }
-    }
-
-    private double CalculateMean(int column, int from, int to) {
-      double[] values = new double[to - from +1];
-      for(int sample = from; sample <= to; sample++) {
-        values[sample - from] = GetValue(sample, column);
-      }
-
-      return Statistics.Mean(values);
+        return cachedMeans[column][from][to];
+      }
     }
 
@@ -239,37 +219,17 @@
     }
 
-    // return value of GetRange should be memoized because it is called repeatedly in Evaluators
     public double GetRange(int column, int from, int to) {
-      Dictionary<int, double[]> columnRanges = ranges[column];
-      if(columnRanges.ContainsKey(from)) {
-        double[] fromRanges = columnRanges[from];
-        if(fromRanges[to-from] >= 0.0) {
-          // already calculated
-          return fromRanges[to-from];
-        } else {
-          // not yet calculated => calculate
-          fromRanges[to-from] = CalculateRange(column, from, to);
-          return fromRanges[to-from];
-        }
+      if(!cachedRanges[column].ContainsKey(from) || !cachedRanges[column][from].ContainsKey(to)) {
+        double[] values = new double[to - from + 1];
+        for(int sample = from; sample <= to; sample++) {
+          values[sample - from] = GetValue(sample, column);
+        }
+        double range = Statistics.Range(values);
+        if(!cachedRanges[column].ContainsKey(from)) cachedRanges[column][from] = new Dictionary<int, double>();
+        cachedRanges[column][from][to] = range;
+        return range;
       } else {
-        // never saw this from-index => create a new array, initialize and recalculate for to-index
-        double[] fromRanges = new double[rows - from];
-        // fill with negative values to indicate which means have already been calculated
-        for(int i = 0; i < fromRanges.Length; i++) { fromRanges[i] = -1.0; }
-        // store in dictionary
-        columnRanges[from] = fromRanges;
-        // calculate for specific to-index
-        fromRanges[to-from] = CalculateRange(column, from, to);
-        return fromRanges[to-from];
-      }
-    }
-
-    private double CalculateRange(int column, int from, int to) {
-      double[] values = new double[to - from + 1];
-      for(int sample = from; sample <= to; sample++) {
-        values[sample - from] = GetValue(sample, column);
-      }
-
-      return Statistics.Range(values);
+        return cachedRanges[column][from][to];
+      }
     }
   }
Index: /branches/3.0/sources/HeuristicLab.DataAnalysis/DatasetView.cs
===================================================================
--- /branches/3.0/sources/HeuristicLab.DataAnalysis/DatasetView.cs	(revision 277)
+++ /branches/3.0/sources/HeuristicLab.DataAnalysis/DatasetView.cs	(revision 278)
@@ -33,18 +33,16 @@
       set {
         Item = value;
-        Item.Changed += new EventHandler(Item_Changed);
+        Refresh();
       }
     }
 
-    void Item_Changed(object sender, EventArgs e) {
-      Refresh();
-    }
-
-    public DatasetView() : base() {
+    public DatasetView()
+      : base() {
       InitializeComponent();
       openFileDialog = new OpenFileDialog();
     }
 
-    public DatasetView(Dataset dataset) :this() {
+    public DatasetView(Dataset dataset)
+      : this() {
       this.Dataset = dataset;
     }
@@ -52,8 +50,7 @@
     protected override void UpdateControls() {
       base.UpdateControls();
-      if(Dataset != null) {
+      if (Dataset != null) {
         int rows = Dataset.Rows;
         int columns = Dataset.Columns;
-
         nameTextBox.Text = Dataset.Name;
         rowsTextBox.Text = rows + "";
@@ -61,6 +58,6 @@
         dataGridView.ColumnCount = columns;
         dataGridView.RowCount = rows;
-        for(int i = 0; i < rows; i++) {
-          for(int j = 0; j < columns; j++) {
+        for (int i = 0; i < rows; i++) {
+          for (int j = 0; j < columns; j++) {
             dataGridView.Rows[i].Cells[j].Value = Dataset.GetValue(i, j);
           }
@@ -85,5 +82,5 @@
 
     private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) {
-      if(ValidateData((string)e.FormattedValue)) {
+      if (ValidateData((string)e.FormattedValue)) {
         SetArrayElement(e.RowIndex, e.ColumnIndex, (string)e.FormattedValue);
         e.Cancel = false;
@@ -97,5 +94,5 @@
       double result;
       double.TryParse(element, out result);
-      if(result != Dataset.GetValue(row, column)) {
+      if (result != Dataset.GetValue(row, column)) {
         Dataset.SetValue(row, column, result);
         Dataset.FireChanged();
Index: /branches/3.0/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.Designer.cs
===================================================================
--- /branches/3.0/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.Designer.cs	(revision 277)
+++ /branches/3.0/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.Designer.cs	(revision 278)
@@ -45,18 +45,13 @@
     /// </summary>
     private void InitializeComponent() {
-      this.nameLabel = new System.Windows.Forms.Label();
-      this.nameTextBox = new System.Windows.Forms.TextBox();
       this.importInstanceButton = new System.Windows.Forms.Button();
       this.openFileDialog = new System.Windows.Forms.OpenFileDialog();
       this.tabControl = new System.Windows.Forms.TabControl();
       this.dataTabPage = new System.Windows.Forms.TabPage();
-      this.variablesLabel = new System.Windows.Forms.Label();
-      this.variablesTextBox = new System.Windows.Forms.TextBox();
-      this.samplesLabel = new System.Windows.Forms.Label();
-      this.samplesTextBox = new System.Windows.Forms.TextBox();
       this.variableInfosTabPage = new System.Windows.Forms.TabPage();
       this.operatorBaseVariableInfosView = new HeuristicLab.Core.OperatorBaseVariableInfosView();
       this.descriptionTabPage = new System.Windows.Forms.TabPage();
       this.operatorBaseDescriptionView = new HeuristicLab.Core.OperatorBaseDescriptionView();
+      this.datasetView = new HeuristicLab.DataAnalysis.DatasetView();
       this.tabControl.SuspendLayout();
       this.dataTabPage.SuspendLayout();
@@ -65,29 +60,9 @@
       this.SuspendLayout();
       // 
-      // nameLabel
-      // 
-      this.nameLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
-      this.nameLabel.AutoSize = true;
-      this.nameLabel.Location = new System.Drawing.Point(6, 9);
-      this.nameLabel.Name = "nameLabel";
-      this.nameLabel.Size = new System.Drawing.Size(38, 13);
-      this.nameLabel.TabIndex = 0;
-      this.nameLabel.Text = "Name:";
-      // 
-      // nameTextBox
-      // 
-      this.nameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.nameTextBox.Location = new System.Drawing.Point(62, 6);
-      this.nameTextBox.Name = "nameTextBox";
-      this.nameTextBox.ReadOnly = true;
-      this.nameTextBox.Size = new System.Drawing.Size(166, 20);
-      this.nameTextBox.TabIndex = 1;
-      // 
       // importInstanceButton
       // 
-      this.importInstanceButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.importInstanceButton.Location = new System.Drawing.Point(6, 105);
+      this.importInstanceButton.Location = new System.Drawing.Point(6, 6);
       this.importInstanceButton.Name = "importInstanceButton";
-      this.importInstanceButton.Size = new System.Drawing.Size(256, 21);
+      this.importInstanceButton.Size = new System.Drawing.Size(129, 21);
       this.importInstanceButton.TabIndex = 6;
       this.importInstanceButton.Text = "&Import...";
@@ -111,61 +86,18 @@
       this.tabControl.Name = "tabControl";
       this.tabControl.SelectedIndex = 0;
-      this.tabControl.Size = new System.Drawing.Size(276, 184);
+      this.tabControl.Size = new System.Drawing.Size(507, 451);
       this.tabControl.TabIndex = 0;
       // 
       // dataTabPage
       // 
-      this.dataTabPage.Controls.Add(this.variablesLabel);
-      this.dataTabPage.Controls.Add(this.variablesTextBox);
-      this.dataTabPage.Controls.Add(this.samplesLabel);
-      this.dataTabPage.Controls.Add(this.samplesTextBox);
-      this.dataTabPage.Controls.Add(this.nameLabel);
+      this.dataTabPage.Controls.Add(this.datasetView);
       this.dataTabPage.Controls.Add(this.importInstanceButton);
-      this.dataTabPage.Controls.Add(this.nameTextBox);
       this.dataTabPage.Location = new System.Drawing.Point(4, 22);
       this.dataTabPage.Name = "dataTabPage";
       this.dataTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.dataTabPage.Size = new System.Drawing.Size(268, 158);
+      this.dataTabPage.Size = new System.Drawing.Size(499, 425);
       this.dataTabPage.TabIndex = 0;
       this.dataTabPage.Text = "Data";
       this.dataTabPage.UseVisualStyleBackColor = true;
-      // 
-      // variablesLabel
-      // 
-      this.variablesLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
-      this.variablesLabel.AutoSize = true;
-      this.variablesLabel.Location = new System.Drawing.Point(6, 61);
-      this.variablesLabel.Name = "variablesLabel";
-      this.variablesLabel.Size = new System.Drawing.Size(53, 13);
-      this.variablesLabel.TabIndex = 9;
-      this.variablesLabel.Text = "Variables:";
-      // 
-      // variablesTextBox
-      // 
-      this.variablesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.variablesTextBox.Location = new System.Drawing.Point(62, 58);
-      this.variablesTextBox.Name = "variablesTextBox";
-      this.variablesTextBox.ReadOnly = true;
-      this.variablesTextBox.Size = new System.Drawing.Size(81, 20);
-      this.variablesTextBox.TabIndex = 10;
-      // 
-      // samplesLabel
-      // 
-      this.samplesLabel.Anchor = System.Windows.Forms.AnchorStyles.Left;
-      this.samplesLabel.AutoSize = true;
-      this.samplesLabel.Location = new System.Drawing.Point(6, 35);
-      this.samplesLabel.Name = "samplesLabel";
-      this.samplesLabel.Size = new System.Drawing.Size(50, 13);
-      this.samplesLabel.TabIndex = 7;
-      this.samplesLabel.Text = "Samples:";
-      // 
-      // samplesTextBox
-      // 
-      this.samplesTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
-      this.samplesTextBox.Location = new System.Drawing.Point(62, 32);
-      this.samplesTextBox.Name = "samplesTextBox";
-      this.samplesTextBox.ReadOnly = true;
-      this.samplesTextBox.Size = new System.Drawing.Size(81, 20);
-      this.samplesTextBox.TabIndex = 8;
       // 
       // variableInfosTabPage
@@ -175,5 +107,5 @@
       this.variableInfosTabPage.Name = "variableInfosTabPage";
       this.variableInfosTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.variableInfosTabPage.Size = new System.Drawing.Size(268, 158);
+      this.variableInfosTabPage.Size = new System.Drawing.Size(499, 425);
       this.variableInfosTabPage.TabIndex = 1;
       this.variableInfosTabPage.Text = "Variable Infos";
@@ -187,5 +119,5 @@
       this.operatorBaseVariableInfosView.Name = "operatorBaseVariableInfosView";
       this.operatorBaseVariableInfosView.Operator = null;
-      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(262, 152);
+      this.operatorBaseVariableInfosView.Size = new System.Drawing.Size(493, 419);
       this.operatorBaseVariableInfosView.TabIndex = 0;
       // 
@@ -196,5 +128,5 @@
       this.descriptionTabPage.Name = "descriptionTabPage";
       this.descriptionTabPage.Padding = new System.Windows.Forms.Padding(3);
-      this.descriptionTabPage.Size = new System.Drawing.Size(268, 158);
+      this.descriptionTabPage.Size = new System.Drawing.Size(499, 425);
       this.descriptionTabPage.TabIndex = 2;
       this.descriptionTabPage.Text = "Description";
@@ -208,6 +140,17 @@
       this.operatorBaseDescriptionView.Name = "operatorBaseDescriptionView";
       this.operatorBaseDescriptionView.Operator = null;
-      this.operatorBaseDescriptionView.Size = new System.Drawing.Size(262, 152);
+      this.operatorBaseDescriptionView.Size = new System.Drawing.Size(493, 419);
       this.operatorBaseDescriptionView.TabIndex = 0;
+      // 
+      // datasetView
+      // 
+      this.datasetView.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.datasetView.Caption = "View";
+      this.datasetView.Location = new System.Drawing.Point(6, 33);
+      this.datasetView.Name = "datasetView";
+      this.datasetView.Size = new System.Drawing.Size(487, 386);
+      this.datasetView.TabIndex = 7;
       // 
       // StructIdProblemInjectorView
@@ -217,8 +160,7 @@
       this.Controls.Add(this.tabControl);
       this.Name = "StructIdProblemInjectorView";
-      this.Size = new System.Drawing.Size(276, 184);
+      this.Size = new System.Drawing.Size(507, 451);
       this.tabControl.ResumeLayout(false);
       this.dataTabPage.ResumeLayout(false);
-      this.dataTabPage.PerformLayout();
       this.variableInfosTabPage.ResumeLayout(false);
       this.descriptionTabPage.ResumeLayout(false);
@@ -229,6 +171,4 @@
     #endregion
 
-    private System.Windows.Forms.Label nameLabel;
-    private System.Windows.Forms.TextBox nameTextBox;
     private System.Windows.Forms.Button importInstanceButton;
     private System.Windows.Forms.OpenFileDialog openFileDialog;
@@ -239,8 +179,5 @@
     private System.Windows.Forms.TabPage descriptionTabPage;
     private HeuristicLab.Core.OperatorBaseDescriptionView operatorBaseDescriptionView;
-    private System.Windows.Forms.Label variablesLabel;
-    private System.Windows.Forms.TextBox variablesTextBox;
-    private System.Windows.Forms.Label samplesLabel;
-    private System.Windows.Forms.TextBox samplesTextBox;
+    private HeuristicLab.DataAnalysis.DatasetView datasetView;
   }
 }
Index: /branches/3.0/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.cs
===================================================================
--- /branches/3.0/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.cs	(revision 277)
+++ /branches/3.0/sources/HeuristicLab.StructureIdentification/StructIdProblemInjectorView.cs	(revision 278)
@@ -61,13 +61,8 @@
       base.UpdateControls();
       if (StructIdProblemInjector == null) {
-        nameTextBox.Text = "-";
-        variablesTextBox.Text = "-";
-        samplesTextBox.Text = "-";
         importInstanceButton.Enabled = false;
       } else {
         Dataset dataset = (Dataset)StructIdProblemInjector.GetVariable("Dataset").Value;
-        nameTextBox.Text = dataset.Name;
-        samplesTextBox.Text = dataset.Rows+"";
-        variablesTextBox.Text = dataset.Columns+"";
+        datasetView.Dataset = dataset;
         importInstanceButton.Enabled = true;
       }
Index: /branches/3.0/sources/HeuristicLab/MainForm.cs
===================================================================
--- /branches/3.0/sources/HeuristicLab/MainForm.cs	(revision 277)
+++ /branches/3.0/sources/HeuristicLab/MainForm.cs	(revision 278)
@@ -96,5 +96,5 @@
             PluginManager.Manager.Run(app);
           });
-          t.SetApartmentState(ApartmentState.STA);
+          t.SetApartmentState(ApartmentState.STA); // needed for the AdvancedOptimizationFrontent
           t.Start();
         }
