| 377 | }; |
| 378 | |
| 379 | Kernel::Kernel(int l, svm_node* const* x_, const svm_parameter& param) |
| 380 | : kernel_type(param.kernel_type) |
| 381 | , degree(param.degree) |
| 382 | , gamma(param.gamma) |
| 383 | , coef0(param.coef0) |
| 384 | { |
| 385 | switch (kernel_type) { |
| 386 | |
| 387 | case LINEAR: |
| 388 | kernel_function = &Kernel::kernel_linear; |
| 389 | break; |
| 390 | |
| 391 | case POLY: |
| 392 | kernel_function = &Kernel::kernel_poly; |
| 393 | break; |
| 394 | |
| 395 | case RBF: |
| 396 | kernel_function = &Kernel::kernel_rbf; |
| 397 | break; |
| 398 | |
| 399 | case SIGMOID: |
| 400 | kernel_function = &Kernel::kernel_sigmoid; |
| 401 | break; |
| 402 | |
| 403 | case PRECOMPUTED: |
| 404 | kernel_function = &Kernel::kernel_precomputed; |
| 405 | break; |
| 406 | } |
| 407 | |
| 408 | clone(x, x_, l); |
| 409 | |
| 410 | if (kernel_type == RBF) { |
| 411 | x_square = new double[l]; |
| 412 | |
| 413 | for (int i = 0; i < l; i++) |
| 414 | x_square[i] = dot(x[i], x[i]); |
| 415 | } |
| 416 | else |
| 417 | x_square = nullptr; |
| 418 | } |
| 419 | |
| 420 | Kernel::~Kernel() |
| 421 | { |