#region License Information
/* HeuristicLab
* Copyright (C) 2002-2011 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 HeuristicLab.Common;
using HeuristicLab.Core;
using HeuristicLab.Data;
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
using HeuristicLab.Optimization;
using HeuristicLab.Parameters;
namespace HeuristicLab.Problems.DataAnalysis {
[StorableClass]
public abstract class DataAnalysisProblemData : ParameterizedNamedItem,
IDataAnalysisProblemData {
private const string DatasetParameterName = "Dataset";
private const string InputVariablesParameterName = "Input variables";
private const string TrainingSamplesStartParameterName = "Training partition start";
private const string TrainingSamplesEndParameterName = "Training partition end";
private const string TestSamplesStartParameterName = "Test partition start";
private const string TestSamplesEndParameterName = "Test partition end";
#region default data
// y = x^4 + x^3 + x^2 + x
private static double[,] kozaF1 = new double[,] {
{2.017885919, -1.449165046},
{1.30060506, -1.344523885},
{1.147134798, -1.317989331},
{0.877182504, -1.266142284},
{0.852562452, -1.261020794},
{0.431095788, -1.158793317},
{0.112586002, -1.050908405},
{0.04594507, -1.021989402},
{0.042572879, -1.020438113},
{-0.074027291, -0.959859562},
{-0.109178553, -0.938094706},
{-0.259721109, -0.803635355},
{-0.272991057, -0.387519561},
{-0.161978191, -0.193611001},
{-0.102489983, -0.114215349},
{-0.01469968, -0.014918985},
{-0.008863365, -0.008942626},
{0.026751057, 0.026054094},
{0.166922436, 0.14309643},
{0.176953808, 0.1504144},
{0.190233418, 0.159916534},
{0.199800708, 0.166635331},
{0.261502822, 0.207600348},
{0.30182879, 0.232370249},
{0.83763905, 0.468046718}
};
#endregion
#region parameter properties
public IValueParameter DatasetParameter {
get { return (IValueParameter)Parameters[DatasetParameterName]; }
}
public IValueParameter> InputVariablesParameter {
get { return (IValueParameter>)Parameters[InputVariablesParameterName]; }
}
public IValueParameter TrainingSamplesStartParameter {
get { return (IValueParameter)Parameters[TrainingSamplesStartParameterName]; }
}
public IValueParameter TrainingSamplesEndParameter {
get { return (IValueParameter)Parameters[TrainingSamplesEndParameterName]; }
}
public IValueParameter TestSamplesStartParameter {
get { return (IValueParameter)Parameters[TestSamplesStartParameterName]; }
}
public IValueParameter TestSamplesEndParameter {
get { return (IValueParameter)Parameters[TestSamplesEndParameterName]; }
}
#endregion
#region propeties
public Dataset Dataset {
get { return DatasetParameter.Value; }
}
public IEnumerable InputVariables {
get { return InputVariablesParameter.Value.CheckedItems.Select(i => i.Value.Value); }
}
public int TrainingSamplesStart {
get { return TrainingSamplesStartParameter.Value.Value; }
set {
if (value != TrainingSamplesStart) {
TrainingSamplesStartParameter.Value.Value = value;
}
}
}
public int TrainingSamplesEnd {
get { return TrainingSamplesEndParameter.Value.Value; }
set {
if (value != TrainingSamplesEnd) {
TrainingSamplesEndParameter.Value.Value = value;
}
}
}
public int TestSamplesStart {
get { return TestSamplesStartParameter.Value.Value; }
set {
if (value != TestSamplesStart) {
TestSamplesStartParameter.Value.Value = value;
}
}
}
public int TestSamplesEnd {
get { return TestSamplesEndParameter.Value.Value; }
set {
if (value != TestSamplesEnd) {
TestSamplesEndParameter.Value.Value = value;
}
}
}
public event EventHandler Changed;
#endregion
protected DataAnalysisProblemData(DataAnalysisProblemData original, Cloner cloner)
: base(original, cloner) {
RegisterEventHandlers();
}
[StorableConstructor]
protected DataAnalysisProblemData(bool deserializing) : base(deserializing) { }
public DataAnalysisProblemData()
: base() {
List variableNames = new List() { "x", "f(x)" };
Dataset kozaF1Dataset = new Dataset(variableNames, kozaF1);
kozaF1Dataset.Name = "Fourth-order Polynomial Function Benchmark Dataset";
kozaF1Dataset.Description = "f(x) = x^4 + x^3 + x^2 + x^1";
CheckedItemList inputVariablesList = new CheckedItemList();
StringValue x = new StringValue(variableNames[0]);
StringValue fx = new StringValue(variableNames[1]);
inputVariablesList.Add(x, true);
inputVariablesList.Add(fx, false);
Parameters.Add(new ValueParameter(DatasetParameterName, kozaF1Dataset));
Parameters.Add(new ValueParameter>(InputVariablesParameterName, inputVariablesList));
Parameters.Add(new ValueParameter(TrainingSamplesStartParameterName, new IntValue(0)));
Parameters.Add(new ValueParameter(TrainingSamplesEndParameterName, new IntValue(kozaF1Dataset.Rows)));
Parameters.Add(new ValueParameter(TestSamplesStartParameterName, new IntValue(kozaF1Dataset.Rows)));
Parameters.Add(new ValueParameter(TestSamplesEndParameterName, new IntValue(kozaF1Dataset.Rows)));
RegisterEventHandlers();
}
[StorableHook(HookType.AfterDeserialization)]
private void AfterDeserialization() {
RegisterEventHandlers();
}
#region changed event propagation
private void RegisterEventHandlers() {
DatasetParameter.Value.Reset += new EventHandler(DatasetChanged);
DatasetParameter.Value.ColumnsChanged += new EventHandler(DatasetChanged);
DatasetParameter.Value.RowsChanged += new EventHandler(DatasetChanged);
InputVariablesParameter.Value.CheckedItemsChanged += new Collections.CollectionItemsChangedEventHandler>(InputVariables_CheckedItemsChanged);
InputVariablesParameter.Value.CollectionReset += new Collections.CollectionItemsChangedEventHandler>(InputVariables_CollectionReset);
InputVariablesParameter.Value.ItemsAdded += new Collections.CollectionItemsChangedEventHandler>(InputVariables_ItemsAdded);
InputVariablesParameter.Value.ItemsMoved += new Collections.CollectionItemsChangedEventHandler>(InputVariables_ItemsMoved);
InputVariablesParameter.Value.ItemsRemoved += new Collections.CollectionItemsChangedEventHandler>(InputVariables_ItemsRemoved);
InputVariablesParameter.Value.ItemsReplaced += new Collections.CollectionItemsChangedEventHandler>(InputVariables_ItemsReplaced);
TrainingSamplesStartParameter.ValueChanged += new EventHandler(TrainingSamplesStartParameter_ValueChanged);
TrainingSamplesEndParameter.ValueChanged += new EventHandler(TrainingSamplesEndParameter_ValueChanged);
TestSamplesStartParameter.ValueChanged += new EventHandler(TestSamplesStartParameter_ValueChanged);
TestSamplesEndParameter.ValueChanged += new EventHandler(TestSamplesEndParameter_ValueChanged);
TrainingSamplesStartParameter.Value.ValueChanged += new EventHandler(Partitions_ValueChanged);
TrainingSamplesEndParameter.Value.ValueChanged += new EventHandler(Partitions_ValueChanged);
TestSamplesStartParameter.Value.ValueChanged += new EventHandler(Partitions_ValueChanged);
TestSamplesEndParameter.Value.ValueChanged += new EventHandler(Partitions_ValueChanged);
}
private void TestSamplesEndParameter_ValueChanged(object sender, EventArgs e) {
TestSamplesEndParameter.Value.ValueChanged += new EventHandler(Partitions_ValueChanged);
}
private void TestSamplesStartParameter_ValueChanged(object sender, EventArgs e) {
TestSamplesStartParameter.Value.ValueChanged += new EventHandler(Partitions_ValueChanged);
}
private void TrainingSamplesEndParameter_ValueChanged(object sender, EventArgs e) {
TrainingSamplesEndParameter.Value.ValueChanged += new EventHandler(Partitions_ValueChanged);
}
private void TrainingSamplesStartParameter_ValueChanged(object sender, EventArgs e) {
TrainingSamplesStartParameter.Value.ValueChanged += new EventHandler(Partitions_ValueChanged);
}
private void Partitions_ValueChanged(object sender, EventArgs e) {
OnProblemChanged();
}
private void InputVariables_ItemsReplaced(object sender, Collections.CollectionItemsChangedEventArgs> e) {
OnProblemChanged();
}
private void InputVariables_ItemsRemoved(object sender, Collections.CollectionItemsChangedEventArgs> e) {
OnProblemChanged();
}
private void InputVariables_ItemsMoved(object sender, Collections.CollectionItemsChangedEventArgs> e) {
OnProblemChanged();
}
private void InputVariables_ItemsAdded(object sender, Collections.CollectionItemsChangedEventArgs> e) {
OnProblemChanged();
}
private void InputVariables_CollectionReset(object sender, Collections.CollectionItemsChangedEventArgs> e) {
OnProblemChanged();
}
private void InputVariables_CheckedItemsChanged(object sender, Collections.CollectionItemsChangedEventArgs> e) {
OnProblemChanged();
}
private void DatasetChanged(object sender, EventArgs e) {
OnProblemChanged();
}
protected void OnProblemChanged() {
var listeners = Changed;
if (listeners != null) listeners(this, EventArgs.Empty);
}
#endregion
}
}