Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
05/10/16 12:38:08 (8 years ago)
Author:
pfleck
Message:

#2597 Implemented cancellation of chart update when new update is called during calculation.

Location:
branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/GradientChart.Designer.cs

    r13836 r13840  
    3131      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
    3232      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
     33      this.statusLabel = new System.Windows.Forms.Label();
    3334      ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
    3435      this.SuspendLayout();
     
    7071      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
    7172      //
     73      // statusLabel
     74      //
     75      this.statusLabel.BackColor = System.Drawing.Color.White;
     76      this.statusLabel.Image = HeuristicLab.Common.Resources.VSImageLibrary.Timer;
     77      this.statusLabel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
     78      this.statusLabel.Location = new System.Drawing.Point(3, 3);
     79      this.statusLabel.Margin = new System.Windows.Forms.Padding(0);
     80      this.statusLabel.Name = "statusLabel";
     81      this.statusLabel.Size = new System.Drawing.Size(17, 17);
     82      this.statusLabel.TabIndex = 1;
     83      this.statusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
     84      this.statusLabel.Visible = false;
     85      //
    7286      // GradientChart
    7387      //
    7488      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    7589      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
     90      this.Controls.Add(this.statusLabel);
    7691      this.Controls.Add(this.chart);
    7792      this.Name = "GradientChart";
     
    85100
    86101    private HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
     102    private System.Windows.Forms.Label statusLabel;
    87103  }
    88104}
  • branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/GradientChart.cs

    r13837 r13840  
    2525using System.Globalization;
    2626using System.Linq;
     27using System.Threading;
    2728using System.Threading.Tasks;
    2829using System.Windows.Forms;
     
    3738    private ModifiableDataset internalDataset; // holds the x values for each point drawn
    3839
     40    private CancellationTokenSource cancelCurrentRefresh;
     41
    3942    public bool ShowLegend {
    4043      get { return chart.Legends[0].Enabled; }
     
    5760    public int XAxisTicks {
    5861      get { return xAxisTicks; }
    59       set { if (xAxisTicks != value) { xAxisTicks = value; UpdateChartAsync(); } }
     62      set { if (xAxisTicks != value) { xAxisTicks = value; UpdateChart(); } }
    6063    }
    6164    private int yAxisTicks = 5;
    6265    public int YXAxisTicks {
    6366      get { return yAxisTicks; }
    64       set { if (yAxisTicks != value) { yAxisTicks = value; UpdateChartAsync(); } }
     67      set { if (yAxisTicks != value) { yAxisTicks = value; UpdateChart(); } }
    6568    }
    6669
     
    6871    public double TrainingMin {
    6972      get { return trainingMin; }
    70       set { if (!value.IsAlmost(trainingMin)) { trainingMin = value; UpdateChartAsync(); } }
     73      set { if (!value.IsAlmost(trainingMin)) { trainingMin = value; UpdateChart(); } }
    7174    }
    7275    private double trainingMax = double.MaxValue;
    7376    public double TrainingMax {
    7477      get { return trainingMax; }
    75       set { if (!value.IsAlmost(trainingMax)) { trainingMax = value; UpdateChartAsync(); } }
     78      set { if (!value.IsAlmost(trainingMax)) { trainingMax = value; UpdateChart(); } }
    7679    }
    7780
     
    7982    public int DrawingSteps {
    8083      get { return drawingSteps; }
    81       set { if (value != drawingSteps) { drawingSteps = value; UpdateChartAsync(); } }
     84      set { if (value != drawingSteps) { drawingSteps = value; UpdateChart(); } }
    8285    }
    8386
     
    9295        freeVariable = value;
    9396        RecalculateInternalDataset();
    94         UpdateChartAsync();
     97        UpdateChart();
    9598      }
    9699    }
     
    117120      chart.ChartAreas[0].AxisY.ScaleView.Zoomable = true;
    118121      chart.ChartAreas[0].CursorY.Interval = 0;
     122
     123      Disposed +=GradientChart_Disposed;
     124    }
     125
     126    private void GradientChart_Disposed(object sender, EventArgs e) {
     127      if (cancelCurrentRefresh != null) {
     128        if (cancelCurrentRefresh.IsCancellationRequested)
     129          cancelCurrentRefresh.Cancel();
     130        cancelCurrentRefresh.Dispose();
     131      }
    119132    }
    120133
     
    175188    }
    176189
    177     public async Task UpdateChartAsync() {
     190    public async void UpdateChart() {
    178191      // throw exceptions?
    179192      if (sharedFixedVariables == null || solutions == null || !solutions.Any())
     
    181194      if (trainingMin.IsAlmost(trainingMax) || trainingMin > trainingMax || drawingSteps == 0)
    182195        return;
     196      if (IsDisposed)
     197        return;
     198
     199      statusLabel.Visible = true;
     200
     201      if (cancelCurrentRefresh != null && !cancelCurrentRefresh.IsCancellationRequested)
     202        cancelCurrentRefresh.Cancel();
     203      cancelCurrentRefresh = new CancellationTokenSource();
    183204
    184205      // Set cursor
     
    194215      axis.Interval = axisInterval;
    195216
     217      var cancellationToken = cancelCurrentRefresh.Token;
    196218      // Create series <mean, conf. interval>
    197219      var seriesDict = new Dictionary<Series, Series>();
    198       for (int i = 0; i < solutions.Count; ++i) {
     220      for (int i = 0; i < solutions.Count; i++) {
    199221        var solution = solutions[i];
    200         var series = await CreateSeriesAsync(solution);
    201         series.Item1.Tag = i; // for sorting
    202         var meanSeries = series.Item1;
    203         var confidenceIntervalSeries = series.Item2;
    204         meanSeries.Name = solution.ProblemData.TargetVariable + " " + i;
    205         seriesDict.Add(meanSeries, confidenceIntervalSeries);
    206         if (confidenceIntervalSeries != null)
    207           confidenceIntervalSeries.Name = "95% Conf. Interval " + meanSeries.Name;
     222        try {
     223          var series = await CreateSeriesAsync(solution, cancellationToken);
     224          if (cancellationToken.IsCancellationRequested)
     225            return;
     226          series.Item1.Tag = i; // for sorting
     227          var meanSeries = series.Item1;
     228          var confidenceIntervalSeries = series.Item2;
     229          meanSeries.Name = solution.ProblemData.TargetVariable + " " + i;
     230          seriesDict.Add(meanSeries, confidenceIntervalSeries);
     231          if (confidenceIntervalSeries != null)
     232            confidenceIntervalSeries.Name = "95% Conf. Interval " + meanSeries.Name;
     233        }
     234        catch (TaskCanceledException) {
     235          return;
     236        }
    208237      }
    209238
     
    229258
    230259
    231       // calculate Y-axis interval
     260      ////calculate Y-axis interval
    232261      //double ymin = 0, ymax = 0;
    233262      //foreach (var vs in chart.Series.SelectMany(series => series.Points.Select(s => s.YValues))) {
     
    249278
    250279      UpdateStripLines();
    251     }
    252 
    253     private Task<Tuple<Series, Series>> CreateSeriesAsync(IRegressionSolution solution) {
     280
     281      statusLabel.Visible = false;
     282    }
     283
     284    private Task<Tuple<Series, Series>> CreateSeriesAsync(IRegressionSolution solution, CancellationToken cancellationToken) {
    254285      return Task.Run(() => {
    255286        var xvalues = internalDataset.GetDoubleValues(FreeVariable).ToList();
     
    270301          confidenceIntervalSeries.Points.DataBindXY(xvalues, lower, upper);
    271302        }
    272 
    273303        return Tuple.Create(series, confidenceIntervalSeries);
    274       });
     304      }, cancellationToken);
    275305    }
    276306
     
    281311      solutions.Add(solution);
    282312      RecalculateTrainingLimits();
    283       UpdateChartAsync();
     313      UpdateChart();
    284314    }
    285315    public void RemoveSolution(IRegressionSolution solution) {
    286316      if (!solutions.Remove(solution)) return;
    287317      RecalculateTrainingLimits();
    288       UpdateChartAsync();
     318      UpdateChart();
    289319    }
    290320
     
    324354
    325355    private void chart_AnnotationPositionChanged(object sender, EventArgs e) {
    326       var annotation = VerticalLineAnnotation;
    327       var x = annotation.X;
    328       sharedFixedVariables.SetVariableValue(x, FreeVariable, 0);
    329 
    330       chart.ChartAreas[0].AxisX.Title = FreeVariable + " : " + x.ToString("N3", CultureInfo.CurrentCulture);
    331       chart.Update();
    332 
    333       OnVariableValueChanged(this, EventArgs.Empty);
     356      //var annotation = VerticalLineAnnotation;
     357      //var x = annotation.X;
     358      //sharedFixedVariables.SetVariableValue(x, FreeVariable, 0);
     359
     360      //chart.ChartAreas[0].AxisX.Title = FreeVariable + " : " + x.ToString("N3", CultureInfo.CurrentCulture);
     361      //chart.Update();
     362
     363      //OnVariableValueChanged(this, EventArgs.Empty);
    334364    }
    335365
    336366    private void chart_AnnotationPositionChanging(object sender, AnnotationPositionChangingEventArgs e) {
    337       //var step = (trainingMax - trainingMin) / drawingSteps;
    338       //e.NewLocationX = step * (long)Math.Round(e.NewLocationX / step);
    339       //var axisX = chart.ChartAreas[0].AxisX;
    340       //if (e.NewLocationX > axisX.Maximum)
    341       //  e.NewLocationX = axisX.Maximum;
    342       //if (e.NewLocationX < axisX.Minimum)
    343       //  e.NewLocationX = axisX.Minimum;
     367      var step = (trainingMax - trainingMin) / drawingSteps;
     368      e.NewLocationX = step * (long)Math.Round(e.NewLocationX / step);
     369      var axisX = chart.ChartAreas[0].AxisX;
     370      if (e.NewLocationX > axisX.Maximum)
     371        e.NewLocationX = axisX.Maximum;
     372      if (e.NewLocationX < axisX.Minimum)
     373        e.NewLocationX = axisX.Minimum;
    344374
    345375      var annotation = VerticalLineAnnotation;
  • branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionGradientView.cs

    r13837 r13840  
    8787      sharedFixedVariables = new ModifiableDataset(variableNames, newTrackbars.Select(tb => new List<double>(1) { (double)tb.Value }));
    8888      gradientChart.Configure(new[] { Content }, sharedFixedVariables, variableNames.First(), DrawingSteps);
    89       gradientChart.UpdateChartAsync();
     89      gradientChart.UpdateChart();
    9090
    9191      // Add to table and observable lists     
     
    149149    }
    150150
    151     private async void trackbar_ValueChanged(object sender, EventArgs e) {
     151    private void trackbar_ValueChanged(object sender, EventArgs e) {
    152152      var trackBar = sender as DensityTrackbar;
    153153      if (trackBar == null) return;
    154154      sharedFixedVariables.SetVariableValue((double)trackBar.Value, variableNames[trackbars.IndexOf(trackBar)], 0);
    155       await gradientChart.UpdateChartAsync();
     155      gradientChart.UpdateChart();
    156156    }
    157157
  • branches/HeuristicLab.RegressionSolutionGradientView/HeuristicLab.Problems.DataAnalysis.Views/3.4/RegressionSolutionTargetResponseGradientView.cs

    r13837 r13840  
    7373          ShowYAxisLabel = true,
    7474        };
    75         gradientChart.VariableValueChanged += async (o, e) => {
     75        gradientChart.VariableValueChanged += (o, e) => {
    7676          foreach (var chart in gradientChartTableLayout.Controls.Cast<GradientChart>()) {
    7777            if (chart == (GradientChart)o) continue;
    78             await chart.UpdateChartAsync();
     78            chart.UpdateChart();
    7979          }
    8080        };
     
    9999    }
    100100
    101     private async void variableListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
     101    private void variableListView_ItemChecked(object sender, ItemCheckedEventArgs e) {
    102102      if (charts == null) return;
    103103      var item = e.Item;
     
    111111      if (item.Checked) {
    112112        tl.Controls.Add(chart);
    113         await chart.UpdateChartAsync();
     113        chart.UpdateChart();
    114114      } else {
    115115        tl.Controls.Remove(chart);
Note: See TracChangeset for help on using the changeset viewer.