24 model_(
model), n_poly_basis_(
model.poly_basis_size()) {
25 auto n_points = points.rows();
26 auto bbox = geometry::bbox3d::from_points(points);
27 std::cout << n_points << std::endl;
28 a_ = std::make_unique<fmm::fmm_symmetric_evaluator<Order>>(
model, fmm::fmm_tree_height(n_points), bbox);
30 if (n_poly_basis_ > 0) {
31 poly_basis_ = std::make_unique<polynomial::monomial_basis>(
model.poly_dimension(),
model.poly_degree());
38 : model_(
model), n_poly_basis_(
model.poly_basis_size()),
40 if(n_poly_basis_ > 0) {
41 poly_basis_ = std::make_unique<polynomial::monomial_basis>(
model.poly_dimension(),
model.poly_degree());
45 valuesd operator()(
const valuesd& weights)
const override {
46 RSMESH_ASSERT(weights.rows() == size());
48 valuesd y = valuesd::Zero(size());
49 a_->set_weights(weights.head(n_points_));
50 y.head(n_points_) = a_->evaluate();
52 if(n_poly_basis_ > 0) {
54 y.head(n_points_) += pt_.transpose() * weights.tail(n_poly_basis_);
55 y.tail(n_poly_basis_) += pt_ * weights.head(n_points_);
58 y.head(n_points_) += weights.head(n_points_) * model_.nugget();
63 n_points_ = points.rows();
65 a_->set_points(points);
66 if (n_poly_basis_ > 0) {
67 pt_ = poly_basis_->evaluate(points);
71 [[nodiscard]] index_t size()
const override {
72 return n_points_ + n_poly_basis_;
78 const index_t n_poly_basis_;
81 std::unique_ptr<fmm::fmm_symmetric_evaluator<Order>> a_;
82 std::unique_ptr<polynomial::monomial_basis> poly_basis_;