1#if TATOOINE_BLAS_AND_LAPACK_AVAILABLE
2#ifndef TATOOINE_DETAIL_POINTSET_RADIAL_BASIS_FUNCTIONS_SAMPLER_WITH_GRADIENTS_H
3#define TATOOINE_DETAIL_POINTSET_RADIAL_BASIS_FUNCTIONS_SAMPLER_WITH_GRADIENTS_H
12namespace rbf_gradient_kernel {
15 return sqr_r * sqr_r * gcem::log(sqr_r) / 2;
19 auto const x1_m_x2 = p1(0) - p2(0);
20 auto const x1_m_x2_sqr = x1_m_x2 * x1_m_x2;
21 auto const y1_m_y2 = p1.y() - p2.y();
22 auto const y1_m_y2_sqr = y1_m_y2 * y1_m_y2;
23 return (gcem::log(y1_m_y2_sqr + x1_m_x2_sqr) * (y1_m_y2_sqr + x1_m_x2_sqr) *
24 (y1_m_y2_sqr + x1_m_x2_sqr)) /
29 return ((2 * p1(0) - 2 * p2(0)) * p2(1) * p2(1) +
30 (4 * p2(0) - 4 * p1(0)) * p1(1) * p2(1) +
31 (2 * p1(0) - 2 * p2(0)) * p1(1) * p1(1) -
32 2 * p2(0) * p2(0) * p2(0) + 6 * p1(0) * p2(0) * p2(0) -
33 6 * p1(0) * p1(0) * p2(0) + 2 * p1(0) * p1(0) * p1(0)) *
34 gcem::log(p2(1) * p2(1) - 2 * p1(1) * p2(1) + p1(1) * p1(1) +
35 p2(0) * p2(0) - 2 * p1(0) * p2(0) +
37 (p1(0) - p2(0)) * p2(1) * p2(1) +
38 (2 * p2(0) - 2 * p1(0)) * p1(1) * p2(1) +
39 (p1(0) - p2(0)) * p1(1) * p1(1) - p2(0) * p2(0) * p2(0) +
40 3 * p1(0) * p2(0) * p2(0) - 3 * p1(0) * p1(0) * p2(0) +
41 p1(0) * p1(0) * p1(0);
45 return (-2 * p2(1) * p2(1) * p2(1) + 6 * p1(1) * p2(1) * p2(1) +
46 (-6 * p1(1) * p1(1) - 2 * p2(0) * p2(0) + 4 * p1(0) * p2(0) -
49 2 * p1(1) * p1(1) * p1(1) +
50 (2 * p2(0) * p2(0) - 4 * p1(0) * p2(0) + 2 * p1(0) * p1(0)) *
52 gcem::log(p2(1) * p2(1) - 2 * p1(1) * p2(1) + p1(1) * p1(1) +
53 p2(0) * p2(0) - 2 * p1(0) * p2(0) +
55 p2(1) * p2(1) * p2(1) + 3 * p1(1) * p2(1) * p2(1) +
56 (-3 * p1(1) * p1(1) - p2(0) * p2(0) + 2 * p1(0) * p2(0) -
59 p1(1) * p1(1) * p1(1) +
60 (p2(0) * p2(0) - 2 * p1(0) * p2(0) + p1(0) * p1(0)) * p1(1);
65 return (-2 * p2(1) * p2(1) + 4 * p1(1) * p2(1) - 2 * p1(1) * p1(1) -
66 6 * p2(0) * p2(0) + 12 * p1(0) * p2(0) - 6 * p1(0) * p1(0)) *
67 gcem::log(p2(1) * p2(1) - 2 * p1(1) * p2(1) + p1(1) * p1(1) +
68 p2(0) * p2(0) - 2 * p1(0) * p2(0) +
70 p2(1) * p2(1) + 2 * p1(1) * p2(1) - p1(1) * p1(1) -
71 7 * p2(0) * p2(0) + 14 * p1(0) * p2(0) - 7 * p1(0) * p1(0);
76 return ((4 * p1(0) - 4 * p2(0)) * p2(1) +
77 (4 * p2(0) - 4 * p1(0)) * p1(1)) *
78 gcem::log(p2(1) * p2(1) - 2 * p1(1) * p2(1) + p1(1) * p1(1) +
79 p2(0) * p2(0) - 2 * p1(0) * p2(0) +
81 (6 * p1(0) - 6 * p2(0)) * p2(1) +
82 (6 * p2(0) - 6 * p1(0)) * p1(1);
87 return (-6 * p2(1) * p2(1) + 12 * p1(1) * p2(1) - 6 * p1(1) * p1(1) -
88 2 * p2(0) * p2(0) + 4 * p1(0) * p2(0) - 2 * p1(0) * p1(0)) *
89 gcem::log(p2(1) * p2(1) - 2 * p1(1) * p2(1) + p1(1) * p1(1) +
90 p2(0) * p2(0) - 2 * p1(0) * p2(0) +
92 7 * p2(1) * p2(1) + 14 * p1(1) * p2(1) - 7 * p1(1) * p1(1) -
93 p2(0) * p2(0) + 2 * p1(0) * p2(0) - p1(0) * p1(0);
98template <
floating_point Real, std::size_t NumDimensions,
typename ValueType,
99 typename GradientType>
102template <
floating_po
int Real,
floating_po
int ValueType>
105 :
field<radial_basis_functions_sampler_with_gradients<Real, 2, ValueType,
107 Real, 2, ValueType> {
119 template <
typename S>
132 auto pointset() const -> auto const& {
return m_pointset; }
135 return m_coefficients(v.index());
138 return m_coefficients(i);
140 auto f() const -> auto const& {
return m_f; }
142 auto f(std::size_t
const i)
const ->
auto const& {
return m_f[i]; }
143 auto df() const -> auto const& {
return m_df; }
145 auto df(std::size_t
const i)
const ->
auto const& {
return m_df[i]; }
202 : m_pointset{ps}, m_f{f_}, m_df{df_} {
207 for (std::size_t c = 0; c < N; ++c) {
208 for (std::size_t r = c + 1; r < N; ++r) {
215 for (std::size_t c = 0; c < N; ++c) {
216 for (std::size_t r = N; r < N * 2; ++r) {
227 for (std::size_t c = 0; c < N; ++c) {
228 for (std::size_t r = N * 2; r < N * 3; ++r) {
229 if (c == r - N * 2) {
239 for (std::size_t c = N; c < N * 2; ++c) {
240 for (std::size_t r = c + 1; r < N * 2; ++r) {
247 for (std::size_t c = N; c < N * 2; ++c) {
248 for (std::size_t r = N * 2; r < N * 3; ++r) {
249 if (c - N == r - N * 2) {
259 for (std::size_t c = N * 2; c < N * 3; ++c) {
260 for (std::size_t r = c + 1; r < N * 3; ++r) {
269 for (std::size_t c = 0; c < N; ++c) {
274 for (std::size_t c = 0; c < N; ++c) {
278 A(N * 3 + 1, c + N) = 1;
279 A(N * 3 + 2, c + 2 * N) = 1;
284 for (std::size_t i = 0; i < N; ++i) {
285 m_coefficients(i) = f(i);
287 for (std::size_t i = N; i < N * 2; ++i) {
288 m_coefficients(i) = df(i - N).x();
290 for (std::size_t i = N * 2; i < N * 3; ++i) {
291 m_coefficients(i) = df(i - N * 2).y();
313 acc += coefficient(N * 3);
314 acc += coefficient(N * 3 + 1) * q.x();
315 acc += coefficient(N * 3 + 2) * q.y();
320template <
floating_po
int Real,
floating_po
int ValueType>
322 mat<ValueType, 2, 2>>
323 :
field<radial_basis_functions_sampler_with_gradients<Real, 2, vec<ValueType, 2>,
324 mat<ValueType, 2, 2>>,
325 Real, 2, vec<ValueType, 2>> {
337 template <
typename S>
350 auto pointset() const -> auto const& {
return m_pointset; }
354 return m_coefficients(v.index(), j);
358 return m_coefficients(i, j);
360 auto f() const -> auto const& {
return m_f; }
362 auto f(std::size_t
const i)
const ->
auto const& {
return m_f[i]; }
363 auto df() const -> auto const& {
return m_df; }
365 auto df(std::size_t
const i)
const ->
auto const& {
return m_df[i]; }
422 : m_pointset{ps}, m_f{f_}, m_df{df_} {
427 for (std::size_t c = 0; c < N; ++c) {
428 for (std::size_t r = c + 1; r < N; ++r) {
435 for (std::size_t c = 0; c < N; ++c) {
436 for (std::size_t r = N; r < N * 2; ++r) {
447 for (std::size_t c = 0; c < N; ++c) {
448 for (std::size_t r = N * 2; r < N * 3; ++r) {
449 if (c == r - N * 2) {
459 for (std::size_t c = N; c < N * 2; ++c) {
460 for (std::size_t r = c + 1; r < N * 2; ++r) {
467 for (std::size_t c = N; c < N * 2; ++c) {
468 for (std::size_t r = N * 2; r < N * 3; ++r) {
469 if (c - N == r - N * 2) {
479 for (std::size_t c = N * 2; c < N * 3; ++c) {
480 for (std::size_t r = c + 1; r < N * 3; ++r) {
489 for (std::size_t c = 0; c < N; ++c) {
494 for (std::size_t c = 0; c < N; ++c) {
498 A(N * 3 + 1, c + N) = 1;
499 A(N * 3 + 2, c + 2 * N) = 1;
504 for (std::size_t i = 0; i < N; ++i) {
505 for (std::size_t j = 0; j < 2; ++j) {
506 m_coefficients(i, j) = f(i)(j);
509 for (std::size_t i = N; i < N * 2; ++i) {
510 for (std::size_t j = 0; j < 2; ++j) {
511 m_coefficients(i, j) = df(i - N)(j, 0);
514 for (std::size_t i = N * 2; i < N * 3; ++i) {
515 for (std::size_t j = 0; j < 2; ++j) {
516 m_coefficients(i, j) = df(i - N*2)(j, 1);
530 for (std::size_t j = 0; j < 2; ++j) {
538 acc(j) -= coefficient(v + N, j) *
540 acc(j) -= coefficient(v + N * 2, j) *
543 acc(j) += coefficient(N * 3, j);
544 acc(j) += coefficient(N * 3 + 1, j) * q.x();
545 acc(j) += coefficient(N * 3 + 2, j) * q.y();
551template <
floating_point Real, std::size_t NumDimensions,
typename ValueType,
552 typename GradientType>
560 GradientType>
const&)
562 ValueType, GradientType>;
564template <
floating_point Real, std::size_t NumDimensions,
typename ValueType,
565 typename GradientType>
568template <
floating_po
int Real,
floating_po
int ValueType>
570 Real, 2, ValueType,
vec<ValueType, 2>>
571 :
field<differentiated_radial_basis_functions_sampler_with_gradients<
572 Real, 2, ValueType, vec<ValueType, 2>>,
573 Real, 2, vec<ValueType, 2>> {
591 auto base() const -> auto const& {
return m_base; }
592 auto pointset() const -> auto const& {
return base().pointset(); }
593 auto coefficients() const -> auto const& {
return base().coefficients(); }
595 return base().coefficient(v.index());
598 return base().coefficient(i);
604 auto f() const -> auto const& {
return base().df(); }
606 auto f(std::size_t
const i)
const ->
auto const& {
return f()[i]; }
619 acc.x() -= coefficient(v + N) *
621 acc.x() -= coefficient(v + N * 2) *
626 acc.y() -= coefficient(v + N) *
628 acc.y() -= coefficient(v + N * 2) *
631 acc.x() += coefficient(N * 3 + 1);
632 acc.y() += coefficient(N * 3 + 2);
637template <
floating_po
int Real,
floating_po
int ValueType>
639 Real, 2,
vec<ValueType, 2>,
mat<ValueType, 2, 2>>
640 :
field<differentiated_radial_basis_functions_sampler_with_gradients<
641 Real, 2, vec<ValueType, 2>, mat<ValueType, 2, 2>>,
642 Real, 2, mat<ValueType, 2, 2>> {
660 auto base() const -> auto const& {
return m_base; }
661 auto pointset() const -> auto const& {
return base().pointset(); }
662 auto coefficients() const -> auto const& {
return base().coefficients(); }
665 return base().coefficient(v.index(), j);
669 return base().coefficient(i, j);
675 auto f() const -> auto const& {
return base().df(); }
677 auto f(std::size_t
const i)
const ->
auto const& {
return f()[i]; }
688 for (std::size_t j = 0; j < 2; ++j) {
693 coefficient(v + N, j) *
696 coefficient(v + N * 2, j) *
703 coefficient(v + N, j) *
706 coefficient(v + N * 2, j) *
710 for (std::size_t j = 0; j < 2; ++j) {
711 for (std::size_t i = 0; i < 2; ++i) {
712 acc(j, i) += coefficient(N * 3 + i + 1, j);
719template <
floating_point Real, std::size_t NumDimensions,
typename ValueType,
720 typename GradientType>
722 Real, NumDimensions, ValueType, GradientType>
const& f) {
724 Real, NumDimensions, ValueType, GradientType>{f};
Definition: tensor_concepts.h:36
Definition: concepts.h:30
static constexpr auto kernel_from_squared(floating_point auto const sqr_r)
Definition: radial_basis_functions_sampler_with_gradients.h:14
static constexpr auto kernel_from_squared_y1(fixed_size_real_vec< 2 > auto const &p1, fixed_size_real_vec< 2 > auto const &p2)
Definition: radial_basis_functions_sampler_with_gradients.h:44
static constexpr auto kernel_from_squared_y1_y2(fixed_size_real_vec< 2 > auto const &p1, fixed_size_real_vec< 2 > auto const &p2)
Definition: radial_basis_functions_sampler_with_gradients.h:85
static constexpr auto kernel_from_squared_x1(fixed_size_real_vec< 2 > auto const &p1, fixed_size_real_vec< 2 > auto const &p2)
Definition: radial_basis_functions_sampler_with_gradients.h:28
static constexpr auto kernel_from_squared_y1_x2(fixed_size_real_vec< 2 > auto const &p1, fixed_size_real_vec< 2 > auto const &p2)
Definition: radial_basis_functions_sampler_with_gradients.h:74
static constexpr auto kernel_from_squared_x1_x2(fixed_size_real_vec< 2 > auto const &p1, fixed_size_real_vec< 2 > auto const &p2)
Definition: radial_basis_functions_sampler_with_gradients.h:63
Definition: inverse_distance_weighting_sampler.h:4
auto diff(radial_basis_functions_sampler_with_gradients< Real, NumDimensions, ValueType, GradientType > const &f)
Definition: radial_basis_functions_sampler_with_gradients.h:721
static constexpr sequential_t sequential
Definition: tags.h:63
typename value_type_impl< T >::type value_type
Definition: type_traits.h:280
auto solve_symmetric_lapack(TensorA &&A_, TensorB &&B_, lapack::uplo uplo=lapack::uplo::lower) -> std::optional< tensor< common_type< tatooine::value_type< decltype(A_)>, tatooine::value_type< decltype(B_)> > > >
Definition: solve.h:349
auto vertices(pointset< Real, NumDimensions > const &ps)
Definition: vertex_container.h:278
constexpr auto squared_euclidean_distance(base_tensor< Tensor0, T0, N > const &lhs, base_tensor< Tensor1, T1, N > const &rhs)
Definition: distance.h:11
Definition: radial_basis_functions_sampler_with_gradients.h:642
auto f() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:675
auto coefficient(std::size_t const i, std::size_t const j) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:667
auto f(vertex_handle const v) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:676
auto base() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:660
auto f(std::size_t const i) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:677
auto coefficient(vertex_handle const v, std::size_t const j) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:663
auto evaluate(pos_type const &q, real_type const) const -> tensor_type
Definition: radial_basis_functions_sampler_with_gradients.h:679
auto pointset() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:661
typename pointset_type::vertex_handle vertex_handle
Definition: radial_basis_functions_sampler_with_gradients.h:654
differentiated_radial_basis_functions_sampler_with_gradients(base_type const &base)
Definition: radial_basis_functions_sampler_with_gradients.h:672
auto coefficients() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:662
base_type const & m_base
Definition: radial_basis_functions_sampler_with_gradients.h:657
Definition: radial_basis_functions_sampler_with_gradients.h:573
base_type const & m_base
Definition: radial_basis_functions_sampler_with_gradients.h:588
auto coefficient(std::size_t const i) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:597
auto base() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:591
differentiated_radial_basis_functions_sampler_with_gradients(base_type const &base)
Definition: radial_basis_functions_sampler_with_gradients.h:601
auto pointset() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:592
typename pointset_type::vertex_handle vertex_handle
Definition: radial_basis_functions_sampler_with_gradients.h:585
auto evaluate(pos_type const &q, real_type const) const -> tensor_type
Definition: radial_basis_functions_sampler_with_gradients.h:608
auto coefficient(vertex_handle const v) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:594
auto f(std::size_t const i) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:606
auto f() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:604
auto coefficients() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:593
auto f(vertex_handle const v) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:605
Definition: radial_basis_functions_sampler_with_gradients.h:566
Definition: radial_basis_functions_sampler_with_gradients.h:325
auto df(std::size_t const i) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:365
auto f() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:360
typed_vertex_property_type< value_type > f_property_type
Definition: radial_basis_functions_sampler_with_gradients.h:340
auto df() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:363
typename pointset_type::vertex_handle vertex_handle
Definition: radial_basis_functions_sampler_with_gradients.h:336
auto df(vertex_handle const v) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:364
auto coefficient(std::size_t const i, std::size_t const j) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:356
auto pointset() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:350
f_property_type const & m_f
Definition: radial_basis_functions_sampler_with_gradients.h:345
typed_vertex_property_type< gradient_type > df_property_type
Definition: radial_basis_functions_sampler_with_gradients.h:341
auto coefficient(vertex_handle const v, std::size_t const j) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:352
auto f(vertex_handle const v) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:361
auto f(std::size_t const i) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:362
radial_basis_functions_sampler_with_gradients(radial_basis_functions_sampler_with_gradients &&) noexcept=default
df_property_type const & m_df
Definition: radial_basis_functions_sampler_with_gradients.h:346
auto coefficients() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:351
auto evaluate(pos_type const &q, real_type const) const -> tensor_type
Definition: radial_basis_functions_sampler_with_gradients.h:526
radial_basis_functions_sampler_with_gradients(radial_basis_functions_sampler_with_gradients const &)=default
pointset_type const & m_pointset
Definition: radial_basis_functions_sampler_with_gradients.h:344
radial_basis_functions_sampler_with_gradients(pointset_type const &ps, f_property_type const &f_, df_property_type const &df_, execution_policy::sequential_t)
Definition: radial_basis_functions_sampler_with_gradients.h:419
typename pointset_type::template typed_vertex_property_type< S > typed_vertex_property_type
Definition: radial_basis_functions_sampler_with_gradients.h:339
Definition: radial_basis_functions_sampler_with_gradients.h:107
pointset_type const & m_pointset
Definition: radial_basis_functions_sampler_with_gradients.h:126
auto f() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:140
radial_basis_functions_sampler_with_gradients(radial_basis_functions_sampler_with_gradients &&) noexcept=default
auto pointset() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:132
auto f(vertex_handle const v) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:141
auto f(std::size_t const i) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:142
typed_vertex_property_type< value_type > f_property_type
Definition: radial_basis_functions_sampler_with_gradients.h:122
auto coefficients() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:133
auto coefficient(std::size_t const i) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:137
auto coefficient(vertex_handle const v) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:134
auto df() const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:143
typename pointset_type::template typed_vertex_property_type< S > typed_vertex_property_type
Definition: radial_basis_functions_sampler_with_gradients.h:121
df_property_type const & m_df
Definition: radial_basis_functions_sampler_with_gradients.h:128
typename pointset_type::vertex_handle vertex_handle
Definition: radial_basis_functions_sampler_with_gradients.h:118
f_property_type const & m_f
Definition: radial_basis_functions_sampler_with_gradients.h:127
auto df(std::size_t const i) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:145
ValueType value_type
Definition: radial_basis_functions_sampler_with_gradients.h:108
typed_vertex_property_type< gradient_type > df_property_type
Definition: radial_basis_functions_sampler_with_gradients.h:123
radial_basis_functions_sampler_with_gradients(pointset_type const &ps, f_property_type const &f_, df_property_type const &df_, execution_policy::sequential_t)
Definition: radial_basis_functions_sampler_with_gradients.h:199
auto df(vertex_handle const v) const -> auto const &
Definition: radial_basis_functions_sampler_with_gradients.h:144
auto evaluate(pos_type const &q, real_type const) const -> tensor_type
Definition: radial_basis_functions_sampler_with_gradients.h:300
radial_basis_functions_sampler_with_gradients(radial_basis_functions_sampler_with_gradients const &)=default
Definition: radial_basis_functions_sampler_with_gradients.h:100
Real real_type
Definition: field.h:17
ValueType tensor_type
Definition: field.h:18
Definition: pointset.h:83
Definition: pointset.h:69
auto vertices() const
Definition: pointset.h:226
auto vertex_at(vertex_handle const v) -> auto &
Definition: pointset.h:205
static constexpr auto zeros()
Definition: tensor.h:144
Definition: property.h:66