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("19E56ADE-9700-42A1-A5BD-5553CB841E93")] public sealed class ModifiedBasicProblemEvaluationExecutionAlgorithm : BasicAlgorithm { public override bool SupportsPause => false; [Storable] public ProblemModifier NextModifier { get; private set; } //private setters are needed for HEAL.Attic [Storable] public IScope IndividualScope { get; private set; } //private setters are needed for HEAL.Attic [Storable] public IRandom Random { get; private set; } //private setters are needed for HEAL.Attic [Storable] public double[] Qualities { get; private set; } //private setters are needed for HEAL.Attic #region Constructors & Cloning [StorableConstructor] private ModifiedBasicProblemEvaluationExecutionAlgorithm(StorableConstructorFlag _) : base(_) { } private ModifiedBasicProblemEvaluationExecutionAlgorithm(ModifiedBasicProblemEvaluationExecutionAlgorithm original, Cloner cloner) : base(original, cloner) { IndividualScope = cloner.Clone(original.IndividualScope); Random = cloner.Clone(original.Random); Qualities = original.Qualities.ToArray(); NextModifier = cloner.Clone(original.NextModifier); } public ModifiedBasicProblemEvaluationExecutionAlgorithm(ProblemModifier nextModifier, IScope individualScope, IRandom random) { NextModifier = nextModifier; IndividualScope = individualScope; Random = random; Qualities = new[] { double.NaN }; } public override IDeepCloneable Clone(Cloner cloner) { return new ModifiedBasicProblemEvaluationExecutionAlgorithm(this, cloner); } #endregion protected override void Run(CancellationToken cancellationToken) { var encoding = NextModifier.Encoding; var individual = encoding is MultiEncoding multiEncoding ? (Individual)new MultiEncodingIndividual(multiEncoding, IndividualScope) : (Individual)new SingleEncodingIndividual(encoding, IndividualScope); var evaluationTask = Task.Run(() => NextModifier.ModifiedEvaluate(individual, Random), cancellationToken); evaluationTask.Wait(cancellationToken); Qualities = evaluationTask.Result; } } }