open-standards/.github/workflows/wai-quantum-estimate.yml
Transaction Science ba9da0fdf3 wai-quantum: what the unit search does to a rotation, as it is
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]>
2026-11-07 03:15:58 -05:00

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