using HEAL.Attic; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding; using HeuristicLab.Parameters; using System; using System.Collections.Generic; namespace HeuristicLab.Problems.DataAnalysis.Symbolic { [Item("User-defined Single-objective Evaluator", "A single-objective evaluator that aggregates the output of its evaluator collection.")] [StorableType("1E668115-AF2A-4037-8E3C-7B279EC72770")] public class SymbolicDataAnalysisSingleObjectiveUserDefinedEvaluator : SymbolicDataAnalysisSingleObjectiveEvaluator where T : class, IDataAnalysisProblemData { private const string EvaluatorsParameterName = "Evaluators"; private const string MaximizationParameterName = "Maximization"; private const string ObjectiveWeightsParameterName = "Weights"; public IValueParameter ObjectiveWeightsParameter { get { return (IValueParameter)Parameters[ObjectiveWeightsParameterName]; } } public IFixedValueParameter>> EvaluatorsParameter { get { return (IFixedValueParameter>>)Parameters[EvaluatorsParameterName]; } } public IFixedValueParameter MaximizationParameter { get { return (IFixedValueParameter)Parameters[MaximizationParameterName]; } } public ItemList> Evaluators { get { return EvaluatorsParameter.Value; } } public DoubleArray ObjectiveWeights => ObjectiveWeightsParameter.Value; public override bool Maximization => false; public SymbolicDataAnalysisSingleObjectiveUserDefinedEvaluator() : base() { Parameters.Add(new FixedValueParameter>>(EvaluatorsParameterName, new ItemList>())); Parameters.Add(new FixedValueParameter(MaximizationParameterName, new BoolValue(false))); Parameters.Add(new ValueParameter(ObjectiveWeightsParameterName, new DoubleArray())); } public SymbolicDataAnalysisSingleObjectiveUserDefinedEvaluator(SymbolicDataAnalysisSingleObjectiveUserDefinedEvaluator original, Cloner cloner) : base(original, cloner) { } [StorableConstructor] protected SymbolicDataAnalysisSingleObjectiveUserDefinedEvaluator(StorableConstructorFlag deserializing) : base(deserializing) { } public override IDeepCloneable Clone(Cloner cloner) { return new SymbolicDataAnalysisSingleObjectiveUserDefinedEvaluator(this, cloner); } public override double Evaluate(IExecutionContext context, ISymbolicExpressionTree tree, T problemData, IEnumerable rows) { var weights = ObjectiveWeights; double eval(ISymbolicDataAnalysisSingleObjectiveEvaluator e) { var q = e.Evaluate(context, tree, problemData, rows); return e.Maximization ? -q : q; } var quality = 0d; for (int i = 0; i < weights.Length; ++i) { quality += weights[i] * eval(Evaluators[i]); } if (double.IsNaN(quality) || double.IsInfinity(quality)) { quality = double.MaxValue; } if (DecimalPlaces >= 0) { quality = Math.Round(quality, DecimalPlaces); } return quality; } public override IOperation InstrumentedApply() { var solution = SymbolicExpressionTreeParameter.ActualValue; var problemData = ProblemDataParameter.ActualValue; var quality = Evaluate(ExecutionContext, solution, problemData, problemData.TrainingIndices); QualityParameter.ActualValue = new DoubleValue(quality); return base.InstrumentedApply(); } } }