Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/08/16 14:40:02 (8 years ago)
Author:
gkronber
Message:

#2434: merged trunk changes r12934:14026 from trunk to branch

Location:
branches/crossvalidation-2434
Files:
8 edited
2 copied

Legend:

Unmodified
Added
Removed
  • branches/crossvalidation-2434

  • branches/crossvalidation-2434/HeuristicLab.Problems.DataAnalysis.Views

  • branches/crossvalidation-2434/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionEnsembleSolutionModelView.cs

    r12012 r14029  
    6363      protected override void SetEnabledStateOfControls() {
    6464        base.SetEnabledStateOfControls();
    65         addButton.Enabled = Content != null && !Content.IsReadOnly && !Locked;
    66         removeButton.Enabled = Content != null && !Content.IsReadOnly && !Locked && itemsListView.SelectedItems.Count > 0;
     65        addButton.Enabled = false;
     66        removeButton.Enabled = Content != null && !Content.IsReadOnly && !Locked && !ReadOnly && itemsListView.SelectedItems.Count > 0;
    6767        itemsListView.Enabled = Content != null && !Locked;
    6868        detailsGroupBox.Enabled = Content != null && itemsListView.SelectedItems.Count == 1;
     69        sortAscendingButton.Enabled = false;
     70        sortDescendingButton.Enabled = false;
    6971      }
     72
     73      //forbid sorting
     74      protected override void SortItemsListView(SortOrder sortOrder) { }
    7075
    7176      protected override void itemsListView_DragEnter(object sender, DragEventArgs e) {
  • branches/crossvalidation-2434/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.Designer.cs

    r12493 r14029  
    4646    private void InitializeComponent() {
    4747      this.components = new System.ComponentModel.Container();
    48       System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea2 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
    49       System.Windows.Forms.DataVisualization.Charting.Legend legend2 = new System.Windows.Forms.DataVisualization.Charting.Legend();
     48      System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
     49      System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();
    5050      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
    5151      this.label1 = new System.Windows.Forms.Label();
     
    5757      // chart
    5858      //
     59      this.chart.AllowDrop = true;
    5960      this.chart.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
    6061            | System.Windows.Forms.AnchorStyles.Left)
    6162            | System.Windows.Forms.AnchorStyles.Right)));
    62       chartArea2.Name = "ChartArea1";
    63       this.chart.ChartAreas.Add(chartArea2);
    64       legend2.Alignment = System.Drawing.StringAlignment.Center;
    65       legend2.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
    66       legend2.Name = "Legend1";
    67       this.chart.Legends.Add(legend2);
     63      chartArea1.Name = "ChartArea1";
     64      this.chart.ChartAreas.Add(chartArea1);
     65      legend1.Alignment = System.Drawing.StringAlignment.Center;
     66      legend1.Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top;
     67      legend1.Name = "Legend1";
     68      this.chart.Legends.Add(legend1);
    6869      this.chart.Location = new System.Drawing.Point(6, 28);
    6970      this.chart.Name = "chart";
     
    7172      this.chart.TabIndex = 0;
    7273      this.chart.Text = "chart";
     74      this.chart.DragDrop += new System.Windows.Forms.DragEventHandler(this.chart_DragDrop);
     75      this.chart.DragEnter += new System.Windows.Forms.DragEventHandler(this.chart_DragEnter);
    7376      this.chart.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.Chart_MouseDoubleClick);
    7477      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
  • branches/crossvalidation-2434/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionErrorCharacteristicsCurveView.cs

    r12642 r14029  
    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();
    251       var model = new ConstantRegressionModel(averageTrainingTarget);
    252       var solution = new ConstantRegressionSolution(model, (IRegressionProblemData)ProblemData.Clone());
    253       solution.Name = "Baseline";
     294      var model = new ConstantModel(averageTrainingTarget, ProblemData.TargetVariable);
     295      var solution = model.CreateRegressionSolution(ProblemData);
     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();
  • branches/crossvalidation-2434/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionEstimatedValuesView.cs

    r12012 r14029  
    2525using HeuristicLab.Data.Views;
    2626using HeuristicLab.MainForm;
    27 using HeuristicLab.MainForm.WindowsForms;
    2827
    2928namespace HeuristicLab.Problems.DataAnalysis.Views {
     
    6867    }
    6968
    70     private void Content_ProblemDataChanged(object sender, EventArgs e) {
     69    protected virtual void Content_ProblemDataChanged(object sender, EventArgs e) {
    7170      OnContentChanged();
    7271    }
    7372
    74     private void Content_ModelChanged(object sender, EventArgs e) {
     73    protected virtual void Content_ModelChanged(object sender, EventArgs e) {
    7574      OnContentChanged();
    7675    }
     
    8180    }
    8281
    83     private void UpdateEstimatedValues() {
     82    protected virtual StringMatrix CreateValueMatrix() {
     83      string[,] values = new string[Content.ProblemData.Dataset.Rows, 7];
     84
     85      double[] target = Content.ProblemData.Dataset.GetDoubleValues(Content.ProblemData.TargetVariable).ToArray();
     86      var estimated = Content.EstimatedValues.GetEnumerator();
     87      var estimated_training = Content.EstimatedTrainingValues.GetEnumerator();
     88      var estimated_test = Content.EstimatedTestValues.GetEnumerator();
     89
     90      foreach (var row in Content.ProblemData.TrainingIndices) {
     91        estimated_training.MoveNext();
     92        values[row, 3] = estimated_training.Current.ToString();
     93      }
     94
     95      foreach (var row in Content.ProblemData.TestIndices) {
     96        estimated_test.MoveNext();
     97        values[row, 4] = estimated_test.Current.ToString();
     98      }
     99
     100      foreach (var row in Enumerable.Range(0, Content.ProblemData.Dataset.Rows)) {
     101        estimated.MoveNext();
     102        double est = estimated.Current;
     103        double res = Math.Abs(est - target[row]);
     104        values[row, 0] = row.ToString();
     105        values[row, 1] = target[row].ToString();
     106        values[row, 2] = est.ToString();
     107        values[row, 5] = Math.Abs(res).ToString();
     108        values[row, 6] = Math.Abs(res / target[row]).ToString();
     109      }
     110
     111      var matrix = new StringMatrix(values);
     112      matrix.ColumnNames = new string[] { "Id", TARGETVARIABLE_SERIES_NAME, ESTIMATEDVALUES_SERIES_NAME, ESTIMATEDVALUES_TRAINING_SERIES_NAME, ESTIMATEDVALUES_TEST_SERIES_NAME, "Absolute Error (all)", "Relative Error (all)" };
     113      matrix.SortableView = true;
     114      return matrix;
     115    }
     116
     117    protected virtual void UpdateEstimatedValues() {
    84118      if (InvokeRequired) Invoke((Action)UpdateEstimatedValues);
    85119      else {
    86120        StringMatrix matrix = null;
    87121        if (Content != null) {
    88           string[,] values = new string[Content.ProblemData.Dataset.Rows, 7];
    89 
    90           double[] target = Content.ProblemData.Dataset.GetDoubleValues(Content.ProblemData.TargetVariable).ToArray();
    91           var estimated = Content.EstimatedValues.GetEnumerator();
    92           var estimated_training = Content.EstimatedTrainingValues.GetEnumerator();
    93           var estimated_test = Content.EstimatedTestValues.GetEnumerator();
    94 
    95           foreach (var row in Content.ProblemData.TrainingIndices) {
    96             estimated_training.MoveNext();
    97             values[row, 3] = estimated_training.Current.ToString();
    98           }
    99 
    100           foreach (var row in Content.ProblemData.TestIndices) {
    101             estimated_test.MoveNext();
    102             values[row, 4] = estimated_test.Current.ToString();
    103           }
    104 
    105           foreach (var row in Enumerable.Range(0, Content.ProblemData.Dataset.Rows)) {
    106             estimated.MoveNext();
    107             double est = estimated.Current;
    108             double res = Math.Abs(est - target[row]);
    109             values[row, 0] = row.ToString();
    110             values[row, 1] = target[row].ToString();
    111             values[row, 2] = est.ToString();
    112             values[row, 5] = Math.Abs(res).ToString();
    113             values[row, 6] = Math.Abs(res / target[row]).ToString();
    114           }
    115 
    116           matrix = new StringMatrix(values);
    117           matrix.ColumnNames = new string[] { "Id", TARGETVARIABLE_SERIES_NAME, ESTIMATEDVALUES_SERIES_NAME, ESTIMATEDVALUES_TRAINING_SERIES_NAME, ESTIMATEDVALUES_TEST_SERIES_NAME, "Absolute Error (all)", "Relative Error (all)" };
    118           matrix.SortableView = true;
     122          matrix = CreateValueMatrix();
    119123        }
    120124        matrixView.Content = matrix;
  • branches/crossvalidation-2434/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionLineChartView.cs

    r12012 r14029  
    2626using System.Windows.Forms.DataVisualization.Charting;
    2727using HeuristicLab.MainForm;
     28using HeuristicLab.Visualization.ChartControlsExtensions;
    2829
    2930namespace HeuristicLab.Problems.DataAnalysis.Views {
     
    9697        this.ToggleSeriesData(this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME]);
    9798
     99        // set the y-axis bounds
     100        var axisY = this.chart.ChartAreas[0].AxisY;
     101        double min = double.MaxValue, max = double.MinValue;
     102        foreach (var point in chart.Series.SelectMany(x => x.Points)) {
     103          if (!point.YValues.Any() || double.IsInfinity(point.YValues[0]) || double.IsNaN(point.YValues[0]))
     104            continue;
     105          var y = point.YValues[0];
     106          if (y < min)
     107            min = y;
     108          if (y > max)
     109            max = y;
     110        }
     111
     112        double axisMin, axisMax, axisInterval;
     113        ChartUtil.CalculateOptimalAxisInterval(min, max, out axisMin, out axisMax, out axisInterval);
     114        axisY.Minimum = axisMin;
     115        axisY.Maximum = axisMax;
     116        axisY.Interval = axisInterval;
     117
    98118        UpdateCursorInterval();
    99119        this.UpdateStripLines();
  • branches/crossvalidation-2434/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionScatterPlotView.cs

    r12509 r14029  
    2626using HeuristicLab.MainForm;
    2727using HeuristicLab.MainForm.WindowsForms;
     28using HeuristicLab.Visualization.ChartControlsExtensions;
    2829
    2930namespace HeuristicLab.Problems.DataAnalysis.Views {
     
    3536    private const string TEST_SERIES = "Test samples";
    3637
     38    private const int OPACITY_LEVEL = 150;
     39
    3740    public new IRegressionSolution Content {
    3841      get { return (IRegressionSolution)base.Content; }
     
    5962      this.chart.TextAntiAliasingQuality = TextAntiAliasingQuality.High;
    6063      this.chart.AxisViewChanged += new EventHandler<System.Windows.Forms.DataVisualization.Charting.ViewEventArgs>(chart_AxisViewChanged);
     64
     65      //make series colors semi transparent
     66      this.chart.ApplyPaletteColors();
     67      this.chart.Series[ALL_SERIES].Color = Color.FromArgb(OPACITY_LEVEL, this.chart.Series[ALL_SERIES].Color);
     68      this.chart.Series[TRAINING_SERIES].Color = Color.FromArgb(OPACITY_LEVEL, this.chart.Series[TRAINING_SERIES].Color);
     69      this.chart.Series[TEST_SERIES].Color = Color.FromArgb(OPACITY_LEVEL, this.chart.Series[TEST_SERIES].Color);
     70
     71      //change all markers to circles
     72      this.chart.Series[ALL_SERIES].MarkerStyle = MarkerStyle.Circle;
     73      this.chart.Series[TRAINING_SERIES].MarkerStyle = MarkerStyle.Circle;
     74      this.chart.Series[TEST_SERIES].MarkerStyle = MarkerStyle.Circle;
    6175
    6276      //configure axis
     
    156170        double min = Content.EstimatedTrainingValues.Concat(Content.EstimatedTestValues.Concat(Content.EstimatedValues.Concat(dataset.GetDoubleValues(targetVariableName)))).Min();
    157171
    158         max = max + 0.2 * Math.Abs(max);
    159         min = min - 0.2 * Math.Abs(min);
    160 
    161         double interestingValuesRange = max - min;
    162         int digits = Math.Max(0, 3 - (int)Math.Log10(interestingValuesRange));
    163 
    164         max = Math.Round(max, digits);
    165         min = Math.Round(min, digits);
    166 
    167         this.chart.ChartAreas[0].AxisX.Maximum = max;
    168         this.chart.ChartAreas[0].AxisX.Minimum = min;
    169         this.chart.ChartAreas[0].AxisY.Maximum = max;
    170         this.chart.ChartAreas[0].AxisY.Minimum = min;
     172        double axisMin, axisMax, axisInterval;
     173        ChartUtil.CalculateOptimalAxisInterval(min, max, out axisMin, out axisMax, out axisInterval);
     174        this.chart.ChartAreas[0].AxisX.Maximum = axisMax;
     175        this.chart.ChartAreas[0].AxisX.Minimum = axisMin;
     176        this.chart.ChartAreas[0].AxisX.Interval = axisInterval;
     177        this.chart.ChartAreas[0].AxisY.Maximum = axisMax;
     178        this.chart.ChartAreas[0].AxisY.Minimum = axisMin;
     179        this.chart.ChartAreas[0].AxisY.Interval = axisInterval;
     180
    171181        UpdateCursorInterval();
    172182      }
Note: See TracChangeset for help on using the changeset viewer.