35 #ifndef SHARK_MODELS_KERNELS_GAUSSIAN_ARD_KERNEL_H 36 #define SHARK_MODELS_KERNELS_GAUSSIAN_ARD_KERNEL_H 59 template<
class InputType=RealVector>
65 struct InternalState:
public State{
68 void resize(std::size_t sizeX1,std::size_t sizeX2){
69 kxy.resize(sizeX1,sizeX2);
81 SHARK_CHECK( gamma_init > 0,
"[ARDKernelUnconstrained::ARDKernelUnconstrained] Expected positive weight.");
92 double sqrt_gamma = std::sqrt( gamma_init );
101 {
return "ARDKernelUnconstrained"; }
117 return boost::shared_ptr<State>(
new InternalState());
139 double eval(ConstInputReference x1, ConstInputReference x2)
const{
142 double dmnorm2 = diagonalMahalanobisDistanceSqr(x1, x2,
m_gammas);
143 return std::exp(-dmnorm2);
150 void eval(ConstBatchInputReference batchX1, ConstBatchInputReference batchX2, RealMatrix& result)
const{
151 SIZE_CHECK(batchX1.size2() == batchX2.size2());
154 std::size_t sizeX1 = batchX1.size1();
155 std::size_t sizeX2 = batchX2.size1();
157 ensure_size(result,sizeX1,sizeX2);
159 for(std::size_t i = 0; i != sizeX1; ++i){
160 for(std::size_t j = 0; j != sizeX2; ++j){
161 double dmnorm2 = diagonalMahalanobisDistanceSqr(
row(batchX1,i),
row(batchX2,j),
m_gammas);
162 result(i,j)=std::exp(-dmnorm2);
171 void eval(ConstBatchInputReference batchX1, ConstBatchInputReference batchX2, RealMatrix& result,
State& state)
const{
172 SIZE_CHECK(batchX1.size2() == batchX2.size2());
175 std::size_t sizeX1 = batchX1.size1();
176 std::size_t sizeX2 = batchX2.size1();
178 InternalState& s = state.
toState<InternalState>();
179 s.resize(sizeX1,sizeX2);
181 ensure_size(result,sizeX1,sizeX2);
183 for(std::size_t i = 0; i != sizeX1; ++i){
184 for(std::size_t j = 0; j != sizeX2; ++j){
185 double dmnorm2 = diagonalMahalanobisDistanceSqr(
row(batchX1,i),
row(batchX2,j),
m_gammas);
186 result(i,j) = std::exp(-dmnorm2);
187 s.kxy(i,j) = result(i,j);
199 ConstBatchInputReference batchX1,
200 ConstBatchInputReference batchX2,
201 RealMatrix
const& coefficients,
205 SIZE_CHECK(batchX1.size2() == batchX2.size2());
208 std::size_t sizeX1 = batchX1.size1();
209 std::size_t sizeX2 = batchX2.size1();
213 InternalState
const& s = state.
toState<InternalState>();
215 for(std::size_t i = 0; i != sizeX1; ++i){
216 for(std::size_t j = 0; j != sizeX2; ++j){
217 double coeff = coefficients(i,j) * s.kxy(i,j);
229 ConstBatchInputReference batchX1,
230 ConstBatchInputReference batchX2,
231 RealMatrix
const& coefficientsX2,
233 BatchInputType& gradient
235 SIZE_CHECK(batchX1.size2() == batchX2.size2());
238 std::size_t sizeX1 = batchX1.size1();
239 std::size_t sizeX2 = batchX2.size1();
241 InternalState
const& s = state.
toState<InternalState>();
245 for(std::size_t i = 0; i != sizeX1; ++i){
246 for(std::size_t j = 0; j != sizeX2; ++j){
247 double coeff = coefficientsX2(i,j) * s.kxy(i,j);