Changeset 9931 for stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/MenuItems/ExportSymbolicSolutionToExcelMenuItem.cs
- Timestamp:
- 09/03/13 15:46:01 (11 years ago)
- Location:
- stable
- Files:
-
- 3 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 9587,9590,9600,9607,9626,9658-9659,9699,9906
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views
- Property svn:mergeinfo changed
-
stable/HeuristicLab.Problems.DataAnalysis.Symbolic.Views/3.4/MenuItems/ExportSymbolicSolutionToExcelMenuItem.cs
r9587 r9931 22 22 using System; 23 23 using System.Collections.Generic; 24 using System.ComponentModel; 24 25 using System.IO; 25 26 using System.Linq; … … 27 28 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Views; 28 29 using HeuristicLab.MainForm; 30 using HeuristicLab.MainForm.WindowsForms; 29 31 using HeuristicLab.Optimizer; 30 32 using OfficeOpenXml; … … 52 54 53 55 protected override void OnToolStripItemSet(EventArgs e) { 56 base.OnToolStripItemSet(e); 54 57 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) { 57 64 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; 59 69 } 60 70 61 71 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); 63 76 var solution = (ISymbolicDataAnalysisSolution)activeView.Content; 64 77 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 67 81 68 82 SaveFileDialog saveFileDialog = new SaveFileDialog(); … … 71 85 if (saveFileDialog.ShowDialog() == DialogResult.OK) { 72 86 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(); 77 92 } 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); 100 120 } 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(); 101 126 } 102 127 } … … 124 149 modelWorksheet.Cells[row, 2].Value = solution.Model.LowerEstimationLimit; 125 150 modelWorksheet.Names.Add("EstimationLimitLower", modelWorksheet.Cells[row, 2]); 151 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 126 152 row++; 127 153 … … 129 155 modelWorksheet.Cells[row, 2].Value = solution.Model.UpperEstimationLimit; 130 156 modelWorksheet.Names.Add("EstimationLimitUpper", modelWorksheet.Cells[row, 2]); 157 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 131 158 row += 2; 132 159 … … 167 194 modelWorksheet.Cells[row, 1].Value = "Pearson's R² (training)"; 168 195 modelWorksheet.Cells[row, 2].Formula = string.Format("POWER(PEARSON({0},{1}),2)", excelTrainingTarget, excelTrainingEstimated); 196 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 169 197 row++; 170 198 171 199 modelWorksheet.Cells[row, 1].Value = "Pearson's R² (test)"; 172 200 modelWorksheet.Cells[row, 2].Formula = string.Format("POWER(PEARSON({0},{1}),2)", excelTestTarget, excelTestEstimated); 201 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 173 202 row++; 174 203 … … 176 205 modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTrainingMSE); 177 206 modelWorksheet.Names.Add("TrainingMSE", modelWorksheet.Cells[row, 2]); 207 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 178 208 row++; 179 209 … … 181 211 modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTestMSE); 182 212 modelWorksheet.Names.Add("TestMSE", modelWorksheet.Cells[row, 2]); 213 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 183 214 row++; 184 215 185 216 modelWorksheet.Cells[row, 1].Value = "Mean absolute error (training)"; 186 217 modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTrainingAbsoluteError); 218 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 187 219 row++; 188 220 189 221 modelWorksheet.Cells[row, 1].Value = "Mean absolute error (test)"; 190 222 modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTestAbsoluteError); 223 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 191 224 row++; 192 225 193 226 modelWorksheet.Cells[row, 1].Value = "Mean error (training)"; 194 227 modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTrainingMeanError); 228 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 195 229 row++; 196 230 197 231 modelWorksheet.Cells[row, 1].Value = "Mean error (test)"; 198 232 modelWorksheet.Cells[row, 2].Formula = string.Format("AVERAGE({0})", excelTestMeanError); 233 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 199 234 row++; 200 235 … … 211 246 modelWorksheet.Cells[row, 1].Value = "Normalized Mean Squared error (training)"; 212 247 modelWorksheet.Cells[row, 2].Formula = string.Format("TrainingMSE / VAR({0})", excelTrainingTarget); 248 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 213 249 row++; 214 250 215 251 modelWorksheet.Cells[row, 1].Value = "Normalized Mean Squared error (test)"; 216 252 modelWorksheet.Cells[row, 2].Formula = string.Format("TestMSE / VAR({0})", excelTestTarget); 253 modelWorksheet.Cells[row, 2].Style.Numberformat.Format = "0.000"; 217 254 218 255 modelWorksheet.Cells["A1:B" + row].AutoFitColumns(); … … 300 337 estimatedWorksheet.Cells[i + 2, 9].Formula = string.Format(preparedFormula, i + 2); 301 338 } 339 estimatedWorksheet.Cells["B2:B" + (rows + 1)].Style.Numberformat.Format = "0.000"; 302 340 303 341 estimatedWorksheet.Cells["C2:C" + (rows + 1)].Formula = "J2"; 304 342 estimatedWorksheet.Cells["C2:C" + (rows + 1)].Style.Numberformat.Format = "0.000"; 305 343 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"; 307 347 estimatedWorksheet.Cells["F2:F" + (rows + 1)].Formula = "C2 - B2"; 348 estimatedWorksheet.Cells["F2:F" + (rows + 1)].Style.Numberformat.Format = "0.000"; 308 349 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"; 310 353 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"; 311 355 } 312 356 … … 322 366 323 367 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; 334 377 } 335 cur++;336 378 } 337 379 } 338 380 339 381 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. 340 384 Dataset dataset = problemData.Dataset; 341 385 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++) 343 389 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); 349 397 } 350 398 }
Note: See TracChangeset
for help on using the changeset viewer.