#3017: updated build and test scripts to support VS 2022
[heuristiclab.git] / HeuristicLab.Optimization.Operators / 3.3 / SolutionsCreator.cs
blob36da69b012ce1fd40513fffb4060f81c31544201
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 /// <summary>
31 /// An operator which creates new solutions. Evaluation of the new solutions is executed in parallel, if an engine is used which supports parallelization.
32 /// </summary>
33 [Item("SolutionsCreator", "An operator which creates new solutions. Evaluation of the new solutions is executed in parallel, if an engine is used which supports parallelization.")]
34 [StorableType("3EE12E32-F8AF-4C7E-A9C9-B5DC5561CFE2")]
35 public sealed class SolutionsCreator : SingleSuccessorOperator {
36 public ValueLookupParameter<IntValue> NumberOfSolutionsParameter {
37 get { return (ValueLookupParameter<IntValue>)Parameters["NumberOfSolutions"]; }
39 public ValueLookupParameter<IOperator> SolutionCreatorParameter {
40 get { return (ValueLookupParameter<IOperator>)Parameters["SolutionCreator"]; }
42 public ValueLookupParameter<IOperator> EvaluatorParameter {
43 get { return (ValueLookupParameter<IOperator>)Parameters["Evaluator"]; }
45 public ValueLookupParameter<BoolValue> ParallelParameter {
46 get { return (ValueLookupParameter<BoolValue>)Parameters["Parallel"]; }
48 private ScopeParameter CurrentScopeParameter {
49 get { return (ScopeParameter)Parameters["CurrentScope"]; }
51 public IScope CurrentScope {
52 get { return CurrentScopeParameter.ActualValue; }
54 public IntValue NumberOfSolutions {
55 get { return NumberOfSolutionsParameter.Value; }
56 set { NumberOfSolutionsParameter.Value = value; }
59 [StorableConstructor]
60 private SolutionsCreator(StorableConstructorFlag _) : base(_) { }
61 private SolutionsCreator(SolutionsCreator original, Cloner cloner) : base(original, cloner) { }
62 public SolutionsCreator()
63 : base() {
64 Parameters.Add(new ValueLookupParameter<IntValue>("NumberOfSolutions", "The number of solutions that should be created."));
65 Parameters.Add(new ValueLookupParameter<IOperator>("SolutionCreator", "The operator which is used to create new solutions."));
66 Parameters.Add(new ValueLookupParameter<IOperator>("Evaluator", "The operator which is used to evaluate new solutions. This operator is executed in parallel, if an engine is used which supports parallelization."));
67 Parameters.Add(new ValueLookupParameter<BoolValue>("Parallel", "True if the operator should be applied in parallel on all sub-scopes, otherwise false.", new BoolValue(true)));
68 Parameters.Add(new ScopeParameter("CurrentScope", "The current scope to which the new solutions are added as sub-scopes."));
70 [StorableHook(HookType.AfterDeserialization)]
71 private void AfterDeserialization() {
72 if (!Parameters.ContainsKey("Parallel")) Parameters.Add(new ValueLookupParameter<BoolValue>("Parallel", "True if the operator should be applied in parallel on all sub-scopes, otherwise false.", new BoolValue(true))); // backwards compatibility
75 public override IDeepCloneable Clone(Cloner cloner) {
76 return new SolutionsCreator(this, cloner);
79 public override IOperation Apply() {
80 int count = NumberOfSolutionsParameter.ActualValue.Value;
81 IOperator creator = SolutionCreatorParameter.ActualValue;
82 IOperator evaluator = EvaluatorParameter.ActualValue;
83 bool parallel = ParallelParameter.ActualValue.Value;
85 int current = CurrentScope.SubScopes.Count;
86 for (int i = 0; i < count; i++)
87 CurrentScope.SubScopes.Add(new Scope((current + i).ToString()));
89 OperationCollection creation = new OperationCollection();
90 OperationCollection evaluation = new OperationCollection() { Parallel = parallel };
91 for (int i = 0; i < count; i++) {
92 if (creator != null) creation.Add(ExecutionContext.CreateOperation(creator, CurrentScope.SubScopes[current + i]));
93 if (evaluator != null) evaluation.Add(ExecutionContext.CreateOperation(evaluator, CurrentScope.SubScopes[current + i]));
95 OperationCollection next = new OperationCollection();
96 next.Add(creation);
97 next.Add(evaluation);
98 next.Add(base.Apply());
99 return next;