MUQ  0.4.3
ProductKernel.h
Go to the documentation of this file.
1 #ifndef PRODUCTKERNEL_H
2 #define PRODUCTKERNEL_H
3 
7 
9 
15 
17 
18 namespace muq
19 {
20 namespace Approximation
21 {
22 
32 class ProductKernel : public KernelBase
33 {
34 
35 public:
36  ProductKernel(std::shared_ptr<KernelBase> kernel1In,
37  std::shared_ptr<KernelBase> kernel2In);
38 
39  virtual ~ProductKernel(){};
40 
41  virtual void FillBlock(Eigen::Ref<const Eigen::VectorXd> const& x1,
42  Eigen::Ref<const Eigen::VectorXd> const& x2,
43  Eigen::Ref<const Eigen::VectorXd> const& params,
44  Eigen::Ref<Eigen::MatrixXd> block) const override;
45 
46  virtual void FillPosDerivBlock(Eigen::Ref<const Eigen::VectorXd> const& x1,
47  Eigen::Ref<const Eigen::VectorXd> const& x2,
48  Eigen::Ref<const Eigen::VectorXd> const& params,
49  std::vector<int> const& wrts,
50  Eigen::Ref<Eigen::MatrixXd> block) const override
51  {
52 
53 
54  Eigen::MatrixXd eval1(coDim,coDim);
55  kernel1->FillBlock(x1,x2,params.head(kernel1->numParams),eval1);
56 
57  Eigen::MatrixXd eval2(coDim,coDim);
58  kernel2->FillBlock(x1,x2,params.tail(kernel2->numParams),eval2);
59 
60  Eigen::MatrixXd deriv1_i(coDim,coDim);
61  kernel1->FillPosDerivBlock(x1,x2,params.head(kernel1->numParams),{wrts.at(0)}, deriv1_i);
62 
63  Eigen::MatrixXd deriv2_i(coDim,coDim);
64  kernel2->FillPosDerivBlock(x1,x2,params.tail(kernel2->numParams), {wrts.at(0)}, deriv2_i);
65 
66  if(wrts.size()==1){
67  block = (deriv2_i.array() * eval1.array() + deriv1_i.array()*eval2.array()).matrix();
68 
69  }else if(wrts.size()==2){
70  Eigen::MatrixXd deriv1_j(coDim,coDim);
71  kernel1->FillPosDerivBlock(x1,x2,params.head(kernel1->numParams),{wrts.at(1)}, deriv1_j);
72 
73  Eigen::MatrixXd deriv2_j(coDim,coDim);
74  kernel2->FillPosDerivBlock(x1,x2,params.tail(kernel2->numParams), {wrts.at(1)}, deriv2_j);
75 
76  Eigen::MatrixXd secDeriv1_ij(coDim,coDim);
77  kernel1->FillPosDerivBlock(x1,x2,params.head(kernel1->numParams), wrts, secDeriv1_ij);
78 
79  Eigen::MatrixXd secDeriv2_ij(coDim,coDim);
80  kernel2->FillPosDerivBlock(x1,x2,params.tail(kernel2->numParams), wrts, secDeriv2_ij);
81 
82  block = (secDeriv1_ij.array() * eval2.array() + deriv1_i.array()*deriv2_j.array() + deriv1_j.array()*deriv2_i.array() + eval1.array()*secDeriv2_ij.array()).matrix();
83 
84  }else{
85  assert(false);
86  }
87  }
88 
89  virtual std::shared_ptr<KernelBase> Clone() const override{return std::make_shared<ProductKernel>(kernel1,kernel2);};
90 
91  // template<typename VecType1, typename VecType2, typename MatType>
92  // inline void GetDerivative(VecType1 const& x1, VecType2 const& x2, int wrt, MatType & derivs) const
93  // {
94  // assert(wrt < this->numParams);
95  //
96  // Eigen::MatrixXd temp1(kernel1.coDim, kernel1.coDim);
97  // Eigen::MatrixXd temp2(kernel2.coDim, kernel2.coDim);
98  //
99  // if(wrt < kernel1.numParams )
100  // {
101  // kernel1.GetDerivative(x1, x2, wrt, temp1);
102  // kernel2.EvaluateImpl(x1,x2, temp2);
103  // }
104  // else
105  // {
106  // kernel1.EvaluateImpl(x1,x2, temp1);
107  // kernel2.GetDerivative(x1,x2, wrt-kernel1.numParams, temp2);
108  // }
109  //
110  // if(kernel1.coDim==kernel2.coDim)
111  // {
112  // derivs = Eigen::MatrixXd(temp1.array() * temp2.array());
113  // }
114  // else if(kernel1.coDim==1)
115  // {
116  // derivs = temp1(0,0) * temp2;
117  // }
118  // else if(kernel2.coDim==1)
119  // {
120  // derivs = temp2(0,0) * temp1;
121  // }
122  // else
123  // {
124  // std::cerr << "\nERROR: Something unexpected happened with the dimensions of the kernels in this product.\n";
125  // assert(false);
126  // }
127 
128  //}
129 
130  virtual std::vector<std::shared_ptr<KernelBase>> GetSeperableComponents() override;
131 
132  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;
133 
134 protected:
135  std::shared_ptr<KernelBase> kernel1;
136  std::shared_ptr<KernelBase> kernel2;
137 
138  std::tuple<std::shared_ptr<muq::Modeling::LinearSDE>, std::shared_ptr<muq::Modeling::LinearOperator>, Eigen::MatrixXd> GetProductStateSpace(std::shared_ptr<PeriodicKernel> const& kernel1,
139  std::shared_ptr<KernelBase> const& kernel2,
140  boost::property_tree::ptree sdeOptions) const;
141 
142 };
143 
144 
145 // Operator overload
146 template<typename KernelType1, typename KernelType2,
148 ProductKernel operator*(KernelType1 const& k1, KernelType2 const& k2)
149 {
150  return ProductKernel(k1.Clone(), k2.Clone());
151 }
152 
153 std::shared_ptr<ProductKernel> operator*(std::shared_ptr<KernelBase> k1, std::shared_ptr<KernelBase> k2);
154 
155 } // namespace Approximation
156 }// namespace muq
157 
158 
159 #endif
Base class for all covariance kernels.
Definition: KernelBase.h:36
const unsigned int coDim
Definition: KernelBase.h:133
std::tuple< std::shared_ptr< muq::Modeling::LinearSDE >, std::shared_ptr< muq::Modeling::LinearOperator >, Eigen::MatrixXd > GetProductStateSpace(std::shared_ptr< PeriodicKernel > const &kernel1, std::shared_ptr< KernelBase > const &kernel2, boost::property_tree::ptree sdeOptions) const
virtual std::vector< std::shared_ptr< KernelBase > > GetSeperableComponents() override
Overridden by ProductKernel.
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
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.
virtual std::shared_ptr< KernelBase > Clone() const override
Definition: ProductKernel.h:89
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: ProductKernel.h:46
std::shared_ptr< KernelBase > kernel2
std::shared_ptr< KernelBase > kernel1
ProductKernel(std::shared_ptr< KernelBase > kernel1In, std::shared_ptr< KernelBase > kernel2In)
LinearTransformMean< MeanType > operator*(Eigen::MatrixXd const &A, MeanType const &K)
int int FloatType value
Definition: json.h:15223