The review of the synthesiser's fix found two claims that were wider than the code. The norm equation does not fix t up to a unit. Where a prime that splits in Z[ω] divides 2^k − |u|², it has other solutions, and the solver returns one of them. The search writes that solution's four unit multiples. The module, the function, the published row and the change note now say so. "Every word is as near its rotation as before" holds for each u, not for each rotation. The search runs over every u, and a u that lost may now win, with its own distance. Over the oracle's 1,192 rows, 350 words change, 57 of them at an unchanged T count, and 87 rotations end farther from Rz(θ). None ends past its ε. At an equal count none is farther. The Ising program's middle angle at 10⁻³ goes from 29 T gates at 3.50·10⁻⁴ to 27 at 6.15·10⁻⁴. The change note gives that rule, and says outputs change wherever a word does, not only where a count drops. rz_by takes the completion as an argument, so the tests compare the search with the solver's own unit: - the_unit_search_takes_no_more_t_gates_and_at_one_count_is_no_farther pins the tally over the sweep (release); - fewer_t_gates_can_end_farther_and_one_count_can_take_another_word holds the two cases above. The workflow requires both by name, and the published-architecture test refuses the old wording. Co-Authored-By: Claude Opus 5.5 <[email protected]>
134 lines
7.5 KiB
YAML
134 lines
7.5 KiB
YAML
name: wai-quantum resource estimation
|
|
|
|
# Resource estimation from programs (wai/wai-quantum/src/engine/estimate/):
|
|
# the logical counts against programs whose counts are known exactly, the
|
|
# ladders through ancillas against the gates they replace on dense unitaries,
|
|
# each rotation's T count against its synthesised word, the interchange
|
|
# documents against the format's schema and a self-made fixture, the
|
|
# frontier, the seals, and the planar model and its receipts
|
|
# (quantum_resource, quantum_resource_receipt) beside them.
|
|
#
|
|
# The published-architecture check (src/published_architectures.rs) feeds the
|
|
# stated assumptions of published resource estimates into the estimators
|
|
# (quantum_arch, quantum_bicycle and the estimate job), holds every row to its
|
|
# published figure (tests/data/published_figures.tsv: the digits it is printed
|
|
# to, or a guard on ours) and the page docs/published-architectures.md to what
|
|
# they give. Its search over 4¹¹ Paulis runs in a release build only. So does
|
|
# the synthesiser's sweep against the reference implementation's T counts
|
|
# (engine::synth::rz), which every rotation's T count in an estimate comes from.
|
|
#
|
|
# In a release build the calibration test measures every point of the
|
|
# decoders' table again (the rotated surface-code memory experiment, decoded
|
|
# by exact matching and by union-find on the same shots), so the code model
|
|
# the estimate calibrates from is held to what the decoders measure; a debug
|
|
# build measures one point. The other platforms run these tests in the
|
|
# crate's suites (wai-energy-receipts.yml, debug) and under wasm32-wasip2
|
|
# (wai-conformance.yml).
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- 'wai/wai-quantum/**'
|
|
- 'rust-toolchain.toml'
|
|
- '.github/workflows/wai-quantum-estimate.yml'
|
|
pull_request:
|
|
paths:
|
|
- 'wai/wai-quantum/**'
|
|
- 'rust-toolchain.toml'
|
|
- '.github/workflows/wai-quantum-estimate.yml'
|
|
|
|
jobs:
|
|
relevant:
|
|
name: does this change touch it
|
|
runs-on: gate
|
|
outputs:
|
|
run: ${{ steps.gate.outputs.run }}
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
with:
|
|
fetch-depth: 0
|
|
- id: gate
|
|
run: |
|
|
set -euo pipefail
|
|
r=$(python3 scripts/pr-touches-paths.py .github/workflows/wai-quantum-estimate.yml \
|
|
"${{ github.event.pull_request.base.sha }}" \
|
|
"${{ github.event.pull_request.head.sha }}")
|
|
echo "this change touches resource estimation: $r"
|
|
echo "run=$r" >> "$GITHUB_OUTPUT"
|
|
|
|
native:
|
|
name: estimation and calibration · linux, release
|
|
needs: relevant
|
|
if: needs.relevant.outputs.run == 'true'
|
|
runs-on: linux
|
|
timeout-minutes: 60
|
|
steps:
|
|
- uses: actions/checkout@v5
|
|
- name: Install Rust 1.99.1
|
|
shell: bash
|
|
run: |
|
|
export PATH="$HOME/.cargo/bin:$PATH"
|
|
command -v rustup >/dev/null 2>&1 || \
|
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.99.1
|
|
rustup toolchain install 1.99.1 --profile minimal
|
|
rustup default 1.99.1
|
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
# A module filter is satisfied by any one test of the module, so each
|
|
# module's tests are required by name to have run.
|
|
- name: The estimate, the planar model and their receipts
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --release --features full --lib -- engine::estimate quantum_resource 2>&1 | tee "$RUNNER_TEMP/estimate.log"
|
|
grep -qE '^test result: ok\. [1-9][0-9]+ passed; 0 failed' "$RUNNER_TEMP/estimate.log" || { echo "::error::the estimate's tests did not pass"; exit 1; }
|
|
for t in engine::estimate::calibration::tests::the_table_is_what_the_decoders_measure \
|
|
engine::estimate::count::tests::ladders_through_ancillas_are_the_controlled_gates_they_replace \
|
|
engine::estimate::count::tests::the_counts_of_programs_whose_counts_are_known_exactly \
|
|
engine::estimate::interchange::tests::the_fixture_meets_the_schema_and_its_totals_are_its_children_s \
|
|
engine::estimate::tests::an_estimate_is_sealed_verifies_and_a_changed_one_does_not \
|
|
quantum_resource::tests::the_summary_rows_are_reproduced \
|
|
quantum_resource_receipt::tests::a_counted_program_binds_its_digest_and_its_epsilon; do
|
|
grep -q "^test $t \.\.\. ok$" "$RUNNER_TEMP/estimate.log" || { echo "::error::$t did not run and pass"; exit 1; }
|
|
done
|
|
- name: Published architectures, re-estimated, and the page that prints them
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --release --features full --lib -- quantum_arch:: quantum_bicycle:: published_architectures:: 2>&1 | tee "$RUNNER_TEMP/published.log"
|
|
grep -qE '^test result: ok\. [1-9][0-9]+ passed; 0 failed; 0 ignored' "$RUNNER_TEMP/published.log" || { echo "::error::the published-architecture tests did not all run and pass"; exit 1; }
|
|
for t in published_architectures::tests::the_page_is_what_the_estimators_give \
|
|
published_architectures::tests::every_row_holds_to_its_published_figure \
|
|
published_architectures::tests::the_ours_column_holds_only_ours_and_the_text_says_what_the_sources_say \
|
|
quantum_bicycle::tests::the_cost_tables_are_what_the_search_finds \
|
|
quantum_bicycle::tests::the_source_s_mean_costs_come_from_taking_z_by_the_inverse \
|
|
quantum_bicycle::tests::the_fits_give_the_printed_rates \
|
|
quantum_arch::tests::the_2021_rsa_table_is_reproduced_to_its_printed_digits \
|
|
quantum_arch::tests::the_chemistry_estimate_is_priced_by_the_same_clock; do
|
|
grep -q "^test $t \.\.\. ok$" "$RUNNER_TEMP/published.log" || { echo "::error::$t did not run and pass"; exit 1; }
|
|
done
|
|
cargo run --locked --release --example published_architectures --features full
|
|
- name: Each rotation's Clifford+T word against the reference implementation's T counts
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: |
|
|
set -euo pipefail
|
|
cargo test --locked --release --features full --lib -- engine::synth::rz:: 2>&1 | tee "$RUNNER_TEMP/rz.log"
|
|
grep -qE '^test result: ok\. [1-9][0-9]* passed; 0 failed; 0 ignored' "$RUNNER_TEMP/rz.log" || { echo "::error::the synthesiser's tests did not all run and pass"; exit 1; }
|
|
for t in engine::synth::rz::tests::never_more_t_gates_than_the_reference_over_the_sweep \
|
|
engine::synth::rz::tests::the_ising_angles_take_no_more_t_gates_than_the_reference \
|
|
engine::synth::rz::tests::the_unit_search_takes_no_more_t_gates_and_at_one_count_is_no_farther \
|
|
engine::synth::rz::tests::fewer_t_gates_can_end_farther_and_one_count_can_take_another_word \
|
|
engine::synth::rz::tests::the_t_count_is_the_optimum_found_by_exhaustive_search; do
|
|
grep -q "^test $t \.\.\. ok$" "$RUNNER_TEMP/rz.log" || { echo "::error::$t did not run and pass"; exit 1; }
|
|
done
|
|
- name: The engine without receipts still builds the estimate
|
|
shell: bash
|
|
working-directory: wai/wai-quantum
|
|
run: cargo check --locked --no-default-features --features quantum_engine --lib
|