-
Notifications
You must be signed in to change notification settings - Fork 322
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chore: use RelationChecker in relation correctness tests and add Translator interleaving test #11878
Conversation
* @brief Ensures the concatenation by interleaving function still preserves the correctness of relations. | ||
* | ||
*/ | ||
TEST_F(TranslatorProvingKeyTests, InterleaveFull) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if you think i shouldn't merge this because it's very preliminary work i can leave it out, I basically wanted to establish that interleaving doesn't break Permutation and DeltaRangeConstraint, which operate on the concatenated polynomials (and their ordered version) in an isolated way
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it's fine. I very much prefer incremental PRs and given that you're planning to work primarily on this it shouldn't result in stale unused code
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks great, long overdue cleanup. Left a couple of minor suggestions
barretenberg/cpp/src/barretenberg/translator_vm/relation_correctness.test.cpp
Outdated
Show resolved
Hide resolved
fill_polynomial_with_random_14_bit_values(prover_polynomials.relation_wide_limbs_range_constraint_2); | ||
fill_polynomial_with_random_14_bit_values(prover_polynomials.relation_wide_limbs_range_constraint_3); | ||
|
||
for (const auto& group : prover_polynomials.get_groups_to_be_concatenated()) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
haha wow, this was long overdue
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yay i did something useful last week
polynomial_get_all[shifted_id] = polynomial_container[to_be_shifted_id].shifted(); | ||
} | ||
|
||
ProverPolynomials prover_polynomials = TranslatorFlavor::ProverPolynomials(circuit_size); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
same as above
// Ensure we can shift this | ||
polynomial_get_all[shifted_id] = polynomial_container[to_be_shifted_id].shifted(); | ||
} | ||
ProverPolynomials prover_polynomials = TranslatorFlavor::ProverPolynomials(circuit_size); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ditto
|
||
// Targets have to be full-sized proving_key->polynomials. We can compute the mini circuit size from them by | ||
// dividing by concatenation index | ||
const size_t MINI_CIRCUIT_SIZE = concatenated_polynomials[0].size() / Flavor::CONCATENATION_GROUP_SIZE; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Isnt MINI_CIRCUIT_SIZE a fixed flavor constant anyway? Maybe not always?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
there is a minimum_mini_circuit_size for which the translator is optimised but technically it can have another size as well, if I understand correctly it's given by the number of gates in the translator circuit
barretenberg/cpp/src/barretenberg/translator_vm/translator_proving_key.cpp
Outdated
Show resolved
Hide resolved
{ | ||
|
||
const size_t group_size = group.size(); | ||
const size_t group_polynomial_size = result.size() / group_size; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Its a little hard to follow how these sizes work out. group_polynomial_size
is computed as the the size
(size of the memory block) of the destination poly divided by number of small polys, but then we only iterate from result.start_index()
to group_polynomial_size
. If result
had a start index > 0, wouldn't this not iterate over the full size
? Perhaps some checks within this method would add safety and also clarify what the sizes are expected to be?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
size() is computed as end_index() - start_index()
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
but yes you are right, will add some checks
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe we're saying the same thing but just to be sure: I agree size is end - start, but the loop below goes from idx = start to idx = size, not idx = end, i.e. it does not loop over size-many elements. Oh but group_polynomial_size is not being computed group_polynomial.size()
so maybe its somehow doing the right thing?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah so the issue here is that the group polynomials are initialised over the full domain (i.e. the same domain as the result
polynomial) rather than they're real domain (mini_circuit_size) even though past their real domain the coeff are 0. A follow on is to refine the sizes so we can call group.size(). I started doing it in this PR but subtle changes to sizes deserve a PR of their own so I added an issue for now.
@@ -25,67 +26,6 @@ void ensure_non_zero(auto& polynomial) | |||
ASSERT_TRUE(has_non_zero_coefficient); | |||
} | |||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nice, thanks for doing this
* @brief Ensures the concatenation by interleaving function still preserves the correctness of relations. | ||
* | ||
*/ | ||
TEST_F(TranslatorProvingKeyTests, InterleaveFull) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it's fine. I very much prefer incremental PRs and given that you're planning to work primarily on this it shouldn't result in stale unused code
|
||
// Iterate over all the subrelation results and report if a linearly independent one failed | ||
for (auto& element : result) { | ||
if constexpr (has_linearly_dependent) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Took me a while to see why this logic has to be written this way but I guess its because only relations that have linearly dependent subrelations specify the array SUBRELATION_LINEARLY_INDEPENDENT. This could be simplified quite a bit if all relations provided this. Might be worth doing but doesn't need to be here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we used to have some sort of boolean specifying whether a relation has a linearly dependent contribution, i'll add an issue
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.76.3</summary> ## [0.76.3](aztec-package-v0.76.2...aztec-package-v0.76.3) (2025-02-12) ### Features * Add undici ([#11818](#11818)) ([8503c7a](8503c7a)) * Initial multi-proof test ([#11779](#11779)) ([f54db75](f54db75)) </details> <details><summary>barretenberg.js: 0.76.3</summary> ## [0.76.3](barretenberg.js-v0.76.2...barretenberg.js-v0.76.3) (2025-02-12) ### Features * **perf:** Speed up construction of bbjs Frs & cache zero hashes in ephemeral trees (redo) ([#11894](#11894)) ([e093acf](e093acf)) ### Bug Fixes * Memory fragmentation fixes to cut UltraHonk memory usage by 26% ([#11895](#11895)) ([b4e2264](b4e2264)) </details> <details><summary>aztec-packages: 0.76.3</summary> ## [0.76.3](aztec-packages-v0.76.2...aztec-packages-v0.76.3) (2025-02-12) ### Features * Add undici ([#11818](#11818)) ([8503c7a](8503c7a)) * **avm:** Sequential lookup resolution ([#11769](#11769)) ([3980f6c](3980f6c)) * Enable ws for reth on devnet ([#11922](#11922)) ([7124664](7124664)), closes [#11921](#11921) * Initial multi-proof test ([#11779](#11779)) ([f54db75](f54db75)) * Native world state now supports checkpointing ([#11739](#11739)) ([6464059](6464059)) * **perf:** Speed up construction of bbjs Frs & cache zero hashes in ephemeral trees (redo) ([#11894](#11894)) ([e093acf](e093acf)) ### Bug Fixes * Correctly configure batch queue ([#11934](#11934)) ([4908df8](4908df8)) * De-dup pubkey conversion of cli-wallet param ([#11948](#11948)) ([5529871](5529871)) * **docs:** Update the token bridge tutorial ([#11578](#11578)) ([aaf42a7](aaf42a7)) * Don't restart kind control plane automatically ([#11923](#11923)) ([c23c0f9](c23c0f9)) * Empty blocks can now be unwound ([#11920](#11920)) ([fdc2042](fdc2042)) * Gcloud logs ([#11944](#11944)) ([c53b1c5](c53b1c5)), closes [#11887](#11887) * Lmdb cmake race condition ([#11959](#11959)) ([031200d](031200d)) * Memory fragmentation fixes to cut UltraHonk memory usage by 26% ([#11895](#11895)) ([b4e2264](b4e2264)) * Npm packages noir resolution ([#11946](#11946)) ([d3e3f20](d3e3f20)) * Set resource limits on Loki pods ([#11940](#11940)) ([6999982](6999982)) ### Miscellaneous * Only take FF (and not Flavor) in compute_logderivative_inverse ([#11938](#11938)) ([bbbded3](bbbded3)) * Op queue cleanup ([#11925](#11925)) ([082ed66](082ed66)) * Renaming `pxe_db.nr` as `capsules.nr` ([#11905](#11905)) ([14d873c](14d873c)) * Replace relative paths to noir-protocol-circuits ([9ce401a](9ce401a)) * Use realistic size Client IVC proofs during simulations ([#11692](#11692)) ([90b9fbf](90b9fbf)) * Use RelationChecker in relation correctness tests and add Translator interleaving test ([#11878](#11878)) ([ed215e8](ed215e8)) </details> <details><summary>barretenberg: 0.76.3</summary> ## [0.76.3](barretenberg-v0.76.2...barretenberg-v0.76.3) (2025-02-12) ### Features * **avm:** Sequential lookup resolution ([#11769](#11769)) ([3980f6c](3980f6c)) * Native world state now supports checkpointing ([#11739](#11739)) ([6464059](6464059)) ### Bug Fixes * Empty blocks can now be unwound ([#11920](#11920)) ([fdc2042](fdc2042)) * Lmdb cmake race condition ([#11959](#11959)) ([031200d](031200d)) * Memory fragmentation fixes to cut UltraHonk memory usage by 26% ([#11895](#11895)) ([b4e2264](b4e2264)) ### Miscellaneous * Only take FF (and not Flavor) in compute_logderivative_inverse ([#11938](#11938)) ([bbbded3](bbbded3)) * Op queue cleanup ([#11925](#11925)) ([082ed66](082ed66)) * Use RelationChecker in relation correctness tests and add Translator interleaving test ([#11878](#11878)) ([ed215e8](ed215e8)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
🤖 I have created a release *beep* *boop* --- <details><summary>aztec-package: 0.76.3</summary> ## [0.76.3](AztecProtocol/aztec-packages@aztec-package-v0.76.2...aztec-package-v0.76.3) (2025-02-12) ### Features * Add undici ([#11818](AztecProtocol/aztec-packages#11818)) ([8503c7a](AztecProtocol/aztec-packages@8503c7a)) * Initial multi-proof test ([#11779](AztecProtocol/aztec-packages#11779)) ([f54db75](AztecProtocol/aztec-packages@f54db75)) </details> <details><summary>barretenberg.js: 0.76.3</summary> ## [0.76.3](AztecProtocol/aztec-packages@barretenberg.js-v0.76.2...barretenberg.js-v0.76.3) (2025-02-12) ### Features * **perf:** Speed up construction of bbjs Frs & cache zero hashes in ephemeral trees (redo) ([#11894](AztecProtocol/aztec-packages#11894)) ([e093acf](AztecProtocol/aztec-packages@e093acf)) ### Bug Fixes * Memory fragmentation fixes to cut UltraHonk memory usage by 26% ([#11895](AztecProtocol/aztec-packages#11895)) ([b4e2264](AztecProtocol/aztec-packages@b4e2264)) </details> <details><summary>aztec-packages: 0.76.3</summary> ## [0.76.3](AztecProtocol/aztec-packages@aztec-packages-v0.76.2...aztec-packages-v0.76.3) (2025-02-12) ### Features * Add undici ([#11818](AztecProtocol/aztec-packages#11818)) ([8503c7a](AztecProtocol/aztec-packages@8503c7a)) * **avm:** Sequential lookup resolution ([#11769](AztecProtocol/aztec-packages#11769)) ([3980f6c](AztecProtocol/aztec-packages@3980f6c)) * Enable ws for reth on devnet ([#11922](AztecProtocol/aztec-packages#11922)) ([7124664](AztecProtocol/aztec-packages@7124664)), closes [#11921](AztecProtocol/aztec-packages#11921) * Initial multi-proof test ([#11779](AztecProtocol/aztec-packages#11779)) ([f54db75](AztecProtocol/aztec-packages@f54db75)) * Native world state now supports checkpointing ([#11739](AztecProtocol/aztec-packages#11739)) ([6464059](AztecProtocol/aztec-packages@6464059)) * **perf:** Speed up construction of bbjs Frs & cache zero hashes in ephemeral trees (redo) ([#11894](AztecProtocol/aztec-packages#11894)) ([e093acf](AztecProtocol/aztec-packages@e093acf)) ### Bug Fixes * Correctly configure batch queue ([#11934](AztecProtocol/aztec-packages#11934)) ([4908df8](AztecProtocol/aztec-packages@4908df8)) * De-dup pubkey conversion of cli-wallet param ([#11948](AztecProtocol/aztec-packages#11948)) ([5529871](AztecProtocol/aztec-packages@5529871)) * **docs:** Update the token bridge tutorial ([#11578](AztecProtocol/aztec-packages#11578)) ([aaf42a7](AztecProtocol/aztec-packages@aaf42a7)) * Don't restart kind control plane automatically ([#11923](AztecProtocol/aztec-packages#11923)) ([c23c0f9](AztecProtocol/aztec-packages@c23c0f9)) * Empty blocks can now be unwound ([#11920](AztecProtocol/aztec-packages#11920)) ([fdc2042](AztecProtocol/aztec-packages@fdc2042)) * Gcloud logs ([#11944](AztecProtocol/aztec-packages#11944)) ([c53b1c5](AztecProtocol/aztec-packages@c53b1c5)), closes [#11887](AztecProtocol/aztec-packages#11887) * Lmdb cmake race condition ([#11959](AztecProtocol/aztec-packages#11959)) ([031200d](AztecProtocol/aztec-packages@031200d)) * Memory fragmentation fixes to cut UltraHonk memory usage by 26% ([#11895](AztecProtocol/aztec-packages#11895)) ([b4e2264](AztecProtocol/aztec-packages@b4e2264)) * Npm packages noir resolution ([#11946](AztecProtocol/aztec-packages#11946)) ([d3e3f20](AztecProtocol/aztec-packages@d3e3f20)) * Set resource limits on Loki pods ([#11940](AztecProtocol/aztec-packages#11940)) ([6999982](AztecProtocol/aztec-packages@6999982)) ### Miscellaneous * Only take FF (and not Flavor) in compute_logderivative_inverse ([#11938](AztecProtocol/aztec-packages#11938)) ([bbbded3](AztecProtocol/aztec-packages@bbbded3)) * Op queue cleanup ([#11925](AztecProtocol/aztec-packages#11925)) ([082ed66](AztecProtocol/aztec-packages@082ed66)) * Renaming `pxe_db.nr` as `capsules.nr` ([#11905](AztecProtocol/aztec-packages#11905)) ([14d873c](AztecProtocol/aztec-packages@14d873c)) * Replace relative paths to noir-protocol-circuits ([9ce401a](AztecProtocol/aztec-packages@9ce401a)) * Use realistic size Client IVC proofs during simulations ([#11692](AztecProtocol/aztec-packages#11692)) ([90b9fbf](AztecProtocol/aztec-packages@90b9fbf)) * Use RelationChecker in relation correctness tests and add Translator interleaving test ([#11878](AztecProtocol/aztec-packages#11878)) ([ed215e8](AztecProtocol/aztec-packages@ed215e8)) </details> <details><summary>barretenberg: 0.76.3</summary> ## [0.76.3](AztecProtocol/aztec-packages@barretenberg-v0.76.2...barretenberg-v0.76.3) (2025-02-12) ### Features * **avm:** Sequential lookup resolution ([#11769](AztecProtocol/aztec-packages#11769)) ([3980f6c](AztecProtocol/aztec-packages@3980f6c)) * Native world state now supports checkpointing ([#11739](AztecProtocol/aztec-packages#11739)) ([6464059](AztecProtocol/aztec-packages@6464059)) ### Bug Fixes * Empty blocks can now be unwound ([#11920](AztecProtocol/aztec-packages#11920)) ([fdc2042](AztecProtocol/aztec-packages@fdc2042)) * Lmdb cmake race condition ([#11959](AztecProtocol/aztec-packages#11959)) ([031200d](AztecProtocol/aztec-packages@031200d)) * Memory fragmentation fixes to cut UltraHonk memory usage by 26% ([#11895](AztecProtocol/aztec-packages#11895)) ([b4e2264](AztecProtocol/aztec-packages@b4e2264)) ### Miscellaneous * Only take FF (and not Flavor) in compute_logderivative_inverse ([#11938](AztecProtocol/aztec-packages#11938)) ([bbbded3](AztecProtocol/aztec-packages@bbbded3)) * Op queue cleanup ([#11925](AztecProtocol/aztec-packages#11925)) ([082ed66](AztecProtocol/aztec-packages@082ed66)) * Use RelationChecker in relation correctness tests and add Translator interleaving test ([#11878](AztecProtocol/aztec-packages#11878)) ([ed215e8](AztecProtocol/aztec-packages@ed215e8)) </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).
The RelationChecker was introduced as a debugging utility in a previous PR but was not actually used in relevant tests, leading to duplicated code. This PR fixes that and aims to refine the check function in the utility. It also includes refactoring of stale code and adds a small sequential test that changing the interleaving strategy in translator will not break the PermutationRelation and DeltaRangeConstraintRelation (the two relations that now operate on the concatenated polynomials)