All checks were successful
wai-quantum docs, course and locales / does this change touch it (pull_request) Successful in 6s
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 9s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (pull_request) Successful in 8s
WAI energy receipts / does this change touch it (pull_request) Successful in 10s
wai-quantum for JavaScript / does this change touch it (pull_request) Successful in 7s
wai-quantum docs, course and locales / the Studio's words in every locale · linux (pull_request) Successful in 37s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (pull_request) Successful in 1m13s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (pull_request) Successful in 2m49s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 3m6s
wai-quantum for JavaScript / javascript · linux (pull_request) Successful in 3m7s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 5m7s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 6m33s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 8m31s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 9m6s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 10m53s
wai-quantum docs, course and locales / the course and the command line's languages · linux (pull_request) Successful in 12m23s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 1h4m5s
wai/wai-quantum-js/ packs the job service's engine for WebAssembly (wai-web with its quantum_engine feature, the engine of wai-quantum 0.7.0) and its bindings as an ES module with its TypeScript declarations and no dependencies, for a page (init() fetches the .wasm beside the module) or for Node (init is given its bytes). The package keeps its own version line, as the Python package does. - build.sh: wai-web built for wasm32 with paths remapped (as the views build does), wasm-bindgen 0.2.127 (refused if it is not the version wai-web's lock file pins), package.json, README and the licence copied, the build refused if a local path is left in the bindings or the binary, then packed. - test/smoke.mjs, on the package unpacked: a job run with a fresh 32-byte key and its receipt verified with this engine's did:key; a forged result that does not verify; a program linted and drawn; a refused program with its diagnostic code (Q310). - test/install.mjs: the README's Node example, run in an empty app that installed the tarball with npm, the package found by name and its .wasm by the subpath it exports. - ci/check.sh runs them all and holds the tarball to the package's allow-list (the seven files and nothing else). - wai-quantum-js.yml runs ci/check.sh on Linux. wai-quantum-js-release.yml runs it on a wai-quantum-cli-v* tag and attaches the tarball and its SHA-256 to the release. Nothing is published to a registry from CI. On the M3 Ultra: the .wasm is 5,928,153 bytes, the tarball 2.26 MB, and every check passes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
87 lines
5.3 KiB
Markdown
87 lines
5.3 KiB
Markdown
# @transaction-science/wai-quantum
|
|
|
|
The WAI quantum job service's engine in WebAssembly, for a page or for Node. A job is planned, run and sealed here exactly as the service plans, runs and seals it. The answer is the service's JSON, signed with a key you hold, and any job's receipt, the service's included, is checked here. Programs are linted, drawn and critiqued before they run.
|
|
|
|
This is version 0.1.0 of the package. It carries the engine of `wai-quantum` 0.7.0, built from `wai-web` with its `quantum_engine` feature. The package keeps its own version line, as the Python package does. The module also holds the rest of `wai-web`'s browser surface (reading WAI envelopes among it); this page is about the quantum engine.
|
|
|
|
## Install
|
|
|
|
```sh
|
|
npm install @transaction-science/wai-quantum
|
|
```
|
|
|
|
It is an ES module with its TypeScript declarations, and has no dependencies.
|
|
|
|
## In a page
|
|
|
|
`init()` fetches `wai_quantum_bg.wasm` from beside the module. With a bundler that does not serve it there, pass its URL: `init({ module_or_path: url })`.
|
|
|
|
```js
|
|
import init, { QuantumEngine, engine_verify } from '@transaction-science/wai-quantum';
|
|
|
|
await init();
|
|
const engine = new QuantumEngine(crypto.getRandomValues(new Uint8Array(32)), 256);
|
|
const job = JSON.parse(engine.run(JSON.stringify({
|
|
qasm: 'OPENQASM 3.0; qubit[2] q; bit[2] c; h q[0]; cx q[0], q[1]; c = measure q;',
|
|
shots: 1000,
|
|
})));
|
|
console.log(job.method, job.result.counts);
|
|
console.log(JSON.parse(engine_verify(JSON.stringify(job))).valid); // true
|
|
```
|
|
|
|
## In Node
|
|
|
|
Node is given the WebAssembly's bytes:
|
|
|
|
```js
|
|
import init, { QuantumEngine, engine_verify } from '@transaction-science/wai-quantum';
|
|
import { readFile } from 'node:fs/promises';
|
|
import { createRequire } from 'node:module';
|
|
import { randomBytes } from 'node:crypto';
|
|
|
|
const wasm = createRequire(import.meta.url).resolve('@transaction-science/wai-quantum/wai_quantum_bg.wasm');
|
|
await init({ module_or_path: await readFile(wasm) });
|
|
const engine = new QuantumEngine(randomBytes(32), 256);
|
|
const job = JSON.parse(engine.run(JSON.stringify({ qasm: 'OPENQASM 3.0; qubit[1] q; bit[1] c; h q[0]; c = measure q;', shots: 100 })));
|
|
console.log(job.result.counts, JSON.parse(engine_verify(JSON.stringify(job))).signer);
|
|
```
|
|
|
|
## What it offers
|
|
|
|
Requests and answers are JSON strings, the job service's own. A call that cannot be answered returns `{"error": …}`; a program the engine refuses also gives its diagnostic `code` (such as `Q310`) and its `meaning`.
|
|
|
|
**`new QuantumEngine(seed, memory_mb)`**: an engine that signs with the Ed25519 key whose 32-byte seed is `seed`, and admits a job of at most `memory_mb` MiB. Keep the seed to keep the key.
|
|
|
|
- `signer_did()`: the key the receipts name, as a `did:key`.
|
|
- `run(request)`: a job run and sealed. The answer holds `status`, `method`, `why`, `request` and `result`, with the result's `receipt`. The request is the service's (`qasm`, `shots`, `seed`, `method`, `observables`, `amplitudes`, `noise`, `intent`, `verdict`, `target`, `compile`, `mitigate` and more).
|
|
- `plan(request)`: the method a job would run on and why, its memory and work, without running it.
|
|
- `compile(request)`: a program compiled (`{"qasm", "epsilon", "level", "basis"}`), with a certificate of every pass, sealed.
|
|
- `estimate(request)`: what a fault-tolerant machine would need to run a program, each estimate sealed.
|
|
- `qec(op, args)`: error correction (`code`, `decode` or `threshold`), the answer sealed.
|
|
- `methods()`: each method, its accuracy, and the most qubits it holds here.
|
|
|
|
**Functions:**
|
|
|
|
- `engine_verify(job)`: whether a job's receipt seals its request and result: `{"valid", "key", "signer"}`. Any change to either after sealing makes it false.
|
|
- `engine_verdict(job, intent, memory_mb)`: a job's verdict against its intent (or the one given).
|
|
- `engine_estimate_verify(answer)`: an estimate's seal, its receipts, and its request re-run to the same figures.
|
|
- `engine_lint(src)`: a program read as the engine reads it: `{"ok": true, "qubits", "gates", …}`, or `{"ok": false, "error", "line", "code"}`.
|
|
- `engine_draw(src, width)`: the circuit as text (`{"text"}`); `engine_layout(src)` gives it as data for a page to draw.
|
|
- `engine_critique(src)`: what the engine can say about a program before it runs: its measures and its smells, each with its lines.
|
|
- `engine_equivalent(a, b)`: whether two programs apply the same gates up to a global phase, and how that was decided.
|
|
- `engine_repair(src, options)`: a program repaired on the lines its diagnostics flag.
|
|
- `engine_shortcuts(src, thorough)`: every exact classical route to simulating a program, with its cost.
|
|
- `engine_diagnostic_codes()`: every diagnostic code the reader uses, with its meaning.
|
|
- `engine_course(locale)`, and the course's lessons, checks and hints: the circuits course, checked by the engine.
|
|
|
|
The declarations (`wai_quantum.d.ts`) list every export.
|
|
|
|
A run in a page or in Node does not meter its energy, and its result says so.
|
|
|
|
## Elsewhere
|
|
|
|
The same engine runs as the command line (`wai-quantum`), as the Python package `wai-quantum`, and as the job service, and a job's receipt verifies in each. The source, its schemas and the versioning policy are at <https://git.transaction.science/Transaction-Science/open-standards> under `wai/`; Quantum Studio, an editor built on this package, is at <https://wai.transaction.science/quantum-studio/>.
|
|
|
|
## Licence
|
|
|
|
Apache-2.0.
|