Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSAnalyzer.cs	(revision 8386)
+++ 	(revision )
@@ -1,156 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System.Linq;
-using HeuristicLab.Analysis;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Optimization;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis;
-
-namespace HeuristicLab.Algorithms.DataAnalysis {
-  [StorableClass]
-  [Item(Name = "BFGSAnalyzer", Description = "Analyzer to collect results for the BFGS algorithm.")]
-  public sealed class BFGSAnalyzer : SingleSuccessorOperator, IAnalyzer {
-    private const string PointParameterName = "Point";
-    private const string QualityGradientsParameterName = "QualityGradients";
-    private const string QualityParameterName = "Quality";
-    private const string ResultCollectionParameterName = "Results";
-    private const string QualitiesTableParameterName = "Qualities";
-    private const string PointsTableParameterName = "PointTable";
-    private const string QualityGradientsTableParameterName = "QualityGradientsTable";
-    private const string BFGSStateParameterName = "BFGSState";
-
-    #region Parameter Properties
-    public ILookupParameter<DoubleArray> QualityGradientsParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters[QualityGradientsParameterName]; }
-    }
-    public ILookupParameter<DoubleArray> PointParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters[PointParameterName]; }
-    }
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
-    }
-    public ILookupParameter<ResultCollection> ResultCollectionParameter {
-      get { return (ILookupParameter<ResultCollection>)Parameters[ResultCollectionParameterName]; }
-    }
-    public ILookupParameter<DataTable> QualitiesTableParameter {
-      get { return (ILookupParameter<DataTable>)Parameters[QualitiesTableParameterName]; }
-    }
-    public ILookupParameter<DataTable> PointsTableParameter {
-      get { return (ILookupParameter<DataTable>)Parameters[PointsTableParameterName]; }
-    }
-    public ILookupParameter<DataTable> QualityGradientsTableParameter {
-      get { return (ILookupParameter<DataTable>)Parameters[QualityGradientsTableParameterName]; }
-    }
-    public ILookupParameter<BFGSState> BFGSStateParameter {
-      get { return (ILookupParameter<BFGSState>)Parameters[BFGSStateParameterName]; }
-    }
-    #endregion
-
-    #region Properties
-    private DoubleArray QualityGradients { get { return QualityGradientsParameter.ActualValue; } }
-    private DoubleArray Point { get { return PointParameter.ActualValue; } }
-    private DoubleValue Quality { get { return QualityParameter.ActualValue; } }
-    private ResultCollection ResultCollection { get { return ResultCollectionParameter.ActualValue; } }
-
-    public bool EnabledByDefault {
-      get { return true; }
-    }
-
-    #endregion
-
-    [StorableConstructor]
-    private BFGSAnalyzer(bool deserializing) : base(deserializing) { }
-    private BFGSAnalyzer(BFGSAnalyzer original, Cloner cloner) : base(original, cloner) { }
-    public BFGSAnalyzer()
-      : base() {
-      // in
-      Parameters.Add(new LookupParameter<DoubleArray>(PointParameterName, "The current point of the function to optimize."));
-      Parameters.Add(new LookupParameter<DoubleArray>(QualityGradientsParameterName, "The current gradients of the function to optimize."));
-      Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The current value of the function to optimize."));
-      Parameters.Add(new LookupParameter<DataTable>(QualitiesTableParameterName, "The table of all visited quality values."));
-      Parameters.Add(new LookupParameter<DataTable>(PointsTableParameterName, "The table of all visited points."));
-      Parameters.Add(new LookupParameter<DataTable>(QualityGradientsTableParameterName, "The table of all visited gradient values."));
-      Parameters.Add(new LookupParameter<BFGSState>(BFGSStateParameterName, "The state of the BFGS optimization algorithm."));
-      // in & out
-      Parameters.Add(new LookupParameter<ResultCollection>(ResultCollectionParameterName, "The result collection of the algorithm."));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new BFGSAnalyzer(this, cloner);
-    }
-
-    public override IOperation Apply() {
-      if (BFGSStateParameter.ActualValue.State.xupdated) {
-        var f = Quality.Value;
-        var g = QualityGradients.ToArray();
-        var x = Point.ToArray();
-        var resultCollection = ResultCollection;
-
-        // create and add tables on the first time
-        if (QualitiesTableParameter.ActualValue == null) {
-          QualitiesTableParameter.ActualValue = new DataTable(QualityParameter.ActualName);
-          PointsTableParameter.ActualValue = new DataTable(PointParameter.ActualName);
-          QualityGradientsTableParameter.ActualValue = new DataTable(QualityGradientsParameter.ActualName);
-
-          QualitiesTableParameter.ActualValue.Rows.Add(new DataRow(QualityParameter.ActualName));
-
-          resultCollection.Add(new Result(QualitiesTableParameter.ActualName,
-                                          QualitiesTableParameter.ActualValue));
-          resultCollection.Add(new Result(PointsTableParameter.ActualName,
-                                          PointsTableParameter.ActualValue));
-          resultCollection.Add(new Result(QualityGradientsTableParameter.ActualName,
-                                          QualityGradientsTableParameter.ActualValue));
-          resultCollection.Add(new Result(QualityParameter.ActualName, QualityParameter.ActualValue));
-        }
-
-        // update
-        var functionValueRow = QualitiesTableParameter.ActualValue.Rows[QualityParameter.ActualName];
-        resultCollection[QualityParameter.ActualName].Value = Quality;
-        functionValueRow.Values.Add(f);
-
-        AddValues(g, QualityGradientsTableParameter.ActualValue);
-        AddValues(x, PointsTableParameter.ActualValue);
-      }
-      return base.Apply();
-    }
-
-    private void AddValues(double[] x, DataTable dataTable) {
-      if (!dataTable.Rows.Any()) {
-        for (int i = 0; i < x.Length; i++) {
-          var newRow = new DataRow("x" + i);
-          newRow.Values.Add(x[i]);
-          dataTable.Rows.Add(newRow);
-        }
-      } else {
-        for (int i = 0; i < x.Length; i++) {
-          dataTable.Rows.ElementAt(i).Values.Add(x[i]);
-        }
-      }
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSInitializer.cs	(revision 8386)
+++ 	(revision )
@@ -1,96 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis;
-
-namespace HeuristicLab.Algorithms.DataAnalysis {
-  [StorableClass]
-  [Item(Name = "BFGSInitializer", Description = "Initializes the necessary data structures for the BFGS algorithm.")]
-  public sealed class BFGSInitializer : SingleSuccessorOperator {
-    private const string DimensionParameterName = "Dimension";
-    private const string PointParameterName = "Point";
-    private const string BFGSStateParameterName = "BFGSState";
-    private const string IterationsParameterName = "Iterations";
-
-    #region Parameter Properties
-    // in
-    public ILookupParameter<IntValue> DimensionParameter {
-      get { return (ILookupParameter<IntValue>)Parameters[DimensionParameterName]; }
-    }
-    public ILookupParameter<IntValue> IterationsParameter {
-      get { return (ILookupParameter<IntValue>)Parameters[IterationsParameterName]; }
-    }
-    // out
-    public ILookupParameter<DoubleArray> PointParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters[PointParameterName]; }
-    }
-    public ILookupParameter<BFGSState> BFGSStateParameter {
-      get { return (ILookupParameter<BFGSState>)Parameters[BFGSStateParameterName]; }
-    }
-
-
-    #endregion
-
-    #region Properties
-    private IntValue Dimension { get { return DimensionParameter.ActualValue; } }
-    private IntValue Iterations { get { return IterationsParameter.ActualValue; } }
-    #endregion
-
-    [StorableConstructor]
-    private BFGSInitializer(bool deserializing) : base(deserializing) { }
-    private BFGSInitializer(BFGSInitializer original, Cloner cloner) : base(original, cloner) { }
-    public BFGSInitializer()
-      : base() {
-      // in
-      Parameters.Add(new LookupParameter<IntValue>(DimensionParameterName, "The length of the vector to optimize."));
-      Parameters.Add(new LookupParameter<IntValue>(IterationsParameterName, "The maximal number of iterations for the BFGS algorithm."));
-      // out
-      Parameters.Add(new LookupParameter<DoubleArray>(PointParameterName, "The initial point for the BFGS algorithm."));
-      Parameters.Add(new LookupParameter<BFGSState>(BFGSStateParameterName, "The state of the BFGS algorithm."));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new BFGSInitializer(this, cloner);
-    }
-
-    public override IOperation Apply() {
-      int n = Dimension.Value;
-      double[] initialPoint = Enumerable.Repeat(0.0, n).ToArray();
-      alglib.minlbfgs.minlbfgsstate state = new alglib.minlbfgs.minlbfgsstate();
-      alglib.minlbfgs.minlbfgscreate(n, Math.Min(n, 7), initialPoint, state);
-      alglib.minlbfgs.minlbfgssetcond(state, 0, 0, 0, Iterations.Value);
-      alglib.minlbfgs.minlbfgssetxrep(state, true);
-
-      PointParameter.ActualValue = new DoubleArray(initialPoint);
-      BFGSStateParameter.ActualValue = new BFGSState(state);
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSMakeStep.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSMakeStep.cs	(revision 8386)
+++ 	(revision )
@@ -1,88 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis;
-
-namespace HeuristicLab.Algorithms.DataAnalysis {
-  [StorableClass]
-  [Item(Name = "BFGSMakeStep", Description = "Makes a step in the BFGS optimization algorithm.")]
-  public sealed class BFGSMakeStep : SingleSuccessorOperator {
-    private const string TerminationCriterionParameterName = "TerminationCriterion";
-    private const string PointParameterName = "Point";
-    private const string BFGSStateParameterName = "BFGSState";
-
-    #region Parameter Properties
-    public ILookupParameter<BFGSState> BFGSStateParameter {
-      get { return (ILookupParameter<BFGSState>)Parameters[BFGSStateParameterName]; }
-    }
-    public ILookupParameter<BoolValue> TerminationCriterionParameter {
-      get { return (ILookupParameter<BoolValue>)Parameters[TerminationCriterionParameterName]; }
-    }
-    public ILookupParameter<DoubleArray> PointParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters[PointParameterName]; }
-    }
-    #endregion
-
-
-    #region Properties
-    private BFGSState BFGSState { get { return BFGSStateParameter.ActualValue; } }
-    #endregion
-
-    [StorableConstructor]
-    private BFGSMakeStep(bool deserializing) : base(deserializing) { }
-    private BFGSMakeStep(BFGSMakeStep original, Cloner cloner) : base(original, cloner) { }
-    public BFGSMakeStep()
-      : base() {
-      // in & out
-      Parameters.Add(new LookupParameter<BFGSState>(BFGSStateParameterName, "The state of the BFGS algorithm."));
-      // out
-      Parameters.Add(new LookupParameter<BoolValue>(TerminationCriterionParameterName, "The termination criterion indicating that the BFGS optimization algorithm should stop."));
-      Parameters.Add(new LookupParameter<DoubleArray>(PointParameterName, "The next point that should be evaluated in the BFGS algorithm."));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new BFGSMakeStep(this, cloner);
-    }
-
-    public override IOperation Apply() {
-      var state = BFGSState;
-      bool @continue = alglib.minlbfgs.minlbfgsiteration(state.State);
-      TerminationCriterionParameter.ActualValue = new BoolValue(!@continue);
-      if (@continue) {
-        PointParameter.ActualValue = new DoubleArray(state.State.x);
-      } else {
-        double[] x = new double[state.State.x.Length];
-        alglib.minlbfgs.minlbfgsreport rep = new alglib.minlbfgs.minlbfgsreport();
-        alglib.minlbfgs.minlbfgsresults(state.State, ref x, rep);
-        PointParameter.ActualValue = new DoubleArray(x);
-      }
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSState.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSState.cs	(revision 8386)
+++ 	(revision )
@@ -1,301 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis;
-
-namespace HeuristicLab.Algorithms.DataAnalysis {
-  [StorableClass]
-  [Item("BFGSState", "Internal state for the BFGS optimization algorithm.")]
-  public sealed class BFGSState : Item {
-    private alglib.minlbfgs.minlbfgsstate state;
-    public alglib.minlbfgs.minlbfgsstate State { get { return state; } }
-
-    [StorableConstructor]
-    private BFGSState(bool deserializing)
-      : base(deserializing) {
-      state = new alglib.minlbfgs.minlbfgsstate();
-    }
-    private BFGSState(BFGSState original, Cloner cloner)
-      : base(original, cloner) {
-      this.state = new alglib.minlbfgs.minlbfgsstate();
-      this.state.autobuf = CopyArray(original.state.autobuf);
-      this.state.d = CopyArray(original.state.d);
-      this.state.denseh = CopyArray(original.state.denseh);
-      this.state.diagh = CopyArray(original.state.diagh);
-      this.state.diffstep = original.state.diffstep;
-      this.state.epsf = original.state.epsf;
-      this.state.epsg = original.state.epsg;
-      this.state.epsx = original.state.epsx;
-      this.state.f = original.state.f;
-      this.state.fbase = original.state.fbase;
-      this.state.fm1 = original.state.fm1;
-      this.state.fm2 = original.state.fm2;
-      this.state.fold = original.state.fold;
-      this.state.fp1 = original.state.fp1;
-      this.state.fp2 = original.state.fp1;
-      this.state.g = CopyArray(original.state.g);
-      this.state.gammak = original.state.gammak;
-      this.state.k = original.state.k;
-
-      this.state.lstate.brackt = original.state.lstate.brackt;
-      this.state.lstate.dg = original.state.lstate.dg;
-      this.state.lstate.dginit = original.state.lstate.dginit;
-      this.state.lstate.dgm = original.state.lstate.dgm;
-      this.state.lstate.dgtest = original.state.lstate.dgtest;
-      this.state.lstate.dgx = original.state.lstate.dgx;
-      this.state.lstate.dgxm = original.state.lstate.dgxm;
-      this.state.lstate.dgy = original.state.lstate.dgy;
-      this.state.lstate.dgym = original.state.lstate.dgym;
-      this.state.lstate.finit = original.state.lstate.finit;
-      this.state.lstate.fm = original.state.lstate.fm;
-      this.state.lstate.ftest1 = original.state.lstate.ftest1;
-      this.state.lstate.fx = original.state.lstate.fx;
-      this.state.lstate.fxm = original.state.lstate.fxm;
-      this.state.lstate.fy = original.state.lstate.fy;
-      this.state.lstate.fym = original.state.lstate.fym;
-      this.state.lstate.infoc = original.state.lstate.infoc;
-      this.state.lstate.stage1 = original.state.lstate.stage1;
-      this.state.lstate.stmax = original.state.lstate.stmax;
-      this.state.lstate.stmin = original.state.lstate.stmin;
-      this.state.lstate.stx = original.state.lstate.stx;
-      this.state.lstate.sty = original.state.lstate.sty;
-      this.state.lstate.width = original.state.lstate.width;
-      this.state.lstate.width1 = original.state.lstate.width1;
-      this.state.lstate.xtrapf = original.state.lstate.xtrapf;
-
-      this.state.m = original.state.m;
-      this.state.maxits = original.state.maxits;
-      this.state.mcstage = original.state.mcstage;
-      this.state.n = original.state.n;
-      this.state.needf = original.state.needf;
-      this.state.needfg = original.state.needfg;
-      this.state.nfev = original.state.nfev;
-      this.state.p = original.state.p;
-      this.state.prectype = original.state.prectype;
-      this.state.q = original.state.q;
-      this.state.repiterationscount = original.state.repiterationscount;
-      this.state.repnfev = original.state.repnfev;
-      this.state.repterminationtype = original.state.repterminationtype;
-      this.state.rho = CopyArray(original.state.rho);
-      this.state.rstate.ba = CopyArray(original.state.rstate.ba);
-      this.state.rstate.ca = CopyArray(original.state.rstate.ca);
-      this.state.rstate.ia = CopyArray(original.state.rstate.ia);
-      this.state.rstate.ra = CopyArray(original.state.rstate.ra);
-      this.state.rstate.stage = original.state.rstate.stage;
-
-      this.state.s = CopyArray(original.state.s);
-      this.state.sk = CopyArray(original.state.sk);
-      this.state.stp = original.state.stp;
-      this.state.stpmax = original.state.stpmax;
-      this.state.theta = CopyArray(original.state.theta);
-      this.state.trimthreshold = original.state.trimthreshold;
-      this.state.work = CopyArray(original.state.work);
-      this.state.x = CopyArray(original.state.x);
-      this.state.xrep = original.state.xrep;
-      this.state.xupdated = original.state.xupdated;
-      this.state.yk = CopyArray(original.state.yk);
-    }
-
-    public BFGSState(alglib.minlbfgs.minlbfgsstate state)
-      : base() {
-      this.state = state;
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new BFGSState(this, cloner);
-    }
-
-
-    private T[] CopyArray<T>(T[] a) {
-      var c = new T[a.Length];
-      Array.Copy(a, c, c.Length);
-      return c;
-    }
-    private T[,] CopyArray<T>(T[,] a) {
-      var c = new T[a.GetLength(0), a.GetLength(1)];
-      Array.Copy(a, c, c.Length);
-      return c;
-    }
-
-    #region persistence
-    [Storable]
-    private double[] Autobuf { get { return state.autobuf; } set { state.autobuf = value; } }
-    [Storable]
-    private double[] D { get { return state.d; } set { state.d = value; } }
-    [Storable]
-    private double[,] Denseh { get { return state.denseh; } set { state.denseh = value; } }
-    [Storable]
-    private double[] Diagh { get { return state.diagh; } set { state.diagh = value; } }
-    [Storable]
-    private double Diffstep { get { return state.diffstep; } set { state.diffstep = value; } }
-    [Storable]
-    private double Epsf { get { return state.epsf; } set { state.epsf = value; } }
-    [Storable]
-    private double Epsg { get { return state.epsg; } set { state.epsg = value; } }
-    [Storable]
-    private double Epsx { get { return state.epsx; } set { state.epsx = value; } }
-    [Storable]
-    private double F { get { return state.f; } set { state.f = value; } }
-    [Storable]
-    private double Fbase { get { return state.fbase; } set { state.fbase = value; } }
-    [Storable]
-    private double Fm1 { get { return state.fm1; } set { state.fm1 = value; } }
-    [Storable]
-    private double Fm2 { get { return state.fm2; } set { state.fm2 = value; } }
-    [Storable]
-    private double Fold { get { return state.fold; } set { state.fold = value; } }
-    [Storable]
-    private double Fp1 { get { return state.fp1; } set { state.fp1 = value; } }
-    [Storable]
-    private double Fp2 { get { return state.fp2; } set { state.fp2 = value; } }
-    [Storable]
-    private double[] G { get { return state.g; } set { state.g = value; } }
-    [Storable]
-    private double Gammak { get { return state.gammak; } set { state.gammak = value; } }
-    [Storable]
-    private int K { get { return state.k; } set { state.k = value; } }
-    [Storable]
-    private bool LstateBrackt { get { return state.lstate.brackt; } set { state.lstate.brackt = value; } }
-    [Storable]
-    private double LstateDg { get { return state.lstate.dg; } set { state.lstate.dg = value; } }
-    [Storable]
-    private double LstateDginit { get { return state.lstate.dginit; } set { state.lstate.dginit = value; } }
-    [Storable]
-    private double LstateDgm { get { return state.lstate.dgm; } set { state.lstate.dgm = value; } }
-    [Storable]
-    private double LstateDgtest { get { return state.lstate.dgtest; } set { state.lstate.dgtest = value; } }
-    [Storable]
-    private double LstateDgx { get { return state.lstate.dgx; } set { state.lstate.dgx = value; } }
-    [Storable]
-    private double LstateDgxm { get { return state.lstate.dgxm; } set { state.lstate.dgxm = value; } }
-    [Storable]
-    private double LstateDgy { get { return state.lstate.dgy; } set { state.lstate.dgy = value; } }
-    [Storable]
-    private double LstateDgym { get { return state.lstate.dgym; } set { state.lstate.dgym = value; } }
-    [Storable]
-    private double LstateFinit { get { return state.lstate.finit; } set { state.lstate.finit = value; } }
-    [Storable]
-    private double LstateFm { get { return state.lstate.fm; } set { state.lstate.fm = value; } }
-    [Storable]
-    private double LstateFtest1 { get { return state.lstate.ftest1; } set { state.lstate.ftest1 = value; } }
-    [Storable]
-    private double LstateFx { get { return state.lstate.fx; } set { state.lstate.fx = value; } }
-    [Storable]
-    private double LstateFxm { get { return state.lstate.fxm; } set { state.lstate.fxm = value; } }
-    [Storable]
-    private double LstateFy { get { return state.lstate.fy; } set { state.lstate.fy = value; } }
-    [Storable]
-    private double LstateFym { get { return state.lstate.fym; } set { state.lstate.fym = value; } }
-    [Storable]
-    private int LstateInfoc { get { return state.lstate.infoc; } set { state.lstate.infoc = value; } }
-    [Storable]
-    private bool LstateStage1 { get { return state.lstate.stage1; } set { state.lstate.stage1 = value; } }
-    [Storable]
-    private double LstateStmax { get { return state.lstate.stmax; } set { state.lstate.stmax = value; } }
-    [Storable]
-    private double LstateStmin { get { return state.lstate.stmin; } set { state.lstate.stmin = value; } }
-    [Storable]
-    private double LstateStx { get { return state.lstate.stx; } set { state.lstate.stx = value; } }
-    [Storable]
-    private double LstateSty { get { return state.lstate.sty; } set { state.lstate.sty = value; } }
-    [Storable]
-    private double LstateWidth { get { return state.lstate.width; } set { state.lstate.width = value; } }
-    [Storable]
-    private double LstateWidth1 { get { return state.lstate.width1; } set { state.lstate.width1 = value; } }
-    [Storable]
-    private double LstateXtrapf { get { return state.lstate.xtrapf; } set { state.lstate.xtrapf = value; } }
-
-    [Storable]
-    private int M { get { return state.m; } set { state.m = value; } }
-    [Storable]
-    private int MaxIts { get { return state.maxits; } set { state.maxits = value; } }
-    [Storable]
-    private int Mcstage { get { return state.mcstage; } set { state.mcstage = value; } }
-    [Storable]
-    private int N { get { return state.n; } set { state.n = value; } }
-    [Storable]
-    private bool Needf { get { return state.needf; } set { state.needf = value; } }
-    [Storable]
-    private bool Needfg { get { return state.needfg; } set { state.needfg = value; } }
-    [Storable]
-    private int Nfev { get { return state.nfev; } set { state.nfev = value; } }
-    [Storable]
-    private int P { get { return state.p; } set { state.p = value; } }
-    [Storable]
-    private int Prectype { get { return state.prectype; } set { state.prectype = value; } }
-    [Storable]
-    private int Q { get { return state.q; } set { state.q = value; } }
-    [Storable]
-    private int Repiterationscount { get { return state.repiterationscount; } set { state.repiterationscount = value; } }
-    [Storable]
-    private int Repnfev { get { return state.repnfev; } set { state.repnfev = value; } }
-    [Storable]
-    private int Repterminationtype { get { return state.repterminationtype; } set { state.repterminationtype = value; } }
-    [Storable]
-    private double[] Rho { get { return state.rho; } set { state.rho = value; } }
-    [Storable]
-    private bool[] RstateBa { get { return state.rstate.ba; } set { state.rstate.ba = value; } }
-    [Storable]
-    private IList<Tuple<double, double>> RStateCa {
-      get { return state.rstate.ca.Select(c => Tuple.Create(c.x, c.y)).ToList(); }
-      set { state.rstate.ca = value.Select(t => new alglib.complex(t.Item1, t.Item2)).ToArray(); }
-    }
-    [Storable]
-    private int[] RstateIa { get { return state.rstate.ia; } set { state.rstate.ia = value; } }
-    [Storable]
-    private double[] RstateRa { get { return state.rstate.ra; } set { state.rstate.ra = value; } }
-    [Storable]
-    private int RstateStage { get { return state.rstate.stage; } set { state.p = value; } }
-    [Storable]
-    private double[] S { get { return state.s; } set { state.s = value; } }
-    [Storable]
-    private double[,] Sk { get { return state.sk; } set { state.sk = value; } }
-    [Storable]
-    private double Stp { get { return state.stp; } set { state.stp = value; } }
-    [Storable]
-    private double Stpmax { get { return state.stpmax; } set { state.stpmax = value; } }
-    [Storable]
-    private double[] Theta { get { return state.theta; } set { state.theta = value; } }
-    [Storable]
-    private double Trimthreshold { get { return state.trimthreshold; } set { state.trimthreshold = value; } }
-    [Storable]
-    private double[] Work { get { return state.work; } set { state.work = value; } }
-    [Storable]
-    private double[] X { get { return state.x; } set { state.x = value; } }
-    [Storable]
-    private bool Xrep { get { return state.xrep; } set { state.xrep = value; } }
-    [Storable]
-    private bool Xupdated { get { return state.xupdated; } set { state.xupdated = value; } }
-    [Storable]
-    private double[,] Yk { get { return state.yk; } set { state.yk = value; } }
-    #endregion
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSUpdateResults.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/BFGSUpdateResults.cs	(revision 8386)
+++ 	(revision )
@@ -1,83 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis;
-
-namespace HeuristicLab.Algorithms.DataAnalysis {
-  [StorableClass]
-  [Item(Name = "BFGSUpdateResults", Description = "Sets the results (function value and gradients) for the next optimization step in the BFGS algorithm.")]
-  public sealed class BFGSUpdateResults : SingleSuccessorOperator {
-    private const string QualityGradientsParameterName = "QualityGradients";
-    private const string QualityParameterName = "Quality";
-    private const string BFGSStateParameterName = "BFGSState";
-
-    #region Parameter Properties
-    public ILookupParameter<DoubleArray> QualityGradientsParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters[QualityGradientsParameterName]; }
-    }
-    public ILookupParameter<DoubleValue> QualityParameter {
-      get { return (ILookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
-    }
-    public ILookupParameter<BFGSState> BFGSStateParameter {
-      get { return (ILookupParameter<BFGSState>)Parameters[BFGSStateParameterName]; }
-    }
-    #endregion
-
-    #region Properties
-    private DoubleArray QualityGradients { get { return QualityGradientsParameter.ActualValue; } }
-    private DoubleValue Quality { get { return QualityParameter.ActualValue; } }
-    private BFGSState BFGSState { get { return BFGSStateParameter.ActualValue; } }
-    #endregion
-
-    [StorableConstructor]
-    private BFGSUpdateResults(bool deserializing) : base(deserializing) { }
-    private BFGSUpdateResults(BFGSUpdateResults original, Cloner cloner) : base(original, cloner) { }
-    public BFGSUpdateResults()
-      : base() {
-      // in
-      Parameters.Add(new LookupParameter<DoubleArray>(QualityGradientsParameterName, "The gradients at the evaluated point of the function to optimize."));
-      Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The value at the evaluated point of the function to optimize."));
-      // in & out
-      Parameters.Add(new LookupParameter<BFGSState>(BFGSStateParameterName, "The state of the BFGS algorithm."));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new BFGSUpdateResults(this, cloner);
-    }
-
-    public override IOperation Apply() {
-      var state = BFGSState;
-      var f = Quality.Value;
-      var g = QualityGradients.ToArray();
-      state.State.f = f;
-      state.State.g = g;
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessHyperparameterInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessHyperparameterInitializer.cs	(revision 8396)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessHyperparameterInitializer.cs	(revision 8396)
@@ -0,0 +1,91 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "GaussianProcessHyperparameterInitializer",
+    Description = "Initializers the hyperparameter vector based on the mean function, covariance function, and number of allowed input variables.")]
+  public sealed class GaussianProcessHyperparameterInitializer : SingleSuccessorOperator {
+    private const string MeanFunctionParameterName = "MeanFunction";
+    private const string CovarianceFunctionParameterName = "CovarianceFunction";
+    private const string ProblemDataParameterName = "ProblemData";
+    private const string HyperparameterParameterName = "Hyperparameter";
+
+    #region Parameter Properties
+    // in
+    public ILookupParameter<IMeanFunction> MeanFunctionParameter {
+      get { return (ILookupParameter<IMeanFunction>)Parameters[MeanFunctionParameterName]; }
+    }
+    public ILookupParameter<ICovarianceFunction> CovarianceFunctionParameter {
+      get { return (ILookupParameter<ICovarianceFunction>)Parameters[CovarianceFunctionParameterName]; }
+    }
+    public ILookupParameter<IDataAnalysisProblemData> ProblemDataParameter {
+      get { return (ILookupParameter<IDataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
+    }
+    // out
+    public ILookupParameter<RealVector> HyperparameterParameter {
+      get { return (ILookupParameter<RealVector>)Parameters[HyperparameterParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    private IMeanFunction MeanFunction { get { return MeanFunctionParameter.ActualValue; } }
+    private ICovarianceFunction CovarianceFunction { get { return CovarianceFunctionParameter.ActualValue; } }
+    private IDataAnalysisProblemData ProblemData { get { return ProblemDataParameter.ActualValue; } }
+    #endregion
+
+    [StorableConstructor]
+    private GaussianProcessHyperparameterInitializer(bool deserializing) : base(deserializing) { }
+    private GaussianProcessHyperparameterInitializer(GaussianProcessHyperparameterInitializer original, Cloner cloner) : base(original, cloner) { }
+    public GaussianProcessHyperparameterInitializer()
+      : base() {
+      // in
+      Parameters.Add(new LookupParameter<IMeanFunction>(MeanFunctionParameterName, "The mean function for the Gaussian process model."));
+      Parameters.Add(new LookupParameter<ICovarianceFunction>(CovarianceFunctionParameterName, "The covariance function for the Gaussian process model."));
+      Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName, "The input data for the Gaussian process."));
+      // out
+      Parameters.Add(new LookupParameter<RealVector>(HyperparameterParameterName, "The initial hyperparameter vector for the Gaussian process model."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new GaussianProcessHyperparameterInitializer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var inputVariablesCount = ProblemData.AllowedInputVariables.Count();
+      int l = 1 + MeanFunction.GetNumberOfParameters(inputVariablesCount) +
+              CovarianceFunction.GetNumberOfParameters(inputVariablesCount);
+      HyperparameterParameter.ActualValue = new RealVector(l);
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModel.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModel.cs	(revision 8386)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModel.cs	(revision 8396)
@@ -35,5 +35,4 @@
   [Item("GaussianProcessModel", "Represents a Gaussian process posterior.")]
   public sealed class GaussianProcessModel : NamedItem, IGaussianProcessModel {
-
     [Storable]
     private double negativeLogLikelihood;
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModelCreator.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModelCreator.cs	(revision 8386)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessModelCreator.cs	(revision 8396)
@@ -23,4 +23,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Operators;
@@ -42,6 +43,6 @@
     #region Parameter Properties
     // in
-    public ILookupParameter<DoubleArray> HyperparameterParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters[HyperparameterParameterName]; }
+    public ILookupParameter<RealVector> HyperparameterParameter {
+      get { return (ILookupParameter<RealVector>)Parameters[HyperparameterParameterName]; }
     }
     public ILookupParameter<IMeanFunction> MeanFunctionParameter {
@@ -55,6 +56,6 @@
       get { return (ILookupParameter<IGaussianProcessModel>)Parameters[ModelParameterName]; }
     }
-    public ILookupParameter<DoubleArray> HyperparameterGradientsParameter {
-      get { return (ILookupParameter<DoubleArray>)Parameters[HyperparameterGradientsParameterName]; }
+    public ILookupParameter<RealVector> HyperparameterGradientsParameter {
+      get { return (ILookupParameter<RealVector>)Parameters[HyperparameterGradientsParameterName]; }
     }
     public ILookupParameter<DoubleValue> NegativeLogLikelihoodParameter {
@@ -65,5 +66,5 @@
 
     #region Properties
-    protected DoubleArray Hyperparameter { get { return HyperparameterParameter.ActualValue; } }
+    protected RealVector Hyperparameter { get { return HyperparameterParameter.ActualValue; } }
     protected IMeanFunction MeanFunction { get { return MeanFunctionParameter.ActualValue; } }
     protected ICovarianceFunction CovarianceFunction { get { return CovarianceFunctionParameter.ActualValue; } }
@@ -76,10 +77,10 @@
       : base() {
       // in
-      Parameters.Add(new LookupParameter<DoubleArray>(HyperparameterParameterName, "The hyperparameters for the Gaussian process model."));
+      Parameters.Add(new LookupParameter<RealVector>(HyperparameterParameterName, "The hyperparameters for the Gaussian process model."));
       Parameters.Add(new LookupParameter<IMeanFunction>(MeanFunctionParameterName, "The mean function for the Gaussian process model."));
       Parameters.Add(new LookupParameter<ICovarianceFunction>(CovarianceFunctionParameterName, "The covariance function for the Gaussian process model."));
       // out
       Parameters.Add(new LookupParameter<IGaussianProcessModel>(ModelParameterName, "The resulting Gaussian process model"));
-      Parameters.Add(new LookupParameter<DoubleArray>(HyperparameterGradientsParameterName, "The gradients of the hyperparameters for the produced Gaussian process model (necessary for hyperparameter optimization)"));
+      Parameters.Add(new LookupParameter<RealVector>(HyperparameterGradientsParameterName, "The gradients of the hyperparameters for the produced Gaussian process model (necessary for hyperparameter optimization)"));
       Parameters.Add(new LookupParameter<DoubleValue>(NegativeLogLikelihoodParameterName, "The negative log-likelihood of the produced Gaussian process model given the data."));
     }
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegression.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegression.cs	(revision 8386)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegression.cs	(revision 8396)
@@ -28,4 +28,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Operators;
 using HeuristicLab.Optimization;
@@ -55,4 +56,5 @@
     private const string CovarianceFunctionParameterName = "CovarianceFunction";
     private const string MinimizationIterationsParameterName = "Iterations";
+    private const string ApproximateGradientsParameterName = "ApproximateGradients";
 
     #region parameter properties
@@ -88,4 +90,7 @@
     public GaussianProcessRegression()
       : base() {
+      this.name = ItemName;
+      this.description = ItemDescription;
+
       Problem = new RegressionProblem();
 
@@ -97,30 +102,33 @@
       Parameters.Add(new ConstrainedValueParameter<ICovarianceFunction>(CovarianceFunctionParameterName, "The covariance function to use.",
         new ItemSet<ICovarianceFunction>(covFunctions), covFunctions.First()));
-      Parameters.Add(new ValueParameter<IntValue>(MinimizationIterationsParameterName, "The number of iterations for likelihood optimization with BFGS.", new IntValue(20)));
+      Parameters.Add(new ValueParameter<IntValue>(MinimizationIterationsParameterName, "The number of iterations for likelihood optimization with LM-BFGS.", new IntValue(20)));
+      Parameters.Add(new ValueParameter<BoolValue>(ApproximateGradientsParameterName, "Indicates that gradients should not be approximated (necessary for LM-BFGS).", new BoolValue(false)));
+      Parameters[ApproximateGradientsParameterName].Hidden = true; // should not be changed
 
-      var setParameterLength = new GaussianProcessSetHyperparameterLength();
-      var initializer = new BFGSInitializer();
-      var makeStep = new BFGSMakeStep();
+      var gpInitializer = new GaussianProcessHyperparameterInitializer();
+      var bfgsInitializer = new LbfgsInitializer();
+      var makeStep = new LbfgsMakeStep();
       var branch = new ConditionalBranch();
       var modelCreator = new GaussianProcessRegressionModelCreator();
-      var updateResults = new BFGSUpdateResults();
-      var analyzer = new BFGSAnalyzer();
+      var updateResults = new LbfgsUpdateResults();
+      var analyzer = new LbfgsAnalyzer();
       var finalModelCreator = new GaussianProcessRegressionModelCreator();
-      var finalAnalyzer = new BFGSAnalyzer();
+      var finalAnalyzer = new LbfgsAnalyzer();
       var solutionCreator = new GaussianProcessRegressionSolutionCreator();
 
-      OperatorGraph.InitialOperator = setParameterLength;
+      OperatorGraph.InitialOperator = gpInitializer;
 
-      setParameterLength.CovarianceFunctionParameter.ActualName = CovarianceFunctionParameterName;
-      setParameterLength.MeanFunctionParameter.ActualName = MeanFunctionParameterName;
-      setParameterLength.ProblemDataParameter.ActualName = Problem.ProblemDataParameter.Name;
-      setParameterLength.Successor = initializer;
+      gpInitializer.CovarianceFunctionParameter.ActualName = CovarianceFunctionParameterName;
+      gpInitializer.MeanFunctionParameter.ActualName = MeanFunctionParameterName;
+      gpInitializer.ProblemDataParameter.ActualName = Problem.ProblemDataParameter.Name;
+      gpInitializer.HyperparameterParameter.ActualName = modelCreator.HyperparameterParameter.Name;
+      gpInitializer.Successor = bfgsInitializer;
 
-      initializer.IterationsParameter.ActualName = MinimizationIterationsParameterName;
-      initializer.DimensionParameter.ActualName = setParameterLength.NumberOfHyperparameterParameter.Name;
-      initializer.PointParameter.ActualName = modelCreator.HyperparameterParameter.Name;
-      initializer.Successor = makeStep;
+      bfgsInitializer.IterationsParameter.ActualName = MinimizationIterationsParameterName;
+      bfgsInitializer.PointParameter.ActualName = modelCreator.HyperparameterParameter.Name;
+      bfgsInitializer.ApproximateGradientsParameter.ActualName = ApproximateGradientsParameterName;
+      bfgsInitializer.Successor = makeStep;
 
-      makeStep.BFGSStateParameter.ActualName = initializer.BFGSStateParameter.Name;
+      makeStep.StateParameter.ActualName = bfgsInitializer.StateParameter.Name;
       makeStep.PointParameter.ActualName = modelCreator.HyperparameterParameter.Name;
       makeStep.Successor = branch;
@@ -135,7 +143,8 @@
       modelCreator.Successor = updateResults;
 
-      updateResults.BFGSStateParameter.ActualName = initializer.BFGSStateParameter.Name;
+      updateResults.StateParameter.ActualName = bfgsInitializer.StateParameter.Name;
       updateResults.QualityParameter.ActualName = modelCreator.NegativeLogLikelihoodParameter.Name;
       updateResults.QualityGradientsParameter.ActualName = modelCreator.HyperparameterGradientsParameter.Name;
+      updateResults.ApproximateGradientsParameter.ActualName = ApproximateGradientsParameterName;
       updateResults.Successor = analyzer;
 
@@ -143,5 +152,5 @@
       analyzer.PointParameter.ActualName = modelCreator.HyperparameterParameter.Name;
       analyzer.QualityGradientsParameter.ActualName = modelCreator.HyperparameterGradientsParameter.Name;
-      analyzer.BFGSStateParameter.ActualName = initializer.BFGSStateParameter.Name;
+      analyzer.StateParameter.ActualName = bfgsInitializer.StateParameter.Name;
       analyzer.PointsTableParameter.ActualName = "Hyperparameter table";
       analyzer.QualityGradientsTableParameter.ActualName = "Gradients table";
@@ -152,5 +161,5 @@
       finalModelCreator.MeanFunctionParameter.ActualName = MeanFunctionParameterName;
       finalModelCreator.CovarianceFunctionParameter.ActualName = CovarianceFunctionParameterName;
-      finalModelCreator.HyperparameterParameter.ActualName = initializer.PointParameter.ActualName;
+      finalModelCreator.HyperparameterParameter.ActualName = bfgsInitializer.PointParameter.ActualName;
       finalModelCreator.Successor = finalAnalyzer;
 
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionModelCreator.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionModelCreator.cs	(revision 8386)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessRegressionModelCreator.cs	(revision 8396)
@@ -25,4 +25,5 @@
 using HeuristicLab.Core;
 using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
 using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
 using HeuristicLab.Operators;
@@ -65,5 +66,5 @@
       ModelParameter.ActualValue = model;
       NegativeLogLikelihoodParameter.ActualValue = new DoubleValue(model.NegativeLogLikelihood);
-      HyperparameterGradientsParameter.ActualValue = new DoubleArray(model.GetHyperparameterGradients());
+      HyperparameterGradientsParameter.ActualValue = new RealVector(model.GetHyperparameterGradients());
       return base.Apply();
     }
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessSetHyperparameterLength.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/GaussianProcessSetHyperparameterLength.cs	(revision 8386)
+++ 	(revision )
@@ -1,91 +1,0 @@
-﻿#region License Information
-/* HeuristicLab
- * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
- *
- * This file is part of HeuristicLab.
- *
- * HeuristicLab is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * HeuristicLab is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
- */
-#endregion
-
-using System.Linq;
-using HeuristicLab.Common;
-using HeuristicLab.Core;
-using HeuristicLab.Data;
-using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
-using HeuristicLab.Operators;
-using HeuristicLab.Parameters;
-using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
-using HeuristicLab.Problems.DataAnalysis;
-
-namespace HeuristicLab.Algorithms.DataAnalysis {
-  [StorableClass]
-  [Item(Name = "GaussianProcessSetHyperparameterLength",
-    Description = "Determines the length of the hyperparameter vector based on the mean function, covariance function, and number of allowed input variables.")]
-  public sealed class GaussianProcessSetHyperparameterLength : SingleSuccessorOperator {
-    private const string MeanFunctionParameterName = "MeanFunction";
-    private const string CovarianceFunctionParameterName = "CovarianceFunction";
-    private const string ProblemDataParameterName = "ProblemData";
-    private const string NumberOfHyperparameterParameterName = "NumberOfHyperparameter";
-
-    #region Parameter Properties
-    // in
-    public ILookupParameter<IMeanFunction> MeanFunctionParameter {
-      get { return (ILookupParameter<IMeanFunction>)Parameters[MeanFunctionParameterName]; }
-    }
-    public ILookupParameter<ICovarianceFunction> CovarianceFunctionParameter {
-      get { return (ILookupParameter<ICovarianceFunction>)Parameters[CovarianceFunctionParameterName]; }
-    }
-    public ILookupParameter<IDataAnalysisProblemData> ProblemDataParameter {
-      get { return (ILookupParameter<IDataAnalysisProblemData>)Parameters[ProblemDataParameterName]; }
-    }
-    // out
-    public ILookupParameter<IntValue> NumberOfHyperparameterParameter {
-      get { return (ILookupParameter<IntValue>)Parameters[NumberOfHyperparameterParameterName]; }
-    }
-    #endregion
-
-    #region Properties
-    private IMeanFunction MeanFunction { get { return MeanFunctionParameter.ActualValue; } }
-    private ICovarianceFunction CovarianceFunction { get { return CovarianceFunctionParameter.ActualValue; } }
-    private IDataAnalysisProblemData ProblemData { get { return ProblemDataParameter.ActualValue; } }
-    #endregion
-
-    [StorableConstructor]
-    private GaussianProcessSetHyperparameterLength(bool deserializing) : base(deserializing) { }
-    private GaussianProcessSetHyperparameterLength(GaussianProcessSetHyperparameterLength original, Cloner cloner) : base(original, cloner) { }
-    public GaussianProcessSetHyperparameterLength()
-      : base() {
-      // in
-      Parameters.Add(new LookupParameter<IMeanFunction>(MeanFunctionParameterName, "The mean function for the Gaussian process model."));
-      Parameters.Add(new LookupParameter<ICovarianceFunction>(CovarianceFunctionParameterName, "The covariance function for the Gaussian process model."));
-      Parameters.Add(new LookupParameter<IDataAnalysisProblemData>(ProblemDataParameterName, "The input data for the Gaussian process."));
-      // out
-      Parameters.Add(new LookupParameter<IntValue>(NumberOfHyperparameterParameterName, "The length of the hyperparameter vector for the Gaussian process model."));
-    }
-
-    public override IDeepCloneable Clone(Cloner cloner) {
-      return new GaussianProcessSetHyperparameterLength(this, cloner);
-    }
-
-    public override IOperation Apply()
-    {
-      var inputVariablesCount = ProblemData.AllowedInputVariables.Count();
-      int l = 1 + MeanFunction.GetNumberOfParameters(inputVariablesCount) +
-              CovarianceFunction.GetNumberOfParameters(inputVariablesCount);
-      NumberOfHyperparameterParameter.ActualValue = new IntValue(l);
-      return base.Apply();
-    }
-  }
-}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/Lbfgs.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/Lbfgs.cs	(revision 8396)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/Lbfgs.cs	(revision 8396)
@@ -0,0 +1,146 @@
+
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.PluginInfrastructure;
+using HeuristicLab.Problems.DataAnalysis;
+using HeuristicLab.Problems.TestFunctions;
+using HeuristicLab.Random;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  /// <summary>
+  /// Limited-Memory BFGS optimization algorithm.
+  /// </summary>
+  [Item("LM-BFGS", "The limited-memory BFGS (BroydenFletcherGoldfarbShanno) optimization algorithm.")]
+  [Creatable("Algorithms")]
+  [StorableClass]
+  public sealed class LbfgsAlgorithm : HeuristicOptimizationEngineAlgorithm, IStorableContent {
+    public override Type ProblemType {
+      get { return typeof(SingleObjectiveTestFunctionProblem); }
+    }
+
+    public new SingleObjectiveTestFunctionProblem Problem {
+      get { return (SingleObjectiveTestFunctionProblem)base.Problem; }
+      set { base.Problem = value; }
+    }
+
+    public string Filename { get; set; }
+
+    private const string MaxIterationsParameterName = "MaxIterations";
+    private const string ApproximateGradientsParameterName = "ApproximateGradients";
+
+    #region parameter properties
+    public IValueParameter<IntValue> MaxIterationsParameter {
+      get { return (IValueParameter<IntValue>)Parameters[MaxIterationsParameterName]; }
+    }
+    #endregion
+    #region properties
+    public int MaxIterations {
+      set { MaxIterationsParameter.Value.Value = value; }
+      get { return MaxIterationsParameter.Value.Value; }
+    }
+    #endregion
+    [StorableConstructor]
+    private LbfgsAlgorithm(bool deserializing) : base(deserializing) { }
+    private LbfgsAlgorithm(LbfgsAlgorithm original, Cloner cloner)
+      : base(original, cloner) {
+    }
+    public LbfgsAlgorithm()
+      : base() {
+      this.name = ItemName;
+      this.description = ItemDescription;
+
+      Problem = new SingleObjectiveTestFunctionProblem();
+
+      Parameters.Add(new ValueParameter<IntValue>(MaxIterationsParameterName, "The maximal number of iterations for.", new IntValue(20)));
+      Parameters.Add(new ValueParameter<BoolValue>(ApproximateGradientsParameterName, "Indicates that gradients should be approximated.", new BoolValue(true)));
+      Parameters[ApproximateGradientsParameterName].Hidden = true; // should not be changed
+
+      var randomCreator = new RandomCreator();
+      var solutionCreator = new Placeholder();
+      var bfgsInitializer = new LbfgsInitializer();
+      var makeStep = new LbfgsMakeStep();
+      var branch = new ConditionalBranch();
+      var evaluator = new Placeholder();
+      var updateResults = new LbfgsUpdateResults();
+      var analyzer = new LbfgsAnalyzer();
+      var finalAnalyzer = new LbfgsAnalyzer();
+
+      OperatorGraph.InitialOperator = randomCreator;
+
+      randomCreator.Successor = solutionCreator;
+
+      solutionCreator.OperatorParameter.ActualName = Problem.SolutionCreatorParameter.Name;
+      solutionCreator.Successor = bfgsInitializer;
+
+      bfgsInitializer.IterationsParameter.ActualName = MaxIterationsParameterName;
+      bfgsInitializer.PointParameter.ActualName = Problem.SolutionCreator.RealVectorParameter.ActualName;
+      bfgsInitializer.ApproximateGradientsParameter.ActualName = ApproximateGradientsParameterName;
+      bfgsInitializer.Successor = makeStep;
+
+      makeStep.StateParameter.ActualName = bfgsInitializer.StateParameter.Name;
+      makeStep.PointParameter.ActualName = bfgsInitializer.PointParameter.ActualName;
+      makeStep.Successor = branch;
+
+      branch.ConditionParameter.ActualName = makeStep.TerminationCriterionParameter.Name;
+      branch.FalseBranch = evaluator;
+      branch.TrueBranch = finalAnalyzer;
+
+      evaluator.OperatorParameter.ActualName = Problem.EvaluatorParameter.Name;
+      evaluator.Successor = updateResults;
+
+      updateResults.StateParameter.ActualName = bfgsInitializer.StateParameter.Name;
+      updateResults.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.Name;
+      updateResults.ApproximateGradientsParameter.ActualName = ApproximateGradientsParameterName;
+      updateResults.Successor = analyzer;
+
+      analyzer.QualityParameter.ActualName = updateResults.QualityParameter.ActualName;
+      analyzer.PointParameter.ActualName = makeStep.PointParameter.ActualName;
+      analyzer.StateParameter.ActualName = bfgsInitializer.StateParameter.Name;
+      analyzer.Successor = makeStep;
+
+      finalAnalyzer.QualityParameter.ActualName = Problem.Evaluator.QualityParameter.Name;
+      finalAnalyzer.PointParameter.ActualName = makeStep.PointParameter.ActualName;
+      finalAnalyzer.PointsTableParameter.ActualName = analyzer.PointsTableParameter.ActualName;
+      finalAnalyzer.QualityGradientsTableParameter.ActualName = analyzer.QualityGradientsTableParameter.ActualName;
+      finalAnalyzer.QualitiesTableParameter.ActualName = analyzer.QualitiesTableParameter.ActualName;
+    }
+
+    [StorableHook(HookType.AfterDeserialization)]
+    private void AfterDeserialization() { }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LbfgsAlgorithm(this, cloner);
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsAnalyzer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsAnalyzer.cs	(revision 8396)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsAnalyzer.cs	(revision 8396)
@@ -0,0 +1,170 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Analysis;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Optimization;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "LBFGS Analyzer", Description = "Analyzer to collect results for the LM-BFGS algorithm.")]
+  public sealed class LbfgsAnalyzer : SingleSuccessorOperator, IAnalyzer {
+    private const string PointParameterName = "Point";
+    private const string QualityGradientsParameterName = "QualityGradients";
+    private const string QualityParameterName = "Quality";
+    private const string ResultCollectionParameterName = "Results";
+    private const string QualitiesTableParameterName = "Qualities";
+    private const string PointsTableParameterName = "PointTable";
+    private const string QualityGradientsTableParameterName = "QualityGradientsTable";
+    private const string StateParameterName = "State";
+    private const string ApproximateGradientsParameterName = "ApproximateGradients";
+
+    #region Parameter Properties
+    public ILookupParameter<RealVector> QualityGradientsParameter {
+      get { return (ILookupParameter<RealVector>)Parameters[QualityGradientsParameterName]; }
+    }
+    public ILookupParameter<RealVector> PointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters[PointParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
+    }
+    public ILookupParameter<ResultCollection> ResultCollectionParameter {
+      get { return (ILookupParameter<ResultCollection>)Parameters[ResultCollectionParameterName]; }
+    }
+    public ILookupParameter<DataTable> QualitiesTableParameter {
+      get { return (ILookupParameter<DataTable>)Parameters[QualitiesTableParameterName]; }
+    }
+    public ILookupParameter<DataTable> PointsTableParameter {
+      get { return (ILookupParameter<DataTable>)Parameters[PointsTableParameterName]; }
+    }
+    public ILookupParameter<DataTable> QualityGradientsTableParameter {
+      get { return (ILookupParameter<DataTable>)Parameters[QualityGradientsTableParameterName]; }
+    }
+    public ILookupParameter<LbfgsState> StateParameter {
+      get { return (ILookupParameter<LbfgsState>)Parameters[StateParameterName]; }
+    }
+    public ILookupParameter<BoolValue> ApproximateGradientsParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters[ApproximateGradientsParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    private RealVector QualityGradients { get { return QualityGradientsParameter.ActualValue; } }
+    private RealVector Point { get { return PointParameter.ActualValue; } }
+    private DoubleValue Quality { get { return QualityParameter.ActualValue; } }
+    private ResultCollection ResultCollection { get { return ResultCollectionParameter.ActualValue; } }
+    private BoolValue ApproximateGradients { get { return ApproximateGradientsParameter.ActualValue; } }
+
+    public bool EnabledByDefault {
+      get { return true; }
+    }
+
+    #endregion
+
+    [StorableConstructor]
+    private LbfgsAnalyzer(bool deserializing) : base(deserializing) { }
+    private LbfgsAnalyzer(LbfgsAnalyzer original, Cloner cloner) : base(original, cloner) { }
+    public LbfgsAnalyzer()
+      : base() {
+      // in
+      Parameters.Add(new LookupParameter<RealVector>(PointParameterName, "The current point of the function to optimize."));
+      Parameters.Add(new LookupParameter<RealVector>(QualityGradientsParameterName, "The current gradients of the function to optimize."));
+      Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The current value of the function to optimize."));
+      Parameters.Add(new LookupParameter<DataTable>(QualitiesTableParameterName, "The table of all visited quality values."));
+      Parameters.Add(new LookupParameter<DataTable>(PointsTableParameterName, "The table of all visited points."));
+      Parameters.Add(new LookupParameter<DataTable>(QualityGradientsTableParameterName, "The table of all visited gradient values."));
+      Parameters.Add(new LookupParameter<LbfgsState>(StateParameterName, "The state of the LM-BFGS optimization algorithm."));
+      Parameters.Add(new LookupParameter<BoolValue>(ApproximateGradientsParameterName,
+                                              "Flag that indicates if gradients should be approximated."));
+
+      // in & out
+      Parameters.Add(new LookupParameter<ResultCollection>(ResultCollectionParameterName, "The result collection of the algorithm."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LbfgsAnalyzer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      if (StateParameter.ActualValue.State.xupdated) {
+        var f = Quality.Value;
+        double[] g;
+        if (ApproximateGradients.Value) {
+          g = StateParameter.ActualValue.State.g;
+        } else {
+          g = QualityGradients.ToArray();
+        }
+        var x = Point.ToArray();
+        var resultCollection = ResultCollection;
+
+        // create and add tables on the first time
+        if (QualitiesTableParameter.ActualValue == null) {
+          QualitiesTableParameter.ActualValue = new DataTable(QualityParameter.ActualName);
+          PointsTableParameter.ActualValue = new DataTable(PointParameter.ActualName);
+          QualityGradientsTableParameter.ActualValue = new DataTable(QualityGradientsParameter.ActualName);
+
+          QualitiesTableParameter.ActualValue.Rows.Add(new DataRow(QualityParameter.ActualName));
+
+          resultCollection.Add(new Result(QualitiesTableParameter.ActualName,
+                                          QualitiesTableParameter.ActualValue));
+          resultCollection.Add(new Result(PointsTableParameter.ActualName,
+                                          PointsTableParameter.ActualValue));
+          resultCollection.Add(new Result(QualityGradientsTableParameter.ActualName,
+                                          QualityGradientsTableParameter.ActualValue));
+          resultCollection.Add(new Result(QualityParameter.ActualName, QualityParameter.ActualValue));
+        }
+
+        // update
+        var functionValueRow = QualitiesTableParameter.ActualValue.Rows[QualityParameter.ActualName];
+        resultCollection[QualityParameter.ActualName].Value = Quality;
+        functionValueRow.Values.Add(f);
+
+        AddValues(g, QualityGradientsTableParameter.ActualValue);
+        AddValues(x, PointsTableParameter.ActualValue);
+      }
+      return base.Apply();
+    }
+
+    private void AddValues(double[] x, DataTable dataTable) {
+      if (!dataTable.Rows.Any()) {
+        for (int i = 0; i < x.Length; i++) {
+          var newRow = new DataRow("x" + i);
+          newRow.Values.Add(x[i]);
+          dataTable.Rows.Add(newRow);
+        }
+      } else {
+        for (int i = 0; i < x.Length; i++) {
+          dataTable.Rows.ElementAt(i).Values.Add(x[i]);
+        }
+      }
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsInitializer.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsInitializer.cs	(revision 8396)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsInitializer.cs	(revision 8396)
@@ -0,0 +1,103 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "LBFGS Initializer", Description = "Initializes the necessary data structures for the LM-BFGS algorithm.")]
+  public sealed class LbfgsInitializer : SingleSuccessorOperator {
+    private const string PointParameterName = "Point";
+    private const string StateParameterName = "State";
+    private const string IterationsParameterName = "Iterations";
+    private const string ApproximateGradientsParameterName = "ApproximateGradients";
+
+    #region Parameter Properties
+    // in
+    public ILookupParameter<IntValue> IterationsParameter {
+      get { return (ILookupParameter<IntValue>)Parameters[IterationsParameterName]; }
+    }
+    public ILookupParameter<RealVector> PointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters[PointParameterName]; }
+    }
+    // out
+    public ILookupParameter<LbfgsState> StateParameter {
+      get { return (ILookupParameter<LbfgsState>)Parameters[StateParameterName]; }
+    }
+    public ILookupParameter<BoolValue> ApproximateGradientsParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters[ApproximateGradientsParameterName]; }
+    }
+
+
+    #endregion
+
+    #region Properties
+    private RealVector Point { get { return PointParameter.ActualValue; } }
+    private IntValue Iterations { get { return IterationsParameter.ActualValue; } }
+    private BoolValue ApproximateGradients { get { return ApproximateGradientsParameter.ActualValue; } }
+    #endregion
+
+    [StorableConstructor]
+    private LbfgsInitializer(bool deserializing) : base(deserializing) { }
+    private LbfgsInitializer(LbfgsInitializer original, Cloner cloner) : base(original, cloner) { }
+    public LbfgsInitializer()
+      : base() {
+      // in
+      Parameters.Add(new LookupParameter<RealVector>(PointParameterName, "The initial point for the LM-BFGS algorithm."));
+      Parameters.Add(new LookupParameter<IntValue>(IterationsParameterName, "The maximal number of iterations for the LM-BFGS algorithm."));
+      Parameters.Add(new LookupParameter<BoolValue>(ApproximateGradientsParameterName,
+                                                    "Flag that indicates if gradients should be approximated."));
+      // out
+      Parameters.Add(new LookupParameter<LbfgsState>(StateParameterName, "The state of the LM-BFGS algorithm."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LbfgsInitializer(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      double[] initialPoint = Point.ToArray();
+      int n = initialPoint.Length;
+      alglib.minlbfgs.minlbfgsstate state = new alglib.minlbfgs.minlbfgsstate();
+      if (ApproximateGradients.Value) {
+        alglib.minlbfgs.minlbfgscreatef(n, Math.Min(n, 7), initialPoint, 1E-5, state);
+      } else {
+        alglib.minlbfgs.minlbfgscreate(n, Math.Min(n, 7), initialPoint, state);
+      }
+      alglib.minlbfgs.minlbfgssetcond(state, 0, 0, 0, Iterations.Value);
+      alglib.minlbfgs.minlbfgssetxrep(state, true);
+
+      PointParameter.ActualValue = new RealVector(initialPoint);
+      StateParameter.ActualValue = new LbfgsState(state);
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsMakeStep.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsMakeStep.cs	(revision 8396)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsMakeStep.cs	(revision 8396)
@@ -0,0 +1,89 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "LBFGS MakeStep", Description = "Makes a step in the LM-BFGS optimization algorithm.")]
+  public sealed class LbfgsMakeStep : SingleSuccessorOperator {
+    private const string TerminationCriterionParameterName = "TerminationCriterion";
+    private const string PointParameterName = "Point";
+    private const string StateParameterName = "State";
+
+    #region Parameter Properties
+    public ILookupParameter<LbfgsState> StateParameter {
+      get { return (ILookupParameter<LbfgsState>)Parameters[StateParameterName]; }
+    }
+    public ILookupParameter<BoolValue> TerminationCriterionParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters[TerminationCriterionParameterName]; }
+    }
+    public ILookupParameter<RealVector> PointParameter {
+      get { return (ILookupParameter<RealVector>)Parameters[PointParameterName]; }
+    }
+    #endregion
+
+
+    #region Properties
+    private LbfgsState State { get { return StateParameter.ActualValue; } }
+    #endregion
+
+    [StorableConstructor]
+    private LbfgsMakeStep(bool deserializing) : base(deserializing) { }
+    private LbfgsMakeStep(LbfgsMakeStep original, Cloner cloner) : base(original, cloner) { }
+    public LbfgsMakeStep()
+      : base() {
+      // in & out
+      Parameters.Add(new LookupParameter<LbfgsState>(StateParameterName, "The state of the LM-BFGS algorithm."));
+      // out
+      Parameters.Add(new LookupParameter<BoolValue>(TerminationCriterionParameterName, "The termination criterion indicating that the LM-BFGS optimization algorithm should stop."));
+      Parameters.Add(new LookupParameter<RealVector>(PointParameterName, "The next point that should be evaluated in the LM-BFGS algorithm."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LbfgsMakeStep(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var state = State;
+      bool @continue = alglib.minlbfgs.minlbfgsiteration(state.State);
+      TerminationCriterionParameter.ActualValue = new BoolValue(!@continue);
+      if (@continue) {
+        PointParameter.ActualValue = new RealVector(state.State.x);
+      } else {
+        double[] x = new double[state.State.x.Length];
+        alglib.minlbfgs.minlbfgsreport rep = new alglib.minlbfgs.minlbfgsreport();
+        alglib.minlbfgs.minlbfgsresults(state.State, ref x, rep);
+        PointParameter.ActualValue = new RealVector(x);
+      }
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsState.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsState.cs	(revision 8396)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsState.cs	(revision 8396)
@@ -0,0 +1,301 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item("LbfgsState", "Internal state for the limited-memory BFGS optimization algorithm.")]
+  public sealed class LbfgsState : Item {
+    private alglib.minlbfgs.minlbfgsstate state;
+    public alglib.minlbfgs.minlbfgsstate State { get { return state; } }
+
+    [StorableConstructor]
+    private LbfgsState(bool deserializing)
+      : base(deserializing) {
+      state = new alglib.minlbfgs.minlbfgsstate();
+    }
+    private LbfgsState(LbfgsState original, Cloner cloner)
+      : base(original, cloner) {
+      this.state = new alglib.minlbfgs.minlbfgsstate();
+      this.state.autobuf = CopyArray(original.state.autobuf);
+      this.state.d = CopyArray(original.state.d);
+      this.state.denseh = CopyArray(original.state.denseh);
+      this.state.diagh = CopyArray(original.state.diagh);
+      this.state.diffstep = original.state.diffstep;
+      this.state.epsf = original.state.epsf;
+      this.state.epsg = original.state.epsg;
+      this.state.epsx = original.state.epsx;
+      this.state.f = original.state.f;
+      this.state.fbase = original.state.fbase;
+      this.state.fm1 = original.state.fm1;
+      this.state.fm2 = original.state.fm2;
+      this.state.fold = original.state.fold;
+      this.state.fp1 = original.state.fp1;
+      this.state.fp2 = original.state.fp1;
+      this.state.g = CopyArray(original.state.g);
+      this.state.gammak = original.state.gammak;
+      this.state.k = original.state.k;
+
+      this.state.lstate.brackt = original.state.lstate.brackt;
+      this.state.lstate.dg = original.state.lstate.dg;
+      this.state.lstate.dginit = original.state.lstate.dginit;
+      this.state.lstate.dgm = original.state.lstate.dgm;
+      this.state.lstate.dgtest = original.state.lstate.dgtest;
+      this.state.lstate.dgx = original.state.lstate.dgx;
+      this.state.lstate.dgxm = original.state.lstate.dgxm;
+      this.state.lstate.dgy = original.state.lstate.dgy;
+      this.state.lstate.dgym = original.state.lstate.dgym;
+      this.state.lstate.finit = original.state.lstate.finit;
+      this.state.lstate.fm = original.state.lstate.fm;
+      this.state.lstate.ftest1 = original.state.lstate.ftest1;
+      this.state.lstate.fx = original.state.lstate.fx;
+      this.state.lstate.fxm = original.state.lstate.fxm;
+      this.state.lstate.fy = original.state.lstate.fy;
+      this.state.lstate.fym = original.state.lstate.fym;
+      this.state.lstate.infoc = original.state.lstate.infoc;
+      this.state.lstate.stage1 = original.state.lstate.stage1;
+      this.state.lstate.stmax = original.state.lstate.stmax;
+      this.state.lstate.stmin = original.state.lstate.stmin;
+      this.state.lstate.stx = original.state.lstate.stx;
+      this.state.lstate.sty = original.state.lstate.sty;
+      this.state.lstate.width = original.state.lstate.width;
+      this.state.lstate.width1 = original.state.lstate.width1;
+      this.state.lstate.xtrapf = original.state.lstate.xtrapf;
+
+      this.state.m = original.state.m;
+      this.state.maxits = original.state.maxits;
+      this.state.mcstage = original.state.mcstage;
+      this.state.n = original.state.n;
+      this.state.needf = original.state.needf;
+      this.state.needfg = original.state.needfg;
+      this.state.nfev = original.state.nfev;
+      this.state.p = original.state.p;
+      this.state.prectype = original.state.prectype;
+      this.state.q = original.state.q;
+      this.state.repiterationscount = original.state.repiterationscount;
+      this.state.repnfev = original.state.repnfev;
+      this.state.repterminationtype = original.state.repterminationtype;
+      this.state.rho = CopyArray(original.state.rho);
+      this.state.rstate.ba = CopyArray(original.state.rstate.ba);
+      this.state.rstate.ca = CopyArray(original.state.rstate.ca);
+      this.state.rstate.ia = CopyArray(original.state.rstate.ia);
+      this.state.rstate.ra = CopyArray(original.state.rstate.ra);
+      this.state.rstate.stage = original.state.rstate.stage;
+
+      this.state.s = CopyArray(original.state.s);
+      this.state.sk = CopyArray(original.state.sk);
+      this.state.stp = original.state.stp;
+      this.state.stpmax = original.state.stpmax;
+      this.state.theta = CopyArray(original.state.theta);
+      this.state.trimthreshold = original.state.trimthreshold;
+      this.state.work = CopyArray(original.state.work);
+      this.state.x = CopyArray(original.state.x);
+      this.state.xrep = original.state.xrep;
+      this.state.xupdated = original.state.xupdated;
+      this.state.yk = CopyArray(original.state.yk);
+    }
+
+    public LbfgsState(alglib.minlbfgs.minlbfgsstate state)
+      : base() {
+      this.state = state;
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LbfgsState(this, cloner);
+    }
+
+
+    private T[] CopyArray<T>(T[] a) {
+      var c = new T[a.Length];
+      Array.Copy(a, c, c.Length);
+      return c;
+    }
+    private T[,] CopyArray<T>(T[,] a) {
+      var c = new T[a.GetLength(0), a.GetLength(1)];
+      Array.Copy(a, c, c.Length);
+      return c;
+    }
+
+    #region persistence
+    [Storable]
+    private double[] Autobuf { get { return state.autobuf; } set { state.autobuf = value; } }
+    [Storable]
+    private double[] D { get { return state.d; } set { state.d = value; } }
+    [Storable]
+    private double[,] Denseh { get { return state.denseh; } set { state.denseh = value; } }
+    [Storable]
+    private double[] Diagh { get { return state.diagh; } set { state.diagh = value; } }
+    [Storable]
+    private double Diffstep { get { return state.diffstep; } set { state.diffstep = value; } }
+    [Storable]
+    private double Epsf { get { return state.epsf; } set { state.epsf = value; } }
+    [Storable]
+    private double Epsg { get { return state.epsg; } set { state.epsg = value; } }
+    [Storable]
+    private double Epsx { get { return state.epsx; } set { state.epsx = value; } }
+    [Storable]
+    private double F { get { return state.f; } set { state.f = value; } }
+    [Storable]
+    private double Fbase { get { return state.fbase; } set { state.fbase = value; } }
+    [Storable]
+    private double Fm1 { get { return state.fm1; } set { state.fm1 = value; } }
+    [Storable]
+    private double Fm2 { get { return state.fm2; } set { state.fm2 = value; } }
+    [Storable]
+    private double Fold { get { return state.fold; } set { state.fold = value; } }
+    [Storable]
+    private double Fp1 { get { return state.fp1; } set { state.fp1 = value; } }
+    [Storable]
+    private double Fp2 { get { return state.fp2; } set { state.fp2 = value; } }
+    [Storable]
+    private double[] G { get { return state.g; } set { state.g = value; } }
+    [Storable]
+    private double Gammak { get { return state.gammak; } set { state.gammak = value; } }
+    [Storable]
+    private int K { get { return state.k; } set { state.k = value; } }
+    [Storable]
+    private bool LstateBrackt { get { return state.lstate.brackt; } set { state.lstate.brackt = value; } }
+    [Storable]
+    private double LstateDg { get { return state.lstate.dg; } set { state.lstate.dg = value; } }
+    [Storable]
+    private double LstateDginit { get { return state.lstate.dginit; } set { state.lstate.dginit = value; } }
+    [Storable]
+    private double LstateDgm { get { return state.lstate.dgm; } set { state.lstate.dgm = value; } }
+    [Storable]
+    private double LstateDgtest { get { return state.lstate.dgtest; } set { state.lstate.dgtest = value; } }
+    [Storable]
+    private double LstateDgx { get { return state.lstate.dgx; } set { state.lstate.dgx = value; } }
+    [Storable]
+    private double LstateDgxm { get { return state.lstate.dgxm; } set { state.lstate.dgxm = value; } }
+    [Storable]
+    private double LstateDgy { get { return state.lstate.dgy; } set { state.lstate.dgy = value; } }
+    [Storable]
+    private double LstateDgym { get { return state.lstate.dgym; } set { state.lstate.dgym = value; } }
+    [Storable]
+    private double LstateFinit { get { return state.lstate.finit; } set { state.lstate.finit = value; } }
+    [Storable]
+    private double LstateFm { get { return state.lstate.fm; } set { state.lstate.fm = value; } }
+    [Storable]
+    private double LstateFtest1 { get { return state.lstate.ftest1; } set { state.lstate.ftest1 = value; } }
+    [Storable]
+    private double LstateFx { get { return state.lstate.fx; } set { state.lstate.fx = value; } }
+    [Storable]
+    private double LstateFxm { get { return state.lstate.fxm; } set { state.lstate.fxm = value; } }
+    [Storable]
+    private double LstateFy { get { return state.lstate.fy; } set { state.lstate.fy = value; } }
+    [Storable]
+    private double LstateFym { get { return state.lstate.fym; } set { state.lstate.fym = value; } }
+    [Storable]
+    private int LstateInfoc { get { return state.lstate.infoc; } set { state.lstate.infoc = value; } }
+    [Storable]
+    private bool LstateStage1 { get { return state.lstate.stage1; } set { state.lstate.stage1 = value; } }
+    [Storable]
+    private double LstateStmax { get { return state.lstate.stmax; } set { state.lstate.stmax = value; } }
+    [Storable]
+    private double LstateStmin { get { return state.lstate.stmin; } set { state.lstate.stmin = value; } }
+    [Storable]
+    private double LstateStx { get { return state.lstate.stx; } set { state.lstate.stx = value; } }
+    [Storable]
+    private double LstateSty { get { return state.lstate.sty; } set { state.lstate.sty = value; } }
+    [Storable]
+    private double LstateWidth { get { return state.lstate.width; } set { state.lstate.width = value; } }
+    [Storable]
+    private double LstateWidth1 { get { return state.lstate.width1; } set { state.lstate.width1 = value; } }
+    [Storable]
+    private double LstateXtrapf { get { return state.lstate.xtrapf; } set { state.lstate.xtrapf = value; } }
+
+    [Storable]
+    private int M { get { return state.m; } set { state.m = value; } }
+    [Storable]
+    private int MaxIts { get { return state.maxits; } set { state.maxits = value; } }
+    [Storable]
+    private int Mcstage { get { return state.mcstage; } set { state.mcstage = value; } }
+    [Storable]
+    private int N { get { return state.n; } set { state.n = value; } }
+    [Storable]
+    private bool Needf { get { return state.needf; } set { state.needf = value; } }
+    [Storable]
+    private bool Needfg { get { return state.needfg; } set { state.needfg = value; } }
+    [Storable]
+    private int Nfev { get { return state.nfev; } set { state.nfev = value; } }
+    [Storable]
+    private int P { get { return state.p; } set { state.p = value; } }
+    [Storable]
+    private int Prectype { get { return state.prectype; } set { state.prectype = value; } }
+    [Storable]
+    private int Q { get { return state.q; } set { state.q = value; } }
+    [Storable]
+    private int Repiterationscount { get { return state.repiterationscount; } set { state.repiterationscount = value; } }
+    [Storable]
+    private int Repnfev { get { return state.repnfev; } set { state.repnfev = value; } }
+    [Storable]
+    private int Repterminationtype { get { return state.repterminationtype; } set { state.repterminationtype = value; } }
+    [Storable]
+    private double[] Rho { get { return state.rho; } set { state.rho = value; } }
+    [Storable]
+    private bool[] RstateBa { get { return state.rstate.ba; } set { state.rstate.ba = value; } }
+    [Storable]
+    private IList<Tuple<double, double>> RStateCa {
+      get { return state.rstate.ca.Select(c => Tuple.Create(c.x, c.y)).ToList(); }
+      set { state.rstate.ca = value.Select(t => new alglib.complex(t.Item1, t.Item2)).ToArray(); }
+    }
+    [Storable]
+    private int[] RstateIa { get { return state.rstate.ia; } set { state.rstate.ia = value; } }
+    [Storable]
+    private double[] RstateRa { get { return state.rstate.ra; } set { state.rstate.ra = value; } }
+    [Storable]
+    private int RstateStage { get { return state.rstate.stage; } set { state.p = value; } }
+    [Storable]
+    private double[] S { get { return state.s; } set { state.s = value; } }
+    [Storable]
+    private double[,] Sk { get { return state.sk; } set { state.sk = value; } }
+    [Storable]
+    private double Stp { get { return state.stp; } set { state.stp = value; } }
+    [Storable]
+    private double Stpmax { get { return state.stpmax; } set { state.stpmax = value; } }
+    [Storable]
+    private double[] Theta { get { return state.theta; } set { state.theta = value; } }
+    [Storable]
+    private double Trimthreshold { get { return state.trimthreshold; } set { state.trimthreshold = value; } }
+    [Storable]
+    private double[] Work { get { return state.work; } set { state.work = value; } }
+    [Storable]
+    private double[] X { get { return state.x; } set { state.x = value; } }
+    [Storable]
+    private bool Xrep { get { return state.xrep; } set { state.xrep = value; } }
+    [Storable]
+    private bool Xupdated { get { return state.xupdated; } set { state.xupdated = value; } }
+    [Storable]
+    private double[,] Yk { get { return state.yk; } set { state.yk = value; } }
+    #endregion
+  }
+}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsUpdateResults.cs
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsUpdateResults.cs	(revision 8396)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/GaussianProcess/LbfgsUpdateResults.cs	(revision 8396)
@@ -0,0 +1,93 @@
+﻿#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2012 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System.Linq;
+using HeuristicLab.Common;
+using HeuristicLab.Core;
+using HeuristicLab.Data;
+using HeuristicLab.Encodings.RealVectorEncoding;
+using HeuristicLab.Encodings.SymbolicExpressionTreeEncoding;
+using HeuristicLab.Operators;
+using HeuristicLab.Parameters;
+using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
+using HeuristicLab.Problems.DataAnalysis;
+
+namespace HeuristicLab.Algorithms.DataAnalysis {
+  [StorableClass]
+  [Item(Name = "LBFGS UpdateResults", Description = "Sets the results (function value and gradients) for the next optimization step in the LM-BFGS algorithm.")]
+  public sealed class LbfgsUpdateResults : SingleSuccessorOperator {
+    private const string QualityGradientsParameterName = "QualityGradients";
+    private const string QualityParameterName = "Quality";
+    private const string StateParameterName = "State";
+    private const string ApproximateGradientsParameterName = "ApproximateGradients";
+
+    #region Parameter Properties
+    public ILookupParameter<BoolValue> ApproximateGradientsParameter {
+      get { return (ILookupParameter<BoolValue>)Parameters[ApproximateGradientsParameterName]; }
+    }
+    public ILookupParameter<RealVector> QualityGradientsParameter {
+      get { return (ILookupParameter<RealVector>)Parameters[QualityGradientsParameterName]; }
+    }
+    public ILookupParameter<DoubleValue> QualityParameter {
+      get { return (ILookupParameter<DoubleValue>)Parameters[QualityParameterName]; }
+    }
+    public ILookupParameter<LbfgsState> StateParameter {
+      get { return (ILookupParameter<LbfgsState>)Parameters[StateParameterName]; }
+    }
+    #endregion
+
+    #region Properties
+    private BoolValue ApproximateGradients { get { return ApproximateGradientsParameter.ActualValue; } }
+    private RealVector QualityGradients { get { return QualityGradientsParameter.ActualValue; } }
+    private DoubleValue Quality { get { return QualityParameter.ActualValue; } }
+    private LbfgsState State { get { return StateParameter.ActualValue; } }
+    #endregion
+
+    [StorableConstructor]
+    private LbfgsUpdateResults(bool deserializing) : base(deserializing) { }
+    private LbfgsUpdateResults(LbfgsUpdateResults original, Cloner cloner) : base(original, cloner) { }
+    public LbfgsUpdateResults()
+      : base() {
+      // in
+      Parameters.Add(new LookupParameter<RealVector>(QualityGradientsParameterName, "The gradients at the evaluated point of the function to optimize."));
+      Parameters.Add(new LookupParameter<DoubleValue>(QualityParameterName, "The value at the evaluated point of the function to optimize."));
+      Parameters.Add(new LookupParameter<BoolValue>(ApproximateGradientsParameterName,
+                                                    "Flag that indicates if gradients should be approximated."));
+      // in & out
+      Parameters.Add(new LookupParameter<LbfgsState>(StateParameterName, "The state of the LM-BFGS algorithm."));
+    }
+
+    public override IDeepCloneable Clone(Cloner cloner) {
+      return new LbfgsUpdateResults(this, cloner);
+    }
+
+    public override IOperation Apply() {
+      var state = State;
+      var f = Quality.Value;
+      state.State.f = f;
+      if (!ApproximateGradients.Value) {
+        var g = QualityGradients.ToArray();
+        state.State.g = g;
+      }
+      return base.Apply();
+    }
+  }
+}
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj	(revision 8386)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/HeuristicLab.Algorithms.DataAnalysis-3.4.csproj	(revision 8396)
@@ -122,11 +122,12 @@
     </Compile>
     <Compile Include="FixedDataAnalysisAlgorithm.cs" />
-    <Compile Include="GaussianProcess\BFGSInitializer.cs" />
-    <Compile Include="GaussianProcess\BFGSState.cs" />
-    <Compile Include="GaussianProcess\BFGSUpdateResults.cs" />
-    <Compile Include="GaussianProcess\BFGSMakeStep.cs" />
-    <Compile Include="GaussianProcess\BFGSAnalyzer.cs" />
+    <Compile Include="GaussianProcess\Lbfgs.cs" />
+    <Compile Include="GaussianProcess\LbfgsInitializer.cs" />
+    <Compile Include="GaussianProcess\LbfgsState.cs" />
+    <Compile Include="GaussianProcess\LbfgsUpdateResults.cs" />
+    <Compile Include="GaussianProcess\LbfgsMakeStep.cs" />
+    <Compile Include="GaussianProcess\LbfgsAnalyzer.cs" />
+    <Compile Include="GaussianProcess\GaussianProcessHyperparameterInitializer.cs" />
     <Compile Include="GaussianProcess\GaussianProcessRegressionSolutionCreator.cs" />
-    <Compile Include="GaussianProcess\GaussianProcessSetHyperparameterLength.cs" />
     <Compile Include="GaussianProcess\GaussianProcessRegressionModelCreator.cs" />
     <Compile Include="GaussianProcess\CovarianceLinear.cs" />
@@ -243,4 +244,8 @@
       <Private>False</Private>
     </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Encodings.RealVectorEncoding\3.3\HeuristicLab.Encodings.RealVectorEncoding-3.3.csproj">
+      <Project>{BB6D334A-4BB6-4674-9883-31A6EBB32CAB}</Project>
+      <Name>HeuristicLab.Encodings.RealVectorEncoding-3.3</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding\3.4\HeuristicLab.Encodings.SymbolicExpressionTreeEncoding-3.4.csproj">
       <Project>{06D4A186-9319-48A0-BADE-A2058D462EEA}</Project>
@@ -300,4 +305,8 @@
       <Name>HeuristicLab.Problems.Instances-3.3</Name>
       <Private>False</Private>
+    </ProjectReference>
+    <ProjectReference Include="..\..\HeuristicLab.Problems.TestFunctions\3.3\HeuristicLab.Problems.TestFunctions-3.3.csproj">
+      <Project>{88B9B0E3-344E-4196-82A3-0F9732506FE8}</Project>
+      <Name>HeuristicLab.Problems.TestFunctions-3.3</Name>
     </ProjectReference>
     <ProjectReference Include="..\..\HeuristicLab.Random\3.3\HeuristicLab.Random-3.3.csproj">
Index: trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/Plugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/Plugin.cs.frame	(revision 8386)
+++ trunk/sources/HeuristicLab.Algorithms.DataAnalysis/3.4/Plugin.cs.frame	(revision 8396)
@@ -37,4 +37,5 @@
   [PluginDependency("HeuristicLab.Data", "3.3")]
   [PluginDependency("HeuristicLab.Encodings.SymbolicExpressionTreeEncoding", "3.4")]
+  [PluginDependency("HeuristicLab.Encodings.RealVectorEncoding", "3.3")]
   [PluginDependency("HeuristicLab.Operators", "3.3")]
   [PluginDependency("HeuristicLab.Optimization", "3.3")]
Index: trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/Plugin.cs.frame
===================================================================
--- trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/Plugin.cs.frame	(revision 8386)
+++ trunk/sources/HeuristicLab.Algorithms.GeneticAlgorithm/3.3/Plugin.cs.frame	(revision 8396)
@@ -40,4 +40,5 @@
   [PluginDependency("HeuristicLab.Random", "3.3")]
   [PluginDependency("HeuristicLab.Selection", "3.3")]
+  [PluginDependency("HeuristicLab.Problems.TestFunctions", "3.3")]
   public class HeuristicLabAlgorithmsGeneticAlgorithmPlugin : PluginBase {
   }
