using System; using System.Collections.Generic; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.DataPreprocessing.Interfaces; using HeuristicLab.Problems.DataAnalysis; using HeuristicLab.Problems.DataAnalysis.Transformations; namespace HeuristicLab.DataPreprocessing.Implementations { public class FilteredPreprocessingData : NamedItem, IFilteredPreprocessingData { protected ITransactionalPreprocessingData originalData; protected ITransactionalPreprocessingData filteredData; protected FilteredPreprocessingData(FilteredPreprocessingData original, Cloner cloner) : base(original, cloner) { originalData = (ITransactionalPreprocessingData)original.originalData; filteredData = (ITransactionalPreprocessingData)original.filteredData; } public FilteredPreprocessingData(ITransactionalPreprocessingData preporcessingData) : base() { originalData = preporcessingData; filteredData = null; } public override IDeepCloneable Clone(Cloner cloner) { return new FilteredPreprocessingData(this, cloner); } public T GetCell(int columnIndex, int rowIndex) { return ActiveData.GetCell(columnIndex, rowIndex); } public void SetCell(int columnIndex, int rowIndex, T value) { ReadOnlyOnFilterData.SetCell(columnIndex, rowIndex, value); } public string GetCellAsString(int columnIndex, int rowIndex) { return ActiveData.GetCellAsString(columnIndex, rowIndex); } public IList GetValues(string variableName, bool considerSelection) { return ActiveData.GetValues(variableName, considerSelection); } public IList GetValues(int columnIndex, bool considerSelection) { return ActiveData.GetValues(columnIndex, considerSelection); } public void SetValues(int columnIndex, IList values) { ReadOnlyOnFilterData.SetValues(columnIndex, values); } public void InsertRow(int rowIndex) { ReadOnlyOnFilterData.InsertRow(rowIndex); } public void DeleteRow(int rowIndex) { ReadOnlyOnFilterData.DeleteRow(rowIndex); } public void InsertColumn(string variableName, int columnIndex) { ReadOnlyOnFilterData.InsertColumn(variableName, columnIndex); } public void DeleteColumn(int columnIndex) { ReadOnlyOnFilterData.DeleteColumn(columnIndex); } public IntRange TrainingPartition { get { return originalData.TrainingPartition; } } public IntRange TestPartition { get { return originalData.TestPartition; } } public IList Transformations { get { return originalData.Transformations; } } public IEnumerable VariableNames { get { return ActiveData.VariableNames; } } public string GetVariableName(int columnIndex) { return ActiveData.GetVariableName(columnIndex); } public int GetColumnIndex(string variableName) { return ActiveData.GetColumnIndex(variableName); } public bool IsType(int columnIndex) { return originalData.IsType(columnIndex); } public int Columns { get { return ActiveData.Columns; } } public int Rows { get { return ActiveData.Rows; } } public Dataset ExportToDataset() { return originalData.ExportToDataset(); } public void SetFilter(bool[] rowFilters) { filteredData = (ITransactionalPreprocessingData)originalData.Clone(); for (int row = (rowFilters.Length - 1); row >= 0; --row) { if (rowFilters[row]) { filteredData.DeleteRow(row); } } } public void PersistFilter() { originalData = (ITransactionalPreprocessingData)filteredData.Clone(); ResetFilter(); } public void ResetFilter() { filteredData = null; } public ITransactionalPreprocessingData ActiveData { get { return IsFiltered ? filteredData : originalData; } } public ITransactionalPreprocessingData ReadOnlyOnFilterData { get { if (IsFiltered) throw new InvalidOperationException(); return originalData; } } public bool IsFiltered { get { return filteredData != null; } } public event DataPreprocessingChangedEventHandler Changed { add { originalData.Changed += value; } remove { originalData.Changed -= value; } } public bool IsUndoAvailable { get { return IsFiltered ? false : originalData.IsUndoAvailable; } } public void Undo() { ReadOnlyOnFilterData.Undo(); } public void InTransaction(Action action, DataPreprocessingChangedEventType type = DataPreprocessingChangedEventType.Any) { ReadOnlyOnFilterData.InTransaction(action, type); } public void BeginTransaction(DataPreprocessingChangedEventType type) { ReadOnlyOnFilterData.BeginTransaction(type); } public void EndTransaction() { originalData.EndTransaction(); } #region IPreprocessingData Members public void SetSelection(IDictionary> selection) { originalData.SetSelection(selection); } public IDictionary> GetSelection() { return originalData.GetSelection(); } public void ClearSelection() { originalData.ClearSelection(); } public event EventHandler SelectionChanged; #endregion } }