4 个版本
0.0.0-pre5 | 2022 年 7 月 14 日 |
---|---|
0.0.0-pre4 | 2022 年 7 月 13 日 |
0.0.0-pre3 | 2022 年 6 月 28 日 |
0.0.0-pre1 | 2022 年 6 月 17 日 |
#379 in WebAssembly
2.5MB
5K SLoC
Qukit - 量子模拟工具包
Qukit 是一个开源的量子电路模拟器,用 rust 实现,并为 wasm 编译。 Qukit 能够在浏览器或服务器(rust 和 node.js)上运行 20+ 量子比特的模拟。您可以在您的 JavaScript 程序中使用它来运行量子模拟。
特性
- Rust API
- JS API(Wasm)
- 算法创建和模拟
- 逐步执行算法
- 将所有支持的门转换为旋转,以启用部分模拟
- Python API
- QASM 导出
- SVG 导出
- 状态可视化
- Quiskit 导出
- QASM 导入
用法
TS/JS
npm install qukit
您应该能够直接将 Qukit 导入 Node,就像通常一样,或者通过任何支持 ES 模块和 WebAssembly 的打包器(例如 Webpack v4 或 v5)导入浏览器。
浏览器构建支持同步(v4 或 v5 同步 WebAssembly 模式)和异步(v5 异步 WebAssembly)构建。当在浏览器构建中导入时,模块总是导出一个 promise,而不是一个固定值,因为这是同步构建的要求,您需要在导入后使用 await
。
我们还通过 Web Workers API 提供一个并行版本,实现使用 wasm-bindgen-rayon,有关设置的更多信息,请访问 wasm-bindgen-rayon 的 GitHub 页面。
Rust
首先,将此工具包添加到您的 Cargo.toml
依赖项中
[dependencies]
qukit = "0.0.0-pre4"
要使用此工具包,您需要使用 nightly 工具链,因为它大量使用了最新的 nightly const fn
功能。
功能标志
std
链接至 stdparallel
启用 rayon 使用
API
TS/JS
const builder: GateBuilder = new GateBuilder();
const qbits: QBit[] = builder.qbits(hidden.length);
const bits: Bit[] = builder.bits(hidden.length);
const target: QBit = builder.qbit();
hadamard(target);
pauliZ(target);
hadamard(qbits);
hidden.forEach((active, index) => {
if (active) {
cPauliX(qbits[index], target);
}
});
hadamard(qbits);
hadamard(target);
measurement(qbits, bits);
builder.intoAlgorithm().run(); // -> Executes the Algorithm
Rust
let algorithm = Algorithm::new(|gate_builder| {
let a = gate_builder.qbit();
let b = gate_builder.qbit();
let c_a = gate_builder.bit();
let c_b = gate_builder.bit();
hadamard(a);
controlled_pauli_x(a, b);
measurement(a, c_a);
measurement(b, c_b);
gate_builder
});
algorithm.run() // -> Executes the Algorithm
Wasm 限制
在 wasm 中,您受到 2GB/4GB 内存限制,因此您只能使用此库模拟最多 25 个 q 位。对于一个 25 q 位系统,我们需要跟踪 2^26
个状态。一个状态由一个复数值描述,该值由 2 个 f64
值组成,相当于 2 x 8 = 16 字节
。这相当于一个状态向量为 2^26 x 16 = 1073731824 字节 ≈ 1.07 GB
。对于每次转换,我们需要一个源向量和目标向量,这导致内存使用量为 2.14 GB
。随着未来 wasm64 的稳定,我们可以模拟大型向量。
依赖项
~1.4–4MB
~76K SLoC