Changeset 13850 for branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionTargetResponseGradientView.cs
- Timestamp:
- 05/18/16 16:28:59 (8 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionTargetResponseGradientView.cs
r13846 r13850 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.Drawing; 24 25 using System.Linq; 25 26 using System.Threading.Tasks; … … 33 34 [Content(typeof(IRegressionSolution))] 34 35 public partial class RegressionSolutionTargetResponseGradientView : DataAnalysisSolutionEvaluationView { 35 private readonly Dictionary<string, GradientChart> charts; 36 private readonly Dictionary<string, GradientChart> gradientCharts; 37 private readonly Dictionary<string, DensityChart> densityCharts; 38 private readonly Dictionary<string, Panel> groupingPanels; 39 36 40 private const int Points = 200; 37 38 private IEnumerable<GradientChart> VisibleCharts { 39 get { return gradientChartTableLayout.Controls.OfType<GradientChart>(); } 41 private const int MaxColumns = 4; 42 43 private IEnumerable<string> VisibleVariables { 44 get { 45 foreach (ListViewItem item in variableListView.CheckedItems) 46 yield return item.Text; 47 } 48 } 49 private IEnumerable<GradientChart> VisibleGradientCharts { 50 get { return VisibleVariables.Select(v => gradientCharts[v]); } 51 } 52 private IEnumerable<DensityChart> VisibleDensityCharts { 53 get { return VisibleVariables.Select(v => densityCharts[v]); } 54 } 55 private IEnumerable<Panel> VisibleChartsPanels { 56 get { return VisibleVariables.Select(v => groupingPanels[v]); } 40 57 } 41 58 42 59 public RegressionSolutionTargetResponseGradientView() { 43 60 InitializeComponent(); 44 charts = new Dictionary<string, GradientChart>(); 61 gradientCharts = new Dictionary<string, GradientChart>(); 62 densityCharts = new Dictionary<string, DensityChart>(); 63 groupingPanels = new Dictionary<string, Panel>(); 45 64 46 65 limitView.Content = new DoubleLimit(0, 1); 66 densityComboBox.SelectedIndex = 0; // select None 67 68 // Avoid additional horizontal scrollbar 69 var vertScrollWidth = SystemInformation.VerticalScrollBarWidth; 70 scrollPanel.Padding = new Padding(0, 0, vertScrollWidth, 0); 71 scrollPanel.AutoScroll = true; 47 72 } 48 73 … … 91 116 var variableValues = allowedInputVariables.Select(x => new List<double> { problemData.Dataset.GetDoubleValues(x, problemData.TrainingIndices).Median() }); 92 117 var sharedFixedVariables = new ModifiableDataset(allowedInputVariables, variableValues); 93 // create charts 94 charts.Clear(); 118 119 // create controls 120 gradientCharts.Clear(); 121 densityCharts.Clear(); 122 groupingPanels.Clear(); 95 123 foreach (var variableName in allowedInputVariables) { 96 var gradientChart = new GradientChart { 124 var gradientChart = CreateGradientChart(variableName, sharedFixedVariables); 125 gradientCharts.Add(variableName, gradientChart); 126 127 var densityChart = new DensityChart() { 128 //Dock = DockStyle.Top, 129 //Location = new Point(0, 0), 130 Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right, 131 Margin = Padding.Empty, 132 Height = 12, 133 Visible = false 134 }; 135 densityCharts.Add(variableName, densityChart); 136 137 var panel = new Panel() { 97 138 Dock = DockStyle.Fill, 98 139 Margin = Padding.Empty, 99 ShowLegend = false, 100 ShowCursor = true, 101 ShowXAxisLabel = true, 102 ShowYAxisLabel = true, 103 YAxisTicks = 5, 140 BackColor = Color.White 104 141 }; 105 gradientChart.VariableValueChanged += async (o, e) => { 106 var recalculations = VisibleCharts.Except(new[] { (GradientChart)o }).Select(async chart => { 107 await chart.RecalculateAsync(updateOnFinish: false, resetYAxis: false); 108 }).ToList(); 109 await Task.WhenAll(recalculations); 110 111 if (recalculations.All(t => t.IsCompleted)) 112 SetupYAxis(); 113 }; 114 gradientChart.Configure(new[] { Content }, sharedFixedVariables, variableName, Points); 115 charts[variableName] = gradientChart; 116 } 142 143 panel.Controls.Add(densityChart); 144 panel.Controls.Add(gradientChart); 145 groupingPanels.Add(variableName, panel); 146 } 147 117 148 // update variable list 118 149 variableListView.Items.Clear(); … … 123 154 variableListView.Items[variable].Checked = true; 124 155 } 156 private GradientChart CreateGradientChart(string variableName, ModifiableDataset sharedFixedVariables) { 157 var gradientChart = new GradientChart { 158 Dock = DockStyle.Fill, 159 Margin = Padding.Empty, 160 ShowLegend = false, 161 ShowCursor = true, 162 ShowXAxisLabel = true, 163 ShowYAxisLabel = true, 164 YAxisTicks = 5, 165 }; 166 gradientChart.VariableValueChanged += async (o, e) => { 167 var recalculations = VisibleGradientCharts.Except(new[] { (GradientChart)o }).Select(async chart => { 168 await chart.RecalculateAsync(updateOnFinish: false, resetYAxis: false); 169 }).ToList(); 170 await Task.WhenAll(recalculations); 171 172 if (recalculations.All(t => t.IsCompleted)) 173 SetupYAxis(); 174 }; 175 gradientChart.Configure(new[] { Content }, sharedFixedVariables, variableName, Points); 176 177 return gradientChart; 178 } 125 179 126 180 private void SetupYAxis() { … … 128 182 if (automaticYAxisCheckBox.Checked) { 129 183 double min = double.MaxValue, max = double.MinValue; 130 foreach (var chart in Visible Charts) {184 foreach (var chart in VisibleGradientCharts) { 131 185 if (chart.YMin < min) min = chart.YMin; 132 186 if (chart.YMax > max) max = chart.YMax; … … 140 194 } 141 195 142 foreach (var chart in Visible Charts) {196 foreach (var chart in VisibleGradientCharts) { 143 197 chart.FixedYAxisMin = axisMin; 144 198 chart.FixedYAxisMax = axisMax; 145 chart.Update();146 } 147 } 148 149 // sortchart controls so that they always appear in the same order as in the list view150 // the gradient chart layoutshould be suspended before calling this method151 private void SortControls() {199 //chart.Update(); 200 } 201 } 202 203 // reorder chart controls so that they always appear in the same order as in the list view 204 // the table layout containing the controls should be suspended before calling this method 205 private void ReOrderControls() { 152 206 var tl = gradientChartTableLayout; 153 var indices = variableListView.CheckedItems.Cast<ListViewItem>().ToDictionary(checkedItem => checkedItem.Text, checkedItem => checkedItem.Index);154 var count = tl.Controls.Count;155 var charts = new GradientChart[count];156 for (int i = 0; i < count; ++i) charts[i] = (GradientChart)tl.Controls[i];157 Array.Sort(charts, (a, b) => indices[a.FreeVariable].CompareTo(indices[b.FreeVariable]));158 207 tl.Controls.Clear(); 159 tl.Controls.AddRange(charts); 208 int row = 0, column = 0; 209 foreach (var chartsPanel in VisibleChartsPanels) { 210 tl.Controls.Add(chartsPanel, column, row); 211 column++; 212 if (column == MaxColumns) { 213 row++; 214 column = 0; 215 } 216 } 160 217 } 161 218 162 219 private async void variableListView_ItemChecked(object sender, ItemCheckedEventArgs e) { 163 if (charts == null) return;164 220 var item = e.Item; 165 221 var variable = item.Text; 166 var chart = charts[variable]; 222 var gradientChart = gradientCharts[variable]; 223 var densityChart = densityCharts[variable]; 224 var chartsPanel = groupingPanels[variable]; 167 225 var tl = gradientChartTableLayout; 226 168 227 tl.SuspendLayout(); 169 var columnWidth = tl.GetColumnWidths()[0]; // all columns have the same width 170 var rowHeight = 0.8f * columnWidth; 171 tl.RowStyles.Clear(); 228 172 229 if (item.Checked) { 173 tl.Controls.Add(chart); 174 await chart.RecalculateAsync(); 230 tl.Controls.Add(chartsPanel); 231 await gradientChart.RecalculateAsync(); 232 UpdateDensityChart(densityChart, variable); 175 233 } else { 176 tl.Controls.Remove(chart); 177 } 178 SetupYAxis(); 179 180 var count = tl.Controls.Count; 181 SortControls(); 182 tl.RowCount = count / tl.ColumnCount + (count % tl.ColumnCount == 0 ? 0 : 1); 183 for (int i = 0; i < count; ++i) { 184 var control = tl.Controls[i]; 185 int rowIndex = i / tl.ColumnCount; 186 int columnIndex = i % tl.ColumnCount; 187 tl.SetRow(control, rowIndex); 188 tl.SetColumn(control, columnIndex); 189 } 190 for (int i = 0; i < tl.RowCount; ++i) { 191 tl.RowStyles.Add(new RowStyle(SizeType.Absolute, rowHeight)); 192 } 234 tl.Controls.Remove(chartsPanel); 235 } 236 237 if (tl.Controls.Count > 0) { 238 SetupYAxis(); 239 240 ReOrderControls(); 241 242 // set column styles 243 int numVariables = VisibleVariables.Count(); 244 tl.ColumnCount = Math.Min(numVariables, MaxColumns); 245 tl.ColumnStyles.Clear(); 246 for (int c = 0; c < tl.ColumnCount; c++) 247 tl.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100.0f / tl.ColumnCount)); 248 249 // set column styles 250 tl.RowCount = (int)Math.Ceiling((double)numVariables / tl.ColumnCount); 251 var columnWidth = tl.Width / tl.ColumnCount; // assume all columns have the same width 252 var rowHeight = (int)(0.8 * columnWidth); 253 tl.RowStyles.Clear(); 254 for (int r = 0; r < tl.RowCount; r++) 255 tl.RowStyles.Add(new RowStyle(SizeType.Absolute, rowHeight)); 256 } 257 193 258 tl.ResumeLayout(); 194 259 } … … 204 269 SetupYAxis(); 205 270 } 271 272 private void densityComboBox_SelectedIndexChanged(object sender, EventArgs e) { 273 int si = densityComboBox.SelectedIndex; 274 if (si == 0) { 275 foreach (var densityChart in densityCharts.Values) 276 densityChart.Visible = false; 277 } else { 278 var indices = GetDensityIndices(si).ToList(); 279 280 foreach (var entry in densityCharts) { 281 var variableName = entry.Key; 282 var densityChart = entry.Value; 283 if (!VisibleVariables.Contains(variableName)) 284 continue; 285 UpdateDensityChart(densityChart, variableName, indices); 286 287 } 288 } 289 } 290 private IEnumerable<int> GetDensityIndices(int selectedIndex) { 291 var problemData = Content.ProblemData; 292 return 293 selectedIndex == 1 ? problemData.TrainingIndices : 294 selectedIndex == 2 ? problemData.TestIndices : 295 problemData.AllIndices; 296 } 297 private void UpdateDensityChart(DensityChart densityChart, string variable, IList<int> indices = null) { 298 if (densityComboBox.SelectedIndex == 0) 299 return; 300 if (indices == null) { 301 indices = GetDensityIndices(densityComboBox.SelectedIndex).ToList(); 302 } 303 var data = Content.ProblemData.Dataset.GetDoubleValues(variable, indices).ToList(); 304 var gradientChart = gradientCharts[variable]; 305 var min = gradientChart.FixedXAxisMin; 306 var max = gradientChart.FixedXAxisMax; 307 var buckets = gradientChart.DrawingSteps; 308 if (min.HasValue && max.HasValue) { 309 densityChart.UpdateChart(data, min.Value, max.Value, buckets); 310 densityChart.Width = gradientChart.Width; 311 312 var gcPlotPosition = gradientChart.InnerPlotPosition; 313 densityChart.Left = (int)(gcPlotPosition.X / 100.0 * gradientChart.Width); 314 densityChart.Width = (int)(gcPlotPosition.Width / 100.0 * gradientChart.Width); 315 316 densityChart.Visible = true; 317 } 318 } 206 319 } 207 320 } 321
Note: See TracChangeset
for help on using the changeset viewer.