1#ifndef TATOOINE_DETAIL_POINTSET_MOVING_LEAST_SQUARES_SAMPLER2_H
2#define TATOOINE_DETAIL_POINTSET_MOVING_LEAST_SQUARES_SAMPLER2_H
4#if TATOOINE_FLANN_AVAILABLE
14template <
floating_po
int Real,
typename T, invocable<Real> Weighting>
16 :
field<moving_least_squares_sampler<Real, 2, T, Weighting>, Real, 2, T> {
24 typename pointset_type::template typed_vertex_property_type<T>;
39 m_weighting{weighting} {}
55 [[nodiscard]] auto evaluate_0_neighbors(
pos_type const& )
const {
56 if constexpr (is_arithmetic<tensor_type>) {
57 return Real(0) / Real(0);
64 std::vector<int>
const& indices)
const {
69 std::vector<int>
const& indices,
70 std::vector<Real>
const& distances)
const {
74 auto d0 = distances[0];
75 auto d1 = distances[1];
77 auto const d_norm = 1 / (d0 + d1);
81 return p0 * d1 + p1 * d0;
85 std::vector<int>
const& indices, std::vector<Real>
const& distances,
87 auto const num_neighbors =
size(indices);
88 auto const w = construct_weights(num_neighbors, distances);
89 auto const F = construct_F(num_neighbors, indices);
90 auto const B = construct_B(num_neighbors, indices, q);
92 auto const C = *
solve(BtW * B, BtW * F);
96 if constexpr (tensor_num_components<T> == 1) {
100 for (std::size_t i = 0; i < tensor_num_components<T>; ++i) {
108 std::vector<int>
const& indices,
pos_type const& q)
const {
109 auto local_positions = std::vector<pos_type>(num_neighbors);
110 std::ranges::copy(indices | std::views::transform([&](
auto const i) {
113 begin(local_positions));
115 auto B = allocate_B(num_neighbors);
116 if (num_neighbors >= 3) {
117 construct_linear_part_of_B(local_positions, B);
119 if (num_neighbors >= 6) {
120 construct_quadratic_part_of_B(local_positions, B);
122 if (num_neighbors >= 10) {
123 construct_cubic_part_of_B(local_positions, B);
129 if (num_neighbors >= 10) {
132 if (num_neighbors >= 6) {
135 if (num_neighbors >= 3) {
143 auto i = std::size_t{};
144 for (
auto const& x : local_positions) {
152 std::vector<pos_type>
const& local_positions,
auto& B)
const {
153 auto i = std::size_t{};
154 for (
auto const& x : local_positions) {
155 B(i, 3) = x.x() * x.x();
156 B(i, 4) = x.x() * x.y();
157 B(i, 5) = x.y() * x.y();
164 auto i = std::size_t{};
165 for (
auto const& x : local_positions) {
166 B(i, 6) = x.x() * x.x() * x.x();
167 B(i, 7) = x.x() * x.x() * x.y();
168 B(i, 8) = x.x() * x.y() * x.y();
169 B(i, 9) = x.y() * x.y() * x.y();
175 std::vector<Real>
const& distances)
const {
177 for (std::size_t i = 0; i < num_neighbors; ++i) {
178 w(i) = m_weighting(distances[i] / m_radius);
185 std::vector<int>
const& indices)
const {
186 auto F = tensor_num_components<T> > 1
189 for (std::size_t i = 0; i < num_neighbors; ++i) {
190 if constexpr (tensor_num_components<T> == 1) {
193 for (std::size_t j = 0; j < tensor_num_components<T>; ++j) {
204 auto [indices, distances] =
206 switch (
size(indices)) {
208 return evaluate_0_neighbors(q);
212 return evaluate_2_neighbors(indices, distances);
214 return evaluate_more_than_2_neighbors(indices, distances, q);
223 "including <tatooine/detail/pointset/moving_least_squares_sampler2.h> without FLANN support.")
Definition: concepts.h:33
Definition: concepts.h:39
Definition: inverse_distance_weighting_sampler.h:4
auto size(vertex_container< Real, NumDimensions > verts)
Definition: vertex_container.h:269
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto solve(polynomial< Real, 1 > const &p) -> std::vector< Real >
solve a + b*x
Definition: polynomial.h:187
auto transposed(dynamic_tensor auto &&t)
Definition: transposed_tensor.h:170
Definition: moving_least_squares_sampler2.h:16
auto evaluate_more_than_2_neighbors(std::vector< int > const &indices, std::vector< Real > const &distances, pos_type const &q) const
Definition: moving_least_squares_sampler2.h:84
auto construct_linear_part_of_B(std::vector< pos_type > const &local_positions, auto &B) const
Definition: moving_least_squares_sampler2.h:141
auto evaluate_1_neighbors(std::vector< int > const &indices) const
Definition: moving_least_squares_sampler2.h:63
moving_least_squares_sampler(moving_least_squares_sampler &&) noexcept=default
moving_least_squares_sampler(pointset_type const &ps, property_type const &property, arithmetic auto const radius, convertible_to< Weighting > auto &&weighting)
Definition: moving_least_squares_sampler2.h:32
typename pointset_type::vertex_handle vertex_handle
Definition: moving_least_squares_sampler2.h:25
typename pointset_type::template typed_vertex_property_type< T > property_type
Definition: moving_least_squares_sampler2.h:24
auto construct_quadratic_part_of_B(std::vector< pos_type > const &local_positions, auto &B) const
Definition: moving_least_squares_sampler2.h:151
auto evaluate_2_neighbors(std::vector< int > const &indices, std::vector< Real > const &distances) const
Definition: moving_least_squares_sampler2.h:68
pointset_type const & m_pointset
Definition: moving_least_squares_sampler2.h:27
auto construct_B(std::size_t const num_neighbors, std::vector< int > const &indices, pos_type const &q) const
Definition: moving_least_squares_sampler2.h:107
property_type const & m_property
Definition: moving_least_squares_sampler2.h:28
auto evaluate(pos_type const &q, Real const) const -> tensor_type
Definition: moving_least_squares_sampler2.h:202
auto construct_cubic_part_of_B(std::vector< pos_type > const &local_positions, auto &B) const
Definition: moving_least_squares_sampler2.h:162
auto allocate_B(std::size_t const num_neighbors) const
Definition: moving_least_squares_sampler2.h:128
auto construct_F(std::size_t const num_neighbors, std::vector< int > const &indices) const
Represents function values f(x_i)
Definition: moving_least_squares_sampler2.h:184
auto construct_weights(std::size_t const num_neighbors, std::vector< Real > const &distances) const
Definition: moving_least_squares_sampler2.h:174
Real m_radius
Definition: moving_least_squares_sampler2.h:29
Weighting m_weighting
Definition: moving_least_squares_sampler2.h:30
moving_least_squares_sampler(moving_least_squares_sampler const &)=default
Definition: moving_least_squares_samplerN.h:12
Real real_type
Definition: field.h:17
T tensor_type
Definition: field.h:18
Definition: pointset.h:83
Definition: pointset.h:69
auto nearest_neighbors_radius_raw(pos_type const &x, Real const radius, flann::SearchParams const params={}) const -> std::pair< std::vector< int >, std::vector< Real > >
Definition: pointset.h:1088
auto vertex_at(vertex_handle const v) -> auto &
Definition: pointset.h:205
static constexpr auto zeros()
Definition: tensor.h:144
static constexpr auto ones()
Definition: tensor.h:146