4 个版本

0.0.0-pre52022 年 7 月 14 日
0.0.0-pre42022 年 7 月 13 日
0.0.0-pre32022 年 6 月 28 日
0.0.0-pre12022 年 6 月 17 日

#379 in WebAssembly

MITGPL-3.0 许可证

2.5MB
5K SLoC

Rust 4.5K SLoC // 0.0% comments JavaScript 715 SLoC // 0.2% comments TypeScript 145 SLoC

Npm Crates License: MIT CI Latest Stable Latest Release

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 链接至 std
  • parallel 启用 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