1 #ifndef GAUSSIANPROCESS_H_
2 #define GAUSSIANPROCESS_H_
20 namespace Approximation
64 class GaussianProcess;
65 class ObservationInformation;
72 double nlopt_obj(
unsigned n,
const double *x,
double *nlopt_grad,
void *opt_info);
89 virtual Eigen::MatrixXd
Evaluate(Eigen::MatrixXd
const& xs)
const = 0;
91 virtual std::shared_ptr<MeanFunctionBase>
Clone()
const = 0;
93 virtual std::shared_ptr<MeanFunctionBase>
GetPtr()
95 return shared_from_this();
98 virtual Eigen::MatrixXd
GetDerivative(Eigen::MatrixXd
const& xs, std::vector<std::vector<int>>
const& derivCoords)
const = 0;
117 virtual std::shared_ptr<MeanFunctionBase>
Clone()
const override
119 return std::make_shared<ZeroMean>(*
this);
122 virtual Eigen::MatrixXd
Evaluate(Eigen::MatrixXd
const& xs)
const override
124 return Eigen::MatrixXd::Zero(
coDim, xs.cols());
127 virtual Eigen::MatrixXd
GetDerivative(Eigen::MatrixXd
const& xs, std::vector<std::vector<int>>
const& derivCoords)
const override
129 return Eigen::MatrixXd::Zero(
coDim*derivCoords.size(), xs.cols());
137 LinearMean(
double slope,
double intercept) :
LinearMean(slope*Eigen::MatrixXd::Ones(1,1), intercept*Eigen::VectorXd::Ones(1)){};
142 Eigen::VectorXd
const& interceptsIn) :
MeanFunctionBase(slopesIn.cols(),slopesIn.rows()),
146 virtual std::shared_ptr<MeanFunctionBase>
Clone()
const override
148 return std::make_shared<LinearMean>(*
this);
151 virtual Eigen::MatrixXd
Evaluate(Eigen::MatrixXd
const& xs)
const override
156 virtual Eigen::MatrixXd
GetDerivative(Eigen::MatrixXd
const& xs, std::vector<std::vector<int>>
const& derivCoords)
const override
158 Eigen::MatrixXd output = Eigen::VectorXd::Zero(
coDim*derivCoords.size(), xs.cols());
159 for(
int j=0; j<xs.cols(); ++j){
160 for(
int i=0; i<derivCoords.size(); ++i)
162 if(derivCoords.at(i).size()==1){
163 output.col(j).segment(i*
coDim,
coDim) =
slopes.col(derivCoords.at(i).at(0));
164 }
else if(derivCoords.at(i).size()==1){
182 template<
typename LinearOperator>
187 template<
typename MeanType>
189 MeanType
const& meanIn) :
199 virtual std::shared_ptr<MeanFunctionBase>
Clone()
const override
201 return std::make_shared<LinearTransformMean>(*
this);
204 virtual Eigen::MatrixXd
Evaluate(Eigen::MatrixXd
const& xs)
const override
209 virtual Eigen::MatrixXd
GetDerivative(Eigen::MatrixXd
const& xs, std::vector<std::vector<int>>
const& derivCoords)
const override
212 std::cerr <<
"Derivatives in linear transform mean have not been implemented yet..." << std::endl;
236 template<
typename MeanType1,
typename MeanType2>
238 MeanType2
const& mu2In) :
243 assert(
mu1->inputDim ==
mu2->inputDim);
244 assert(
mu1->coDim ==
mu2->coDim);
249 virtual std::shared_ptr<MeanFunctionBase>
Clone()
const override
251 return std::make_shared<SumMean>(*
this);
254 virtual Eigen::MatrixXd
Evaluate(Eigen::MatrixXd
const& xs)
const override
256 return mu1->Evaluate(xs) +
mu2->Evaluate(xs);
259 virtual Eigen::MatrixXd
GetDerivative(Eigen::MatrixXd
const& xs, std::vector<std::vector<int>>
const& derivCoords)
const override
261 return mu1->GetDerivative(xs, derivCoords) +
mu2->GetDerivative(xs, derivCoords);
265 std::shared_ptr<MeanFunctionBase>
mu1,
mu2;
297 std::shared_ptr<KernelBase> covKernelIn);
303 Eigen::Ref<const Eigen::MatrixXd>
const& vals)
307 Eigen::Ref<const Eigen::MatrixXd>
const& vals,
316 std::shared_ptr<muq::Modeling::Gaussian>
Discretize(Eigen::MatrixXd
const& pts);
324 virtual std::pair<Eigen::MatrixXd, Eigen::MatrixXd>
Predict(Eigen::MatrixXd
const& newLocs,
330 virtual Eigen::MatrixXd
PredictMean(Eigen::MatrixXd
const& newPts);
335 virtual Eigen::MatrixXd
Sample(Eigen::MatrixXd
const& newPts);
339 Eigen::MatrixXd
const& vals);
347 std::shared_ptr<MeanFunctionBase>
Mean(){
return mean;};
352 Eigen::MatrixXd
BuildCrossCov(Eigen::MatrixXd
const& newLocs);
354 Eigen::MatrixXd
SolveFromEig(Eigen::MatrixXd
const& b)
const;
359 std::shared_ptr<MeanFunctionBase>
mean;
380 const double pi = 4.0 * atan(1.0);
388 template<
typename MeanType,
typename KernelType>
390 KernelType
const& kernel)
Eigen::VectorXd sigmaTrainDiff
Eigen::LDLT< Eigen::MatrixXd > covSolver
virtual Eigen::MatrixXd Sample(Eigen::MatrixXd const &newPts)
GaussianProcess(MeanFunctionBase &meanIn, KernelBase &kernelIn)
std::shared_ptr< KernelBase > covKernel
virtual Eigen::MatrixXd PredictMean(Eigen::MatrixXd const &newPts)
Eigen::MatrixXd BuildCrossCov(Eigen::MatrixXd const &newLocs)
Eigen::SelfAdjointEigenSolver< Eigen::MatrixXd > covSolverEig
virtual GaussianProcess & Condition(Eigen::Ref< const Eigen::MatrixXd > const &loc, Eigen::Ref< const Eigen::MatrixXd > const &vals)
void ProcessObservations()
virtual double MarginalLogLikelihood(Eigen::Ref< Eigen::VectorXd > grad)
std::shared_ptr< muq::Modeling::Gaussian > Discretize(Eigen::MatrixXd const &pts)
Eigen::MatrixXd SolveFromEig(Eigen::MatrixXd const &b) const
virtual std::pair< Eigen::MatrixXd, Eigen::MatrixXd > Predict(Eigen::MatrixXd const &newLocs, CovarianceType covType)
std::shared_ptr< MeanFunctionBase > mean
std::vector< std::shared_ptr< ObservationInformation > > observations
virtual ~GaussianProcess()=default
std::shared_ptr< MeanFunctionBase > Mean()
Eigen::VectorXd trainDiff
virtual double MarginalLogLikelihood()
virtual double LogLikelihood(Eigen::MatrixXd const &xs, Eigen::MatrixXd const &vals)
std::shared_ptr< KernelBase > Kernel()
Base class for all covariance kernels.
virtual ~LinearMean()=default
Eigen::VectorXd intercepts
virtual std::shared_ptr< MeanFunctionBase > Clone() const override
LinearMean(double slope, double intercept)
LinearMean(Eigen::MatrixXd const &slopesIn, Eigen::VectorXd const &interceptsIn)
virtual Eigen::MatrixXd GetDerivative(Eigen::MatrixXd const &xs, std::vector< std::vector< int >> const &derivCoords) const override
virtual Eigen::MatrixXd Evaluate(Eigen::MatrixXd const &xs) const override
virtual Eigen::MatrixXd GetDerivative(Eigen::MatrixXd const &xs, std::vector< std::vector< int >> const &derivCoords) const =0
virtual ~MeanFunctionBase()=default
MeanFunctionBase(unsigned dimIn, unsigned coDimIn)
virtual std::shared_ptr< MeanFunctionBase > Clone() const =0
virtual std::shared_ptr< MeanFunctionBase > GetPtr()
virtual Eigen::MatrixXd Evaluate(Eigen::MatrixXd const &xs) const =0
virtual Eigen::MatrixXd GetDerivative(Eigen::MatrixXd const &xs, std::vector< std::vector< int >> const &derivCoords) const override
std::shared_ptr< MeanFunctionBase > mu1
SumMean(MeanType1 const &mu1In, MeanType2 const &mu2In)
virtual ~SumMean()=default
virtual Eigen::MatrixXd Evaluate(Eigen::MatrixXd const &xs) const override
std::shared_ptr< MeanFunctionBase > mu2
virtual std::shared_ptr< MeanFunctionBase > Clone() const override
virtual Eigen::MatrixXd Evaluate(Eigen::MatrixXd const &xs) const override
ZeroMean(unsigned dim, unsigned coDim)
virtual std::shared_ptr< MeanFunctionBase > Clone() const override
virtual Eigen::MatrixXd GetDerivative(Eigen::MatrixXd const &xs, std::vector< std::vector< int >> const &derivCoords) const override
virtual ~ZeroMean()=default
GaussianProcess ConstructGP(MeanType const &mean, KernelType const &kernel)
LinearTransformMean< MeanType > operator*(Eigen::MatrixXd const &A, MeanType const &K)
double nlopt_obj(unsigned n, const double *x, double *nlopt_grad, void *opt_info)
SumMean operator+(MeanType1 const &mu1, MeanType2 const &mu2)