MUQ  0.4.3
KernelBase.cpp
Go to the documentation of this file.
2 
3 using namespace muq::Approximation;
4 
5 Eigen::MatrixXd KernelBase::Evaluate(Eigen::VectorXd const& x1,
6  Eigen::VectorXd const& x2) const
7 {
8  Eigen::MatrixXd output(coDim, coDim);
9 
10  // Because Eigen doesn't support arbitrary indexing yet, we have to create
11  // A new vector containing the individual components of x1 and x2
12  Eigen::VectorXd x1Part(dimInds.size());
13  Eigen::VectorXd x2Part(dimInds.size());
14 
15  for(int i=0; i<dimInds.size(); ++i){
16  x1Part(i) = x1(dimInds.at(i));
17  x2Part(i) = x2(dimInds.at(i));
18  }
19 
20  FillBlock(x1Part, x2Part, cachedParams, output);
21  return output;
22 }
23 
24 Eigen::MatrixXd KernelBase::BuildCovariance(Eigen::MatrixXd const& x) const
25 {
26  Eigen::MatrixXd output(coDim*x.cols(), coDim*x.cols());
27  FillCovariance(x,output);
28  return output;
29 }
30 
31 Eigen::MatrixXd KernelBase::BuildCovariance(Eigen::MatrixXd const& x1,
32  Eigen::MatrixXd const& x2) const
33 {
34  Eigen::MatrixXd output(coDim*x1.cols(), coDim*x2.cols());
35  FillCovariance(x1,x2,output);
36  return output;
37 }
38 
39 void KernelBase::FillCovariance(Eigen::MatrixXd const& x,
40  Eigen::Ref<Eigen::MatrixXd> output) const
41 {
42  assert(output.rows()==x.cols()*coDim);
43  assert(output.cols()==x.cols()*coDim);
44 
45  const int numPts = x.cols();
46 
47  Eigen::MatrixXd xParts(dimInds.size(), x.cols());
48  for(int i=0; i<dimInds.size(); ++i)
49  xParts.row(i) = x.row(dimInds.at(i));
50 
51  #pragma omp parallel for
52  for(int i=0; i<numPts; ++i){
53 
54  for(int j=0; j<i; ++j){
55  FillBlock(xParts.col(i), xParts.col(j), cachedParams, output.block(i*coDim, j*coDim, coDim, coDim));
56  output.block(j*coDim, i*coDim, coDim, coDim) = output.block(i*coDim, j*coDim, coDim, coDim).transpose();
57  }
58 
59  FillBlock(xParts.col(i), xParts.col(i), cachedParams, output.block(i*coDim,i*coDim,coDim,coDim));
60  }
61 
62 }
63 
64 void KernelBase::FillCovariance(Eigen::MatrixXd const& x1,
65  Eigen::MatrixXd const& x2,
66  Eigen::Ref<Eigen::MatrixXd> output) const
67 {
68  int numRows = x1.cols();
69  int numCols = x2.cols();
70 
71  assert(output.rows()==numRows*coDim);
72  assert(output.cols()==numCols*coDim);
73 
74  Eigen::MatrixXd x1Parts(dimInds.size(), x1.cols());
75  Eigen::MatrixXd x2Parts(dimInds.size(), x2.cols());
76  for(int i=0; i<dimInds.size(); ++i){
77  x1Parts.row(i) = x1.row(dimInds.at(i));
78  x2Parts.row(i) = x2.row(dimInds.at(i));
79  }
80  #pragma omp parallel for
81  for(int i=0; i<numRows; ++i){
82  for(int j=0; j<numCols; ++j)
83  FillBlock(x1Parts.col(i), x2Parts.col(j), cachedParams, output.block(i*coDim, j*coDim, coDim, coDim));
84  }
85 }
86 
87 void KernelBase::FillDerivCovariance(Eigen::MatrixXd const& x1,
88  Eigen::MatrixXd const& x2,
89  std::vector<int> const& wrts,
90  Eigen::Ref<Eigen::MatrixXd> output) const
91 {
92  int numRows = x1.cols();
93  int numCols = x2.cols();
94 
95  output.resize(numRows*coDim,numCols*coDim);
96 
97  Eigen::MatrixXd x1Parts(dimInds.size(), x1.cols());
98  Eigen::MatrixXd x2Parts(dimInds.size(), x2.cols());
99  for(int i=0; i<dimInds.size(); ++i){
100  x1Parts.row(i) = x1.row(dimInds.at(i));
101  x2Parts.row(i) = x2.row(dimInds.at(i));
102  }
103 
104  #pragma omp parallel for
105  for(int i=0; i<numRows; ++i){
106  for(int j=0; j<numCols; ++j){
107  FillPosDerivBlock(x1Parts.col(i), x2Parts.col(j), cachedParams, wrts, output.block(i*coDim, j*coDim, coDim, coDim));
108  }
109  }
110 }
111 
112 Eigen::MatrixXd KernelBase::GetPosDerivative(Eigen::VectorXd const& x1,
113  Eigen::VectorXd const& x2,
114  std::vector<int> const& wrts) const
115 {
116  int numRows = x1.cols();
117  int numCols = x2.cols();
118 
119  Eigen::MatrixXd output(numRows*coDim,numCols*coDim);
120 
121  FillDerivCovariance(x1,x2,wrts,output);
122 
123  return output;
124 }
virtual Eigen::MatrixXd BuildCovariance(Eigen::MatrixXd const &x) const
Definition: KernelBase.cpp:24
virtual Eigen::MatrixXd GetPosDerivative(Eigen::VectorXd const &x1, Eigen::VectorXd const &x2, std::vector< int > const &wrts) const
Returns derivatives of the kernel with respect to the first input, x1.
Definition: KernelBase.cpp:112
const unsigned int coDim
Definition: KernelBase.h:133
virtual void FillPosDerivBlock(Eigen::Ref< const Eigen::VectorXd > const &x1, Eigen::Ref< const Eigen::VectorXd > const &x2, Eigen::Ref< const Eigen::VectorXd > const &params, std::vector< int > const &wrts, Eigen::Ref< Eigen::MatrixXd > block) const =0
virtual Eigen::MatrixXd Evaluate(Eigen::VectorXd const &x1, Eigen::VectorXd const &x2) const
Definition: KernelBase.cpp:5
Eigen::VectorXd cachedParams
Definition: KernelBase.h:156
const std::vector< unsigned int > dimInds
Definition: KernelBase.h:126
virtual void FillDerivCovariance(Eigen::MatrixXd const &xs, Eigen::MatrixXd const &ys, std::vector< int > const &wrts, Eigen::Ref< Eigen::MatrixXd > cov) const
Definition: KernelBase.cpp:87
virtual void FillCovariance(Eigen::MatrixXd const &xs, Eigen::MatrixXd const &ys, Eigen::Ref< Eigen::MatrixXd > cov) const
Definition: KernelBase.cpp:64
virtual void FillBlock(Eigen::Ref< const Eigen::VectorXd > const &x1, Eigen::Ref< const Eigen::VectorXd > const &x2, Eigen::Ref< const Eigen::VectorXd > const &params, Eigen::Ref< Eigen::MatrixXd > block) const =0