19 static constexpr int kMaxTrial = 32;
22 if(degree < 0)
return;
23 auto n_points = points.rows();
24 auto n_poly_basis = polynomial_basis_base::basis_size(dimension, degree);
26 std::random_device rd;
27 std::mt19937 gen(rd());
28 std::uniform_int_distribution<index_t> dist(index_t{0}, n_points - 1);
30 std::set<index_t> set;
33 while(!found and trial < kMaxTrial) {
36 while(
static_cast<index_t
>(set.size()) < n_poly_basis) {
37 set.insert(dist(gen));
42 points(std::vector<index_t>(begin(set), end(set)), Eigen::all));
44 }
catch (
const std::domain_error&) {
51 if(!found and trial == kMaxTrial) {
52 throw std::runtime_error(
"Could not find a unisolvent set of points.");
55 point_idcs_.insert(begin(point_idcs_), begin(set), end(set));
58 [[nodiscard]]
const std::vector<index_t>& point_indices()
const {
63 std::vector<index_t> point_idcs_;