using System.Linq; namespace HeuristicLab.Problems.ProgramSynthesis.Base.Erc.StringVector { using System.Collections.Generic; using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; using HeuristicLab.Random; [StorableClass] public class StringVectorConstantsErcValue : WeightedErcValueItem> { private const string ConstantsParameterName = "Constants"; private readonly StringArray[] arrays; // perf opt: avoid using parameter getter public StringVectorConstantsErcValue() : this(false, new StringArray[0]) { } public StringVectorConstantsErcValue(params StringArray[] arrays) : this(true, arrays) { } public StringVectorConstantsErcValue(bool isEnabled, params StringArray[] arrays) { this.arrays = arrays; Name = "String vector constants"; IsEnabled = isEnabled; Parameters.Add(new ValueParameter>(ConstantsParameterName, new ItemCollection(arrays))); } [StorableConstructor] private StringVectorConstantsErcValue(bool deserializing) : base(deserializing) { } public StringVectorConstantsErcValue(StringVectorConstantsErcValue origin, Cloner cloner) : base(origin, cloner) { } public IValueParameter> ConstantsParameter { get { return (IValueParameter>)Parameters[ConstantsParameterName]; } } public IEnumerable Constants { get { return ConstantsParameter.Value; } } public override IReadOnlyList GetErcValue(IRandom random) { // TODO: remove ToList when ValueTypeArray implements IReadOnlyList return arrays.SampleRandom(random).ToList(); } public override IDeepCloneable Clone(Cloner cloner) { return new StringVectorConstantsErcValue(this, cloner); } } }