Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/03/13 15:46:01 (11 years ago)
Author:
ascheibe
Message:

#1730 merged r9587,r9590, r9600, r9607, r9626, r9658, r9659, r9699, r9906 into stable

Location:
stable
Files:
3 edited
1 copied

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views

  • stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/MenuItems/ExportSymbolicSolutionToExcelMenuItem.cs

    r9587 r9931  
    2222using System;
    2323using System.Collections.Generic;
     24using System.ComponentModel;
    2425using System.IO;
    2526using System.Linq;
     
    2728using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views;
    2829using HeuristicLab.MainForm;
     30using HeuristicLab.MainForm.WindowsForms;
    2931using HeuristicLab.Optimizer;
    3032using OfficeOpenXml;
     
    5254
    5355    protected override void OnToolStripItemSet(EventArgs e) {
     56      base.OnToolStripItemSet(e);
    5457      ToolStripItem.Enabled = false;
    55     }
    56     protected override void OnActiveViewChanged(object sender, EventArgs e) {
     58      var menuItem = ToolStripItem.OwnerItem as ToolStripMenuItem;
     59      if (menuItem != null)
     60        menuItem.DropDownOpening += menuItem_DropDownOpening;
     61    }
     62
     63    private void menuItem_DropDownOpening(object sender, EventArgs e) {
    5764      IContentView activeView = MainFormManager.MainForm.ActiveView as IContentView;
    58       ToolStripItem.Enabled = activeView != null && activeView.Content is ISymbolicDataAnalysisSolution;
     65      Control control = activeView as Control;
     66      activeView = control.GetNestedControls((c) => c.Visible)
     67        .OfType<IContentView>().FirstOrDefault(v => v.Content is ISymbolicDataAnalysisSolution && v.Content is IRegressionSolution);
     68      ToolStripItem.Enabled = activeView != null;
    5969    }
    6070
    6171    public override void Execute() {
    62       var activeView = (IContentView)MainFormManager.MainForm.ActiveView;
     72      IContentView activeView = MainFormManager.MainForm.ActiveView as IContentView;
     73      Control control = activeView as Control;
     74      activeView = control.GetNestedControls((c) => c.Visible)
     75        .OfType<IContentView>().First(v => v.Content is ISymbolicDataAnalysisSolution && v.Content is IRegressionSolution);
    6376      var solution = (ISymbolicDataAnalysisSolution)activeView.Content;
    6477      var formatter = new SymbolicDataAnalysisExpressionExcelFormatter();
    65       var formula = formatter.Format(solution.Model.SymbolicExpressionTree);
    66       var formulaParts = formula.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
     78      var formula = formatter.Format(solution.Model.SymbolicExpressionTree, solution.ProblemData.Dataset);
     79      control = (Control)activeView;
     80
    6781
    6882      SaveFileDialog saveFileDialog = new SaveFileDialog();
     
    7185      if (saveFileDialog.ShowDialog() == DialogResult.OK) {
    7286        string fileName = saveFileDialog.FileName;
    73         FileInfo newFile = new FileInfo(fileName);
    74         if (newFile.Exists) {
    75           newFile.Delete();
    76           newFile = new FileInfo(fileName);
     87        using (BackgroundWorker bg = new BackgroundWorker()) {
     88          MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().AddOperationProgressToView(control, "Exportion solution to " + fileName + ".");
     89          bg.DoWork += (b, e) => ExportChart(fileName, solution, formula);
     90          bg.RunWorkerCompleted += (o, e) => MainFormManager.GetMainForm<MainForm.WindowsForms.MainForm>().RemoveOperationProgressFromView(control);
     91          bg.RunWorkerAsync();
    7792        }
    78         using (ExcelPackage package = new ExcelPackage(newFile)) {
    79           ExcelWorksheet modelWorksheet = package.Workbook.Worksheets.Add("Model");
    80           FormatModelSheet(modelWorksheet, solution, formulaParts);
    81 
    82           ExcelWorksheet datasetWorksheet = package.Workbook.Worksheets.Add("Dataset");
    83           WriteDatasetToExcel(datasetWorksheet, solution.ProblemData);
    84 
    85           ExcelWorksheet inputsWorksheet = package.Workbook.Worksheets.Add("Inputs");
    86           WriteInputSheet(inputsWorksheet, datasetWorksheet, formulaParts.Skip(2), solution.ProblemData.Dataset);
    87 
    88           if (solution is IRegressionSolution) {
    89             ExcelWorksheet estimatedWorksheet = package.Workbook.Worksheets.Add("Estimated Values");
    90             WriteEstimatedWorksheet(estimatedWorksheet, datasetWorksheet, formulaParts, solution as IRegressionSolution);
    91 
    92             ExcelWorksheet chartsWorksheet = package.Workbook.Worksheets.Add("Charts");
    93             AddCharts(chartsWorksheet);
    94           }
    95           package.Workbook.Properties.Title = "Excel Export";
    96           package.Workbook.Properties.Author = "HEAL";
    97           package.Workbook.Properties.Comments = "Excel export of a symbolic data analysis solution from HeuristicLab";
    98 
    99           package.Save();
     93      }
     94    }
     95
     96    private void ExportChart(string fileName, ISymbolicDataAnalysisSolution solution, string formula) {
     97      FileInfo newFile = new FileInfo(fileName);
     98      if (newFile.Exists) {
     99        newFile.Delete();
     100        newFile = new FileInfo(fileName);
     101      }
     102      var formulaParts = formula.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
     103
     104      using (ExcelPackage package = new ExcelPackage(newFile)) {
     105        ExcelWorksheet modelWorksheet = package.Workbook.Worksheets.Add("Model");
     106        FormatModelSheet(modelWorksheet, solution, formulaParts);
     107
     108        ExcelWorksheet datasetWorksheet = package.Workbook.Worksheets.Add("Dataset");
     109        WriteDatasetToExcel(datasetWorksheet, solution.ProblemData);
     110
     111        ExcelWorksheet inputsWorksheet = package.Workbook.Worksheets.Add("Inputs");
     112        WriteInputSheet(inputsWorksheet, datasetWorksheet, formulaParts.Skip(2), solution.ProblemData.Dataset);
     113
     114        if (solution is IRegressionSolution) {
     115          ExcelWorksheet estimatedWorksheet = package.Workbook.Worksheets.Add("Estimated Values");
     116          WriteEstimatedWorksheet(estimatedWorksheet, datasetWorksheet, formulaParts, solution as IRegressionSolution);
     117
     118          ExcelWorksheet chartsWorksheet = package.Workbook.Worksheets.Add("Charts");
     119          AddCharts(chartsWorksheet);
    100120        }
     121        package.Workbook.Properties.Title = "Excel Export";
     122        package.Workbook.Properties.Author = "HEAL";
     123        package.Workbook.Properties.Comments = "Excel export of a symbolic data analysis solution from HeuristicLab";
     124
     125        package.Save();
    101126      }
    102127    }
     
    124149      modelWorksheet.Cells[row, 2].Value = solution.Model.LowerEstimationLimit;
    125150      modelWorksheet.Names.Add("EstimationLimitLower", modelWorksheet.Cells[row, 2]);
     151      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    126152      row++;
    127153
     
    129155      modelWorksheet.Cells[row, 2].Value = solution.Model.UpperEstimationLimit;
    130156      modelWorksheet.Names.Add("EstimationLimitUpper", modelWorksheet.Cells[row, 2]);
     157      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    131158      row += 2;
    132159
     
    167194      modelWorksheet.Cells[row, 1].Value = "Pearson's R² (training)";
    168195      modelWorksheet.Cells[row, 2].Formula = string.Format("POWER(PEARSON({0},{1}),2)", excelTrainingTarget, excelTrainingEstimated);
     196      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    169197      row++;
    170198
    171199      modelWorksheet.Cells[row, 1].Value = "Pearson's R² (test)";
    172200      modelWorksheet.Cells[row, 2].Formula = string.Format("POWER(PEARSON({0},{1}),2)", excelTestTarget, excelTestEstimated);
     201      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    173202      row++;
    174203
     
    176205      modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTrainingMSE);
    177206      modelWorksheet.Names.Add("TrainingMSE", modelWorksheet.Cells[row, 2]);
     207      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    178208      row++;
    179209
     
    181211      modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTestMSE);
    182212      modelWorksheet.Names.Add("TestMSE", modelWorksheet.Cells[row, 2]);
     213      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    183214      row++;
    184215
    185216      modelWorksheet.Cells[row, 1].Value = "Mean absolute error (training)";
    186217      modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTrainingAbsoluteError);
     218      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    187219      row++;
    188220
    189221      modelWorksheet.Cells[row, 1].Value = "Mean absolute error (test)";
    190222      modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTestAbsoluteError);
     223      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    191224      row++;
    192225
    193226      modelWorksheet.Cells[row, 1].Value = "Mean error (training)";
    194227      modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTrainingMeanError);
     228      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    195229      row++;
    196230
    197231      modelWorksheet.Cells[row, 1].Value = "Mean error (test)";
    198232      modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTestMeanError);
     233      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    199234      row++;
    200235
     
    211246      modelWorksheet.Cells[row, 1].Value = "Normalized Mean Squared error (training)";
    212247      modelWorksheet.Cells[row, 2].Formula = string.Format("TrainingMSE / VAR({0})", excelTrainingTarget);
     248      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    213249      row++;
    214250
    215251      modelWorksheet.Cells[row, 1].Value = "Normalized Mean Squared error  (test)";
    216252      modelWorksheet.Cells[row, 2].Formula = string.Format("TestMSE / VAR({0})", excelTestTarget);
     253      modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000";
    217254
    218255      modelWorksheet.Cells["A1:B" + row].AutoFitColumns();
     
    300337        estimatedWorksheet.Cells[i + 2, 9].Formula = string.Format(preparedFormula, i + 2);
    301338      }
     339      estimatedWorksheet.Cells["B2:B" + (rows + 1)].Style.Numberformat.Format = "0.000";
    302340
    303341      estimatedWorksheet.Cells["C2:C" + (rows + 1)].Formula = "J2";
    304 
     342      estimatedWorksheet.Cells["C2:C" + (rows + 1)].Style.Numberformat.Format = "0.000";
    305343      estimatedWorksheet.Cells["D2:D" + (rows + 1)].Formula = "ABS(B2 - C2)";
    306       estimatedWorksheet.Cells["E2:E" + (rows + 1)].Formula = "D2 / B2";
     344      estimatedWorksheet.Cells["D2:D" + (rows + 1)].Style.Numberformat.Format = "0.000";
     345      estimatedWorksheet.Cells["E2:E" + (rows + 1)].Formula = "ABS(D2 / B2)";
     346      estimatedWorksheet.Cells["E2:E" + (rows + 1)].Style.Numberformat.Format = "0.000";
    307347      estimatedWorksheet.Cells["F2:F" + (rows + 1)].Formula = "C2 - B2";
     348      estimatedWorksheet.Cells["F2:F" + (rows + 1)].Style.Numberformat.Format = "0.000";
    308349      estimatedWorksheet.Cells["G2:G" + (rows + 1)].Formula = "POWER(F2, 2)";
    309 
     350      estimatedWorksheet.Cells["G2:G" + (rows + 1)].Style.Numberformat.Format = "0.000";
     351
     352      estimatedWorksheet.Cells["I2:I" + (rows + 1)].Style.Numberformat.Format = "0.000";
    310353      estimatedWorksheet.Cells["J2:J" + (rows + 1)].Formula = "IFERROR(IF(I2 > Model!EstimationLimitUpper, Model!EstimationLimitUpper, IF(I2 < Model!EstimationLimitLower, Model!EstimationLimitLower, I2)), AVERAGE(Model!EstimationLimitLower, Model!EstimationLimitUpper))";
     354      estimatedWorksheet.Cells["J2:J" + (rows + 1)].Style.Numberformat.Format = "0.000";
    311355    }
    312356
     
    322366
    323367    private void WriteInputSheet(ExcelWorksheet inputsWorksheet, ExcelWorksheet datasetWorksheet, IEnumerable<string> list, Dataset dataset) {
    324       int rows = dataset.Rows;
    325       var variableNames = dataset.VariableNames.ToList();
    326       int cur = 1;
    327       foreach (var variableMapping in list) {
    328         var varMap = variableMapping.Split(new string[] { " = " }, StringSplitOptions.None);
    329         if (varMap.Count() != 2) throw new ArgumentException("variableMapping is not correct");
    330         int column = variableNames.FindIndex(x => x.Equals(varMap[0])) + 1;
    331         inputsWorksheet.Cells[1, cur].Value = varMap[0];
    332         for (int i = 2; i <= rows + 1; i++) {
    333           inputsWorksheet.Cells[i, cur].Formula = datasetWorksheet.Cells[i, column].FullAddress;
     368      //remark the performance of EPPlus drops dramatically
     369      //if the data is not written row wise (from left to right) due the internal indices used.
     370      var variableNames = dataset.VariableNames.Select((v, i) => new { variable = v, index = i + 1 }).ToDictionary(v => v.variable, v => v.index);
     371      var nameMapping = list.Select(x => x.Split('=')[0].Trim()).ToArray();
     372
     373      for (int row = 1; row <= dataset.Rows + 1; row++) {
     374        for (int column = 1; column < nameMapping.Length + 1; column++) {
     375          int variableIndex = variableNames[nameMapping[column - 1]];
     376          inputsWorksheet.Cells[row, column].Formula = datasetWorksheet.Cells[row, variableIndex].FullAddress;
    334377        }
    335         cur++;
    336378      }
    337379    }
    338380
    339381    private void WriteDatasetToExcel(ExcelWorksheet datasetWorksheet, IDataAnalysisProblemData problemData) {
     382      //remark the performance of EPPlus drops dramatically
     383      //if the data is not written row wise (from left to right) due the internal indices used.
    340384      Dataset dataset = problemData.Dataset;
    341385      var variableNames = dataset.VariableNames.ToList();
    342       for (int col = 1; col <= variableNames.Count; col++) {
     386      var doubleVariables = new HashSet<string>(dataset.DoubleVariables);
     387
     388      for (int col = 1; col <= variableNames.Count; col++)
    343389        datasetWorksheet.Cells[1, col].Value = variableNames[col - 1];
    344         if (dataset.DoubleVariables.Contains(variableNames[col - 1])) {
    345           datasetWorksheet.Cells[2, col].LoadFromCollection(dataset.GetDoubleValues(variableNames[col - 1]));
    346         } else {
    347           var coll = Enumerable.Range(0, dataset.Rows).Select(x => dataset.GetValue(x, col - 1));
    348           datasetWorksheet.Cells[2, col].LoadFromCollection(coll);
     390
     391      for (int row = 0; row < dataset.Rows; row++) {
     392        for (int col = 0; col < variableNames.Count; col++) {
     393          if (doubleVariables.Contains(variableNames[col]))
     394            datasetWorksheet.Cells[row + 2, col + 1].Value = dataset.GetDoubleValue(variableNames[col], row);
     395          else
     396            datasetWorksheet.Cells[row + 2, col + 1].Value = dataset.GetValue(row, col);
    349397        }
    350398      }
Note: See TracChangeset for help on using the changeset viewer.