SparQSim 架构¶
本文档描述 SparQSim 仓库(SparQ 框架之家)的整体架构、仓库分工和核心模块。
概述¶
项目目标¶
SparQ 是一个用于模拟量子随机存取存储器(QRAM)和稀疏态量子计算的高性能模拟器框架。它旨在为量子算法研究者和开发者提供:
高效模拟大规模量子系统的工具(利用稀疏态表示)
精确建模 QRAM 电路的行为和噪声影响
寄存器级编程范式:直接对整数/布尔寄存器做算术与逻辑操作,无需手工分解到门
完整的算法库(Grover、Shor、态制备、块编码、哈密顿量模拟、离散绝热 QDA 等)
简洁的 Python API(
pysparq)便于快速原型开发
仓库分工¶
依赖方向:SparQSim → QRAM-Simulator。本仓库承载 SparQ C++ 框架
(SparQ/ 稀疏态模拟器 + SparQ_Algorithm/ 算法库 + 全部 Python 绑定与算法类实验);
QRAM 基座(Common + QRAM + ThirdParty)在
QRAM-Simulator 仓库独立发版,
本仓库以 git submodule(相对 URL ../QRAM-Simulator.git)引用并编译。
目录结构¶
SparQSim/
├── SparQ/ # SparQ C++ 稀疏态模拟器(伞形目标 SparQ 在根 CMake 定义)
│ ├── include/ # 公共 API 头文件(含 cuda/ GPU 后端,暂被 CMake 屏蔽)
│ └── src/ # 实现(含 src/cuda/ GPU 内核)
├── SparQ_Algorithm/ # 高层算法 C++ 库
│ ├── include/ # grover / shor / 态制备 / 块编码 / 哈密顿模拟 / QDA
│ └── src/
├── PySparQ/ # pybind11 富绑定 + 纯 Python 包
│ ├── core.cpp # _core 模块绑定(约 1500 行)
│ ├── include/ # 绑定层辅助头(core.h、BindUtils.h)
│ ├── pysparq/ # Python 包:operators/ algorithms/ rir conformance dynamic_operator
│ └── test/ # pytest 套件(含外部消费者 API 契约测试)
├── Experiments/ # 量子算法 C++ 实验(QDA/Grover/QFT/Shor/QCNN/CKS/GHZ 等)
├── examples/ # C++ 与 Python 示例(SPARQ_BUILD_EXAMPLES 门控 C++ 部分)
├── test/ # C++ 测试(SPARQ_BUILD_TESTS 门控)
├── extern/qram-simulator/ # QRAM 基座 submodule(Common + QRAM + ThirdParty,勿直接修改)
├── docs/ # Sphinx 文档 + Doxygen(C++ API)+ 算法转译指南
└── pyproject.toml # pysparq 包(scikit-build-core + setuptools-scm)
SparQ/ - 稀疏态模拟器核心¶
职责:实现稀疏态量子模拟的核心功能(寄存器管理、门、测量、QRAM、量子算术)。
核心类(均在 qram_simulator 命名空间下,声明于 SparQ/include/basic_components.h):
System:单个计算基态,包含复数振幅amplitude和寄存器值数组registers; 同时以静态成员维护全局寄存器表(名称、类型、位宽),是寄存器级编程的枢纽StateStorage:量子寄存器存储单元SparseState:稀疏量子态,托管std::vector<System>,默认构造创建|0...0⟩初态BaseOperator:算子的统一接口(operator()/dag(),含 CPU/GPU 重载),支持复合算子和条件算子SelfAdjointOperator:自伴算子基类(dag() == operator()),如 Hadamard、Pauli-X
主要头文件模块:
头文件 |
内容 |
|---|---|
|
System / SparseState / BaseOperator 等核心数据结构 |
|
Phase / Rotation / Pauli / S / T / RX-RI-RZ / SX / U2 / U3 等标准门 |
|
整数寄存器 Hadamard(叠加态生成) |
|
QFT / InverseQFT / QFT_Full |
|
中间电路测量 MeasureZ / Reset / Probability |
|
部分迹与读出 |
|
QRAMLoad / QRAMLoadFast / QRAMInputGenerator |
|
加减乘除模、移位、比较等约 50 个量子算术算子 |
|
AddRegister / RemoveRegister / Split / Combine / Push / Pop 等 |
|
条件旋转、一般酉旋转与态制备 |
|
CheckNormalization / CheckNan / StatePrint 等调试算子 |
SparQ_Algorithm/ - 高层算法库¶
组合核心原语实现完整量子算法,每个算法对应 Experiments/ 中的 C++ 实验
与 PySparQ/pysparq/algorithms/ 中的 Python 实现(对照关系见
docs/algorithm-implementation.md):
grover.h:QRAM oracle 驱动的 Grover 搜索(含振幅放大与量子计数)
shor.h:Shor 因数分解(标准版 + 半经典版)
state_preparation.h:基于 QRAM 的态制备
BlockEncoding/:三对角矩阵块编码、基于 QRAM 的块编码
DiscreteAdiabatic/:离散绝热(QDA)线性方程组求解器
hamiltonian_simulation.h:量子行走 / LCU / 稀疏矩阵 oracle / QSVT 哈密顿量模拟
qcnn.h:量子卷积网络(当前被
#if false整体禁用)
PySparQ/ - Python 绑定与纯 Python 层¶
通过 pybind11(PySparQ/core.cpp → 编译为 pysparq._core)暴露核心 C++ API,
再由纯 Python 包 pysparq 组织:
pysparq/operators/:算子基类与条件控制 mixinpysparq/algorithms/:纯 Python 算法层(Grover、Shor、QDA、CKS、态制备、块编码)pysparq/rir.py:RIR 解释器(QECC.Lang 中间表示)pysparq/dynamic_operator/:运行时 JIT 编译 C++ 动态算子(含独立的 loader)pysparq/conformance.py:一致性校验工具
qram_simulator 薄绑定不在本仓库——它由 QRAM-Simulator 核心仓独立打包发布
(pip install qram-simulator)。
extern/qram-simulator/ - QRAM 基座(submodule)¶
QRAM 电路核心(QRAMCircuit 的 qutrit/qubit 实现、CuQRAMCircuit)与
Common 基础设施(数学工具、矩阵封装、随机数引擎、错误处理)。
此目录属于另一仓库,不要在本仓库内直接修改;升级方式是
git submodule update --remote 后提交新 pin。
量子态表示¶
┌──────────────────────────────────────────────────────────────┐
│ SparseState │
├──────────────────────────────────────────────────────────────┤
│ 稀疏存储: std::vector<System> basis_states │
│ - 每个 System = { amplitude: complex, registers: uint64_t[] }│
│ - 寄存器值组合唯一(干涉时振幅相加去重) │
│ - 仅存储 |amplitude| > ε 的非零基态 │
│ - 默认构造创建 |0...0⟩ 初态 │
├──────────────────────────────────────────────────────────────┤
│ System(静态共享元数据) │
│ - name_register_map: [(name, type, size, status), ...] │
│ - 寄存器以 uint64_t 存储,支持 |a⟩|b⟩|c⟩ 多寄存器编码 │
└──────────────────────────────────────────────────────────────┘
关键特性:
内存使用:O(k × r),k 为非零基态数,r 为寄存器数
对比稠密表示的 O(2^n),可实现更大规模的模拟
寄存器级操作:AddRegister ≈ ⊗|0⟩,RemoveRegister ≈ PartialTrace
关键设计决策¶
为什么使用稀疏态模拟¶
内存效率:稀疏表示内存使用与纠缠程度成正比
计算效率:门操作只需处理非零振幅的基态
适用场景:QRAM 操作、量子漫步、稀疏哈密顿量模拟
Qutrit-based vs Qubit-based QRAM¶
两者的核心区别在于 address 编码方式,进而导致不同的 error scaling:
Qutrit-based(0/1/wait 三态编码):address 存在关闭(wait)状态
经典信息以 classical controlled X 方式编码
Z-basis 直接传下去,无需基变换
Error scaling: ε ∈ O(L²),L 为 layer number
Qubit-based(0/1 两态编码):address 无关闭状态,默认常开(向左 routing)
无法直接将 data qubit 传下去,需要将 data 换到 Pauli-X basis
经典信息以 classical controlled Z 方式传入
Error scaling: ε ∈ O(L³),L 为 layer number
扩展性¶
添加新量子门 / 算子¶
在
SparQ/include/创建头文件,继承BaseOperator(一般算子)或SelfAdjointOperator(自伴算子),实现operator()与(如非自伴)dag()在
SparQ/src/同名 .cpp 实现;可利用ClassControllable宏获得条件控制能力需要暴露给 Python 时,在
PySparQ/core.cpp添加绑定,并同步_core.pyi类型提示
添加新算法¶
在
SparQ_Algorithm/include/创建算法头文件,组合核心算子实现(可选)在
Experiments/添加 C++ 实验入口,在PySparQ/pysparq/algorithms/添加 Python 实现,并在docs/algorithm-implementation.md登记对照关系
构建选项¶
SPARQ_BUILD_TESTS/SPARQ_BUILD_EXPERIMENTS/SPARQ_BUILD_EXAMPLES:CMake 门控,默认 OFFCUDA/GPU 后端:代码保留在
SparQ/include/cuda/与SparQ/src/cuda/,当前 CMake 暂时屏蔽 GPU 构建