#region License Information /* HeuristicLab * Copyright (C) 2002-2018 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.Linq; using HEAL.Attic; using HeuristicLab.Algorithms.DataAnalysis; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Optimization; using HeuristicLab.Parameters; using HeuristicLab.Problems.DataAnalysis; namespace HeuristicLab.Problems.Modifiers { [StorableType("888EE1F9-F142-40F4-B5DC-D541184F8A9D")] [Item("InModelSingularEvaluationRemovalStrategy", "A modifier attached to a problem")] public class InModelSingularEvaluationRemovalStrategy : ModelBasedEvaluationRemoverProblemModifier { public const string SurvivalProbabilityParameterName = "SurvivalProbability"; public const string ModelBuilderParameterName = "ModelBuilder"; public const string InModelComparisonParameterName = "InModelComparison"; public IFixedValueParameter SurvivalProbabilityParameter => (IFixedValueParameter)Parameters[SurvivalProbabilityParameterName]; public IValueParameter ModelBuilderParameter => (IValueParameter)Parameters[ModelBuilderParameterName]; public IFixedValueParameter InModelComparisonParameter => (IFixedValueParameter)Parameters[InModelComparisonParameterName]; public double SurvivalProbability => SurvivalProbabilityParameter.Value.Value; public IAlgorithm ModelBuilder => ModelBuilderParameter.Value; public bool InModelComparison => InModelComparisonParameter.Value.Value; [StorableConstructor] protected InModelSingularEvaluationRemovalStrategy(StorableConstructorFlag _) : base(_) { } protected InModelSingularEvaluationRemovalStrategy(InModelSingularEvaluationRemovalStrategy original, Cloner cloner) : base(original, cloner) { } public InModelSingularEvaluationRemovalStrategy() : base() { Parameters.Add(new FixedValueParameter( SurvivalProbabilityParameterName, "Probability of survival despite bad prediction values", new PercentValue(0.05))); Parameters.Add(new ValueParameter(ModelBuilderParameterName, "The model builder", new LinearRegression())); Parameters.Add(new FixedValueParameter(InModelComparisonParameterName, "Whether the actual qualities (false) or the predicted qualities (values) will be used to determine removal. This is relevant if the model has a strong offset to the actual values", new BoolValue(false))); } public override IDeepCloneable Clone(Cloner cloner) { return new InModelSingularEvaluationRemovalStrategy(this, cloner); } protected override IRegressionSolution BuildRunningModel(RegressionProblemData pd, IRandom random, int objectiveNumber) { if (pd.TrainingPartition.Size <= 0) return null; try { ModelBuilder.Problem = new RegressionProblem() { ProblemData = pd }; if (ModelBuilder.Parameters.ContainsKey("Seed") && (ModelBuilder.Parameters["Seed"] is IValueParameter seedparam)) { seedparam.Value.Value = random.Next(); if (ModelBuilder.Parameters.ContainsKey("SetSeedRandomly") && (ModelBuilder.Parameters["SetSeedRandomly"] is IValueParameter setseedparam)) { setseedparam.Value.Value = false; } } ModelBuilder.Start(); var res = ModelBuilder.Results.Select(x => x.Value).OfType().Single(); ModelBuilder.Prepare(); ModelBuilder.Runs.Clear(); return res; } catch (Exception) { return null; } } protected override bool RemoveEvaluation(Individual individual, bool[] maximization, IRandom random) { if (random.NextDouble() < SurvivalProbability) return false; if (solutions == null || solutions.Count != maximization.Length || solutions.Any(s => s == null)) return false; var q = solutions.Select(x => x.Model.GetEstimatedValues(ToDataset(ExtractInputs(individual)), new[] { 0 }).Single()).ToArray(); return lastPopulation.Any(x => DominationCalculator.Dominates(InModelComparison ? x.Item3 : x.Item2, q, maximization, false) == DominationResult.Dominates); } } }