1  #region License Information


2  /* HeuristicLab


3  * Copyright (C) 20022012 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 System.Collections.Generic;


24  using System.Linq;


25  using HeuristicLab.Common;


26  using HeuristicLab.Core;


27  using HeuristicLab.Data;


28  using HeuristicLab.Parameters;


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


30 


31  namespace HeuristicLab.Algorithms.DataAnalysis {


32  [StorableClass]


33  [Item(Name = "MeanLinear", Description = "Linear mean function for Gaussian processes.")]


34  public sealed class MeanLinear : ParameterizedNamedItem, IMeanFunction {


35  public IValueParameter<DoubleArray> WeightsParameter {


36  get { return (IValueParameter<DoubleArray>)Parameters["Weights"]; }


37  }


38 


39  [StorableConstructor]


40  private MeanLinear(bool deserializing) : base(deserializing) { }


41  private MeanLinear(MeanLinear original, Cloner cloner)


42  : base(original, cloner) {


43  }


44  public MeanLinear()


45  : base() {


46  Parameters.Add(new OptionalValueParameter<DoubleArray>("Weights", "The weights parameter for the linear mean function."));


47  }


48 


49  public override IDeepCloneable Clone(Cloner cloner) {


50  return new MeanLinear(this, cloner);


51  }


52 


53  public int GetNumberOfParameters(int numberOfVariables) {


54  return WeightsParameter.Value != null ? 0 : numberOfVariables;


55  }


56 


57  public void SetParameter(double[] p) {


58  double[] weights;


59  GetParameter(p, out weights);


60  WeightsParameter.Value = new DoubleArray(weights);


61  }


62 


63  public void GetParameter(double[] p, out double[] weights) {


64  if (WeightsParameter.Value == null) {


65  weights = p;


66  } else {


67  if (p.Length != 0) throw new ArgumentException("The length of the parameter vector does not match the number of free parameters for the linear mean function.", "p");


68  weights = WeightsParameter.Value.ToArray();


69  }


70  }


71 


72  public ParameterizedMeanFunction GetParameterizedMeanFunction(double[] p, IEnumerable<int> columnIndices) {


73  double[] weights;


74  int[] columns = columnIndices.ToArray();


75  GetParameter(p, out weights);


76  var mf = new ParameterizedMeanFunction();


77  mf.Mean = (x, i) => {


78  // sanity check


79  if (weights.Length != columns.Length) throw new ArgumentException("The number of rparameters must match the number of variables for the linear mean function.");


80  return Util.ScalarProd(weights, Util.GetRow(x, i, columns));


81  };


82  mf.Gradient = (x, i, k) => {


83  if (k > columns.Length) throw new ArgumentException();


84  return x[i, columns[k]];


85  };


86  return mf;


87  }


88  }


89  }

