#region License Information
/* HeuristicLab
* Copyright (C) 2002-2010 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.Encodings.SymbolicExpressionTreeEncoding;
using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Analyzers;
using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Creators;
using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding.Interfaces;
using HeuristicLab.Optimization;
using HeuristicLab.Parameters;
using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
using HeuristicLab.PluginInfrastructure;
using HeuristicLab.Encodings.BinaryVectorEncoding;
namespace HeuristicLab.Problems.DataAnalysis.FeatureSelection {
[Item("Feature Selection Problem", "Represents a feature selection problem.")]
[Creatable("Problems")]
[StorableClass]
public class FeatureSelectionProblem : DataAnalysisProblem, IMultiObjectiveProblem {
#region Parameter Properties
public ValueParameter MaximizationParameter {
get { return (ValueParameter)Parameters["Maximization"]; }
}
IParameter IMultiObjectiveProblem.MaximizationParameter {
get { return MaximizationParameter; }
}
public new ValueParameter SolutionCreatorParameter {
get { return (ValueParameter)Parameters["SolutionCreator"]; }
}
IParameter IProblem.SolutionCreatorParameter {
get { return SolutionCreatorParameter; }
}
public new ValueParameter EvaluatorParameter {
get { return (ValueParameter)Parameters["Evaluator"]; }
}
IParameter IProblem.EvaluatorParameter {
get { return EvaluatorParameter; }
}
#endregion
#region Properties
public new IBinaryVectorCreator SolutionCreator {
get { return SolutionCreatorParameter.Value; }
set { SolutionCreatorParameter.Value = value; }
}
ISolutionCreator IProblem.SolutionCreator {
get { return SolutionCreatorParameter.Value; }
}
public new IFeatureSelectionEvaluator Evaluator {
get { return EvaluatorParameter.Value; }
set { EvaluatorParameter.Value = value; }
}
IMultiObjectiveEvaluator IMultiObjectiveProblem.Evaluator {
get { return EvaluatorParameter.Value; }
}
IEvaluator IProblem.Evaluator {
get { return EvaluatorParameter.Value; }
}
public override IEnumerable Operators {
get { return operators; }
}
#endregion
[Storable]
private List operators;
[StorableConstructor]
protected FeatureSelectionProblem(bool deserializing) : base(deserializing) { }
protected FeatureSelectionProblem(FeatureSelectionProblem original, Cloner cloner)
: base(original, cloner) {
operators = original.operators.Select(x => (IOperator)cloner.Clone(x)).ToList();
RegisterParameterEvents();
RegisterParameterValueEvents();
}
public FeatureSelectionProblem()
: base() {
BinaryVectorCreator creator = new RandomBinaryVectorCreator();
var evaluator = new LinearRegressionFeatureSelectionEvaluator();
Parameters.Add(new ValueParameter("Maximization", "Both objectives should be minimized.", new BoolArray(new bool[] {false, false})));
Parameters.Add(new ValueParameter("SolutionCreator", "The operator which should be used to create new solutions.", creator));
Parameters.Add(new ValueParameter("Evaluator", "The evaluator that should be used for the feature selection problem.", evaluator));
creator.BinaryVectorParameter.ActualName = "FeatureArray";
evaluator.QualitiesParameter.ActualName = "SizeAndCVMeanSquaredError";
ParameterizeSolutionCreator();
ParameterizeEvaluator();
InitializeOperators();
RegisterParameterEvents();
RegisterParameterValueEvents();
}
[StorableHook(HookType.AfterDeserialization)]
private void AfterDeserialization() {
// BackwardsCompatibility3.3
#region Backwards compatible code (remove with 3.4)
if (operators == null) InitializeOperators();
#endregion
RegisterParameterEvents();
RegisterParameterValueEvents();
}
public override IDeepCloneable Clone(Cloner cloner) {
return new FeatureSelectionProblem(this, cloner);
}
private void RegisterParameterValueEvents() {
SolutionCreatorParameter.ValueChanged += new EventHandler(SolutionCreatorParameter_ValueChanged);
EvaluatorParameter.ValueChanged += new EventHandler(EvaluatorParameter_ValueChanged);
}
private void RegisterParameterEvents() {
SolutionCreator.BinaryVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_BinaryVectorParameter_ActualNameChanged);
}
#region event handling
protected override void OnDataAnalysisProblemChanged(EventArgs e) {
base.OnDataAnalysisProblemChanged(e);
ParameterizeSolutionCreator();
}
protected virtual void OnOperatorsChanged(EventArgs e) { RaiseOperatorsChanged(e); }
protected virtual void OnSolutionCreatorChanged(EventArgs e) {
SolutionCreator.BinaryVectorParameter.ActualNameChanged += new EventHandler(SolutionCreator_BinaryVectorParameter_ActualNameChanged);
ParameterizeSolutionCreator();
OnSolutionParameterNameChanged(e);
RaiseSolutionCreatorChanged(e);
}
protected virtual void OnSolutionParameterNameChanged(EventArgs e) {
ParameterizeEvaluator();
ParameterizeOperators();
}
protected virtual void OnEvaluatorChanged(EventArgs e) {
ParameterizeEvaluator();
RaiseEvaluatorChanged(e);
}
#endregion
#region event handlers
private void SolutionCreatorParameter_ValueChanged(object sender, EventArgs e) {
OnSolutionCreatorChanged(e);
}
private void SolutionCreator_BinaryVectorParameter_ActualNameChanged(object sender, EventArgs e) {
OnSolutionParameterNameChanged(e);
}
private void EvaluatorParameter_ValueChanged(object sender, EventArgs e) {
OnEvaluatorChanged(e);
}
#endregion
#region Helpers
private void InitializeOperators() {
operators = new List();
operators.AddRange(ApplicationManager.Manager.GetInstances().OfType());
ParameterizeOperators();
}
private void ParameterizeSolutionCreator() {
SolutionCreator.LengthParameter.Value = new IntValue(DataAnalysisProblemData.InputVariables.CheckedItems.Count());
}
private void ParameterizeEvaluator() {
Evaluator.SolutionParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
}
private void ParameterizeOperators() {
foreach (IBinaryVectorCrossover op in Operators.OfType()) {
op.ParentsParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
op.ChildParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
}
foreach (IBinaryVectorManipulator op in Operators.OfType()) {
op.BinaryVectorParameter.ActualName = SolutionCreator.BinaryVectorParameter.ActualName;
}
}
#endregion
}
}