#region License Information
/* HeuristicLab
* Copyright (C) 2002-2014 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Drawing;
using HeuristicLab.Analysis;
using HeuristicLab.Core;
using HeuristicLab.Data;
using HeuristicLab.Common;
namespace HeuristicLab.DataPreprocessing {
public class ChartLogic : IChartLogic {
private const int MAX_DISTINCT_VALUES_FOR_CLASSIFCATION = 20;
private ITransactionalPreprocessingData preprocessingData;
public ChartLogic(ITransactionalPreprocessingData preprocessingData) {
this.preprocessingData = preprocessingData;
}
#region IChartLogic Members
public DataRow CreateDataRow(string variableName, DataRowVisualProperties.DataRowChartType chartType) {
IList values = preprocessingData.GetValues(variableName);
DataRow row = new DataRow(variableName, "", values);
row.VisualProperties.ChartType = chartType;
return row;
}
public DataRow CreateDataRowRange(string variableName,int start, int end, DataRowVisualProperties.DataRowChartType chartType) {
IList values = preprocessingData.GetValues(variableName);
IList valuesRange = new List();
for (int i = 0; i < values.Count; i++) {
if (i >= start && i <= end)
valuesRange.Add(values[i]);
else
valuesRange.Add(Double.NaN);
}
DataRow row = new DataRow(variableName, "", valuesRange);
row.VisualProperties.ChartType = chartType;
return row;
}
public IEnumerable GetVariableValues(string variableName) {
return preprocessingData.GetValues(preprocessingData.GetColumnIndex(variableName));
}
public IEnumerable GetVariableNames() {
List doubleVariableNames = new List();
//only return variable names from type double
foreach (string variableName in preprocessingData.VariableNames) {
if (preprocessingData.IsType(preprocessingData.GetColumnIndex(variableName)))
doubleVariableNames.Add(variableName);
}
return doubleVariableNames;
}
public IEnumerable GetVariableNamesForHistogramClassification() {
List doubleVariableNames = new List();
//only return variable names from type double
foreach (string variableName in preprocessingData.VariableNames)
{
int columnIndex = preprocessingData.GetColumnIndex(variableName);
bool isDouble = preprocessingData.IsType(columnIndex);
if (isDouble) {
double distinctValueCount = preprocessingData.GetValues(columnIndex).GroupBy(x => x).Count();
bool distinctValuesOk = distinctValueCount <= MAX_DISTINCT_VALUES_FOR_CLASSIFCATION;
if (distinctValuesOk)
doubleVariableNames.Add(variableName);
}
}
return doubleVariableNames;
}
public ICheckedItemList CreateVariableItemList() {
ICheckedItemList itemList = new CheckedItemList();
foreach (string name in GetVariableNames()) {
itemList.Add(new StringValue(name), true);
}
return new ReadOnlyCheckedItemList(itemList);
}
public event DataPreprocessingChangedEventHandler Changed {
add { preprocessingData.Changed += value; }
remove { preprocessingData.Changed -= value; }
}
public event EventHandler SelectionChanged {
add { preprocessingData.SelectionChanged += value; }
remove { preprocessingData.SelectionChanged -= value; }
}
public string GetVariableNameByIndex(int index) {
return preprocessingData.GetVariableName(index);
}
public List CreateAllDataRows(DataRowVisualProperties.DataRowChartType chartType) {
List dataRows = new List();
foreach (var name in GetVariableNames())
dataRows.Add(CreateDataRow(name, chartType));
return dataRows;
}
public List CreateAllSelectedDataRows(DataRowVisualProperties.DataRowChartType chartType) {
List dataRows = new List();
foreach (var name in GetVariableNames()) {
DataRow row = CreateSelectedDataRow(name, chartType);
if(row != null)
dataRows.Add(row);
}
return dataRows;
}
public DataRow CreateSelectedDataRow(string variableName, DataRowVisualProperties.DataRowChartType chartType) {
IDictionary> selection = preprocessingData.GetSelection();
int variableIndex = preprocessingData.GetColumnIndex(variableName);
if (selection.Keys.Contains(variableIndex))
{
List selectedIndices = new List(selection[variableIndex]);
//need selection with more than 1 value
if(selectedIndices.Count < 2)
return null;
selectedIndices.Sort();
int start = selectedIndices[0];
int end = selectedIndices[selectedIndices.Count-1];
DataRow rowSelect = CreateDataRowRange(variableName, start, end, chartType);
return rowSelect;
}
else
return null;
}
public ScatterPlot CreateScatterPlot(string variableNameX, string variableNameY) {
ScatterPlot scatterPlot = new ScatterPlot();
List xValues = GetVariableValues(variableNameX).ToList();
List yValues = GetVariableValues(variableNameY).ToList();
List> points = new List>();
for( int i = 0; i < xValues.Count; i++)
{
Point2D point = new Point2D(xValues[i],yValues[i]);
points.Add(point);
}
ScatterPlotDataRow scdr = new ScatterPlotDataRow(variableNameX + " - " + variableNameY,"",points);
scatterPlot.Rows.Add(scdr);
return scatterPlot;
}
#endregion
}
}