open-standards/.github/workflows/wai-quantum-estimate.yml
Transaction Science ed1b7e5cd0 wai-quantum: resource estimation from programs, calibrated from the crate's own decoders
- engine::estimate::count: a program written in Clifford gates, T, z
  rotations, Toffolis (one CCZ state each) and measurements; a gate under
  several controls goes through clean ancillas (x, y, z, h under c >= 3
  controls: 2c - 3 Toffolis and c - 2 ancillas; a phase under c >= 2: 2c
  Toffolis and c ancillas); a branching program is counted step by step,
  an upper bound. Each rotation is synthesised at its own angle within its
  share of the budget's synthesis share, its T count the word's. Counts:
  T, Toffolis, rotations and their T, measurements, non-Clifford, rotation
  and T depth, total depth, logical qubits with ancillas.
- Ground truth: Bell, T chains, the ripple-carry adder (2n Toffolis), the
  QFT (3(n-1) T, 3(n-1)(n-2)/2 rotations), multi-controlled gates; every
  ladder held to the gate it replaces on dense unitaries with the
  ancillas at |0>; each rotation's T count equal to engine::synth's word.
- engine::estimate::calibration: the gate-based surface code's model
  P(d) = a(p/p*)^((d+1)/2) fitted to the memory experiment decoded by exact
  matching and by union-find on the same shots (d 3, 5, 7; p 0.002 to
  0.005; 100000 shots, 25000 at d = 7; seed 1). The table is in the crate;
  a release test measures every point again, a debug one one point, and
  the example estimate_calibration prints them.
- engine::estimate::interchange: the logical-counts document and the
  routine document (v1), import and export, with the schema's checks
  (names, directions, resource types and values, unique siblings,
  connections between ports) and a self-made fixture.
- engine::estimate: the planar model on the counts, the headline and the
  frontier no estimate beats on both qubits and runtime, each estimate
  sealed in the resource-estimate receipt family (a counted program binding
  the digest, every count, the budget, the synthesis share and each
  rotation's), the frontier's naming the headline's as parent, and the
  answer sealed in a job's form; verify re-runs the request. Refusals
  carry codes QE02 to QE08.
- The engine feature now carries the resource model and the decoders'
  memory experiment; the receipt family compiles with the resource model
  and any signing feature.
- CI: wai-quantum-estimate.yml runs the tests in release (the whole
  calibration); engine::estimate joins the wasip2 module list (18 passed
  under wasmtime on the build host).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 23:44:27 -04:00

93 lines
4.2 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.
#
# 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: linux-arm64
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.98.0
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.98.0
rustup toolchain install 1.98.0 --profile minimal
rustup default 1.98.0
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: 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