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("RunsAnalyzer", "")] [StorableClass] public sealed class RunsAnalyzer : 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 ValueLookupParameter> RunsParameter { get { return (ValueLookupParameter>)Parameters["Runs"]; } } public RunsAnalyzer() : 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, "")); Parameters.Add(new ValueLookupParameter>("Runs", "", new ItemDictionary())); } [StorableConstructor] private RunsAnalyzer(bool deserializing) : base(deserializing) { } private RunsAnalyzer(RunsAnalyzer original, Cloner cloner) : base(original, cloner) { } public override IDeepCloneable Clone(Cloner cloner) { return new RunsAnalyzer(this, cloner); } public override IOperation Apply() { ResultCollection results = ResultsParameter.ActualValue; ItemArray solutions = ParameterConfigurationParameter.ActualValue; ItemArray qualities = QualityParameter.ActualValue; ItemDictionary allRuns = RunsParameter.ActualValue; foreach (var solution in solutions) { string key = solution.ParameterInfoString; if (allRuns.Count(x => x.Key.Value == key) == 0) { allRuns.Add(new StringValue(key), new RunCollection()); } foreach (var run in solution.Runs) { if (!((BoolValue)run.Results["Meta.FromCache"]).Value) { run.Results["Meta.FromCache"] = new BoolValue(true); allRuns.Single(x => x.Key.Value == key).Value.Add(run); } } } if (!results.ContainsKey("Runs")) { results.Add(new Result("Runs", allRuns)); } return base.Apply(); } } }