84 using View =
typename Accumulator::View;
87 auto w_1 = View(in.w_l);
88 auto w_2 = View(in.w_r);
89 auto w_3 = View(in.w_o);
90 auto w_4 = View(in.w_4);
92 auto sigma_1 = View(in.sigma_1);
93 auto sigma_2 = View(in.sigma_2);
94 auto sigma_3 = View(in.sigma_3);
95 auto sigma_4 = View(in.sigma_4);
97 const auto& beta = ParameterView(params.beta);
98 const auto& gamma = ParameterView(params.gamma);
101 return (w_1 + sigma_1 * beta + gamma) * (w_2 + sigma_2 * beta + gamma) * (w_3 + sigma_3 * beta + gamma) *
102 (w_4 + sigma_4 * beta + gamma);
122 inline static void accumulate(ContainerOverSubrelations& accumulators,
123 const AllEntities& in,
124 const Parameters& params,
125 const FF& scaling_factor)
129 using View =
typename Accumulator::View;
130 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
132 using ParameterCoefficientAccumulator =
typename ParameterView::CoefficientAccumulator;
134 const CoefficientAccumulator w_1_m(in.w_l);
135 const CoefficientAccumulator w_2_m(in.w_r);
136 const CoefficientAccumulator w_3_m(in.w_o);
137 const CoefficientAccumulator w_4_m(in.w_4);
138 const CoefficientAccumulator id_1_m(in.id_1);
139 const CoefficientAccumulator id_2_m(in.id_2);
140 const CoefficientAccumulator id_3_m(in.id_3);
141 const CoefficientAccumulator id_4_m(in.id_4);
142 const CoefficientAccumulator sigma_1_m(in.sigma_1);
143 const CoefficientAccumulator sigma_2_m(in.sigma_2);
144 const CoefficientAccumulator sigma_3_m(in.sigma_3);
145 const CoefficientAccumulator sigma_4_m(in.sigma_4);
147 const ParameterCoefficientAccumulator gamma_m(params.gamma);
148 const ParameterCoefficientAccumulator beta_m(params.beta);
150 const auto w_1_plus_gamma = w_1_m + gamma_m;
151 const auto w_2_plus_gamma = w_2_m + gamma_m;
152 const auto w_3_plus_gamma = w_3_m + gamma_m;
153 const auto w_4_plus_gamma = w_4_m + gamma_m;
155 auto t1 = (id_1_m * beta_m);
156 t1 += w_1_plus_gamma;
157 t1 *= scaling_factor;
158 auto t2 = id_2_m * beta_m;
159 t2 += w_2_plus_gamma;
160 auto t3 = id_3_m * beta_m;
161 t3 += w_3_plus_gamma;
162 auto t4 = id_4_m * beta_m;
163 t4 += w_4_plus_gamma;
165 auto t5 = sigma_1_m * beta_m;
166 t5 += w_1_plus_gamma;
167 t5 *= scaling_factor;
168 auto t6 = sigma_2_m * beta_m;
169 t6 += w_2_plus_gamma;
170 auto t7 = sigma_3_m * beta_m;
171 t7 += w_3_plus_gamma;
172 auto t8 = sigma_4_m * beta_m;
173 t8 += w_4_plus_gamma;
175 Accumulator numerator(t1);
176 numerator *= Accumulator(t2);
177 numerator *= Accumulator(t3);
178 numerator *= Accumulator(t4);
180 Accumulator denominator(t5);
181 denominator *= Accumulator(t6);
182 denominator *= Accumulator(t7);
183 denominator *= Accumulator(t8);
185 const ParameterCoefficientAccumulator public_input_delta_m(params.public_input_delta);
186 const auto z_perm_m = CoefficientAccumulator(in.z_perm);
187 const auto z_perm_shift_m = CoefficientAccumulator(in.z_perm_shift);
188 const auto lagrange_first_m = CoefficientAccumulator(in.lagrange_first);
189 const auto lagrange_last_m = CoefficientAccumulator(in.lagrange_last);
191 auto public_input_term_m = lagrange_last_m * public_input_delta_m;
192 public_input_term_m += z_perm_shift_m;
193 const Accumulator public_input_term(public_input_term_m);
197 ((Accumulator(z_perm_m + lagrange_first_m) * numerator) - (public_input_term * denominator));
202 std::get<1>(accumulators) += ShortAccumulator((lagrange_last_m * z_perm_shift_m) * scaling_factor);