1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) Heuristic and Evolutionary Algorithms Laboratory (HEAL)


4  *


5  * This file is part of HeuristicLab.


6  *


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.


11  *


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.


16  *


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/>.


19  */


20  #endregion


21 


22  using HeuristicLab.Common;


23  using HeuristicLab.Core;


24  using HeuristicLab.Data;


25  using HeuristicLab.Operators;


26  using HeuristicLab.Parameters;


27  using HEAL.Attic;


28  using System;


29 


30  namespace HeuristicLab.Random {


31  /// <summary>


32  /// Normally distributed random number generator.


33  /// </summary>


34  [StorableType("0EAF41846C984C9D80A109A42E03450E")]


35  [Item("NormalRandomizer", "Initializes the value of variable 'Value' to a random value normally distributed with parameters 'Mu' and 'Sigma'")]


36  [Obsolete("Use NormalRandomizerPolar instead.")]


37  public class NormalRandomizer : SingleSuccessorOperator {


38  #region Parameter Properties


39  public ILookupParameter<IRandom> RandomParameter {


40  get { return (ILookupParameter<IRandom>)Parameters["Random"]; }


41  }


42  public IValueLookupParameter<DoubleValue> MuParameter {


43  get { return (IValueLookupParameter<DoubleValue>)Parameters["Mu"]; }


44  }


45  public IValueLookupParameter<DoubleValue> SigmaParameter {


46  get { return (IValueLookupParameter<DoubleValue>)Parameters["Sigma"]; }


47  }


48  public ILookupParameter<DoubleValue> ValueParameter {


49  get { return (ILookupParameter<DoubleValue>)Parameters["Value"]; }


50  }


51  #endregion


52 


53  #region Properties


54  public DoubleValue Mu {


55  get { return MuParameter.ActualValue; }


56  set { MuParameter.ActualValue = value; }


57  }


58  public DoubleValue Max {


59  get { return SigmaParameter.ActualValue; }


60  set { SigmaParameter.ActualValue = value; }


61  }


62  #endregion


63 


64  [StorableConstructor]


65  protected NormalRandomizer(StorableConstructorFlag _) : base(_) { }


66  protected NormalRandomizer(NormalRandomizer original, Cloner cloner) : base(original, cloner) { }


67  /// <summary>


68  /// Initializes a new instance of <see cref="NormalRandomizer"/> with four variable infos


69  /// (<c>Mu</c>, <c>Sigma</c>, <c>Value</c> and <c>Random</c>).


70  /// </summary>


71  public NormalRandomizer() {


72  Parameters.Add(new LookupParameter<IRandom>("Random", "A random generator that supplies uniformly distributed values."));


73  Parameters.Add(new ValueLookupParameter<DoubleValue>("Mu", "Mu parameter of the normal distribution (N(mu,sigma))."));


74  Parameters.Add(new ValueLookupParameter<DoubleValue>("Sigma", "Sigma parameter of the normal distribution (N(mu,sigma))."));


75  Parameters.Add(new LookupParameter<DoubleValue>("Value", "The value that should be set to a random value."));


76  }


77 


78  public override IDeepCloneable Clone(Cloner cloner) {


79  return new NormalRandomizer(this, cloner);


80  }


81 


82  /// <summary>


83  /// Generates a new normally distributed random variable and assigns it to the specified variable.


84  /// </summary>


85  public override IOperation Apply() {


86  IRandom random = RandomParameter.ActualValue;


87  double mu = MuParameter.ActualValue.Value;


88  double sigma = SigmaParameter.ActualValue.Value;


89 


90  NormalDistributedRandom normalRandom = new NormalDistributedRandom(random, mu, sigma);


91  ValueParameter.ActualValue = new DoubleValue(normalRandom.NextDouble());


92  return base.Apply();


93  }


94  }


95  }

