using System.Linq; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Operators; using HeuristicLab.Optimization; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using System.Collections.Generic; using System; namespace HeuristicLab.Problems.MetaOptimization { /// /// TODO /// [Item("ReferenceQualityAnalyzer", "")] [StorableClass] public sealed class ReferenceQualityAnalyzer : SingleSuccessorOperator, IAnalyzer { public ValueLookupParameter ResultsParameter { get { return (ValueLookupParameter)Parameters["Results"]; } } public ScopeTreeLookupParameter ParameterConfigurationParameter { get { return (ScopeTreeLookupParameter)Parameters["ParameterConfigurationTree"]; } } public ScopeTreeLookupParameter QualityParameter { get { return (ScopeTreeLookupParameter)Parameters["Quality"]; } } public LookupParameter ProblemQualityReferenceParameter { get { return (LookupParameter)Parameters["ProblemQualityReferences"]; } } public LookupParameter> ProblemsParameter { get { return (LookupParameter>)Parameters[MetaOptimizationProblem.ProblemsParameterName]; } } public ReferenceQualityAnalyzer() : base() { Parameters.Add(new ScopeTreeLookupParameter("Quality", "")); Parameters.Add(new ValueLookupParameter("Results", "")); Parameters.Add(new ScopeTreeLookupParameter("ParameterConfigurationTree", "")); Parameters.Add(new LookupParameter("ProblemQualityReferences", "")); Parameters.Add(new LookupParameter>(MetaOptimizationProblem.ProblemsParameterName, "")); } [StorableConstructor] private ReferenceQualityAnalyzer(bool deserializing) : base(deserializing) { } private ReferenceQualityAnalyzer(ReferenceQualityAnalyzer original, Cloner cloner) : base(original, cloner) { } public override IDeepCloneable Clone(Cloner cloner) { return new ReferenceQualityAnalyzer(this, cloner); } public override IOperation Apply() { ResultCollection results = ResultsParameter.ActualValue; ItemArray solutions = ParameterConfigurationParameter.ActualValue; ItemArray qualities = QualityParameter.ActualValue; if (ProblemQualityReferenceParameter.ActualValue == null) { DoubleArray referenceQualities = CalculateReferenceQualities(solutions); ProblemQualityReferenceParameter.ActualValue = referenceQualities; NormalizePopulation(solutions, qualities, referenceQualities); results.Add(new Result("QualityReferences", referenceQualities)); } return base.Apply(); } private DoubleArray CalculateReferenceQualities(ItemArray solutions) { DoubleArray referenceQualities = new DoubleArray(ProblemsParameter.ActualValue.Count); for (int pi = 0; pi < ProblemsParameter.ActualValue.Count; pi++) { referenceQualities[pi] = solutions.Where(x => x.AverageQualities != null).Select(x => x.AverageQualities[pi]).Min(); // todo: respect minimization / maximization } return referenceQualities; } private void NormalizePopulation(ItemArray solutions, ItemArray qualities, DoubleArray referenceQualities) { for (int i = 0; i < solutions.Length; i++) { qualities[i].Value = MetaOptimizationUtil.NormalizeQualities(solutions[i], referenceQualities.ToArray()); } } } }