10#include <gtest/gtest.h>
15template <
typename Builder_,
16 typename AcirConstraint_,
17 size_t num_multiplication_terms,
18 size_t num_linear_terms,
19 bool overlap_mul_and_linear,
31template <
typename Builder_,
32 typename AcirConstraint_,
33 size_t num_multiplication_terms,
34 size_t num_linear_terms,
35 bool overlap_mul_and_linear,
51 if constexpr (overlap_mul_and_linear) {
55 if constexpr (overlap_mul_and_linear && num_multiplication_terms > 1) {
59 if constexpr (overlap_mul_and_linear && num_multiplication_terms > 2) {
74 size_t num_multiplication_gates = num_multiplication_terms;
75 num_gates += num_multiplication_gates;
78 size_t num_witnesses_into_wires = num_linear_terms;
85 size_t num_witnesses_first_wire = num_multiplication_gates != 0 ? 2U : 4U;
86 if (num_witnesses_into_wires <= num_witnesses_first_wire) {
87 return num_multiplication_gates != 0 ? num_multiplication_gates : 1U;
89 num_witnesses_into_wires -= num_witnesses_first_wire;
90 num_gates += num_multiplication_gates != 0 ? 0U : 1U;
93 if (num_witnesses_into_wires + 1 <= num_gates) {
96 num_witnesses_into_wires -= (num_multiplication_gates - 1);
99 size_t num_additional_gates = num_witnesses_into_wires / (Builder::NUM_WIRES - 1);
100 size_t diff = num_witnesses_into_wires - num_additional_gates * (Builder::NUM_WIRES - 1);
101 num_additional_gates += diff == 0 ? 0U : 1U;
103 return num_gates + num_additional_gates;
113 static std::vector<std::string>
get_labels() {
return {
"None",
"InvalidateConstant",
"InvalidateWitness" }; }
119 const std::vector<bb::fr>& witness_values)
123 for (
const auto& mul_term : mul_terms) {
127 result += scalar * lhs_value * rhs_value;
130 for (
const auto& linear_term : linear_terms) {
131 bb::fr scalar = linear_term.first;
132 bb::fr value = witness_values[linear_term.second.first];
133 result += scalar *
value;
146 mul_terms.reserve(num_multiplication_terms);
147 for (
size_t idx = 0; idx < num_multiplication_terms; ++idx) {
158 linear_terms.reserve(num_linear_terms);
159 for (
size_t idx = 0; idx < num_linear_terms; ++idx) {
171 if constexpr (overlap_mul_and_linear) {
172 BB_ASSERT_GTE(num_linear_terms, 1U,
"We need at least 1 linear terms when overlapping is turned on.");
174 num_multiplication_terms, 1U,
"We need at least 1 multiplication terms when overlapping is turned on.");
177 std::get<1>(mul_terms[0]).first = linear_terms[0].second.first;
179 if constexpr (num_multiplication_terms > 1 && num_linear_terms > 1) {
181 std::get<2>(mul_terms[1]).first = linear_terms[1].second.first;
184 if constexpr (num_multiplication_terms > 2 && num_linear_terms > 2) {
186 std::get<1>(mul_terms[2]).first = linear_terms[2].second.first;
187 std::get<2>(mul_terms[2]).first = linear_terms[2].second.first;
193 if constexpr (overlap_linear) {
197 <<
" linear term when overlapping is turned on.");
207 for (
const auto& mul_term : mul_terms) {
212 for (
const auto& linear_term : linear_terms) {
214 std::make_tuple(linear_term.first.to_buffer(),
Acir::Witness(linear_term.second.first)));
225 if (EXPECTED_NUM_GATES > 1) {
245 switch (invalid_witness_target) {
270template <
typename ArithmeticConstra
intParams_>
272 :
public ::testing::Test,
273 public TestClass<ArithmeticConstraintsTestingFunctions<typename ArithmeticConstraintParams_::Builder,
274 typename ArithmeticConstraintParams_::AcirConstraint,
275 ArithmeticConstraintParams_::NUM_MULTIPLICATION_TERMS,
276 ArithmeticConstraintParams_::NUM_LINEAR_TERMS,
277 ArithmeticConstraintParams_::OVERLAP_MUL_AND_LINEAR,
278 ArithmeticConstraintParams_::OVERLAP_LINEAR>> {
312 TestFixture::template test_vk_independence<Flavor>();
317 TestFixture::test_tampering();
320template <
typename ArithmeticConstra
intParams_>
322 :
public ::testing::Test,
323 public TestClass<ArithmeticConstraintsTestingFunctions<typename ArithmeticConstraintParams_::Builder,
324 typename ArithmeticConstraintParams_::AcirConstraint,
325 ArithmeticConstraintParams_::NUM_MULTIPLICATION_TERMS,
326 ArithmeticConstraintParams_::NUM_LINEAR_TERMS,
327 ArithmeticConstraintParams_::OVERLAP_MUL_AND_LINEAR,
328 ArithmeticConstraintParams_::OVERLAP_LINEAR>> {
356 TestFixture::template test_vk_independence<Flavor>();
361 TestFixture::test_tampering();
testing::Types< ArithmeticConstraintParams< UltraCircuitBuilder, QuadConstraint, 1, 0, false, false >, ArithmeticConstraintParams< UltraCircuitBuilder, QuadConstraint, 1, 1, false, false >, ArithmeticConstraintParams< UltraCircuitBuilder, QuadConstraint, 1, 2, false, false >, ArithmeticConstraintParams< UltraCircuitBuilder, QuadConstraint, 1, 3, false, true >, ArithmeticConstraintParams< UltraCircuitBuilder, QuadConstraint, 1, 4, true, true >, ArithmeticConstraintParams< UltraCircuitBuilder, QuadConstraint, 0, 4, false, false >, ArithmeticConstraintParams< UltraCircuitBuilder, QuadConstraint, 0, 4, false, true >, ArithmeticConstraintParams< MegaCircuitBuilder, QuadConstraint, 1, 0, false, false >, ArithmeticConstraintParams< MegaCircuitBuilder, QuadConstraint, 1, 1, false, false >, ArithmeticConstraintParams< MegaCircuitBuilder, QuadConstraint, 1, 2, false, false >, ArithmeticConstraintParams< MegaCircuitBuilder, QuadConstraint, 1, 3, false, true >, ArithmeticConstraintParams< MegaCircuitBuilder, QuadConstraint, 1, 4, true, true >, ArithmeticConstraintParams< MegaCircuitBuilder, QuadConstraint, 0, 4, false, false >, ArithmeticConstraintParams< MegaCircuitBuilder, QuadConstraint, 0, 5, false, true > > QuadConstraintConfigs
testing::Types< ArithmeticConstraintParams< UltraCircuitBuilder, BigQuadConstraint, 1, 3, false, false >, ArithmeticConstraintParams< UltraCircuitBuilder, BigQuadConstraint, 0, 5, false, false >, ArithmeticConstraintParams< UltraCircuitBuilder, BigQuadConstraint, 2, 0, false, false >, ArithmeticConstraintParams< UltraCircuitBuilder, BigQuadConstraint, 3, 3, true, false >, ArithmeticConstraintParams< UltraCircuitBuilder, BigQuadConstraint, 1, 4, false, true >, ArithmeticConstraintParams< UltraCircuitBuilder, BigQuadConstraint, 5, 5, true, true >, ArithmeticConstraintParams< UltraCircuitBuilder, BigQuadConstraint, 0, 6, false, true >, ArithmeticConstraintParams< MegaCircuitBuilder, BigQuadConstraint, 1, 3, false, false >, ArithmeticConstraintParams< MegaCircuitBuilder, BigQuadConstraint, 0, 5, false, false >, ArithmeticConstraintParams< MegaCircuitBuilder, BigQuadConstraint, 2, 0, false, false >, ArithmeticConstraintParams< MegaCircuitBuilder, BigQuadConstraint, 3, 3, true, false >, ArithmeticConstraintParams< MegaCircuitBuilder, BigQuadConstraint, 1, 4, false, true >, ArithmeticConstraintParams< MegaCircuitBuilder, BigQuadConstraint, 5, 5, true, true >, ArithmeticConstraintParams< MegaCircuitBuilder, BigQuadConstraint, 0, 6, false, true > > BigQuadConstraintConfigs
std::vector< mul_quad_< bb::fr > > BigQuadConstraint
#define BB_ASSERT(expression,...)
#define BB_ASSERT_GTE(left, right,...)
#define BB_ASSERT_GT(left, right,...)
#define BB_ASSERT_EQ(actual, expected,...)
static constexpr size_t NUM_LINEAR_TERMS
static constexpr size_t NUM_MULTIPLICATION_TERMS
AcirConstraint_ AcirConstraint
static constexpr bool OVERLAP_MUL_AND_LINEAR
static constexpr bool OVERLAP_LINEAR
static std::vector< std::string > get_labels()
static std::vector< Target > get_all()
AcirConstraint_ AcirConstraint
static constexpr size_t NUM_OVERLAP_MUL_AND_LINEAR
static constexpr size_t LINEAR_OFFSET
static bb::fr evaluate_expression_result(const std::vector< std::tuple< bb::fr, std::pair< uint32_t, bb::fr >, std::pair< uint32_t, bb::fr > > > &mul_terms, const std::vector< std::pair< bb::fr, std::pair< uint32_t, bb::fr > > > &linear_terms, const std::vector< bb::fr > &witness_values)
static constexpr size_t num_overlap_mul_and_linear()
Compute the number of elements to overlap between multiplication and linear terms.
void generate_constraints(AcirConstraint &arithmetic_constraint, WitnessVector &witness_values)
static constexpr size_t NUM_OVERLAP_LINEAR
static size_t expected_num_gates()
static constexpr bool IS_BIG_QUAD
void invalidate_witness(AcirConstraint &constraint, WitnessVector &witness_values, const typename InvalidWitness::Target &invalid_witness_target)
static void SetUpTestSuite()
static void SetUpTestSuite()
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::vector< uint8_t > to_buffer(T const &value)
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness > > linear_combinations
std::vector< uint8_t > q_c
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
static constexpr field one()
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE std::vector< uint8_t > to_buffer() const