Skip to content

Commit 78ae39f

Browse files
committed
handle diff size big quad constraints
1 parent 91639b3 commit 78ae39f

2 files changed

Lines changed: 59 additions & 3 deletions

File tree

barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,18 @@ ConstraintProfile profile_constraint_type(ConstraintType representative, Handler
330330
void prepare_builder_from_profiles(UltraCircuitBuilder& builder, const std::vector<ConstraintProfile>& profiles)
331331
{
332332
// Register all constants from all profiles
333-
for (const auto& profile : profiles) {
333+
for (size_t p = 0; p < profiles.size(); p++) {
334+
const auto& profile = profiles[p];
335+
info(" profile[",
336+
p,
337+
"]: blk2=",
338+
profile.block_sizes.block_sizes[2],
339+
" vars=",
340+
profile.block_sizes.num_variables,
341+
" constants=",
342+
profile.constants.size(),
343+
" range_targets=",
344+
profile.range_list_targets.size());
334345
for (const auto& value : profile.constants) {
335346
builder.put_constant_variable(value);
336347
}
@@ -388,8 +399,30 @@ void build_constraints_parallel(UltraCircuitBuilder& builder,
388399

389400
profile_and_collect(constraints.quad_constraints,
390401
[](UltraCircuitBuilder& b, QuadConstraint& c) { create_quad_constraint(b, c); });
391-
profile_and_collect(constraints.big_quad_constraints,
392-
[](UltraCircuitBuilder& b, BigQuadConstraint& c) { create_big_quad_constraint(b, c); });
402+
// BigQuad constraints must be grouped by size() since different sizes produce different gate counts.
403+
{
404+
std::map<size_t, std::vector<size_t>> big_quad_groups;
405+
for (size_t i = 0; i < constraints.big_quad_constraints.size(); i++) {
406+
big_quad_groups[constraints.big_quad_constraints[i].size()].push_back(i);
407+
}
408+
auto handler = [](UltraCircuitBuilder& b, BigQuadConstraint& c) { create_big_quad_constraint(b, c); };
409+
for (auto& [sz, indices] : big_quad_groups) {
410+
auto& representative = constraints.big_quad_constraints[indices[0]];
411+
auto profile = profile_constraint_type(representative, handler, num_witnesses);
412+
size_t profile_idx = profiles.size();
413+
profiles.push_back(profile);
414+
auto sizes = profile.block_sizes;
415+
sizes.num_rom_arrays = profile.num_rom_arrays_per_instance;
416+
sizes.num_ram_arrays = profile.num_ram_arrays_per_instance;
417+
for (size_t idx : indices) {
418+
tasks.emplace_back([handler, &constraints, idx](UltraCircuitBuilder& b) {
419+
handler(b, constraints.big_quad_constraints[idx]);
420+
});
421+
task_sizes.push_back(sizes);
422+
task_profile_indices.push_back(profile_idx);
423+
}
424+
}
425+
}
393426
profile_and_collect(constraints.logic_constraints, [](UltraCircuitBuilder& b, const LogicConstraint& c) {
394427
create_logic_gate(b, c.a, c.b, c.result, c.num_bits, c.is_xor_gate);
395428
});

barretenberg/cpp/src/barretenberg/dsl/acir_format/per_block_gate_count.test.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1691,6 +1691,29 @@ TEST_P(AcirTestParallelEquivalence, SequentialN1N2)
16911691
n1_builder.get_num_variables(),
16921692
" n2=",
16931693
n2_builder.get_num_variables());
1694+
info(" constants: seq=",
1695+
seq_builder.constant_variable_indices.size(),
1696+
" n1=",
1697+
n1_builder.constant_variable_indices.size(),
1698+
" n2=",
1699+
n2_builder.constant_variable_indices.size());
1700+
info(" range_lists: seq=",
1701+
seq_builder.range_lists.size(),
1702+
" n1=",
1703+
n1_builder.range_lists.size(),
1704+
" n2=",
1705+
n2_builder.range_lists.size());
1706+
for (const auto& [target, rl] : seq_builder.range_lists) {
1707+
auto n1_it = n1_builder.range_lists.find(target);
1708+
size_t n1_count = (n1_it != n1_builder.range_lists.end()) ? n1_it->second.variable_indices.size() : 0;
1709+
info(" range ", target, ": seq=", rl.variable_indices.size(), " n1=", n1_count);
1710+
}
1711+
// Check for range lists in n1 that aren't in seq
1712+
for (const auto& [target, rl] : n1_builder.range_lists) {
1713+
if (seq_builder.range_lists.find(target) == seq_builder.range_lists.end()) {
1714+
info(" range ", target, ": seq=MISSING n1=", rl.variable_indices.size());
1715+
}
1716+
}
16941717
}
16951718

16961719
// All three must pass circuit checker

0 commit comments

Comments
 (0)