#3017: updated build and test scripts to support VS 2022
[heuristiclab.git] / HeuristicLab.Optimization.Operators / 3.3 / QualityComparator.cs
blob67c685635409958d6bedbc0956f60ac136cd14b3
1 #region License Information
2 /* HeuristicLab
3 * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)
5 * This file is part of HeuristicLab.
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
20 #endregion
22 using HeuristicLab.Common;
23 using HeuristicLab.Core;
24 using HeuristicLab.Data;
25 using HeuristicLab.Operators;
26 using HeuristicLab.Parameters;
27 using HEAL.Attic;
29 namespace HeuristicLab.Optimization.Operators {
30 [Item("QualityComparator", "Compares two qualities and creates a boolean flag that indicates if the left side is better than the right side.")]
31 [StorableType("ACCB56BB-699C-493D-8832-2E3B1D6AEE97")]
32 public class QualityComparator : SingleSuccessorOperator, IQualityComparator {
33 public ILookupParameter<DoubleValue> LeftSideParameter {
34 get { return (ILookupParameter<DoubleValue>)Parameters["LeftSide"]; }
36 public IValueLookupParameter<DoubleValue> RightSideParameter {
37 get { return (IValueLookupParameter<DoubleValue>)Parameters["RightSide"]; }
39 public ILookupParameter<BoolValue> ResultParameter {
40 get { return (ILookupParameter<BoolValue>)Parameters["Result"]; }
42 public IValueLookupParameter<BoolValue> MaximizationParameter {
43 get { return (IValueLookupParameter<BoolValue>)Parameters["Maximization"]; }
46 [StorableConstructor]
47 protected QualityComparator(StorableConstructorFlag _) : base(_) { }
48 protected QualityComparator(QualityComparator original, Cloner cloner) : base(original, cloner) { }
49 public QualityComparator()
50 : base() {
51 Parameters.Add(new LookupParameter<DoubleValue>("LeftSide", "The left side of the comparison."));
52 Parameters.Add(new ValueLookupParameter<DoubleValue>("RightSide", "The right side of the comparison."));
53 Parameters.Add(new LookupParameter<BoolValue>("Result", "The result of the comparison, true if the quality on the LeftSide is better than the quality on the RightSide."));
54 Parameters.Add(new ValueLookupParameter<BoolValue>("Maximization", "True if the problem is a maximization problem, otherwise false."));
57 public override IDeepCloneable Clone(Cloner cloner) {
58 return new QualityComparator(this, cloner);
61 public override IOperation Apply() {
62 DoubleValue left = LeftSideParameter.ActualValue;
63 DoubleValue right = RightSideParameter.ActualValue;
64 BoolValue maximization = MaximizationParameter.ActualValue;
65 bool better = Compare(maximization.Value, left.Value, right.Value);
66 if (ResultParameter.ActualValue == null)
67 ResultParameter.ActualValue = new BoolValue(better);
68 else ResultParameter.ActualValue.Value = better;
69 return base.Apply();
72 protected virtual bool Compare(bool maximization, double left, double right) {
73 return maximization && left > right || !maximization && left < right;