12 Eigen::Map<const Eigen::VectorXd> params(x,
n);
17 info->
gp->
Kernel()->SetParams(params);
20 Eigen::Map<Eigen::VectorXd> grad(nlopt_grad,
n);
31 std::shared_ptr<KernelBase> covKernelIn) :
33 covKernel(covKernelIn),
34 inputDim(covKernel->inputDim),
35 coDim(covKernel->coDim),
40 Eigen::Ref<const Eigen::MatrixXd>
const& vals,
43 auto H = std::make_shared<IdentityOperator>(
coDim);
46 assert(vals.cols()==loc.cols());
47 assert(vals.rows()==
coDim);
50 for(
int i=0; i<loc.cols(); ++i){
51 auto obs = std::make_shared<ObservationInformation>(H,
54 obsVar*Eigen::MatrixXd::Identity(
coDim,
coDim));
77 Eigen::Map<Eigen::VectorXd> meanMap(
mean.data(),
mean.rows()*
mean.cols());
79 return std::make_shared<muq::Modeling::Gaussian>(meanMap,cov);
87 const double tol = std::max(std::numeric_limits<double>::epsilon(), 1
e-12*vals.maxCoeff());
90 for(
int i=vals.size()-1; i>=0; --i){
98 return vecs.rightCols(numPos) * vals.tail(numPos).cwiseInverse().asDiagonal() * vecs.rightCols(numPos).transpose() * b;
115 for(
int i=0; i<j; ++i){
124 trainCov.triangularView<Eigen::Lower>() = trainCov.triangularView<Eigen::Upper>().transpose();
126 covSolver.compute(trainCov.selfadjointView<Eigen::Lower>());
140 auto derivObs = std::dynamic_pointer_cast<DerivativeObservation>(
observations.at(i));
167 Eigen::VectorXd params =
covKernel->GetParams();
169 const Eigen::MatrixXd bounds =
covKernel->GetParamBounds();
170 Eigen::VectorXd lbs = bounds.row(0);
171 Eigen::VectorXd ubs = bounds.row(1);
193 Eigen::MatrixXd crossCov(
obsDim,
coDim*newLocs.cols());
197 for(
int i=0; i<newLocs.cols(); ++i){
208 return crossCov.transpose();
217 Eigen::MatrixXd crossCov;
219 Eigen::MatrixXd outputMean(
coDim, newLocs.cols());
220 Eigen::MatrixXd outputCov;
222 Eigen::Map<Eigen::VectorXd> postMean(outputMean.data(),
coDim*newLocs.cols());
225 outputMean =
mean->Evaluate(newLocs);
226 assert(outputMean.rows()==
coDim);
233 outputMean +=
mean->Evaluate(newLocs);
239 outputCov.resize(
coDim, newLocs.cols());
242 for(
int i=0; i<newLocs.cols(); ++i){
243 covKernel->FillCovariance(newLocs.col(i),priorCov);
246 for(
int d=0; d<
coDim; ++d){
248 outputCov(d,i) = priorCov(d,d) - crossCov.row(i*
coDim+d).dot(
SolveFromEig(crossCov.row(i*
coDim+d).transpose()).col(0) );
250 outputCov(d,i) = priorCov(d,d) - crossCov.row(i*
coDim+d) *
covSolver.solve(crossCov.row(i*
coDim+d).transpose());
254 for(
int d=0; d<
coDim; ++d)
255 outputCov(d,i) = priorCov(d,d);
262 outputCov.resize(
coDim,
coDim*newLocs.cols());
265 for(
int i=0; i<newLocs.cols(); ++i){
266 covKernel->FillCovariance(newLocs.col(i),priorCov);
283 Eigen::MatrixXd priorCov(
coDim*newLocs.cols(),
coDim*newLocs.cols());
284 covKernel->FillCovariance(newLocs,priorCov);
289 outputCov = priorCov - crossCov *
SolveFromEig(crossCov.transpose());
291 outputCov = priorCov - crossCov *
covSolver.solve(crossCov.transpose());
294 outputCov = priorCov;
299 outputCov +=
nugget*Eigen::MatrixXd::Identity(outputCov.rows(), outputCov.cols());
300 return std::make_pair(outputMean, outputCov);
307 return mean->Evaluate(newPts);
314 Eigen::MatrixXd meanMat(
coDim, newPts.size());
315 Eigen::Map<Eigen::VectorXd> meanVec(meanMat.data(),
coDim*newPts.cols());
318 meanMat +=
mean->Evaluate(newPts);
328 Eigen::MatrixXd
mean, covariance;
331 Eigen::MatrixXd output(
mean.rows(),
mean.cols());
332 Eigen::Map<Eigen::VectorXd> outVec(output.data(), output.rows()*output.cols());
335 auto fact = covariance.selfadjointView<Eigen::Lower>().llt();
336 if(fact.info() == Eigen::Success){
337 outVec = fact.matrixL()*RandomGenerator::GetNormal(covariance.rows());
342 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> solver(covariance);
343 auto& vals = solver.eigenvalues();
344 auto& vecs = solver.eigenvectors();
347 for(
int i=vals.size()-1; i>=0; --i){
348 if(vals(i)>std::sqrt(std::numeric_limits<double>::epsilon())){
355 outVec = vecs.rightCols(numPos)*vals.tail(numPos).cwiseSqrt().asDiagonal()*RandomGenerator::GetNormal(numPos);
364 Eigen::MatrixXd
const& vals)
369 Eigen::MatrixXd
mean, covariance;
372 const Eigen::Map<const Eigen::VectorXd> valMap(vals.data(), vals.rows()*vals.cols());
373 Eigen::Map<Eigen::VectorXd> muMap(
mean.data(),
mean.rows()*
mean.cols());
375 Eigen::VectorXd diff = valMap-muMap;
376 auto solver = covariance.selfadjointView<Eigen::Lower>().llt();
378 for(
int i=0; i<solver.matrixL().rows(); ++i)
379 logDet += 2.0*log(solver.matrixL()(i,i));
381 double logDens = -0.5*diff.dot( solver.solve(diff) ) - 0.5*logDet - 0.5*valMap.size()*log(2.0*M_PI);
388 Eigen::VectorXd grad;
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()
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
Eigen::VectorXd trainDiff
virtual double MarginalLogLikelihood()
virtual double LogLikelihood(Eigen::MatrixXd const &xs, Eigen::MatrixXd const &vals)
std::shared_ptr< KernelBase > Kernel()
double nlopt_obj(unsigned n, const double *x, double *nlopt_grad, void *opt_info)