using System.Linq; using System.Threading; using System.Threading.Tasks; using HEAL.Attic; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Optimization; namespace HeuristicLab.Problems.Modifiers { [StorableType("3985D750-03D4-4842-A34D-A352BED95190")] public sealed class MultiObjectiveBasicProblemEvaluation : BasicAlgorithm { public override bool SupportsPause => false; public new MultiObjectiveBasicProblem Problem { get => (MultiObjectiveBasicProblem)base.Problem; private set => base.Problem = value; } [Storable] public IScope IndividualScope { get; private set; } [Storable] public IRandom Random { get; private set; } [Storable] public double[] Qualities { get; private set; } #region Constructors & Cloning [StorableConstructor] private MultiObjectiveBasicProblemEvaluation(StorableConstructorFlag _) : base(_) { } private MultiObjectiveBasicProblemEvaluation(MultiObjectiveBasicProblemEvaluation original, Cloner cloner) : base(original, cloner) { IndividualScope = cloner.Clone(original.IndividualScope); Random = cloner.Clone(original.Random); Qualities = (double[])original.Qualities.Clone(); } public MultiObjectiveBasicProblemEvaluation(MultiObjectiveBasicProblem problem, IScope individualScope, IRandom random) { Problem = problem; IndividualScope = individualScope; Random = random; Qualities = Enumerable.Repeat(double.NaN, problem.Maximization.Length).ToArray(); } public override IDeepCloneable Clone(Cloner cloner) { return new MultiObjectiveBasicProblemEvaluation(this, cloner); } #endregion protected override void Run(CancellationToken cancellationToken) { var singleEncoding = Problem.Encoding; var individual = Problem.Encoding is MultiEncoding multiEncoding ? (Individual)new MultiEncodingIndividual(multiEncoding, IndividualScope) : (Individual)new SingleEncodingIndividual(singleEncoding, IndividualScope); var evaluationTask = Task.Run(() => Problem.Evaluate(individual, Random), cancellationToken); evaluationTask.Wait(cancellationToken); Qualities = evaluationTask.Result; } } }