22 .beta = AvmFlavor::FF::random_element(),
23 .gamma = AvmFlavor::FF::random_element(),
24 .public_input_delta = 0,
27 .eccvm_set_permutation_delta = 0,
31 std::vector<std::function<void()>> checks;
34 bb::constexpr_for<0, std::tuple_size_v<typename AvmFlavor::MainRelations>, 1>([&]<
size_t i>() {
36 checks.push_back([&]() {
39 for (
size_t r = 0; r < num_rows; ++r) {
42 if (skippable_enabled && Relation::skip(row)) {
47 Relation::accumulate(result, row, {}, 1);
50 for (
size_t j = 0; j < result.size(); ++j) {
51 if (detail::subrelation_is_linearly_independent<Relation>(j) && !result[j].is_zero()) {
52 throw std::runtime_error(
format(
"Relation ",
55 Relation::get_subrelation_label(j),
62 for (
size_t j = 0; j < result.size(); ++j) {
63 if (!result[j].is_zero()) {
64 throw std::runtime_error(
format(
65 "Relation ", Relation::NAME,
", subrelation ", Relation::get_subrelation_label(j),
" failed."));
72 bb::constexpr_for<0, std::tuple_size_v<typename AvmFlavor::LookupRelations>, 1>([&]<
size_t i>() {
74 checks.push_back([&, num_rows]() {
76 bb::compute_logderivative_inverse<typename AvmFlavor::FF, Relation>(polys, params, num_rows);
80 for (
size_t r = 0; r < num_rows; ++r) {
83 if (skippable_enabled && Relation::skip(row)) {
88 Relation::accumulate(lookup_result, row, params, 1);
90 for (
size_t subrelation_idx = 0; subrelation_idx < lookup_result.size(); ++subrelation_idx) {
92 if (detail::subrelation_is_linearly_independent<Relation>(subrelation_idx) &&
93 !lookup_result[subrelation_idx].is_zero()) {
94 throw std::runtime_error(
format(
"Lookup ",
97 Relation::get_subrelation_label(subrelation_idx),
104 for (
auto r : lookup_result) {
106 throw std::runtime_error(
format(
"Lookup ", Relation::NAME,
" failed."));