Repository navigation
Fix 32-bit shifts in brute_force_decomp_helper dropping high detectors - #1123
Merged
Merged
Conversation
|
Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA). View this failed invocation of the CLA check for more information. For the most up to date status, view the checks section at the bottom of the pull request. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #1113
While looking at this issue I found that
brute_force_decomp_helperkeeps track of used terms in auint64_tmask, but it was updating it with1 << startand1 << k. Those shift a 32-bitint, so once the shift count reaches 31 or more the result is undefined or gets sign-extended and the mask is wrong. In practice, withdecompose_errors=True, an error touching 33 or more detectors would lose its higher targets (D32 in the example from the issue).The fix is just changing those three shifts to
uint64_t{1} << .... The existing check that rejects problems with 64 or more terms is untouched, so the biggest shift is 62 and stays in range. The fix and the regression test follow what was suggested in the issue.I added
test_decomposition_preserves_large_single_qubit_errortocircuit_pybind_test.py. It builds the circuit from the issue for 32, 33 and 63 measurements and checks that the decomposed 0.25 error still flips every detector. Without the fix it fails at 33 (AssertionError: 33, mask is0xFFFFFFFFso D32 is missing), and with the fix it passes.Tests I ran:
python -m pytest src/stim/circuit src/stim/simulators: 222 passed./build/out/stim_test --gtest_filter='ErrorAnalyzer.*': 57 passed