using System; namespace HeuristicLab.Problems.ProgramSynthesis.Base.Erc.Boolean { using HeuristicLab.Common; using HeuristicLab.Core; using HeuristicLab.Data; using HeuristicLab.Parameters; using HeuristicLab.Persistence.Default.CompositeSerializers.Storable; [StorableClass] public class BooleanRandomErcValue : WeightedErcValueItem { private const string AllowTrueParameterName = "Allow true"; private const string AllowFalseParameterName = "Allow false"; public BooleanRandomErcValue() : this(false, true, true) { } public BooleanRandomErcValue(bool isEnabled, bool allowTrue, bool allowFalse) { if (!allowTrue && allowFalse) { throw new InvalidOperationException("true and false values are disabled"); } Name = "Boolean random"; IsEnabled = isEnabled; Parameters.Add(new FixedValueParameter(AllowTrueParameterName, new BoolValue(allowTrue))); Parameters.Add(new FixedValueParameter(AllowFalseParameterName, new BoolValue(allowFalse))); } [StorableConstructor] public BooleanRandomErcValue(bool deserializing) : base(deserializing) { } public BooleanRandomErcValue(BooleanRandomErcValue origin, Cloner cloner) : base(origin, cloner) { this.AllowFalse = origin.AllowFalse; this.AllowTrue = origin.AllowTrue; } public IValueParameter AllowFalseParameter { get { return (IValueParameter)Parameters[AllowFalseParameterName]; } } public bool AllowFalse { get { return AllowFalseParameter.Value.Value; } set { AllowFalseParameter.Value.Value = value; } } public IValueParameter AllowTrueParameter { get { return (IValueParameter)Parameters[AllowTrueParameterName]; } } public bool AllowTrue { get { return AllowTrueParameter.Value.Value; } set { AllowTrueParameter.Value.Value = value; } } public override IDeepCloneable Clone(Cloner cloner) { return new BooleanRandomErcValue(this, cloner); } public override bool GetErcValue(IRandom random) { if (!this.AllowTrue && !this.AllowFalse) throw new InvalidOperationException(); if (!this.AllowFalse) return true; if (!this.AllowTrue) return false; return random.NextDouble() >= 0.5; } } }