- 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]>
93 lines
4.2 KiB
YAML
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
|