35 #ifndef SHARK_MODELS_KERNELS_ABSTRACTKERNELFUNCTION_H 36 #define SHARK_MODELS_KERNELS_ABSTRACTKERNELFUNCTION_H 44 #ifdef SHARK_COUNT_KERNEL_LOOKUPS 45 #define INCREMENT_KERNEL_COUNTER( counter ) { counter++; } 47 #define INCREMENT_KERNEL_COUNTER( counter ) { } 64 template<
class InputTypeT>
116 throw SHARKEXCEPTION(
"[AbstractKernelFunction::createState] createState must be overridden by kernels with derivatives");
118 return boost::shared_ptr<State>(
new EmptyState());
125 virtual double eval(ConstInputReference x1, ConstInputReference x2)
const{
136 inline double operator () (ConstInputReference x1, ConstInputReference x2)
const {
146 virtual void eval(ConstBatchInputReference batchX1, ConstBatchInputReference batchX2, RealMatrix& result,
State& state)
const = 0;
151 virtual void eval(ConstBatchInputReference batchX1, ConstBatchInputReference batchX2, RealMatrix& result)
const {
153 eval(batchX1, batchX2, result, *state);
160 inline RealMatrix
operator () (ConstBatchInputReference batchX1, ConstBatchInputReference batchX2)
const{
162 eval(batchX1, batchX2, result);
170 ConstBatchInputReference batchX1,
171 ConstBatchInputReference batchX2,
172 RealMatrix
const& coefficients,
176 throw SHARKEXCEPTION(
"[AbstractKernelFunction::weightedParameterDerivative] weightedParameterDerivative(...) not implemented.");
186 ConstBatchInputReference batchX1,
187 ConstBatchInputReference batchX2,
188 RealMatrix
const& coefficientsX2,
190 BatchInputType& gradient
192 throw SHARKEXCEPTION(
"[AbstractKernelFunction::weightedInputDerivative] weightedInputDerivative(...) not implemented");
201 double k12 =
eval(x1, x2);
202 return (2.0 - 2.0 * k12);
204 double k11 =
eval(x1, x1);
205 double k12 =
eval(x1, x2);
206 double k22 =
eval(x2, x2);
207 return (k11 - 2.0 * k12 + k22);
211 virtual RealMatrix
featureDistanceSqr(ConstBatchInputReference batchX1,ConstBatchInputReference batchX2)
const{
214 RealMatrix result=(*this)(batchX1,batchX2);
217 noalias(result)+=RealScalarMatrix(sizeX1,sizeX2,2.0);
220 RealVector kx2(sizeX2);
221 for(std::size_t i = 0; i != sizeX2;++i){
222 kx2(i)=
eval(
get(batchX2,i),
get(batchX2,i));
224 for(std::size_t j = 0; j != sizeX1;++j){
225 double kx1=
eval(
get(batchX1,j),
get(batchX1,j));