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),
64 for (
size_t j = 0; j < result.size(); ++j) {
65 if (!result[j].is_zero()) {
66 throw std::runtime_error(
format(
67 "Relation ", Relation::NAME,
", subrelation ", Relation::get_subrelation_label(j),
" failed."));
74 bb::constexpr_for<0, std::tuple_size_v<typename AvmFlavor::LookupRelations>, 1>([&]<
size_t i>() {
76 checks.push_back([&, num_rows]() {
79 Relation::Settings::INVERSES,
80 Relation::Settings::SRC_SELECTOR,
81 Relation::Settings::DST_SELECTOR);
84 bb::compute_logderivative_inverse<typename AvmFlavor::FF, Relation>(polys, params, num_rows);
88 for (
size_t r = 0; r < num_rows; ++r) {
91 if (skippable_enabled && Relation::skip(row)) {
96 Relation::accumulate(lookup_result, row, params, 1);
98 for (
size_t subrelation_idx = 0; subrelation_idx < lookup_result.size(); ++subrelation_idx) {
100 if (detail::subrelation_is_linearly_independent<Relation>(subrelation_idx) &&
101 !lookup_result[subrelation_idx].is_zero()) {
102 throw std::runtime_error(
format(
"Lookup ",
105 Relation::get_subrelation_label(subrelation_idx),
112 for (
auto r : lookup_result) {
114 throw std::runtime_error(
format(
"Lookup ", Relation::NAME,
" failed."));