6 #include <stan/math/fwd/scal.hpp>
10 namespace Approximation
24 template<
typename ChildType>
33 unsigned numParamsIn) :
KernelBase(inputDimIn, coDimIn, numParamsIn){};
36 std::vector<unsigned> dimIndsIn,
38 unsigned numParamsIn) :
KernelBase(inputDimIn, dimIndsIn, coDimIn, numParamsIn){};
43 virtual std::shared_ptr<KernelBase>
Clone()
const override
45 return std::make_shared<ChildType>(
static_cast<ChildType
const &
>(*
this));
48 virtual void FillBlock(Eigen::Ref<const Eigen::VectorXd>
const& x1,
49 Eigen::Ref<const Eigen::VectorXd>
const& x2,
50 Eigen::Ref<const Eigen::VectorXd>
const& params,
51 Eigen::Ref<Eigen::MatrixXd> block)
const override
56 static_cast<const ChildType*
>(
this)->FillBlockImpl(Eigen::Ref<const Eigen::VectorXd>(x1slice),Eigen::Ref<const Eigen::VectorXd>(x2slice),params,block);
61 Eigen::Ref<const Eigen::VectorXd>
const& x2,
62 Eigen::Ref<const Eigen::VectorXd>
const& params,
63 std::vector<int>
const& wrts,
64 Eigen::Ref<Eigen::MatrixXd> block)
const override
70 Eigen::Ref<const Eigen::VectorXd>
const& x2,
71 Eigen::Ref<const Eigen::VectorXd>
const& params,
72 std::vector<int>
const& wrts,
73 Eigen::Ref<Eigen::MatrixXd> block)
const
81 static_cast<const ChildType*
>(
this)->FillBlockImpl(Eigen::Ref<const Eigen::VectorXd>(x1slice), Eigen::Ref<const Eigen::VectorXd>(x2slice), params, block);
86 Eigen::Matrix<stan::math::fvar<double>, Eigen::Dynamic, 1> x1Temp(x1.size());
87 Eigen::Matrix<stan::math::fvar<double>, Eigen::Dynamic, 1> x2Temp(x2.size());
89 for(
int i=0; i<x1.size(); ++i){
90 x1Temp(i).val_ = x1(i);
92 x2Temp(i).val_ = x2(i);
95 x1Temp(wrts.at(0)).d_ = 1.0;
98 Eigen::Matrix<stan::math::fvar<double>, Eigen::Dynamic, Eigen::Dynamic> cov(
coDim,
coDim);
99 static_cast<const ChildType*
>(
this)->
template FillBlockImpl<stan::math::fvar<double>,
double, stan::math::fvar<double>>(x1Temp, x2Temp, params, cov);
101 for(
int j=0; j<
coDim; ++j){
102 for(
int i=0; i<
coDim; ++i){
103 block(i,j) = cov(i,j).d_;
110 Eigen::Matrix<stan::math::fvar<stan::math::fvar<double>>, Eigen::Dynamic, 1> x1Temp2(x1.size());
111 Eigen::Matrix<stan::math::fvar<stan::math::fvar<double>>, Eigen::Dynamic, 1> x2Temp2(x1.size());
112 for(
int i=0; i<x1.size(); ++i){
113 x1Temp2(i).val_ = x1Temp(i);
115 x2Temp2(i).val_ = x2Temp(i);
118 x1Temp2(wrts.at(1)).d_ = 1.0;
121 Eigen::Matrix<stan::math::fvar<stan::math::fvar<double>>, Eigen::Dynamic, Eigen::Dynamic> cov(
coDim,
coDim);
122 static_cast<const ChildType*
>(
this)->
template FillBlockImpl<stan::math::fvar<stan::math::fvar<double>>,
double,stan::math::fvar<stan::math::fvar<double>>>(x1Temp2, x2Temp2, params, cov);
124 for(
int j=0; j<
coDim; ++j){
125 for(
int i=0; i<
coDim; ++i){
126 block(i,j) = cov(i,j).d_.d_;
133 Eigen::Matrix<stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>, Eigen::Dynamic, 1> x1Temp3(x1.size());
134 Eigen::Matrix<stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>, Eigen::Dynamic, 1> x2Temp3(x1.size());
135 for(
int i=0; i<x1.size(); ++i){
136 x1Temp3(i).val_ = x1Temp2(i);
138 x2Temp3(i).val_ = x2Temp2(i);
141 x1Temp3(wrts.at(2)).d_ = 1.0;
145 Eigen::Matrix<stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>, Eigen::Dynamic, Eigen::Dynamic> cov(
coDim,
coDim);
146 static_cast<const ChildType*
>(
this)->
template FillBlockImpl<stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>,
double,stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>>(x1Temp3, x2Temp3, params, cov);
148 for(
int j=0; j<
coDim; ++j){
149 for(
int i=0; i<
coDim; ++i){
150 block(i,j) = cov(i,j).d_.d_.d_;
157 Eigen::Matrix<stan::math::fvar<stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>>, Eigen::Dynamic, 1> x1Temp4(x1.size());
158 Eigen::Matrix<stan::math::fvar<stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>>, Eigen::Dynamic, 1> x2Temp4(x1.size());
159 for(
int i=0; i<x1.size(); ++i){
160 x1Temp4(i).val_ = x1Temp3(i);
162 x2Temp4(i).val_ = x2Temp3(i);
165 x1Temp4(wrts.at(3)).d_ = 1.0;
169 Eigen::Matrix<stan::math::fvar<stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>>, Eigen::Dynamic, Eigen::Dynamic> cov(
coDim,
coDim);
170 static_cast<const ChildType*
>(
this)->
template FillBlockImpl<stan::math::fvar<stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>>,
double,stan::math::fvar<stan::math::fvar<stan::math::fvar<stan::math::fvar<double>>>>>(x1Temp4, x2Temp4, params, cov);
172 for(
int j=0; j<
coDim; ++j){
173 for(
int i=0; i<
coDim; ++i){
174 block(i,j) = cov(i,j).d_.d_.d_.d_;
181 assert(wrts.size()<=4);
184 template<
typename ScalarType>
185 Eigen::Matrix<ScalarType, Eigen::Dynamic, 1>
GetSegment(Eigen::Ref<
const Eigen::Matrix<ScalarType, Eigen::Dynamic, 1>>
const& input)
const
187 Eigen::Matrix<ScalarType, Eigen::Dynamic, 1> output(
dimInds.size());
188 for(
int i=0; i<
dimInds.size(); ++i)
189 output(i) = input(
dimInds.at(i));
Base class for all covariance kernels.
const std::vector< unsigned int > dimInds
Base class in CRTP pattern for covariance kernels.
virtual void FillPosDerivBlock(Eigen::Ref< const Eigen::VectorXd > const &x1, Eigen::Ref< const Eigen::VectorXd > const &x2, Eigen::Ref< const Eigen::VectorXd > const ¶ms, std::vector< int > const &wrts, Eigen::Ref< Eigen::MatrixXd > block) const override
KernelImpl(unsigned inputDimIn, unsigned coDimIn, unsigned numParamsIn)
KernelImpl(unsigned inputDimIn, std::vector< unsigned > dimIndsIn, unsigned coDimIn, unsigned numParamsIn)
Eigen::Matrix< ScalarType, Eigen::Dynamic, 1 > GetSegment(Eigen::Ref< const Eigen::Matrix< ScalarType, Eigen::Dynamic, 1 >> const &input) const
virtual void FillBlock(Eigen::Ref< const Eigen::VectorXd > const &x1, Eigen::Ref< const Eigen::VectorXd > const &x2, Eigen::Ref< const Eigen::VectorXd > const ¶ms, Eigen::Ref< Eigen::MatrixXd > block) const override
void FillPosDerivBlockImpl(Eigen::Ref< const Eigen::VectorXd > const &x1, Eigen::Ref< const Eigen::VectorXd > const &x2, Eigen::Ref< const Eigen::VectorXd > const ¶ms, std::vector< int > const &wrts, Eigen::Ref< Eigen::MatrixXd > block) const
virtual std::shared_ptr< KernelBase > Clone() const override