Index: /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/GradientChart.cs
===================================================================
--- /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/GradientChart.cs	(revision 13807)
+++ /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/GradientChart.cs	(revision 13808)
@@ -179,5 +179,17 @@
     }
 
-    private void UpdateChart() {
+    public void Configure(IEnumerable<IRegressionSolution> solutions, IRegressionProblemData pd, ModifiableDataset dataset, string variable, double min, double max, int points) {
+      if (!SolutionsCompatibleWithProblemData(pd, solutions))
+        throw new ArgumentException("Solutions are not compatible with the problem data.");
+      this.solutionList = new List<IRegressionSolution>(solutions);
+      this.problemData = pd;
+      this.variable = variable;
+      this.internalDataset = dataset;
+      this.min = min;
+      this.max = max;
+      this.points = points;
+    }
+
+    public void UpdateChart() {
       // throw exceptions?
       if (internalDataset == null || solutionList == null || !solutionList.Any())
Index: /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj
===================================================================
--- /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 13807)
+++ /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/HeuristicLab.Problems.DataAnalysis.Views-3.4.csproj	(revision 13808)
@@ -293,4 +293,10 @@
     <Compile Include="RegressionSolutionGradientView.Designer.cs">
       <DependentUpon>RegressionSolutionGradientView.cs</DependentUpon>
+    </Compile>
+    <Compile Include="RegressionSolutionTargetResponseGradientView.cs">
+      <SubType>UserControl</SubType>
+    </Compile>
+    <Compile Include="RegressionSolutionTargetResponseGradientView.Designer.cs">
+      <DependentUpon>RegressionSolutionTargetResponseGradientView.cs</DependentUpon>
     </Compile>
     <Compile Include="Regression\RegressionEnsembleSolutionModelWeightsView.cs">
Index: /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionGradientView.cs
===================================================================
--- /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionGradientView.cs	(revision 13807)
+++ /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionGradientView.cs	(revision 13808)
@@ -27,5 +27,5 @@
 namespace HeuristicLab.Problems.DataAnalysis.Views {
   [View("Gradient View")]
-  [Content(typeof(IRegressionSolution), false)]
+  [Content(typeof(IRegressionSolution))]
   public partial class RegressionSolutionGradientView : DataAnalysisSolutionEvaluationView {
     public RegressionSolutionGradientView() {
Index: /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionTargetResponseGradientView.Designer.cs
===================================================================
--- /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionTargetResponseGradientView.Designer.cs	(revision 13808)
+++ /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionTargetResponseGradientView.Designer.cs	(revision 13808)
@@ -0,0 +1,75 @@
+﻿namespace HeuristicLab.Problems.DataAnalysis.Views {
+  partial class RegressionSolutionTargetResponseGradientView {
+    /// <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.variableListView = new System.Windows.Forms.ListView();
+      this.gradientChartTableLayout = new System.Windows.Forms.TableLayoutPanel();
+      this.SuspendLayout();
+      // 
+      // variableListView
+      // 
+      this.variableListView.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left)));
+      this.variableListView.CheckBoxes = true;
+      this.variableListView.Location = new System.Drawing.Point(4, 4);
+      this.variableListView.Name = "variableListView";
+      this.variableListView.Size = new System.Drawing.Size(263, 944);
+      this.variableListView.TabIndex = 0;
+      this.variableListView.UseCompatibleStateImageBehavior = false;
+      this.variableListView.View = System.Windows.Forms.View.List;
+      // 
+      // gradientChartTableLayout
+      // 
+      this.gradientChartTableLayout.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.gradientChartTableLayout.ColumnCount = 2;
+      this.gradientChartTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.gradientChartTableLayout.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.gradientChartTableLayout.Location = new System.Drawing.Point(274, 4);
+      this.gradientChartTableLayout.Name = "gradientChartTableLayout";
+      this.gradientChartTableLayout.RowCount = 2;
+      this.gradientChartTableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.gradientChartTableLayout.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+      this.gradientChartTableLayout.Size = new System.Drawing.Size(1323, 944);
+      this.gradientChartTableLayout.TabIndex = 1;
+      // 
+      // RegressionSolutionTargetResponseGradientView
+      // 
+      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+      this.Controls.Add(this.gradientChartTableLayout);
+      this.Controls.Add(this.variableListView);
+      this.Name = "RegressionSolutionTargetResponseGradientView";
+      this.Size = new System.Drawing.Size(1600, 951);
+      this.ResumeLayout(false);
+
+    }
+
+    #endregion
+
+    private System.Windows.Forms.ListView variableListView;
+    private System.Windows.Forms.TableLayoutPanel gradientChartTableLayout;
+  }
+}
Index: /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionTargetResponseGradientView.cs
===================================================================
--- /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionTargetResponseGradientView.cs	(revision 13808)
+++ /branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionTargetResponseGradientView.cs	(revision 13808)
@@ -0,0 +1,82 @@
+﻿using System.Collections.Generic;
+using System.Linq;
+using System.Windows.Forms;
+using HeuristicLab.Common;
+using HeuristicLab.MainForm;
+
+namespace HeuristicLab.Problems.DataAnalysis.Views {
+  [View("Target Response Gradient View")]
+  [Content(typeof(IRegressionSolution))]
+  public partial class RegressionSolutionTargetResponseGradientView : DataAnalysisSolutionEvaluationView {
+    private ModifiableDataset internalDataset;
+    private Dictionary<string, GradientChart> charts;
+    private Dictionary<string, DoubleLimit> variableLimits;
+
+    private const int Points = 1000;
+
+    public RegressionSolutionTargetResponseGradientView() {
+      InitializeComponent();
+    }
+
+    public new IRegressionSolution Content {
+      get { return (IRegressionSolution)base.Content; }
+      set {
+        if (value == null || value == Content) return;
+        base.Content = value;
+      }
+    }
+
+    protected override void RegisterContentEvents() {
+      base.RegisterContentEvents();
+      variableListView.ItemChecked += variableListView_ItemChecked;
+    }
+
+    protected override void DeregisterContentEvents() {
+      variableListView.ItemChecked -= variableListView_ItemChecked;
+      base.DeregisterContentEvents();
+    }
+
+    protected override void OnContentChanged() {
+      base.OnContentChanged();
+      var pd = Content.ProblemData;
+      var ds = pd.Dataset;
+
+      // update variable list
+      variableListView.Items.Clear();
+      variableListView.Items.AddRange(pd.AllowedInputVariables.Select(x => new ListViewItem(x, 0)).ToArray());
+
+      // update internal dataset
+      var variableNames = pd.AllowedInputVariables.ToList();
+      var variableValues = variableNames.Select(x => new List<double> { pd.Dataset.GetDoubleValues(x, pd.TrainingIndices).Median() });
+      internalDataset = new ModifiableDataset(variableNames, variableValues);
+
+      // update charts and variable limits
+      charts = new Dictionary<string, GradientChart>();
+      variableLimits = new Dictionary<string, DoubleLimit>();
+      foreach (var x in pd.AllowedInputVariables) {
+        double min = 0, max = 0;
+        foreach (var v in ds.GetDoubleValues(x, pd.TrainingIndices)) {
+          if (v > max) max = v;
+          if (v < min) min = v;
+        }
+        variableLimits[x] = new DoubleLimit(min, max);
+        var gradientChart = new GradientChart();
+        gradientChart.Configure(new[] { Content }, pd, internalDataset, x, min, max, Points);
+        charts[x] = gradientChart;
+      }
+    }
+
+    private void variableListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
+      if (charts == null) return;
+      var item = e.Item;
+      var variable = item.Text;
+      var chart = charts[variable];
+      if (item.Checked) {
+        gradientChartTableLayout.Controls.Add(chart);
+        chart.UpdateChart();
+      } else {
+        gradientChartTableLayout.Controls.Remove(chart);
+      }
+    }
+  }
+}
