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() {}
 
  292       std::vector<int> perm_;
 
  308       virtual scalar_t eval_kernel_function
 
  309       (
const scalar_t* x, 
const scalar_t* y) 
const = 0;
 
  330     template<
typename scalar_t>
 
  349       scalar_t eval_kernel_function
 
  350       (
const scalar_t* x, 
const scalar_t* y)
 const override {
 
  353            / (scalar_t(2.) * h_ * h_));
 
  375     template<
typename scalar_t>
 
  394       scalar_t eval_kernel_function
 
  395       (
const scalar_t* x, 
const scalar_t* y)
 const override {
 
  421     template<
typename scalar_t>
 
  437         : 
Kernel<scalar_t>(
data, lambda), h_(h), p_(p) {
 
  438         assert(p >= 1 && p <= 
int(this->
d()));
 
  445       scalar_t eval_kernel_function
 
  446       (
const scalar_t* x, 
const scalar_t* y)
 const override {
 
  447         std::vector<scalar_t> Ks(p_), Kss(p_), Kpp(p_+1);
 
  449         for (
int j=0; j<p_; j++) Kss[j] = 0;
 
  450         for (std::size_t i=0; i<this->
d(); i++) {
 
  451           scalar_t tmp = std::exp
 
  453              / (scalar_t(2.) * h_ * h_));
 
  456           for (
int j=1; j<p_; j++) {
 
  461         for (
int i=1; i<=p_; i++) {
 
  463           for (
int s=1; s<=i; s++)
 
  464             Kpp[i] += std::pow(-1,s+1)*Kpp[i-s]*Kss[s-1];
 
  483     template<
typename scalar_t>
 
  500       scalar_t 
eval(std::size_t i, std::size_t j)
 const override {
 
  501         return A_(i, j) + ((i == j) ? this->lambda_ : scalar_t(0.));
 
  504       void permute()
 override {
 
  505         A_.lapmt(this->perm_, 
true);
 
  506         A_.lapmr(this->perm_, 
true);
 
  512       scalar_t eval_kernel_function
 
  513       (
const scalar_t* x, 
const scalar_t* y)
 const override {
 
  539       default: 
return "UNKNOWN";
 
  553       std::cerr << 
"ERROR: Kernel type not recogonized, " 
  554                 << 
" setting kernel type to Gauss." 
  571     template<
typename scalar_t>
 
  574      scalar_t h, scalar_t lambda, 
int p=1) {
 
  580         return std::unique_ptr<Kernel<scalar_t>>
 
  583         return std::unique_ptr<Kernel<scalar_t>>
 
  586         return std::unique_ptr<Kernel<scalar_t>>
 
  589         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:1015
This class represents a matrix, stored in column major format, to allow direct use of BLAS/LAPACK rou...
Definition: DenseMatrix.hpp:138
std::size_t cols() const
Definition: DenseMatrix.hpp:230
const scalar_t * ptr(std::size_t i, std::size_t j) const
Definition: DenseMatrix.hpp:282
std::size_t rows() const
Definition: DenseMatrix.hpp:227
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:194
ANOVA kernel.
Definition: Kernel.hpp:422
ANOVAKernel(DenseMatrix< scalar_t > &data, scalar_t h, scalar_t lambda, int p=1)
Definition: Kernel.hpp:436
Arbitrary dense matrix, with underlying geometry.
Definition: Kernel.hpp:484
DenseKernel(DenseMatrix< scalar_t > &data, DenseMatrix< scalar_t > &A, scalar_t lambda)
Definition: Kernel.hpp:496
scalar_t eval(std::size_t i, std::size_t j) const override
Definition: Kernel.hpp:500
Gaussian or radial basis function kernel.
Definition: Kernel.hpp:331
GaussKernel(DenseMatrix< scalar_t > &data, scalar_t h, scalar_t lambda)
Definition: Kernel.hpp:343
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
DenseM_t & data()
Definition: Kernel.hpp:282
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
DistM_t fit_HSS(const BLACSGrid &grid, std::vector< scalar_t > &labels, const HSS::HSSOptions< scalar_t > &opts)
const DenseM_t & data() const
Definition: Kernel.hpp:276
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
std::vector< scalar_t > predict(const DenseM_t &test, const DistM_t &weights) const
std::vector< scalar_t > predict(const DenseM_t &test, const DenseM_t &weights) const
Laplace kernel.
Definition: Kernel.hpp:376
LaplaceKernel(DenseMatrix< scalar_t > &data, scalar_t h, scalar_t lambda)
Definition: Kernel.hpp:388
std::string get_name(KernelType k)
Definition: Kernel.hpp:533
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:573
KernelType
Definition: Kernel.hpp:523
KernelType kernel_type(const std::string &k)
Definition: Kernel.hpp:548
Definition: StrumpackOptions.hpp:43
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