21 static constexpr bool value =
false;
25 static constexpr bool value =
true;
46 static_assert(
domain_size > 0,
"BarycentricData requires domain_size > 0");
47 static_assert(num_evals > 0,
"BarycentricData requires num_evals > 0");
48 static_assert(num_evals >= domain_end || (!is_field_type_v<Fr> && num_evals == 1),
49 "Expected num_evals >= domain_size (or stdlib num_evals==1 special case)");
60 result[i] =
static_cast<Fr>(i);
73 result[i] *= big_domain[i] - big_domain[j];
83 if constexpr (!is_field_type_v<Fr>) {
84 BB_ASSERT(val.is_constant(),
"barycentric coeffs must be constants, not witnesses");
95 for (
size_t i = 0; i < n; ++i) {
96 temporaries[i] = accumulator;
102 bool is_zero =
false;
103 if constexpr (is_field_type_v<Fr>) {
104 is_zero = (coeffs[i] == 0);
107 is_zero = (coeffs[i].get_value() == 0);
113 accumulator *= coeffs[i];
116 accumulator =
Fr(1) / accumulator;
119 for (
size_t i = n - 1; i < n; --i) {
121 T0 = accumulator * temporaries[i];
122 accumulator *= coeffs[i];
135 const auto& big_domain,
const auto& lagrange_denominators)
138 if constexpr (!is_field_type_v<Fr> && num_evals == 1) {
139 result = lagrange_denominators;
145 Fr inv = lagrange_denominators[j];
146 inv *= (big_domain[k] - big_domain[j]);
161 for (
size_t i = 0; i != num_evals; ++i) {
165 result[i] *= v_i - big_domain[j];
176template <
class Fr,
size_t domain_end,
size_t num_evals>
195template <
class Fr,
size_t domain_end,
size_t num_evals>
217template <
class Fr,
size_t domain_end,
size_t num_evals>
#define BB_ASSERT(expression,...)
Compile-time variant: precomputed arrays are static constexpr.
static constexpr auto lagrange_denominators
static constexpr auto big_domain
static constexpr auto precomputed_denominator_inverses
static constexpr auto full_numerator_values
Shared computation logic for barycentric extension and evaluation data.
static constexpr std::array< Fr, domain_size *num_evals > construct_denominator_inverses(const auto &big_domain, const auto &lagrange_denominators)
static constexpr std::array< Fr, num_evals > construct_full_numerator_values(const auto &big_domain)
static constexpr size_t domain_size
static constexpr size_t big_domain_size
static constexpr std::array< Fr, domain_size > construct_lagrange_denominators(const auto &big_domain)
static constexpr std::array< Fr, big_domain_size > construct_big_domain()
static void assert_constant(const Fr &val)
static constexpr std::array< Fr, domain_size *num_evals > batch_invert(const std::array< Fr, domain_size *num_evals > &coeffs)
Run-time variant: precomputed arrays are inline static const.
static const auto lagrange_denominators
static const auto full_numerator_values
static const auto precomputed_denominator_inverses
static const auto big_domain
Entry point for Barretenberg command-line interface.
constexpr bool is_field_type_v
std::conditional_t< is_field_type_v< Fr >, BarycentricDataCompileTime< Fr, domain_end, num_evals >, BarycentricDataRunTime< Fr, domain_end, num_evals > > BarycentricData
Exposes BarycentricData with compile time arrays if the type is bberg::field and runtime arrays other...
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
General class for prime fields see Prime field documentation["field documentation"] for general imple...
Helper to determine whether input is bb::field type.
static constexpr bool value