private void RebuildDataTable(string resultName, string rowName) { LinearLeastSquaresFitting llsFitting = new LinearLeastSquaresFitting(); string[] columnNames = new string[] { "Count", "Minimum", "Maximum", "Average", "Median", "Standard Deviation", "Variance", "25th Percentile", "75th Percentile", "Avg. of Upper 25 %", " Avg. of Lower 25 %", "Avg. of First 25 %", "Avg. of Last 25 %", "Slope", "Intercept", "Average Relative Error" }; runs = Content.Where(x => x.Results.ContainsKey(resultName) && x.Visible).ToList(); DoubleMatrix dt = new DoubleMatrix(runs.Count(), columnNames.Count()); dt.RowNames = runs.Select(x => x.Name); dt.ColumnNames = columnNames; int i = 0; foreach (Run run in runs) { DataTable resTable = (DataTable)run.Results[resultName]; dt.SortableView = true; DataRow row = resTable.Rows[rowName]; var values = row.Values.ToArray(); double cnt = values.Count(); double min = values.Min(); double max = values.Max(); double avg = values.Average(); double median = values.Median(); double stdDev = values.StandardDeviation(); double variance = values.Variance(); double percentile25 = values.Quantile(0.25); double percentile75 = values.Quantile(0.75); double lowerAvg = values.Count() > 4 ? values.OrderBy(x => x).Take((int)(values.Count() * 0.25)).Average() : double.NaN; double upperAvg = values.Count() > 4 ? values.OrderByDescending(x => x).Take((int)(values.Count() * 0.25)).Average() : double.NaN; double firstAvg = values.Count() > 4 ? values.Take((int)(values.Count() * 0.25)).Average() : double.NaN; double lastAvg = values.Count() > 4 ? values.Skip((int)(values.Count() * 0.75)).Average() : double.NaN; double slope, intercept, r; llsFitting.Calculate(values, out slope, out intercept); r = llsFitting.CalculateError(values, slope, intercept); dt[i, 0] = cnt; dt[i, 1] = min; dt[i, 2] = max; dt[i, 3] = avg; dt[i, 4] = median; dt[i, 5] = stdDev; dt[i, 6] = variance; dt[i, 7] = percentile25; dt[i, 8] = percentile75; dt[i, 9] = upperAvg; dt[i, 10] = lowerAvg; dt[i, 11] = firstAvg; dt[i, 12] = lastAvg; dt[i, 13] = slope; dt[i, 14] = intercept; dt[i, 15] = r; i++; progress.ProgressValue = ((double)runs.Count) / i; } stringConvertibleMatrixView.Content = dt; for (i = 0; i < runs.Count(); i++) { stringConvertibleMatrixView.DataGridView.Rows[i].DefaultCellStyle.ForeColor = runs[i].Color; } }