1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022018 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 System;


23  using HeuristicLab.Common;


24  using HeuristicLab.Core;


25  using HeuristicLab.Data;


26  using HeuristicLab.Parameters;


27  using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;


28 


29  namespace HeuristicLab.Algorithms.DataAnalysis {


30  [StorableClass]


31  [Item(Name = "CovarianceConst",


32  Description = "Constant covariance function for Gaussian processes.")]


33  public sealed class CovarianceConst : ParameterizedNamedItem, ICovarianceFunction {


34  public IValueParameter<DoubleValue> ScaleParameter {


35  get { return (IValueParameter<DoubleValue>)Parameters["Scale"]; }


36  }


37  private bool HasFixedScaleParameter {


38  get { return ScaleParameter.Value != null; }


39  }


40  [StorableConstructor]


41  private CovarianceConst(bool deserializing)


42  : base(deserializing) {


43  }


44 


45  private CovarianceConst(CovarianceConst original, Cloner cloner)


46  : base(original, cloner) {


47  }


48 


49  public CovarianceConst()


50  : base() {


51  Name = ItemName;


52  Description = ItemDescription;


53 


54  Parameters.Add(new OptionalValueParameter<DoubleValue>("Scale", "The scale of the constant covariance function."));


55  }


56 


57  public override IDeepCloneable Clone(Cloner cloner) {


58  return new CovarianceConst(this, cloner);


59  }


60 


61  public int GetNumberOfParameters(int numberOfVariables) {


62  return HasFixedScaleParameter ? 0 : 1;


63  }


64 


65  public void SetParameter(double[] p) {


66  double scale;


67  GetParameterValues(p, out scale);


68  ScaleParameter.Value = new DoubleValue(scale);


69  }


70 


71  private void GetParameterValues(double[] p, out double scale) {


72  int c = 0;


73  // gather parameter values


74  if (HasFixedScaleParameter) {


75  scale = ScaleParameter.Value.Value;


76  } else {


77  scale = Math.Exp(2 * p[c]);


78  c++;


79  }


80  if (p.Length != c) throw new ArgumentException("The length of the parameter vector does not match the number of free parameters for CovarianceConst", "p");


81  }


82 


83  public ParameterizedCovarianceFunction GetParameterizedCovarianceFunction(double[] p, int[] columnIndices) {


84  double scale;


85  GetParameterValues(p, out scale);


86  // create functions


87  var cov = new ParameterizedCovarianceFunction();


88  cov.Covariance = (x, i, j) => scale;


89  cov.CrossCovariance = (x, xt, i, j) => scale;


90  if (HasFixedScaleParameter) {


91  cov.CovarianceGradient = (x, i, j) => new double[0];


92  } else {


93  cov.CovarianceGradient = (x, i, j) => new[] { 2.0 * scale };


94  }


95  return cov;


96  }


97  }


98  }

