using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HeuristicLab.BioBoost.Operators.Mutation; 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 HeuristicLab.PluginInfrastructure; namespace HeuristicLab.BioBoost.Operators.Moves { [StorableClass] public class MoveGeneratorAdapter : SingleSuccessorOperator, IMoveGenerator { public IConstrainedValueParameter ManipulatorParameter { get { return (IConstrainedValueParameter) Parameters["Manipulator"]; } } public IManipulator Manipulator { get { return ManipulatorParameter.Value; } } public IValueLookupParameter SampleSizeParameter { get { return (IValueLookupParameter) Parameters["SampleSize"]; } } public int SampleSize { get { return SampleSizeParameter.ActualValue.Value; } } #region construction & cloning [StorableConstructor] public MoveGeneratorAdapter(bool isDeserializing) : base(isDeserializing) { } public MoveGeneratorAdapter(MoveGeneratorAdapter orig, Cloner cloner) : base(orig, cloner) { } public MoveGeneratorAdapter() { Parameters.Add(new ValueLookupParameter("SampleSize", "The number of moves to generate.")); Parameters.Add(new LookupParameter("Generations", "rename value to iterations", "Iterations")); Parameters.Add(new LookupParameter("MaximumGenerations", "rename value to maximum iterations", "MaximumIterations")); Parameters.Add(new ConstrainedValueParameter("Manipulator", "The actual maniuplator that should be wrapped.", new ItemSet(ApplicationManager.Manager.GetInstances()))); ManipulatorParameter.Value = ManipulatorParameter.ValidValues.FirstOrDefault(m => m.GetType() == typeof (MultiMutator)); } public override IDeepCloneable Clone(Cloner cloner) { return new MoveGeneratorAdapter(this, cloner); } #endregion public override IOperation Apply() { var successors = new OperationCollection(); for (int i = 0; i < SampleSize; i++) { var subscope = new Scope(i.ToString()); foreach (var variable in ExecutionContext.Scope.Variables) { subscope.Variables.Add(new Variable(variable.Name, (IItem) variable.Value.Clone())); } ExecutionContext.Scope.SubScopes.Add(subscope); successors.Add(ExecutionContext.CreateChildOperation((IOperator) Manipulator.Clone(), subscope)); } successors.Add(base.Apply()); return successors; } } }