34 #ifndef KERNEL_FUNCTOR_H__ 35 #define KERNEL_FUNCTOR_H__ 44 #ifndef DOXYGEN_SHOULD_SKIP_THIS 48 explicit Kernel(CKernel* kernel) : m_kernel(kernel)
52 inline float32_t operator()(int32_t i, int32_t j)
const 54 return m_kernel->kernel(i, j);
60 class SelfAdjointPrecomputedKernel
63 SelfAdjointPrecomputedKernel() : m_num_feat_vec(0)
66 explicit SelfAdjointPrecomputedKernel(SGVector<float32_t> self_adjoint_kernel_matrix) : m_num_feat_vec(0)
68 REQUIRE(self_adjoint_kernel_matrix.size()>0,
"Provided kernel matrix cannot be of size 0!\n");
69 m_self_adjoint_kernel_matrix=self_adjoint_kernel_matrix;
71 void precompute(CKernel* kernel)
73 REQUIRE(kernel,
"Kernel instance cannot be NULL!\n");
74 REQUIRE(kernel->get_num_vec_lhs()==kernel->get_num_vec_rhs(),
75 "Kernel instance is not symmetric (%dx%d)!\n", kernel->get_num_vec_lhs(), kernel->get_num_vec_rhs());
76 m_num_feat_vec=kernel->get_num_vec_lhs();
77 auto size=m_num_feat_vec*(m_num_feat_vec+1)/2;
78 if (m_self_adjoint_kernel_matrix.size()==0 || m_self_adjoint_kernel_matrix.size()!=size)
79 m_self_adjoint_kernel_matrix=SGVector<float32_t>(size);
80 for (
auto i=0; i<m_num_feat_vec; ++i)
82 for (
auto j=i; j<m_num_feat_vec; ++j)
84 auto index=i*m_num_feat_vec-i*(i+1)/2+j;
85 m_self_adjoint_kernel_matrix[index]=kernel->kernel(i, j);
89 inline float32_t operator()(int32_t i, int32_t j)
const 92 ASSERT(i>=0 && i<m_num_feat_vec);
93 ASSERT(j>=0 && j<m_num_feat_vec);
96 auto index=i*m_num_feat_vec-i*(i+1)/2+j;
97 return m_self_adjoint_kernel_matrix[index];
100 SGVector<float32_t> m_self_adjoint_kernel_matrix;
103 #endif // DOXYGEN_SHOULD_SKIP_THIS 107 #endif // KERNEL_FUNCTOR_H__
all of classes and functions are contained in the shogun namespace