36#ifndef STRUMPACK_KERNEL_HPP
37#define STRUMPACK_KERNEL_HPP
42#if defined(STRUMPACK_USE_MPI)
44#if defined(STRUMPACK_USE_BPACK)
73 template<
typename scalar_t>
class Kernel {
74 using real_t =
typename RealType<scalar_t>::value_type;
77#if defined(STRUMPACK_USE_MPI)
93 : data_(
data), lambda_(lambda) { }
106 std::size_t
n()
const {
return data_.
cols(); }
113 std::size_t
d()
const {
return data_.
rows(); }
122 virtual scalar_t
eval(std::size_t i, std::size_t j)
const {
123 return eval_kernel_function(data_.
ptr(0, i), data_.
ptr(0, j))
124 + ((i == j) ? lambda_ : scalar_t(0.));
139 const std::vector<std::size_t>& J,
141 assert(B.
rows() == I.size() && B.
cols() == J.size());
142 for (std::size_t j=0; j<J.size(); j++)
143 for (std::size_t i=0; i<I.size(); i++) {
144 assert(I[i] <
n() && J[j] <
n());
145 B(i, j) =
eval(I[i], J[j]);
161 const std::vector<std::size_t>& J,
163 assert(B.rows() == I.size() && B.cols() == J.size());
164 for (std::size_t j=0; j<J.size(); j++)
165 for (std::size_t i=0; i<I.size(); i++) {
166 assert(I[i] <
n() && J[j] <
n());
167 B(i, j) =
eval(I[i], J[j]);
206#if defined(STRUMPACK_USE_MPI)
228 (
const BLACSGrid& grid, std::vector<scalar_t>& labels,
245#if defined(STRUMPACK_USE_BPACK)
265 (
const MPIComm& c, std::vector<scalar_t>& labels,
284 std::vector<int>& permutation() {
return perm_; }
285 const std::vector<int>& permutation()
const {
return perm_; }
287 virtual void permute() {
288 data_.
lapmr(perm_,
true);
294 std::vector<int> perm_;
310 virtual scalar_t eval_kernel_function
311 (
const scalar_t* x,
const scalar_t* y)
const = 0;
332 template<
typename scalar_t>
351 scalar_t eval_kernel_function
352 (
const scalar_t* x,
const scalar_t* y)
const override {
355 / (scalar_t(2.) * h_ * h_));
377 template<
typename scalar_t>
396 scalar_t eval_kernel_function
397 (
const scalar_t* x,
const scalar_t* y)
const override {
423 template<
typename scalar_t>
439 :
Kernel<scalar_t>(
data, lambda), h_(h), p_(p) {
440 assert(p >= 1 && p <=
int(this->
d()));
447 scalar_t eval_kernel_function
448 (
const scalar_t* x,
const scalar_t* y)
const override {
449 std::vector<scalar_t> Ks(p_), Kss(p_), Kpp(p_+1);
451 for (
int j=0; j<p_; j++) Kss[j] = 0;
452 for (std::size_t i=0; i<this->
d(); i++) {
453 scalar_t tmp = std::exp
455 / (scalar_t(2.) * h_ * h_));
458 for (
int j=1; j<p_; j++) {
463 for (
int i=1; i<=p_; i++) {
465 for (
int s=1; s<=i; s++)
466 Kpp[i] += std::pow(-1,s+1)*Kpp[i-s]*Kss[s-1];
485 template<
typename scalar_t>
502 scalar_t
eval(std::size_t i, std::size_t j)
const override {
503 return A_(i, j) + ((i == j) ? this->lambda_ : scalar_t(0.));
506 void permute()
override {
508 A_.lapmt(this->perm_,
true);
509 A_.lapmr(this->perm_,
true);
515 scalar_t eval_kernel_function
516 (
const scalar_t* x,
const scalar_t* y)
const override {
542 default:
return "UNKNOWN";
556 std::cerr <<
"ERROR: Kernel type not recogonized, "
557 <<
" setting kernel type to Gauss."
574 template<
typename scalar_t>
577 scalar_t h, scalar_t lambda,
int p=1) {
583 return std::unique_ptr<Kernel<scalar_t>>
586 return std::unique_ptr<Kernel<scalar_t>>
589 return std::unique_ptr<Kernel<scalar_t>>
592 return std::unique_ptr<Kernel<scalar_t>>
Contains the DenseMatrix and DenseMatrixWrapper classes, simple wrappers around BLAS/LAPACK style den...
Contains the DistributedMatrix and DistributedMatrixWrapper classes, wrappers around ScaLAPACK/PBLAS ...
Contains the class holding HODLR matrix options.
Contains the HSSOptions class as well as general routines for HSS options.
Definitions of distance metrics.
This is a small wrapper class around a BLACS grid and a BLACS context.
Definition BLACSGrid.hpp:66
Like DenseMatrix, this class represents a matrix, stored in column major format, to allow direct use ...
Definition DenseMatrix.hpp:1018
This class represents a matrix, stored in column major format, to allow direct use of BLAS/LAPACK rou...
Definition DenseMatrix.hpp:139
std::size_t cols() const
Definition DenseMatrix.hpp:231
std::size_t rows() const
Definition DenseMatrix.hpp:228
const scalar_t * ptr(std::size_t i, std::size_t j) const
Definition DenseMatrix.hpp:283
void lapmr(const std::vector< int > &P, bool fwd)
2D block cyclicly distributed matrix, as used by ScaLAPACK.
Definition DistributedMatrix.hpp:84
Class containing several options for the HODLR code and data-structures.
Definition HODLROptions.hpp:117
Class containing several options for the HSS code and data-structures.
Definition HSSOptions.hpp:152
Wrapper class around an MPI_Comm object.
Definition MPIWrapper.hpp:173
ANOVA kernel.
Definition Kernel.hpp:424
ANOVAKernel(DenseMatrix< scalar_t > &data, scalar_t h, scalar_t lambda, int p=1)
Definition Kernel.hpp:438
Arbitrary dense matrix, with underlying geometry.
Definition Kernel.hpp:486
DenseKernel(DenseMatrix< scalar_t > &data, DenseMatrix< scalar_t > &A, scalar_t lambda)
Definition Kernel.hpp:498
scalar_t eval(std::size_t i, std::size_t j) const override
Definition Kernel.hpp:502
Gaussian or radial basis function kernel.
Definition Kernel.hpp:333
GaussKernel(DenseMatrix< scalar_t > &data, scalar_t h, scalar_t lambda)
Definition Kernel.hpp:345
Representation of a kernel matrix.
Definition Kernel.hpp:73
virtual ~Kernel()=default
DenseM_t fit_HODLR(const MPIComm &c, std::vector< scalar_t > &labels, const HODLR::HODLROptions< scalar_t > &opts)
virtual scalar_t eval(std::size_t i, std::size_t j) const
Definition Kernel.hpp:122
std::size_t n() const
Definition Kernel.hpp:106
std::size_t d() const
Definition Kernel.hpp:113
void operator()(const std::vector< std::size_t > &I, const std::vector< std::size_t > &J, DenseMatrix< std::complex< real_t > > &B) const
Definition Kernel.hpp:160
std::vector< scalar_t > predict(const DenseM_t &test, const DistM_t &weights) const
const DenseM_t & data() const
Definition Kernel.hpp:276
void operator()(const std::vector< std::size_t > &I, const std::vector< std::size_t > &J, DenseMatrix< real_t > &B) const
Definition Kernel.hpp:138
DenseM_t & data()
Definition Kernel.hpp:282
DistM_t fit_HSS(const BLACSGrid &grid, std::vector< scalar_t > &labels, const HSS::HSSOptions< scalar_t > &opts)
std::vector< scalar_t > predict(const DenseM_t &test, const DenseM_t &weights) const
DenseM_t fit_HSS(std::vector< scalar_t > &labels, const HSS::HSSOptions< scalar_t > &opts)
Kernel(DenseM_t &data, scalar_t lambda)
Definition Kernel.hpp:92
Laplace kernel.
Definition Kernel.hpp:378
LaplaceKernel(DenseMatrix< scalar_t > &data, scalar_t h, scalar_t lambda)
Definition Kernel.hpp:390
std::string get_name(KernelType k)
Definition Kernel.hpp:536
std::unique_ptr< Kernel< scalar_t > > create_kernel(KernelType k, DenseMatrix< scalar_t > &data, scalar_t h, scalar_t lambda, int p=1)
Definition Kernel.hpp:576
KernelType
Definition Kernel.hpp:526
KernelType kernel_type(const std::string &k)
Definition Kernel.hpp:551
Definition StrumpackOptions.hpp:44
real_t norm1_distance(std::size_t d, const scalar_t *x, const scalar_t *y)
Definition Metrics.hpp:91
real_t Euclidean_distance_squared(std::size_t d, const scalar_t *x, const scalar_t *y)
Definition Metrics.hpp:53