68 inline static void accumulate(ContainerOverSubrelations& accumulators,
69 const AllEntities& in,
70 const Parameters& params,
71 const FF& scaling_factor)
77 using View =
typename Accumulator::View;
78 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
81 using ParameterCoefficientAccumulator =
typename ParameterView::CoefficientAccumulator;
83 const auto& eta_m = ParameterCoefficientAccumulator(params.eta);
84 const auto& eta_two_m = ParameterCoefficientAccumulator(params.eta_two);
85 const auto& eta_three_m = ParameterCoefficientAccumulator(params.eta_three);
87 auto w_1_m = CoefficientAccumulator(in.w_l);
88 auto w_2_m = CoefficientAccumulator(in.w_r);
89 auto w_3_m = CoefficientAccumulator(in.w_o);
90 auto w_4_m = CoefficientAccumulator(in.w_4);
91 auto w_1_shift_m = CoefficientAccumulator(in.w_l_shift);
92 auto w_2_shift_m = CoefficientAccumulator(in.w_r_shift);
93 auto w_3_shift_m = CoefficientAccumulator(in.w_o_shift);
94 auto w_4_shift_m = CoefficientAccumulator(in.w_4_shift);
96 auto q_1_m = CoefficientAccumulator(in.q_l);
97 auto q_2_m = CoefficientAccumulator(in.q_r);
98 auto q_3_m = CoefficientAccumulator(in.q_o);
99 auto q_4_m = CoefficientAccumulator(in.q_4);
100 auto q_m_m = CoefficientAccumulator(in.q_m);
101 auto q_c_m = CoefficientAccumulator(in.q_c);
103 auto q_memory_m = CoefficientAccumulator(in.q_memory);
149 auto memory_record_check_m = w_3_m * eta_three_m;
150 memory_record_check_m += w_2_m * eta_two_m;
151 memory_record_check_m += w_1_m * eta_m;
152 memory_record_check_m += q_c_m;
153 auto partial_record_check_m = memory_record_check_m;
154 memory_record_check_m = memory_record_check_m - w_4_m;
156 auto memory_record_check = Accumulator(memory_record_check_m);
174 auto neg_index_delta_m = w_1_m - w_1_shift_m;
175 auto index_delta_is_zero_m = neg_index_delta_m +
FF(1);
176 auto record_delta_m = w_4_shift_m - w_4_m;
178 Accumulator index_is_monotonically_increasing(neg_index_delta_m.sqr() +
182 auto adjacent_values_match_if_adjacent_indices_match =
183 Accumulator(index_delta_is_zero_m * record_delta_m);
185 auto q_memory_by_scaling_m = q_memory_m * scaling_factor;
186 auto q_memory_by_scaling = Accumulator(q_memory_by_scaling_m);
187 auto q_one_by_two_m = q_1_m * q_2_m;
188 auto q_one_by_two = Accumulator(q_one_by_two_m);
189 auto q_one_by_two_by_memory_by_scaling = q_one_by_two * q_memory_by_scaling;
192 adjacent_values_match_if_adjacent_indices_match * q_one_by_two_by_memory_by_scaling;
193 std::get<2>(accumulators) += index_is_monotonically_increasing * q_one_by_two_by_memory_by_scaling;
194 auto ROM_consistency_check_identity = memory_record_check * q_one_by_two;
214 auto neg_access_type_m = (partial_record_check_m - w_4_m);
215 Accumulator neg_access_type(neg_access_type_m);
216 auto access_check = neg_access_type.sqr() + neg_access_type;
221 auto neg_next_gate_access_type_m = w_3_shift_m * eta_three_m;
222 neg_next_gate_access_type_m += w_2_shift_m * eta_two_m;
223 neg_next_gate_access_type_m += w_1_shift_m * eta_m;
224 neg_next_gate_access_type_m = neg_next_gate_access_type_m - w_4_shift_m;
225 Accumulator neg_next_gate_access_type(neg_next_gate_access_type_m);
226 auto value_delta_m = w_3_shift_m - w_3_m;
227 auto adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation =
228 Accumulator(index_delta_is_zero_m * value_delta_m) *
229 Accumulator(neg_next_gate_access_type_m +
FF(1));
236 auto next_gate_access_type_is_boolean = neg_next_gate_access_type.sqr() + neg_next_gate_access_type;
238 auto q_3_by_memory_and_scaling = Accumulator(q_3_m * q_memory_by_scaling_m);
241 adjacent_values_match_if_adjacent_indices_match_and_next_access_is_a_read_operation *
242 q_3_by_memory_and_scaling;
243 std::get<4>(accumulators) += index_is_monotonically_increasing * q_3_by_memory_and_scaling;
244 std::get<5>(accumulators) += next_gate_access_type_is_boolean * q_3_by_memory_and_scaling;
246 auto RAM_consistency_check_identity = access_check * q_3_by_memory_and_scaling;
259 auto timestamp_delta_m = w_2_shift_m - w_2_m;
260 auto RAM_timestamp_check_identity_m = index_delta_is_zero_m * timestamp_delta_m - w_3_m;
261 Accumulator RAM_timestamp_check_identity(RAM_timestamp_check_identity_m);
266 auto memory_identity = ROM_consistency_check_identity;
267 memory_identity += RAM_timestamp_check_identity * Accumulator(q_4_m * q_1_m);
268 memory_identity += memory_record_check * Accumulator(q_m_m * q_1_m);
271 memory_identity *= q_memory_by_scaling;
272 memory_identity += RAM_consistency_check_identity;