MUQ  0.4.3
SumKernel.cpp
Go to the documentation of this file.
2 
4 
7 
8 using namespace muq::Approximation;
9 
10 SumKernel::SumKernel(std::shared_ptr<KernelBase> kernel1In,
11  std::shared_ptr<KernelBase> kernel2In) : KernelBase(kernel1In->inputDim,
12  kernel1In->coDim,
13  kernel1In->numParams + kernel2In->numParams),
14  kernel1(kernel1In),
15  kernel2(kernel2In)
16 {
17  assert(kernel2->inputDim == kernel2->inputDim);
18  assert(kernel1->coDim == kernel2->coDim);
19  cachedParams.resize(numParams);
20  cachedParams.head(kernel1->numParams) = kernel1->GetParams();
21  cachedParams.tail(kernel2->numParams) = kernel2->GetParams();
22 };
23 
24 
25 void SumKernel::FillBlock(Eigen::Ref<const Eigen::VectorXd> const& x1,
26  Eigen::Ref<const Eigen::VectorXd> const& x2,
27  Eigen::Ref<const Eigen::VectorXd> const& params,
28  Eigen::Ref<Eigen::MatrixXd> block) const
29 {
30 
31  kernel1->FillBlock(x1,x2, params.head(kernel1->numParams), block);
32 
33  Eigen::MatrixXd temp(coDim, coDim);
34  kernel2->FillBlock(x1,x2, params.tail(kernel2->numParams), temp);
35 
36  block += temp;
37 }
38 
39 
40 void SumKernel::FillPosDerivBlock(Eigen::Ref<const Eigen::VectorXd> const& x1,
41  Eigen::Ref<const Eigen::VectorXd> const& x2,
42  Eigen::Ref<const Eigen::VectorXd> const& params,
43  std::vector<int> const& wrts,
44  Eigen::Ref<Eigen::MatrixXd> block) const
45 {
46  kernel1->FillPosDerivBlock(x1,x2, params.head(kernel1->numParams), wrts, block);
47 
48  Eigen::MatrixXd temp(coDim, coDim);
49  kernel2->FillPosDerivBlock(x1,x2, params.tail(kernel2->numParams), wrts, temp);
50 
51  block += temp;
52 }
53 
54 std::tuple<std::shared_ptr<muq::Modeling::LinearSDE>, std::shared_ptr<muq::Modeling::LinearOperator>, Eigen::MatrixXd> SumKernel::GetStateSpace(boost::property_tree::ptree sdeOptions) const
55 {
56  std::vector<std::shared_ptr<muq::Modeling::LinearSDE>> sdes(2);
57  std::vector<std::shared_ptr<muq::Modeling::LinearOperator>> linOps(2);
58  Eigen::MatrixXd pinf1, pinf2;
59 
60  // Get the statespace information from each component
61  std::tie(sdes.at(0), linOps.at(0), pinf1) = kernel1->GetStateSpace(sdeOptions);
62  std::tie(sdes.at(1), linOps.at(1), pinf2) = kernel2->GetStateSpace(sdeOptions);
63 
64  // Concantenate the sdes
65  auto newSDE = muq::Modeling::LinearSDE::Concatenate(sdes,sdeOptions);
66 
67  // Concatenate the linear operators
68  auto newObsOp = std::make_shared<muq::Modeling::BlockRowOperator>(linOps);
69 
70  // Set up the combined stationary covariance
71  Eigen::MatrixXd newPinf = Eigen::MatrixXd::Zero(pinf1.rows() + pinf2.rows(), pinf1.cols() + pinf2.cols());
72  newPinf.block(0,0,pinf1.rows(),pinf1.cols()) = pinf1;
73  newPinf.block(pinf1.rows(),pinf1.cols(), pinf2.rows(), pinf2.cols()) = pinf2;
74 
75  return std::make_tuple(newSDE, newObsOp, newPinf);
76 
77 }
78 
79 
80 std::shared_ptr<SumKernel> muq::Approximation::operator+(std::shared_ptr<KernelBase> k1, std::shared_ptr<KernelBase> k2)
81 {
82  return std::make_shared<SumKernel>(k1, k2);
83 }
Base class for all covariance kernels.
Definition: KernelBase.h:36
const unsigned int coDim
Definition: KernelBase.h:133
const unsigned int numParams
Definition: KernelBase.h:134
Eigen::VectorXd cachedParams
Definition: KernelBase.h:156
std::shared_ptr< KernelBase > kernel1
Definition: SumKernel.h:48
std::shared_ptr< KernelBase > kernel2
Definition: SumKernel.h:49
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 override
Definition: SumKernel.cpp:40
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 override
Definition: SumKernel.cpp:25
virtual std::tuple< std::shared_ptr< muq::Modeling::LinearSDE >, std::shared_ptr< muq::Modeling::LinearOperator >, Eigen::MatrixXd > GetStateSpace(boost::property_tree::ptree sdeOptions=boost::property_tree::ptree()) const override
Returns a state space representation of the covariance kernel.
Definition: SumKernel.cpp:54
SumKernel(std::shared_ptr< KernelBase > kernel1In, std::shared_ptr< KernelBase > kernel2In)
Definition: SumKernel.cpp:10
static std::shared_ptr< LinearSDE > Concatenate(std::vector< std::shared_ptr< LinearSDE >> const &sdes, boost::property_tree::ptree options=boost::property_tree::ptree())
Combines the states of multiple SDEs into a single monolitch SDE.
Definition: LinearSDE.cpp:180
SumMean operator+(MeanType1 const &mu1, MeanType2 const &mu2)