Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/26/15 18:26:57 (9 years ago)
Author:
gkronber
Message:

#2452: merged r13002:13004 from trunk to stable

Location:
stable
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.Problems.DataAnalysis.Views

  • stable/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.cs

    r12668 r13062  
    2525using System.Windows.Forms;
    2626using System.Windows.Forms.DataVisualization.Charting;
     27using HeuristicLab.Algorithms.DataAnalysis;
    2728using HeuristicLab.Common;
    2829using HeuristicLab.MainForm;
     30using HeuristicLab.Optimization;
    2931
    3032namespace HeuristicLab.Problems.DataAnalysis.Views {
     
    6264    }
    6365
     66    // the view holds one regression solution as content but also contains several other regression solutions for comparison
     67    // the following invariants must hold
     68    // (Solutions.IsEmpty && Content == null) ||
     69    // (Solutions[0] == Content && Solutions.All(s => s.ProblemData.TargetVariable == Content.TargetVariable))
     70
    6471    public new IRegressionSolution Content {
    6572      get { return (IRegressionSolution)base.Content; }
    6673      set { base.Content = value; }
    6774    }
     75
     76    private readonly IList<IRegressionSolution> solutions = new List<IRegressionSolution>();
     77    public IEnumerable<IRegressionSolution> Solutions {
     78      get { return solutions.AsEnumerable(); }
     79    }
     80
    6881    public IRegressionProblemData ProblemData {
    6982      get {
     
    8699    protected virtual void Content_ModelChanged(object sender, EventArgs e) {
    87100      if (InvokeRequired) Invoke((Action<object, EventArgs>)Content_ModelChanged, sender, e);
    88       else UpdateChart();
     101      else {
     102        // recalculate baseline solutions (for symbolic regression models the features used in the model might have changed)
     103        solutions.Clear(); // remove all
     104        solutions.Add(Content); // re-add the first solution
     105        // and recalculate all other solutions
     106        foreach (var sol in CreateBaselineSolutions()) {
     107          solutions.Add(sol);
     108        }
     109        UpdateChart();
     110      }
    89111    }
    90112    protected virtual void Content_ProblemDataChanged(object sender, EventArgs e) {
    91113      if (InvokeRequired) Invoke((Action<object, EventArgs>)Content_ProblemDataChanged, sender, e);
    92114      else {
     115        // recalculate baseline solutions
     116        solutions.Clear(); // remove all
     117        solutions.Add(Content); // re-add the first solution
     118        // and recalculate all other solutions
     119        foreach (var sol in CreateBaselineSolutions()) {
     120          solutions.Add(sol);
     121        }
    93122        UpdateChart();
    94123      }
     
    96125    protected override void OnContentChanged() {
    97126      base.OnContentChanged();
     127      // the content object is always stored as the first element in solutions
     128      solutions.Clear();
     129      ReadOnly = Content == null;
     130      if (Content != null) {
     131        // recalculate all solutions
     132        solutions.Add(Content);
     133        if (ProblemData.TrainingIndices.Any()) {
     134          foreach (var sol in CreateBaselineSolutions())
     135            solutions.Add(sol);
     136          // more solutions can be added by drag&drop
     137        }
     138      }
    98139      UpdateChart();
    99140    }
     
    109150      if (cmbSamples.SelectedItem.ToString() == TestSamples && !ProblemData.TestIndices.Any()) return;
    110151
    111       if (Content.ProblemData.TrainingIndices.Any()) {
    112         AddRegressionSolution(CreateConstantSolution());
    113       }
    114 
    115       AddRegressionSolution(Content);
     152      foreach (var sol in Solutions) {
     153        AddSeries(sol);
     154      }
    116155
    117156      chart.ChartAreas[0].AxisX.Title = residualComboBox.SelectedItem.ToString();
    118157    }
    119158
    120     protected void AddRegressionSolution(IRegressionSolution solution) {
     159    protected void AddSeries(IRegressionSolution solution) {
    121160      if (chart.Series.Any(s => s.Name == solution.Name)) return;
    122161
     
    239278    }
    240279
    241     #region Baseline
    242280    private void Chart_MouseDoubleClick(object sender, MouseEventArgs e) {
    243281      HitTestResult result = chart.HitTest(e.X, e.Y);
     
    247285    }
    248286
    249     private ConstantRegressionSolution CreateConstantSolution() {
     287    protected virtual IEnumerable<IRegressionSolution> CreateBaselineSolutions() {
     288      yield return CreateConstantSolution();
     289      yield return CreateLinearSolution();
     290    }
     291
     292    private IRegressionSolution CreateConstantSolution() {
    250293      double averageTrainingTarget = ProblemData.Dataset.GetDoubleValues(ProblemData.TargetVariable, ProblemData.TrainingIndices).Average();
    251294      var model = new ConstantRegressionModel(averageTrainingTarget);
    252295      var solution = new ConstantRegressionSolution(model, (IRegressionProblemData)ProblemData.Clone());
    253       solution.Name = "Baseline";
     296      solution.Name = "Baseline (constant)";
    254297      return solution;
    255298    }
    256     #endregion
     299    private IRegressionSolution CreateLinearSolution() {
     300      double rmsError, cvRmsError;
     301      var solution = LinearRegression.CreateLinearRegressionSolution((IRegressionProblemData)ProblemData.Clone(), out rmsError, out cvRmsError);
     302      solution.Name = "Baseline (linear)";
     303      return solution;
     304    }
    257305
    258306    private void chart_MouseMove(object sender, MouseEventArgs e) {
     
    265313    }
    266314
     315    private void chart_DragDrop(object sender, DragEventArgs e) {
     316      if (e.Data.GetDataPresent(HeuristicLab.Common.Constants.DragDropDataFormat)) {
     317
     318        var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
     319        var dataAsRegressionSolution = data as IRegressionSolution;
     320        var dataAsResult = data as IResult;
     321
     322        if (dataAsRegressionSolution != null) {
     323          solutions.Add((IRegressionSolution)dataAsRegressionSolution.Clone());
     324        } else if (dataAsResult != null && dataAsResult.Value is IRegressionSolution) {
     325          solutions.Add((IRegressionSolution)dataAsResult.Value.Clone());
     326        }
     327
     328        UpdateChart();
     329      }
     330    }
     331
     332    private void chart_DragEnter(object sender, DragEventArgs e) {
     333      e.Effect = DragDropEffects.None;
     334      if (!e.Data.GetDataPresent(HeuristicLab.Common.Constants.DragDropDataFormat)) return;
     335
     336      var data = e.Data.GetData(HeuristicLab.Common.Constants.DragDropDataFormat);
     337      var dataAsRegressionSolution = data as IRegressionSolution;
     338      var dataAsResult = data as IResult;
     339
     340      if (!ReadOnly &&
     341        (dataAsRegressionSolution != null || (dataAsResult != null && dataAsResult.Value is IRegressionSolution))) {
     342        e.Effect = DragDropEffects.Copy;
     343      }
     344    }
     345
    267346    private void residualComboBox_SelectedIndexChanged(object sender, EventArgs e) {
    268347      UpdateChart();
Note: See TracChangeset for help on using the changeset viewer.