89 using View =
typename Accumulator::View;
90 using ParameterView = Parameters::DataType;
92 auto w_1 = View(in.w_l);
93 auto w_2 = View(in.w_r);
94 auto w_3 = View(in.w_o);
95 auto w_4 = View(in.w_4);
97 auto sigma_1 = View(in.sigma_1);
98 auto sigma_2 = View(in.sigma_2);
99 auto sigma_3 = View(in.sigma_3);
100 auto sigma_4 = View(in.sigma_4);
102 const auto& beta = ParameterView(params.beta);
103 const auto& gamma = ParameterView(params.gamma);
106 return (w_1 + sigma_1 * beta + gamma) * (w_2 + sigma_2 * beta + gamma) * (w_3 + sigma_3 * beta + gamma) *
107 (w_4 + sigma_4 * beta + gamma);
127 inline static void accumulate(ContainerOverSubrelations& accumulators,
128 const AllEntities& in,
129 const Parameters& params,
130 const FF& scaling_factor)
134 using CoefficientAccumulator =
typename Accumulator::CoefficientAccumulator;
135 using ParameterView = Parameters::DataType;
136 using ParameterCoefficientAccumulator =
typename ParameterView::CoefficientAccumulator;
138 const CoefficientAccumulator w_1_m(in.w_l);
139 const CoefficientAccumulator w_2_m(in.w_r);
140 const CoefficientAccumulator w_3_m(in.w_o);
141 const CoefficientAccumulator w_4_m(in.w_4);
142 const CoefficientAccumulator id_1_m(in.id_1);
143 const CoefficientAccumulator id_2_m(in.id_2);
144 const CoefficientAccumulator id_3_m(in.id_3);
145 const CoefficientAccumulator id_4_m(in.id_4);
146 const CoefficientAccumulator sigma_1_m(in.sigma_1);
147 const CoefficientAccumulator sigma_2_m(in.sigma_2);
148 const CoefficientAccumulator sigma_3_m(in.sigma_3);
149 const CoefficientAccumulator sigma_4_m(in.sigma_4);
151 const ParameterCoefficientAccumulator gamma_m(params.gamma);
152 const ParameterCoefficientAccumulator beta_m(params.beta);
154 const auto w_1_plus_gamma = w_1_m + gamma_m;
155 const auto w_2_plus_gamma = w_2_m + gamma_m;
156 const auto w_3_plus_gamma = w_3_m + gamma_m;
157 const auto w_4_plus_gamma = w_4_m + gamma_m;
159 auto t1 = (id_1_m * beta_m);
160 t1 += w_1_plus_gamma;
161 t1 *= scaling_factor;
162 auto t2 = id_2_m * beta_m;
163 t2 += w_2_plus_gamma;
164 auto t3 = id_3_m * beta_m;
165 t3 += w_3_plus_gamma;
166 auto t4 = id_4_m * beta_m;
167 t4 += w_4_plus_gamma;
169 auto t5 = sigma_1_m * beta_m;
170 t5 += w_1_plus_gamma;
171 t5 *= scaling_factor;
172 auto t6 = sigma_2_m * beta_m;
173 t6 += w_2_plus_gamma;
174 auto t7 = sigma_3_m * beta_m;
175 t7 += w_3_plus_gamma;
176 auto t8 = sigma_4_m * beta_m;
177 t8 += w_4_plus_gamma;
179 Accumulator numerator(t1);
180 numerator *= Accumulator(t2);
181 numerator *= Accumulator(t3);
182 numerator *= Accumulator(t4);
184 Accumulator denominator(t5);
185 denominator *= Accumulator(t6);
186 denominator *= Accumulator(t7);
187 denominator *= Accumulator(t8);
189 const ParameterCoefficientAccumulator public_input_delta_m(params.public_input_delta);
190 const auto z_perm_m = CoefficientAccumulator(in.z_perm);
191 const auto z_perm_shift_m = CoefficientAccumulator(in.z_perm_shift);
192 const auto lagrange_first_m = CoefficientAccumulator(in.lagrange_first);
193 const auto lagrange_last_m = CoefficientAccumulator(in.lagrange_last);
195 auto public_input_term_m = lagrange_last_m * public_input_delta_m;
196 public_input_term_m += z_perm_shift_m;
197 const Accumulator public_input_term(public_input_term_m);
200 ((Accumulator(z_perm_m + lagrange_first_m) * numerator) - (public_input_term * denominator));
205 std::get<1>(accumulators) += ShortAccumulator((lagrange_last_m * z_perm_shift_m) * scaling_factor);
211 std::get<2>(accumulators) += InitAccumulator((lagrange_first_m * z_perm_m) * scaling_factor);