diff --git a/.agents/capability-packages.yml b/.agents/capability-packages.yml index e773b70b..3884472d 100644 --- a/.agents/capability-packages.yml +++ b/.agents/capability-packages.yml @@ -2521,3 +2521,6 @@ packages: - id: rcmps-field-theory level: L0 + + - id: ppvm-simulation + level: L0 diff --git a/.agents/sdk-libraries.json b/.agents/sdk-libraries.json index d213fcd5..7bb4d165 100644 --- a/.agents/sdk-libraries.json +++ b/.agents/sdk-libraries.json @@ -1596,6 +1596,23 @@ ], "nativeOnly": true, "juliaVersion": "1.12.7" + }, + { + "id": "ppvm-simulation", + "title": "PPVM", + "language": "python", + "modules": [ + "ppvm" + ], + "group": "qec", + "workflow": "Pauli 传播、广义 tableau、近 Clifford 观测量与含丢失/泄漏的自定义电路采样", + "conditions": [ + "显式准备固定源码的 Python 3.12 / Rust 环境;完整原生 API 可用,成本取决于非 Clifford 分支与截断。", + "Heisenberg 计算倒序处理整条门和噪声链;LOST 与比特值分开;reset_state 不恢复丢失/泄漏。", + "非对称丢失的存活分支反作用尚未实现;开发数值对照不构成器件模型或科学验收。" + ], + "nativeOnly": true, + "pythonVersion": "3.12" } ] } diff --git a/.agents/skills/README.md b/.agents/skills/README.md index 6e65a0c4..3d1d3b5a 100644 --- a/.agents/skills/README.md +++ b/.agents/skills/README.md @@ -13,9 +13,9 @@ ## 当前 Skill -以下 189 个 Skill 随源码分发;它们与 MCP Server 不是一一对应关系,知识型 Skill 可以不绑定专用 Tool, +以下 190 个 Skill 随源码分发;它们与 MCP Server 不是一一对应关系,知识型 Skill 可以不绑定专用 Tool, 工作流也可以使用多个服务或进程内原生 Tool。连接默认配置与凭据条件见[MCP 服务目录](../../docs/CAPABILITIES.md#mcp-服务目录)。 -当前 176 项可由模型自动选择,13 个分类索引仅保留用户显式调用;名称和来源映射不变。 +当前 177 项可由模型自动选择,13 个分类索引仅保留用户显式调用;名称和来源映射不变。 分批建议与兼容影响见[扩展治理清单](../../docs/architecture/EXTENSION_GOVERNANCE.md)。 | Skill | 作用 | 依赖的执行模块 | @@ -51,6 +51,7 @@ | `slowquant-response` | 分子线性响应、激发能和跃迁性质;保留响应近似与验证边界 | 宿主代码 Tool;显式准备固定源码 SDK | | [`tnqs-dynamics`](tnqs-dynamics/SKILL.md) | 非规则图张量网络、电路、有限平面 CTMRG 与采样 | 宿主代码 Tool;显式准备固定 Julia SDK;保留几何与收敛边界 | | [`rcmps-field-theory`](rcmps-field-theory/SKILL.md) | 连续 RCMPS、标量场优化、正常序观测量与同真空激发 | 宿主代码 Tool;显式准备固定 Julia CPU SDK;区分传递 gap 与 Hamiltonian 能隙 | +| [`ppvm-simulation`](ppvm-simulation/SKILL.md) | Pauli 传播、广义 tableau 与丢失/泄漏采样 | 宿主代码 Tool;显式准备 Python/Rust SDK;区分近似、LOST 与重置语义 | | `tesseract-decoding` | Stim DEM、syndrome、搜索式解码器与统计 | 宿主代码 Tool;显式准备 python 环境 | | `tqec-compilation` | BlockGraph、逻辑计算块、相关面与 Stim 线路生成 | 宿主代码 Tool;显式准备 python 环境 | | `tsim-sampling` | Clifford/非 Clifford 线路、噪声、detector 与 observable 采样 | 宿主代码 Tool;显式准备 python 环境 | diff --git a/.agents/skills/ppvm-simulation/SKILL.md b/.agents/skills/ppvm-simulation/SKILL.md new file mode 100644 index 00000000..ec81e764 --- /dev/null +++ b/.agents/skills/ppvm-simulation/SKILL.md @@ -0,0 +1,42 @@ +--- +name: ppvm-simulation +description: 用 PPVM 原生 API 编写 Pauli 传播、广义稳定子 tableau 和含丢失/泄漏的自定义电路;区分观测量反向传播、采样与物理近似。 +--- + +# PPVM + + +## 原生 SDK 路径 + +本能力使用 **PPVM 的原生公开 API**。用户需要 Pauli 传播、广义 tableau、近 Clifford 观测量与含丢失/泄漏的自定义电路采样 时,由 Agent 在固定依赖环境中编写和运行任务代码。 + +使用 `node scripts/sdk-access.mjs inspect ppvm-simulation` 定位环境,按[完整 SDK 工作流](../quantum-sdk-workbench/references/workflow.md)执行。模块导航:`ppvm`;导航不是 API 白名单。 + +显式准备固定源码的 Python 3.12 / Rust 环境;完整原生 API 可用,成本取决于非 Clifford 分支与截断。 + +Heisenberg 计算倒序处理整条门和噪声链;LOST 与比特值分开;reset_state 不恢复丢失/泄漏。 + +非对称丢失的存活分支反作用尚未实现;开发数值对照不构成器件模型或科学验收。 + +本入口复用宿主文件与代码工具,没有新增通用执行 Tool。原生 SDK 受上游版本、可选依赖、宿主资源与用户授权约束。已禁用或被拒绝的动作不能借代码路径绕过。执行状态和科研验收分别报告。 + + + +当任务需要近 Clifford 观测量、非 Clifford tableau 或中性原子丢失/泄漏模型时使用。先比较现有 Stim、Tsim、Clifft 与 monoprop:仅需普通 Clifford 采样或通用算符传播时,不必引入 PPVM。 + +## 方法选择与边界 + +- `PauliSum` / `LossyPauliSum`:从观测量出发反向传播,**整条门和噪声操作链倒序,旋转角保留原符号**。PauliSum 没有 `t()` 简写,T 门的观测量传播使用 `rz(q, math.pi/4)`(忽略无关全局相位)。记录截断规则,不能以一次有限截断计算宣称收敛。 +- `GeneralizedTableau`:按物理时间顺序作用门,再测量。Python 绑定支持 1–2048 qubit;此上限不表示这些规模在任意非 Clifford 电路上都可承受,系数可能迅速增长。 +- `StimProgram` / `sample_stim`:使用固定版本支持的 Stim 指令及扩展,不假定与 Stim 全指令等价。保存原始测量记录;`LOST=2` 不是布尔比特,不能直接转成 detector flips。 +- `reset_state` 只重置活跃 qubit,保留丢失/泄漏标记;`reset` 才恢复计算子空间。丢失与泄漏的模型语义分别报告。 +- 相关丢失参数 `p[1]` 是失去某个指定 qubit 的概率,恰好失去一个的总概率为 `2*p[1]`。非对称丢失目前不包含存活分支反作用;不能宣称完整物理量子通道或器件数字孪生已验证。 +- 保存种子与线程设置;用 `fork(seed=...)` 构造独立随机轨迹,复制对象可能复制随机数状态。 + +## 执行与证据 + +先发现环境,再显式准备,随后用宿主代码工具运行用户的完整程序。准备会下载和编译 Rust/Python 依赖;首次执行不隐式安装。硬件或外部服务仍需另行授权。 + +[可编辑原生示例](references/native-example.py)展示带噪观测量与丢失恢复,参数只是示例,不是公开 API 白名单。程序、输入、锁文件摘要、实际版本、近似与原始输出一起保留;用独立解析值、密度矩阵或其他适用方法检查任务的科学结论。 + +[使用、来源与实测范围](../../../docs/integrations/PPVM.md)。原生程序执行与开发回归不推导最终科学验收,`scientificValidation=not_evaluated`。 diff --git a/.agents/skills/ppvm-simulation/pyproject.toml b/.agents/skills/ppvm-simulation/pyproject.toml new file mode 100644 index 00000000..a60234e3 --- /dev/null +++ b/.agents/skills/ppvm-simulation/pyproject.toml @@ -0,0 +1,10 @@ +[project] +name = "openquantum-ppvm-simulation" +version = "0.1.0" +requires-python = ">=3.12,<3.13" +dependencies = [ + "bloqade-ppvm @ git+https://github.com/QuEraComputing/ppvm.git@3cc883fd93b2475cb10c892a8a31adcc09a7579c#subdirectory=ppvm-python", +] + +[tool.uv] +package = false diff --git a/.agents/skills/ppvm-simulation/references/native-example.py b/.agents/skills/ppvm-simulation/references/native-example.py new file mode 100644 index 00000000..020c029e --- /dev/null +++ b/.agents/skills/ppvm-simulation/references/native-example.py @@ -0,0 +1,43 @@ +"""Editable public PPVM program; run in a new task directory after explicit setup.""" +import importlib.metadata +import json +import math +from pathlib import Path + +from ppvm import GeneralizedTableau, MeasurementResult, PauliSum + +theta, gamma, seed = 0.73, 0.23, 20261110 +# Physical order: Rx(theta), then amplitude damping. Heisenberg order reverses both. +observable = PauliSum.new(1, ["Z"]) +observable.amplitude_damping(0, gamma) +observable.rx(0, theta) +expectation = observable.overlap_with_zero() +reference = gamma + (1 - gamma) * math.cos(theta) +assert abs(expectation - reference) < 1e-10 + +state = GeneralizedTableau(2, seed=seed) +state.h(0) +state.cnot(0, 1) +bell_zz = state.expectation("ZZ") +assert abs(bell_zz - 1) < 1e-10 +state.loss_channel(1, 1.0) +state.reset_state(1) +lost = state.measure(1) +assert lost == MeasurementResult.LOST +state.reset(1) +restored = state.measure(1) +assert restored == MeasurementResult.ZERO + +result = { + "upstreamVersion": importlib.metadata.version("bloqade-ppvm"), + "parameters": {"theta": theta, "amplitudeDamping": gamma, "seed": seed}, + "zAfterRxAndDamping": expectation, + "analyticReference": reference, + "bellZZ": bell_zz, + "afterStateOnlyReset": lost.name, + "afterFullReset": restored.name, + "scope": "small public-API checks; not a hardware or performance benchmark", + "scientificValidation": "not_evaluated", +} +with Path("result.json").open("x", encoding="utf-8") as output: + output.write(json.dumps(result, indent=2) + "\n") diff --git a/.agents/skills/ppvm-simulation/uv.lock b/.agents/skills/ppvm-simulation/uv.lock new file mode 100644 index 00000000..96e07c6b --- /dev/null +++ b/.agents/skills/ppvm-simulation/uv.lock @@ -0,0 +1,621 @@ +version = 1 +revision = 5 +requires-python = "==3.12.*" +resolution-markers = [ + "sys_platform == 'win32'", + "sys_platform == 'emscripten'", + "sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[[package]] +name = "annotated-types" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", hash = "sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", size = 13427, upload-time = "2026-07-23T20:16:12.938Z" }, +] + +[[package]] +name = "beartype" +version = "0.23.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/34/c0cfdaee9c796c8381439fed0fcab62810753b8b0adb1ec88fa7f41eaa5d/beartype-0.23.1.tar.gz", hash = "sha256:8b805f246b32931c74f2b321ea0939fe5bb2ff43c12a3eff19cc4c854b832e1d", size = 1993714, upload-time = "2026-10-11T05:36:55.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/cb/2f6aa982e2860c1156830db3da7f823b71784ed7d533ca289ea9b6c6347a/beartype-0.23.1-py3-none-any.whl", hash = "sha256:4461b4dc57e3fdd6c8a8464b22cf118002eea107c33e9fef651c69068ab3cce3", size = 1582101, upload-time = "2026-10-11T05:36:52.431Z" }, +] + +[[package]] +name = "beliefmatching" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ldpc" }, + { name = "numpy" }, + { name = "pymatching" }, + { name = "sinter" }, + { name = "stim" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/e4/5b5cc731a4507c7243a90c786390041ceb69dbe304ee17debd589049b6a0/beliefmatching-0.2.0.tar.gz", hash = "sha256:915175fc6ab4b73cfb948774ef06d71abc045a189dfb21cdf3dbd69389b111cc", size = 13472, upload-time = "2025-06-28T21:19:44.485Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/48/49f5bc2a7ac44226d07381ac553f44966bcee1f4c17d3688d960023ac228/beliefmatching-0.2.0-py3-none-any.whl", hash = "sha256:601e5511e34acd00daad6f421a229aa60f3ff58a1c8800f416b2ffa236c7a22a", size = 12740, upload-time = "2025-06-28T21:19:43.487Z" }, +] + +[[package]] +name = "bloqade-circuit" +version = "0.15.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bloqade-decoders" }, + { name = "kirin-toolchain" }, + { name = "numpy" }, + { name = "pandas" }, + { name = "pydantic" }, + { name = "pyqrack-cpu" }, + { name = "rich" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/6b/30ee9d1362aadef38f4fb0ddf4a2f8016d0ef9f8c9ad25083039350494a4/bloqade_circuit-0.15.5.tar.gz", hash = "sha256:4fb3ddf3640885c31bd28dc79b4aa0e282ae3ceb0bb78399efb1af7eacf5c7ff", size = 529109, upload-time = "2026-10-28T08:45:19.483Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/e0/2732ac06eb9bb89ca36d82554d93ed8594e9c645420d2a67e1fd2ea093c5/bloqade_circuit-0.15.5-py3-none-any.whl", hash = "sha256:75395639951c6cdaa3911e79b2ff147ce94d892439dd086b5dd8e707afd892c5", size = 321939, upload-time = "2026-10-28T08:45:17.723Z" }, +] + +[[package]] +name = "bloqade-decoders" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beliefmatching" }, + { name = "kirin-toolchain" }, + { name = "ldpc" }, + { name = "numpy" }, + { name = "stim" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/f4/0690bb769df64802373c1def476cdb3d57d2c9bd526e655944d917d4eab8/bloqade_decoders-0.6.1.tar.gz", hash = "sha256:a4b410724410fbe28800d8ab40e60da6913112d0b234f75122a68d1e07c74366", size = 153096, upload-time = "2026-09-09T18:30:35.423Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/1f/3fb130617eb023d3a575c3665f50d93b07fe7cbceed44bb012c09b6ab2b6/bloqade_decoders-0.6.1-py3-none-any.whl", hash = "sha256:fd65fb936966b187a384d186ca823e6ce669eda91f1687a30c9a551a0b47dd73", size = 26406, upload-time = "2026-09-09T18:30:34.012Z" }, +] + +[[package]] +name = "bloqade-ppvm" +version = "0.3.0" +source = { git = "https://github.com/QuEraComputing/ppvm.git?subdirectory=ppvm-python&rev=3cc883fd93b2475cb10c892a8a31adcc09a7579c#3cc883fd93b2475cb10c892a8a31adcc09a7579c" } +dependencies = [ + { name = "bloqade-circuit" }, + { name = "kirin-toolchain" }, + { name = "numpy" }, + { name = "typing-extensions" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "contourpy" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/5a/a55177dd22553a277388e8a1b3220e92de91bacb28356cdc73caa240121d/contourpy-1.4.0.tar.gz", hash = "sha256:20156f5a1ac4f8ce02656e39a61e82164a3d359796dc8026f75b062783d500e1", size = 13323726, upload-time = "2026-09-11T19:05:05.808Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/ba/01bde9753bdbba04a6da9d2bff3881f021bc708f654655e95fae26d3b3a3/contourpy-1.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:186ba929df36d61b6127da2e89cd1357e4cb79aca647381ab1a6feb0b152877b", size = 297302, upload-time = "2026-09-11T19:02:45.103Z" }, + { url = "https://files.pythonhosted.org/packages/dd/f5/c5bf67522d49a2222f3154fe46879451d26f0e35ece41770758a64ea78cb/contourpy-1.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c76f3a5318164db7d9401132fc1b5364b784c613c93fa506e3b5e6d1bf353ec8", size = 284921, upload-time = "2026-09-11T19:02:48.049Z" }, + { url = "https://files.pythonhosted.org/packages/0f/cc/cb989599eec12fda312e127eb8e04a8b21a7a6c94bf7ff1bc68273334a42/contourpy-1.4.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:43c3ccbb32c6294b183dcc8e8c46dacf5ecef809497e3d48a5be298eef185ad0", size = 356332, upload-time = "2026-09-11T19:02:51.408Z" }, + { url = "https://files.pythonhosted.org/packages/47/fb/6f620d7602507817b0b4c21dd790ed68688f1f4ae9c29aacf21f08db5cf1/contourpy-1.4.0-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86d05cec773c9507a3950122e0e40ce77c23c75ceeb2fc189514e71893cbb34b", size = 405878, upload-time = "2026-09-11T19:02:54.093Z" }, + { url = "https://files.pythonhosted.org/packages/32/4e/693c6d6bdece679f0953775eef3a1b66d56be55478d936e7deb1f3004422/contourpy-1.4.0-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2deb580178ca19437a84bd77e4bc2cd91a8ccad212413a83c273900868b5978c", size = 408296, upload-time = "2026-09-11T19:02:56.528Z" }, + { url = "https://files.pythonhosted.org/packages/78/f9/b6831508960d559581c448532ba4df312217072975486dbf2b24fcc5b76f/contourpy-1.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:875f42444c9cf48d56f724f2637e60d0f73b3b12c9041e1484580a233edf9591", size = 383243, upload-time = "2026-09-11T19:02:58.638Z" }, + { url = "https://files.pythonhosted.org/packages/f2/21/52903825a0ae7bb625e8bd30a09816d4c3c5d6174a469c10a616166cf780/contourpy-1.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f863c6100bf926cf47d13f3cd75f9bb8ebd98aaab230eeb4468b91f98f39a6b3", size = 1357306, upload-time = "2026-09-11T19:03:01.036Z" }, + { url = "https://files.pythonhosted.org/packages/d8/79/d68b1ce8539e4071518fed9523f558398f34dcd078b8927b109c72dad2ef/contourpy-1.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3863ef2e2b13fe93f8c0ebb08ee400cb07153b8b0e91c5acb26e4537f283634f", size = 1427243, upload-time = "2026-09-11T19:03:03.866Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f0/b75a10e9d0616b97a30de277b6dfe83f1879880854c7330337309530eb48/contourpy-1.4.0-cp312-cp312-win32.whl", hash = "sha256:5450f091ac1be0be3ad3a2a3b3f23b5e443e78c670ced4fd347d626f92a28fd2", size = 347345, upload-time = "2026-09-11T19:03:06.192Z" }, + { url = "https://files.pythonhosted.org/packages/50/a9/dab08786bb4d77ef9a046b3c1be923be4e73c5d07d91f5a54e8ea9b09e41/contourpy-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e697d94e69f499ff6bebb899cae97a58d5d14f0e1fe9568b43a0248d2f9af8c", size = 234083, upload-time = "2026-09-11T19:03:08.122Z" }, + { url = "https://files.pythonhosted.org/packages/47/b9/3ba509755a970dbde5948e7142ac21f266be72f38017cc4087a05fdceee1/contourpy-1.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:0c7a4c2716a4e98342221954416a836cca77c996c14ddbf22b5f01d5d93ca09c", size = 559521, upload-time = "2026-09-11T19:03:10.047Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "dnspython" +version = "2.9.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/49/900383b471c645a3c397f47b3211d1fcecb3a540c98f683494cdf86b33de/dnspython-2.9.2.tar.gz", hash = "sha256:8d4d39a513e649d634004ce4d39ade2352efcea472a0247535a5c2d18a9d7ba9", size = 455484, upload-time = "2026-11-03T23:56:53.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/0c/5346358b3a20275d256978c35203ddc2c8617f78c1b23795b79ba22ced6d/dnspython-2.9.2-py3-none-any.whl", hash = "sha256:af15f7d385a6ae2fb35a796fde2138004c8c42c7389090e2addc83e3b3340fd8", size = 360455, upload-time = "2026-11-03T23:56:52.088Z" }, +] + +[[package]] +name = "fonttools" +version = "4.68.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/b5/672312ae80ce8b8eb9779c56052a24c8f36652aa7293a1a420553bcf03e5/fonttools-4.68.0.tar.gz", hash = "sha256:73294e233070f71e2b3653b6bd8564af676d57f26d075761fb06d1ab2e4a7a5d", size = 3848583, upload-time = "2026-10-27T16:30:26.451Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/63/f332b2099599b4911786a6f6fd69552fdd5ae6a45cfaffb0c881092f36c8/fonttools-4.68.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f265c85432c398d86f26add143423924a4747879b2dce001a3ffe0a5fed30638", size = 3143556, upload-time = "2026-10-27T16:28:21.812Z" }, + { url = "https://files.pythonhosted.org/packages/c8/97/68816bb56843e06631ff11517e4fb35fc62d76aec6e29f11df095e7f33c5/fonttools-4.68.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d225096687fc3bac0ebe3357e95b2dd8b0a49d191f016db0771d537ccdd6f47e", size = 2633689, upload-time = "2026-10-27T16:28:23.54Z" }, + { url = "https://files.pythonhosted.org/packages/21/94/b125c7a6d154d17f4f699150ef3abebd9d8ad0f7eddce9dad649a9e5c1d8/fonttools-4.68.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b41e71b2657c9843b2327b4e3c116db1757dc8cd05d978cd47cb5061272d4997", size = 5462605, upload-time = "2026-10-27T16:28:25.774Z" }, + { url = "https://files.pythonhosted.org/packages/7f/58/fe13db71e3f5a020c6875f349806e84f7550f3f24cb3cdbabdd693968b1d/fonttools-4.68.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3edce69ecdefa73ab1041901ca22eefed6ebb93a77bc77e889d940479f25bf7d", size = 5443448, upload-time = "2026-10-27T16:28:27.898Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7f/48236f8c626007670586dd6b0d61ed80323a6b17ead763c881d717525cea/fonttools-4.68.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8d5674de2b614575f0751671727056af042ac1d61beacb59a298d74282fa492", size = 5399992, upload-time = "2026-10-27T16:28:29.99Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0d/09e9a433430e277e454eace1c4d02c3691a33d5257bd234702a427a9d090/fonttools-4.68.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7ab8097e7e191784974c5608eb95fb31e1243fe3054cb66778ac82558e9b36f8", size = 5563739, upload-time = "2026-10-27T16:28:32.691Z" }, + { url = "https://files.pythonhosted.org/packages/ac/54/6708f4c6742de2d5bf4280d8bde22fb8aef5120328bdc19ca34a9d2e8e8b/fonttools-4.68.0-cp312-cp312-win32.whl", hash = "sha256:1695cd2e1f9768fe3f14d369ce6ef1b3e8561069cc9e47059571985d1ea42614", size = 2481614, upload-time = "2026-10-27T16:28:35.122Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3e/ef786310a3774ae7aacaa288ca6d1e1dfd03c24214137478e4b630b76af0/fonttools-4.68.0-cp312-cp312-win_amd64.whl", hash = "sha256:fedc183bdbc3fdbfbdca26e0e04566d089cbb404712509a4e824608e9304cc77", size = 2533508, upload-time = "2026-10-27T16:28:37.085Z" }, + { url = "https://files.pythonhosted.org/packages/06/11/2cc4272ddd485c448c0363be9beb0a24d3f429f1cc8c5aafa716c508e899/fonttools-4.68.0-cp312-cp312-win_arm64.whl", hash = "sha256:95628bbc5ea81d5761268f4c4f1ba709af510b970f363498ac801c0c1fd7a4a8", size = 2502049, upload-time = "2026-10-27T16:28:39.355Z" }, + { url = "https://files.pythonhosted.org/packages/35/74/4ea331ecc65ba05a58b1e4e8ccd604c8a15565f876dfbf93fc2a2ea2e22b/fonttools-4.68.0-py3-none-any.whl", hash = "sha256:d76f8fdcb6936f5e1045a0c9dd721a4bf11112e60d1e243bfa1d39f06a8b3104", size = 1248357, upload-time = "2026-10-27T16:30:24.389Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/e1/2069291243c926a2ff1cd706c7f3eeb9b62144bf60f77c9fb9ff2fb26bd3/iniconfig-2.3.1.tar.gz", hash = "sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960", size = 21209, upload-time = "2026-10-06T22:48:38.076Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/43/4ca9e49d27a1fcf6bece6f6aec0ea46bb9112489b93d4b688fb415457bdb/iniconfig-2.3.1-py3-none-any.whl", hash = "sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7", size = 7552, upload-time = "2026-10-06T22:48:36.959Z" }, +] + +[[package]] +name = "kirin-toolchain" +version = "0.22.21" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beartype" }, + { name = "pymongo" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/19/549c28a4a841fac2ae082882576f709bf9472eb835b672f0c6849732c566/kirin_toolchain-0.22.21.tar.gz", hash = "sha256:6dc786414f5bc2e23b789fc680a813c490b49e1752236711d5eef978fd311aa1", size = 1287780, upload-time = "2026-10-14T23:40:35.719Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/7d/ebdceb3778787d3c9fda6fbe5d5e2fc8e112ddf9dc60f3e87a478184fbda/kirin_toolchain-0.22.21-py3-none-any.whl", hash = "sha256:0d43302628fcf12b2b0eb94b22ab5ff013b24b00af1503deca061d7ee80e8ffb", size = 273988, upload-time = "2026-10-14T23:40:33.98Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/07/bd78e6a8fae171ea041ef5bba3ed21a003522fa088834b069b1909981f30/kiwisolver-1.5.1.tar.gz", hash = "sha256:f1303ef2eec81262a4b708c3e858afe58d7c75ad91c1c05266eda7673369859a", size = 104395, upload-time = "2026-08-28T10:28:27.153Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/9b/65b302742389c6f96f2956bef5decf26011309feb2fc5d79613af18adea4/kiwisolver-1.5.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63fb7294b768f444eb4b068965f2662f28c2fd4161e23bd60fcf3ff27b74c046", size = 123876, upload-time = "2026-08-28T10:25:27.44Z" }, + { url = "https://files.pythonhosted.org/packages/71/74/c21f339956f6f691b2ed7e31d5f3ae767304df6c460192739fc830853051/kiwisolver-1.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ebdef3eae5336568147c39a55be6a2036ffde53faa9ca2d978989ae7c2da12c", size = 66487, upload-time = "2026-08-28T10:25:28.728Z" }, + { url = "https://files.pythonhosted.org/packages/84/e5/bdb34e21523e01dceda064d63713f3bdec91388af24fba1eca7ea5e85864/kiwisolver-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1798e83840c3f627246104c4d8a9639c60fa068adf9ce92b61791781fa8a68c1", size = 64660, upload-time = "2026-08-28T10:25:30.071Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f4/dadfec469313c7f428efa7e84b4aba9732f813c13ea7131a24b7b008ef57/kiwisolver-1.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34633ecf50d16187ab8e5528b7a2530f2feb4e23f300db4672538b51cfc5cd38", size = 1477929, upload-time = "2026-08-28T10:25:31.495Z" }, + { url = "https://files.pythonhosted.org/packages/6f/35/09c58daac34e6f6ea5c6dee0094b422118e5a7c265586008a95fd135ac5f/kiwisolver-1.5.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d27c2123977cb9269c30a49ba45f03a4323017ef693e19db4ec9dbe1299a3002", size = 1278499, upload-time = "2026-08-28T10:25:33.375Z" }, + { url = "https://files.pythonhosted.org/packages/19/32/739765e24fbad29d13f83e546ea4abc215a78cea9d677ca09025b027724d/kiwisolver-1.5.1-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6a797a1cefc8b9c93170db580337e1fe3d011ad18b1299943231279406342048", size = 1296677, upload-time = "2026-08-28T10:25:35.059Z" }, + { url = "https://files.pythonhosted.org/packages/df/32/03304d1010e2cc45e5b3b52cef7e43fed3a2a5cd6c87a89b4a88e1d85b5d/kiwisolver-1.5.1-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2551cf9917af48ee7c4b29cc82320489508cf96fd26a51f6fc124de661cd44c7", size = 1346037, upload-time = "2026-08-28T10:25:36.705Z" }, + { url = "https://files.pythonhosted.org/packages/3e/57/4c49377bfd274450dd72ecaa13eaac32ea804a03363e4d1db0c5aa999ceb/kiwisolver-1.5.1-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:38f6e0deb4d0a4615efe0c4efc5990b06ae450ab50a0b321c0b078b6d238c083", size = 988248, upload-time = "2026-08-28T10:25:38.299Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c3/38df144a08b6c5d75ca4504e5cc3141bb3bfef64c04f4ef48204f42711b6/kiwisolver-1.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bfd1de989b3330420e29de39352f5c049905c9e3ee67233a50d550e3d652c148", size = 2228722, upload-time = "2026-08-28T10:25:40.038Z" }, + { url = "https://files.pythonhosted.org/packages/e7/11/3221838a89cd64d9b386353e000cd8a296069a20fbe3584507fdfd5bebae/kiwisolver-1.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1209042a623ddfda5497e4066c7b77651dde8e1d3a9dd97599dc7e97f3b9b78c", size = 2325216, upload-time = "2026-08-28T10:25:41.699Z" }, + { url = "https://files.pythonhosted.org/packages/83/d4/075c219230697bb5db910d37262b9bacf880f92b4811a02ab81ed073a253/kiwisolver-1.5.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:26e8268480be5061d509e29669d59103c067a26377a56491630ece11762e3858", size = 1977689, upload-time = "2026-08-28T10:25:43.559Z" }, + { url = "https://files.pythonhosted.org/packages/bb/08/1d219c3c2dd960983d0d4da623d916e9de6385df2b0bab3d1af0e9b8fccc/kiwisolver-1.5.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:d79308fa689fac89cbcfbd4dbfc80b5f95c54c5a7fd4d194be221f9d33d026e6", size = 2491443, upload-time = "2026-08-28T10:25:45.242Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d3/024208ec1079d273f1047468d1bdffbf38bb75b7b268090fd3a0301b9d9a/kiwisolver-1.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b03af77d77e50edba2030fd5f7c352ff209314b09030a3cba7c14edf9a09a444", size = 2295200, upload-time = "2026-08-28T10:25:46.984Z" }, + { url = "https://files.pythonhosted.org/packages/6e/7c/7b210498f9f92e1cd7855f260fa69ef056881087b199ee20c208f0e4189a/kiwisolver-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:06a6917674de9e0fe3f66f5430787f59a9f2ddb64af9b714eaec547e29ef5c19", size = 70748, upload-time = "2026-08-28T10:25:48.444Z" }, + { url = "https://files.pythonhosted.org/packages/94/61/ef0daa157c8bb23672f7423e0d14c39db1dc6ef8ed47e6bc54c9c1bef3bf/kiwisolver-1.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:ad8b9671348d7c8716715652ae11f85ed0eb99e265a2df2ca490577d69860b2c", size = 68324, upload-time = "2026-08-28T10:25:49.81Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c4/1407df7512a5b36cc79840e01710dc575733c461b13ab866cae77eaf87f3/kiwisolver-1.5.1-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:482676e5bd48d70ac99d9fc78863469845421e01184fa83f1f9366dc49f7e974", size = 134002, upload-time = "2026-08-28T10:28:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/16/45/c37a21ad5c0ab581a93c55ad544721aaa1f0ae94edb29c6a678a23d013e6/kiwisolver-1.5.1-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:072bdb15a3c19a5b5dbc8f8fb1f4e1884bf4f3507eeb4cc6334401274d37a5c0", size = 194292, upload-time = "2026-08-28T10:28:11.06Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c1/69f00d627949580e43d57af0aa465df46868d7c29801c137a55374101294/kiwisolver-1.5.1-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:a5a00665d1a0e26763a7338d7e911d4598fbc1d50dd0d6b7919b7dc6c5d6569f", size = 73362, upload-time = "2026-08-28T10:28:12.449Z" }, +] + +[[package]] +name = "ldpc" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pymatching" }, + { name = "pytest" }, + { name = "scipy" }, + { name = "sinter" }, + { name = "stim" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/3d/1642f2456dc4c494ab1209b8da8a886cd4e82280839c8ef434294492738d/ldpc-2.4.1.tar.gz", hash = "sha256:729376026af4e46e550c333152f073dcf42224589380d309f38923e00736ceba", size = 1077057, upload-time = "2025-12-08T15:10:52.19Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/3b/11c487a402c58e646ce5736412ff4aa06ff0cbf20c4e228e1c942c473b08/ldpc-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:035ceb48f9d8c0d2ab37eee67f87692a935ba586ebc380a0f7ad7bac3192a872", size = 1834836, upload-time = "2025-12-08T15:10:31.333Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ee/157f674b39807af9a16a2d682b6993a3696709278c83fe9039356cbd5460/ldpc-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4010c9ac9eff008c058dfa9f225325d5aed8b7a0b55ec0975a737fc7352aa301", size = 1795380, upload-time = "2025-12-08T15:10:32.459Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b3/491228c3ee52889be6dbc9d3dbc1cff7f81d7174154dff564307fa76d694/ldpc-2.4.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6701b042f8d505f205c7fe39820566513f1191ed04413e0968bb54bfbc6f0086", size = 8122834, upload-time = "2025-12-08T15:10:33.59Z" }, + { url = "https://files.pythonhosted.org/packages/d6/b0/a480113901c689b73087406f0a09a2206de2c71e2b791257802362bd5b12/ldpc-2.4.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49b8b14413ec0d4c68c4f5a9bcaff0232363aed71652a75ed6af1234c58031b", size = 8266025, upload-time = "2025-12-08T15:10:35.163Z" }, + { url = "https://files.pythonhosted.org/packages/39/05/6b2cab8a9417d4de79bd67f281f420dd5862c1fe7b6f12b0910001d05938/ldpc-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d7965b6c3dc53ac0bc852e3769516a4b4a2756f26c6a683ea675c1e1771da42", size = 1736143, upload-time = "2025-12-08T15:10:36.837Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.11.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/c8/9aa712a0afb882649424dd8de8ad9aa6235e796e84c6052e8f6dc1598d0d/matplotlib-3.11.2.tar.gz", hash = "sha256:cec596316640f2b394b8f0daa0ea61a8eae82d017b620b9f202befb972a59ea4", size = 32660610, upload-time = "2026-09-11T19:05:31.214Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/ce/1bfcc4873b121597791ad74032943b123218c0613af0b97e8dd05e916fb1/matplotlib-3.11.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ef752769cd962f39ea0b6ffc82d1ea43a0012c5a6157c7a075212fa509cfcff2", size = 9476466, upload-time = "2026-09-11T19:03:19.45Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c4/7f5f3601ee69baf072c0c7d3ce60c03e0618621c5a56c34a62a460e29d11/matplotlib-3.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ef31985c4dedb5f1424e1aec6849a47dd37689cb7fa3c20b1b82187f26806261", size = 9305583, upload-time = "2026-09-11T19:03:22.39Z" }, + { url = "https://files.pythonhosted.org/packages/b8/90/2b3fd67ee273163faeda6d514be70b5596eaa0fd77b60ffc294ad0b34f5f/matplotlib-3.11.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:df4f7784aca81a94f254c0a2767d592ee25f407e488f5fa7203e51093fb6ca27", size = 9860353, upload-time = "2026-09-11T19:03:25.049Z" }, + { url = "https://files.pythonhosted.org/packages/f4/84/32549e7a462dc311aed2ab62e5d2538028840b5c53a8be0195c789937c3d/matplotlib-3.11.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b9a7ad579856284135e401ecc918c5f8a017ee30539298862a109f51b971710", size = 10670348, upload-time = "2026-09-11T19:03:28.108Z" }, + { url = "https://files.pythonhosted.org/packages/84/39/02e21b74f7439bd643d717ea846006d46e309e6d29b632b57751265311d6/matplotlib-3.11.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3aa4b8516fd26659e4363abbf317c703d9116496c5db2e9d0609a2866dd39dd2", size = 10810580, upload-time = "2026-09-11T19:03:31.402Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/0d239bde12b308262265c2d98909b2f0ecad2b5deeae96241642e822e9c7/matplotlib-3.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:c5c1c68ee401fc98271263410f0e5ce88285abacf7627132914e8adf3d70ff43", size = 9349409, upload-time = "2026-09-11T19:03:34.195Z" }, + { url = "https://files.pythonhosted.org/packages/49/a8/06baf901c02246c8a222b655cc4540ef9c15e1549a04e07927f9cde716c3/matplotlib-3.11.2-cp312-cp312-win_arm64.whl", hash = "sha256:643ff850d8e0f5b8319337f87ed3cb59506afb3df3cc48de777d85871233be7b", size = 9028084, upload-time = "2026-09-11T19:03:37.032Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "networkx" +version = "3.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/76/3af777226b63a5e64a6b36b1ec5855c14e2b94a37096d4760e595fc43511/networkx-3.7.tar.gz", hash = "sha256:fd77a511bd90f39f3d016351345b52cf5319b813bdca01de3f755d3cca62e96a", size = 1866482, upload-time = "2026-09-21T16:45:16.974Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/cd/fe58041e9011f307c490e3e17dd48cc516448f7c698a3f2d9d9d65d7e6a8/networkx-3.7-py3-none-any.whl", hash = "sha256:e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0", size = 2142205, upload-time = "2026-09-21T16:45:14.609Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, +] + +[[package]] +name = "openquantum-ppvm-simulation" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "bloqade-ppvm" }, +] + +[package.metadata] +requires-dist = [{ name = "bloqade-ppvm", git = "https://github.com/QuEraComputing/ppvm.git?subdirectory=ppvm-python&rev=3cc883fd93b2475cb10c892a8a31adcc09a7579c" }] + +[[package]] +name = "packaging" +version = "26.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, +] + +[[package]] +name = "pandas" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/17/ca/24c6bc92aca3d366146358e47f1d374c0e1a50763ef226fc71eff20a63fb/pandas-3.1.1.tar.gz", hash = "sha256:05fed3e3b7c99b226f160e29d7d6cb7ef39638c758cbfe42b3f24ba34f04b859", size = 5936163, upload-time = "2026-11-04T15:08:01.994Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/90/a0212e039b49c058e1286f57a9864c23a65d7be05195b8f22a783638fd33/pandas-3.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ac114c27f10b8783a9c3bbf1b08a08494e1fafb17c2a0c8db54e06180874c01", size = 11590674, upload-time = "2026-11-04T15:05:51.818Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e2/dbcb8b3639358f49a723cbe7e9e505be378a981b5e5dbc403bca978b368a/pandas-3.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b10ae67d301ea84d0969388557cf8b90ea7870def14fd743614bde890104163", size = 11173287, upload-time = "2026-11-04T15:05:54.207Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f4/ef17ed877969e869a673a6506bb3ebb038b071af434a99e9bb610bb0bd97/pandas-3.1.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f628bb9a4681695da1dcc04efef86bc8c67095300d8da928b9886259cb0dada", size = 11494640, upload-time = "2026-11-04T15:05:57.056Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b6/f9c0c52f7a2fcd828e336dd143001b0bcbc1276c90187dfa104458528e2e/pandas-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:028490c8ac2e03e18c9b08b7f3612e149b03570209bcf741d23833a7a5377ab2", size = 12031410, upload-time = "2026-11-04T15:05:59.531Z" }, + { url = "https://files.pythonhosted.org/packages/4a/89/f19b6b9baf210d020e6694462158c3e7c813acf7e4252caf86defeab7a1e/pandas-3.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d15b83c79bafbce2cb7707f609dd0eb7c57545abcd3f93398e9272adee17f81a", size = 12511367, upload-time = "2026-11-04T15:06:02.31Z" }, + { url = "https://files.pythonhosted.org/packages/0f/dc/f414405c5971eacf2865125e6869b842b66e5cd2a80bc8b9d78836914ef9/pandas-3.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:255fab1fee49783494ec2e8fc5ed27bf896c5e05e9266826d4a9738bfd77d56c", size = 13109983, upload-time = "2026-11-04T15:06:04.653Z" }, + { url = "https://files.pythonhosted.org/packages/37/39/46c0cc0c270e084af94f112f958c338c3ef067be38d2cfa34fe7a7c8f110/pandas-3.1.1-cp312-cp312-pyemscripten_2024_0_wasm32.whl", hash = "sha256:6705575b65750e4494b4f9328eed8cb263b4b809984d4eeb8f492a3e804b0c53", size = 8092796, upload-time = "2026-11-04T15:06:07.051Z" }, + { url = "https://files.pythonhosted.org/packages/c8/35/54c22df9e6bdb0fa001da2b8855f997addafd9575f14f25c166a8ef96b6e/pandas-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:eef35cb3f07dbc8e10e298b8a55ee4aa04d6511f27d5277f13c3df45d3bbef5c", size = 10751076, upload-time = "2026-11-04T15:06:09.397Z" }, + { url = "https://files.pythonhosted.org/packages/03/e3/76e8a1131d819c6ef7a9f943f7f4148e0112e02a7a25815143c875aa9a10/pandas-3.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:f13731c5f3c610c4584dd4f80df0f1279c657a0b3eff32205cda5d541f5385cf", size = 10133045, upload-time = "2026-11-04T15:06:11.847Z" }, +] + +[[package]] +name = "pillow" +version = "13.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/a4/9cc30690a394a8305e8be4c9036aa16d0dfddadd09079860b582f562496d/pillow-13.0.0.tar.gz", hash = "sha256:cdcd1ba258178f7356d74170c9a81ba4eab6a5d55748bc402a5a2a6fe6be3510", size = 47058631, upload-time = "2026-10-16T22:18:09.718Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/b8/58d79332229482eb0d27c82973850808c19d37e5bdc14443d3417bd373f5/pillow-13.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:67c8d44ad89fa7eb88de5d6ef6199b1e03dd24974f85a67639fc8badb801fe79", size = 5568643, upload-time = "2026-10-16T22:15:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/39/4b/f2ed53d83aa44ac19599ac0a54897f867fafb95f406980d1e24083f8cbe3/pillow-13.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc481f742ccda20e9ed760b8f978dff50f2a4e9bc253ac167fb0a05b0783ef52", size = 4852329, upload-time = "2026-10-16T22:15:46.284Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bb/9e30e8ed18c20800ee327a12107d5249ad8dc444867b3adfcc21654e3c71/pillow-13.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8bf295fe459343bc6093c8e5e0df60bfa189e0fcb775a22e2c2488fdeccc6c0d", size = 6519309, upload-time = "2026-10-16T22:15:48.14Z" }, + { url = "https://files.pythonhosted.org/packages/e6/99/fdf65cc539e266ab93546c261bdf98411fe165c6e4e13f9dbf597097192b/pillow-13.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42d63be3af4f9b951b199b0a9d23365d37ab14687e6d77b74940432c8515c4ca", size = 7144542, upload-time = "2026-10-16T22:15:50.093Z" }, + { url = "https://files.pythonhosted.org/packages/26/9b/f38b7c4d8f599537e2d1a6d546cec9beef7536ff8f5c49a3f9c78179d8ac/pillow-13.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4bd024d567eca931b668978d672dba914d4b8e2628e2c3073a2ad178de8a2620", size = 6618042, upload-time = "2026-10-16T22:15:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7c/45ee28531f89ee4582967d8a17f7a26d71ca64cd902b93c269590cd60a00/pillow-13.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:23edf4ec4b6f4f240e8df6e4985e9ee2ced86474632433e55fb1e2548744bf40", size = 7228137, upload-time = "2026-10-16T22:15:54.009Z" }, + { url = "https://files.pythonhosted.org/packages/01/bc/9c2a969cb1b70201d04fa17fd5aedf02a732870b8da86bceaaa30b0ca385/pillow-13.0.0-cp312-cp312-win32.whl", hash = "sha256:02464da86f561f410e13b061ec37c3068a9cb557a095494157742d07b3c24a27", size = 6515423, upload-time = "2026-10-16T22:15:56.25Z" }, + { url = "https://files.pythonhosted.org/packages/ff/cd/73a79ecdc822076002eb24b5e1e4a530b0bb5310fcb6d239abbec877110b/pillow-13.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:ff3fe9eb621fbb9db4c4be33ab946f6bac5f98ab50ca8d3260503653656c961b", size = 7272166, upload-time = "2026-10-16T22:15:58.597Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a3/be5a1236efd085b3984e4305da8f179ae9dab80c991d2ad78f2bd5c4c843/pillow-13.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:c3bc8ee0271387e0b1e3ad0ff893645990a656e79bf9c42f4f734a3642b11d51", size = 2698943, upload-time = "2026-10-16T22:16:00.637Z" }, + { url = "https://files.pythonhosted.org/packages/60/da/f6d644e631c5b370c5d0b899f3ccadd2780aab070b29a110527cf4e1fd2c/pillow-13.0.0-pp312-pypy312_pp80-macosx_10_15_x86_64.whl", hash = "sha256:8619685cad8efc4c38c66d3b36aad854523297c43d748b3b6f0cc03c90ba3463", size = 5523188, upload-time = "2026-10-16T22:17:59.334Z" }, + { url = "https://files.pythonhosted.org/packages/e4/b0/2594f202d743a35d4fe80682bfd96f277e5ca7aecb27cf64ef5bfc1d000b/pillow-13.0.0-pp312-pypy312_pp80-macosx_11_0_arm64.whl", hash = "sha256:7e91e97a929232cdb828889ee6ad0e48d7f40f4ec38818f4e4a8968b2b1af22e", size = 4806808, upload-time = "2026-10-16T22:18:01.188Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ed/d504165ef79af6fafe25c76726cf30f544cc236002f7ed054f1d51adc4ff/pillow-13.0.0-pp312-pypy312_pp80-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93ff9c9c3663ce23aaa5d0b6b6abac55359e2a0c06c7e30f3771829af816be63", size = 5464358, upload-time = "2026-10-16T22:18:02.779Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fe/a10aba5503ca13e9e009b8bd0a1a4ce5584bdce246245fd6f3a83701369c/pillow-13.0.0-pp312-pypy312_pp80-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e65dd6e75de67b2362a4fa3e16aa627595f65054dc4ec73d64680c84d592fa61", size = 6043514, upload-time = "2026-10-16T22:18:04.538Z" }, + { url = "https://files.pythonhosted.org/packages/c0/37/66b12dc476041fe523bca29c9d58fbf1ea92a4eaf73acfb9e993948f1191/pillow-13.0.0-pp312-pypy312_pp80-win_amd64.whl", hash = "sha256:567f20f1c75897d7663830da6ea8af719e03d712b1d9ee7f813319f9ece42e5a", size = 7366030, upload-time = "2026-10-16T22:18:06.638Z" }, +] + +[[package]] +name = "pluggy" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/db/7fc19e6f2dc92a966727031389fc2e08b558f0f25eb7403c1119ad4713cd/pluggy-1.7.0.tar.gz", hash = "sha256:d1eaa46ebb595891b860ab086b4d09c8588af65ebd4361b8e8f4bb8920b90ba8", size = 123304, upload-time = "2026-10-15T09:50:58.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/9e/2b38731e0fc536806f16490e1a12d7f0dc2a1235aa8cc07bcc75416a7daa/pluggy-1.7.0-py3-none-any.whl", hash = "sha256:7dd7b0d8832ba3cb632c306926ded123429211b83641b35dc5c41ad2d34f9bec", size = 27082, upload-time = "2026-10-15T09:50:56.808Z" }, +] + +[[package]] +name = "pydantic" +version = "2.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/fc/1203d011145c98ddce3cd2f505bb54375ef8d43223053df6bfcf3c746f46/pydantic-2.14.3.tar.gz", hash = "sha256:1054f237f4d4733e5a30e1e2333bd33a2004ab9ab1510bd053a9a31bb48e232d", size = 925636, upload-time = "2026-11-05T09:17:04.686Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/b8/b864503789ef5c58597d2a7b4adbee62c26440ab1e682581fc6838df8947/pydantic-2.14.3-py3-none-any.whl", hash = "sha256:3f7b347782ab7e4cf4c798496ae3a82787d9f21ec12676a9c564355eeef8daa8", size = 494071, upload-time = "2026-11-05T09:17:02.426Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.50.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9c/0f/34f9ce4ba701dd0b815033ef94d99b56f66200e578ee6052aa3ac26f064e/pydantic_core-2.50.4.tar.gz", hash = "sha256:aead3b74b68396bf0feab5d57e050b730ded7df55853c1e048a87e00aaf033c6", size = 522249, upload-time = "2026-11-05T09:15:26.774Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bf/d1f6b81709538f831ebe1c42f50fb89db3dfda06f9e9b1ea24e90fc69209/pydantic_core-2.50.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:32a991aebd165f227b7c7c60bb9d66c2c7de9c24308552da264c9938fde0f8d6", size = 2231444, upload-time = "2026-11-05T09:12:06.969Z" }, + { url = "https://files.pythonhosted.org/packages/c1/39/6618e541658d5a687a8d4962fc304350073a8f322bc4c62e8ed4c2d514d6/pydantic_core-2.50.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e20cbde2b6deb33a51d08cd168454dd9044ec7d4474056f4d98d63f51578783", size = 2108048, upload-time = "2026-11-05T09:12:08.85Z" }, + { url = "https://files.pythonhosted.org/packages/d9/54/1c941fffa4e14bfc9ab0cd4977075f0e03201447856130d08a33cd45e47b/pydantic_core-2.50.4-cp312-cp312-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:8cceae48ae7f94990c2f4e36291e9ec9868735e8b0f19e4489a17b0422338466", size = 2256866, upload-time = "2026-11-05T09:12:10.495Z" }, + { url = "https://files.pythonhosted.org/packages/61/a0/8028ef3e014be522ce43060aeac82a5be2288215e660866f5e6260acc123/pydantic_core-2.50.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:16902a147b3da4840612164a5e67947104d63e978f7a57c395877a5e26690b9c", size = 2125682, upload-time = "2026-11-05T09:12:12.278Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f2/b98bb73b1734ec4e42e786a766abc24f3c89620a0ddbaf8aa14e4b4c628c/pydantic_core-2.50.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.whl", hash = "sha256:d6e3485a5e5c01fb5339c1ee3d4b9e21e2135a2a9d44caafb71acd994487ee7c", size = 2197108, upload-time = "2026-11-05T09:12:13.873Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d1/7a7142786781400143e8806633fe5b65e2d407c311041fc9494490f05b18/pydantic_core-2.50.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:629eae995185540406e3635df5d5cf1d44f19ea240840b835d3f44541ff694d8", size = 2380521, upload-time = "2026-11-05T09:12:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/b5/34/cf710ca48d4498b04a3ea605d45892675dc2b14a94a25121a8d03f56d3e9/pydantic_core-2.50.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:41b2cd8b29dbb5a4c9828a70f50d1abfc92011115c813213d3a91205c6f731b3", size = 2457436, upload-time = "2026-11-05T09:12:17.447Z" }, + { url = "https://files.pythonhosted.org/packages/91/23/e0c6e3cd09a0ac809953fea698c816b9f03bf0b35b6820c9553e4f5d85a8/pydantic_core-2.50.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c81d98e27d9d9261909dcccab1ba5d6ea1c98b0bb9470e368604614fd1d36ddd", size = 2261727, upload-time = "2026-11-05T09:12:19.097Z" }, + { url = "https://files.pythonhosted.org/packages/f9/00/292a0ed96d5d2d6edb49468ef481336e5b7e54f13435d73b7c912c891c23/pydantic_core-2.50.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:ca83a32b2b41653d89f09a3d22b770bca96da72273bef8f7a68136bdd1e8b823", size = 2262071, upload-time = "2026-11-05T09:12:20.78Z" }, + { url = "https://files.pythonhosted.org/packages/f8/36/d4690faf8c082eacf7754e52ab6bebe1bc73b167272e28699c00480ee908/pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:817953730e4a73a09008b010c4a42396cefe799616a22df2ac21d3927b3080cf", size = 2298931, upload-time = "2026-11-05T09:12:22.614Z" }, + { url = "https://files.pythonhosted.org/packages/21/17/b180af6d17cf6c8e0d3d2661fc501a4a40959744ca4947d6ad0db81b1416/pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:664e74848c2f5fc27db8505fe24e1ecd3ac669412913bf73d176916f86cc08e2", size = 2474285, upload-time = "2026-11-05T09:12:24.842Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bb/7e44d4ac6e1292f1859384c688713045bdf5448e0635c49c003d2be3bb6c/pydantic_core-2.50.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:219114f8dcdcbe4720d82ef016b1287ce5a0a67d7c69ca61524eb72e82aac344", size = 2498172, upload-time = "2026-11-05T09:12:26.434Z" }, + { url = "https://files.pythonhosted.org/packages/d8/84/5101f35294579c4bef7dc32fd4f097d91eedac2e195894266bdabc1e6dfd/pydantic_core-2.50.4-cp312-cp312-win32.whl", hash = "sha256:67f7cc397e1d5556a801d1cba74de0d27d827eb242e6c036c0ca273c745414f1", size = 2119592, upload-time = "2026-11-05T09:12:27.971Z" }, + { url = "https://files.pythonhosted.org/packages/82/88/d438a8fcf3738e9ff2670f724047ca3893ec899bcd5cdfc077a2aab133c6/pydantic_core-2.50.4-cp312-cp312-win_amd64.whl", hash = "sha256:ea2f61b0bc12f3592288503961b764579dea0658852d96a0b3d823614d808821", size = 2264064, upload-time = "2026-11-05T09:12:29.538Z" }, + { url = "https://files.pythonhosted.org/packages/77/d4/4a0c73dc3ef9e50b122b8c3527afcded15a44838f1c9668d2d4b72cc09f0/pydantic_core-2.50.4-cp312-cp312-win_arm64.whl", hash = "sha256:32d6dda86383645ec428ea64dfc277036f5cbc60a72238eab28b91a3fdb9a113", size = 2167792, upload-time = "2026-11-05T09:12:31.103Z" }, + { url = "https://files.pythonhosted.org/packages/9a/18/2f6a25e9104d5af713d16671711927601da1f0db74e785be67bd590385c9/pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:c04e9d920e2674f54651fd260a15c5d2843526c73d5242ee4311325ddc9573b3", size = 2212591, upload-time = "2026-11-05T09:14:56.262Z" }, + { url = "https://files.pythonhosted.org/packages/4c/1b/ba8b721af10a7659e7fbbef320ff8eb55462557a72607858af5a9bd22cb1/pydantic_core-2.50.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:5bc1811ef2b4d4ba63e8e452f6e332b6374bd1d2cbbfdf66826c8cb1f71dd10d", size = 2048167, upload-time = "2026-11-05T09:14:57.681Z" }, + { url = "https://files.pythonhosted.org/packages/48/42/3f8638e7d90bdd9a7c7f3e5084723af59e7f43f15a292e242d35624073ce/pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b059a7968b1911be5a2d9a8234827ab0bef9d1e465d4b42da525894143550e8", size = 2119548, upload-time = "2026-11-05T09:14:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/e0/8d/4bfbacaf191f7939893d165e18eb301731fa3366c59a6e57336c4f168fbd/pydantic_core-2.50.4-graalpy312-graalpy250_312_native-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bee28aab5a580eec673f7b68dfa8dece3dd37bd207ef8d22fafe23a8e9837296", size = 2279952, upload-time = "2026-11-05T09:15:00.907Z" }, +] + +[[package]] +name = "pygments" +version = "2.21.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz", hash = "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", size = 5005329, upload-time = "2026-08-17T08:02:48.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl", hash = "sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9", size = 1250147, upload-time = "2026-08-17T08:02:44.912Z" }, +] + +[[package]] +name = "pymatching" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib" }, + { name = "networkx" }, + { name = "numpy" }, + { name = "scipy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/19/39472c89d532e576890320eff5e9738e4b4d7828d027315f7e198ba0be8c/pymatching-2.4.0.tar.gz", hash = "sha256:0c30dafa506b086f50d15530debd7b7b39228597d22c52d5ccd114bcbb0a2326", size = 347169, upload-time = "2026-05-22T18:10:07.471Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/bc/4983d49570d97b4489de8ed1580faea58e63a16e6c7046e45aaa636ea054/pymatching-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:881f3410975b5a2d393561d44fa4513c878653d0e718e55930b08f52e9a04fc5", size = 380199, upload-time = "2026-05-22T18:09:35.25Z" }, + { url = "https://files.pythonhosted.org/packages/5c/0e/00cd2b9c2da28fb3dafb77da8e2da18ceedda42de2298c682fbb016a9189/pymatching-2.4.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:af03cdd7389e7b9f93069f1dd1bb9931c3836a2bfc0d01952993f394b0bfa10d", size = 412898, upload-time = "2026-05-22T18:09:37.024Z" }, + { url = "https://files.pythonhosted.org/packages/0f/03/b3186c28500a5aa751f7fc37b52fe6129ba24092604a8118faea456f482c/pymatching-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15e6d73153713a8f383f44ba4497d478fb4c4d765fbdd30f9fc1e1d47af75760", size = 626230, upload-time = "2026-05-22T18:09:38.547Z" }, + { url = "https://files.pythonhosted.org/packages/60/c8/d9abe73cc6dbaddf61d3c5875a9687aaa9591a976b109cc7cb6b7595cccb/pymatching-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:eb4428581a2578a8cc77f695ab267c184f444d9de5cb25301fe9f3f893214ea4", size = 347707, upload-time = "2026-05-22T18:09:40.805Z" }, +] + +[[package]] +name = "pymongo" +version = "4.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/8b/a9d214044153cb7d9141229d3e1b171cdf4f460fa07cade9354c4ce2f84d/pymongo-4.19.0.tar.gz", hash = "sha256:3c510dd3c5d9b392d3b33bb5d2a594758acfe8f026fca654253f947ce0af9d40", size = 2689381, upload-time = "2026-10-14T19:48:19.629Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/a3/47f2c964779c395314b1dc5506df9d00d4ba26c1aa6f35674e81a4a418d3/pymongo-4.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d28d6ff5cec9fd405657de12128e3faafb9c4a0b0194527e3d761dd9d083d7a7", size = 827051, upload-time = "2026-10-14T19:46:20.446Z" }, + { url = "https://files.pythonhosted.org/packages/4f/58/d4ee8dac050365c0de8ca3ad02aafb9128176d63b9145ace2865c7850d2e/pymongo-4.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dcf04e36e192791fb07f53e3a508c4752e6e0bba7aeda5cee10a84b3ccd0ca44", size = 827371, upload-time = "2026-10-14T19:46:21.921Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ce/83e24645c49cb66631e3802b574deba362e2712c92228f0853e44c10b098/pymongo-4.19.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:117e64c5ba2755d147bea31c86f3b4cd59ec8fb0f44cbae2f49e1502ff226789", size = 1047887, upload-time = "2026-10-14T19:46:23.669Z" }, + { url = "https://files.pythonhosted.org/packages/36/02/f9336de0777074c37f164901bb28c9b6cd26e366e054f1b9d0e0938be380/pymongo-4.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f072289060739430d2ded949a196939c3e3ff8ba4469b40e4833b5f1d8b0943", size = 1058974, upload-time = "2026-10-14T19:46:25.416Z" }, + { url = "https://files.pythonhosted.org/packages/37/b9/01c3e07d93ec955ca72ef20f8ecacf77b4e75ad2b453acadd356c924e05c/pymongo-4.19.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ff9679803b691aa5ff6efe4de2d715e65e1784641e334d701b7b80a0776c35f8", size = 1082922, upload-time = "2026-10-14T19:46:27.605Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/989bb02c9fb545304d88b77727c62fd215c46df43a8847d07960aad00227/pymongo-4.19.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:03ae5228d97eb465e42cd3058888be6892146296a600e8038b6dd3a4c4ac20fe", size = 1076649, upload-time = "2026-10-14T19:46:29.49Z" }, + { url = "https://files.pythonhosted.org/packages/44/1b/e8364fadbc05bff19e67dda4f151e63fb13c58252cd5e1e1750c22cc1b8f/pymongo-4.19.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5af9e52dfd18224474d5f54817ef2cbf06e313d100772a4a72aea8394037941", size = 1058052, upload-time = "2026-10-14T19:46:31.23Z" }, + { url = "https://files.pythonhosted.org/packages/cf/f0/b562a891e73ae371f26fd9aa949c69f9596e720431a25396b8f9416a5194/pymongo-4.19.0-cp312-cp312-win32.whl", hash = "sha256:43debbb3e14be3db2764a77f14da2ac220b8ff192b485145855574127e2feee2", size = 822933, upload-time = "2026-10-14T19:46:32.885Z" }, + { url = "https://files.pythonhosted.org/packages/ac/1d/dda443f738b63e34f045ba0249e03e0010e0406c093eb9af9c2468d56300/pymongo-4.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:4fd6db124a081b627fb86e1f1d681a58f42c6ae2ec876c6e2015f1d516931ea9", size = 829709, upload-time = "2026-10-14T19:46:34.605Z" }, + { url = "https://files.pythonhosted.org/packages/25/53/0392704674a921e9798eddc726045a01a554748dc7e80ec00d6577c76099/pymongo-4.19.0-cp312-cp312-win_arm64.whl", hash = "sha256:6073c762dbd4d0d17acbdd3aac4004750eec842fa40aa10965451367963f40d6", size = 825566, upload-time = "2026-10-14T19:46:36.382Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/11/b213bebff182584360cb8d17c72c1677fec5c5c228de439e63bcf8ab1c8f/pyparsing-3.3.3.tar.gz", hash = "sha256:928ae7e20211f3b6f3915a72f06a0cfd29ab9d24279dd6346b6b1a7146397d36", size = 1050487, upload-time = "2026-09-20T20:59:05.609Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/bb/d215ee7c73b61497b28a5503f9f53523f294fcc936762b7caf90e0c1c2b5/pyparsing-3.3.3-py3-none-any.whl", hash = "sha256:ece8c00a69cf01b45d0b1dedabb469c90d8caf996d4fda40f147627a122849a4", size = 126420, upload-time = "2026-09-20T20:59:04.025Z" }, +] + +[[package]] +name = "pyqrack-cpu" +version = "1.89.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/f4/2f327e1be091b44b346ae461987dea87ead1be4ddced94d2456336505990/pyqrack_cpu-1.89.0.tar.gz", hash = "sha256:f9483868405affc00e413ad9a654cfaf70f18445dd17066888cc379ba78c768e", size = 56254, upload-time = "2026-04-25T17:10:42.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/35/6a1610c95ffb81d6007350ca975eaed083e0e1dc513dd7e440029ffb85ae/pyqrack_cpu-1.89.0-py3-none-macosx_14_0_arm64.whl", hash = "sha256:2dd33531cc97f1e82a0da77a8724c41f11745100432591eaaea2d8bb59fbf4d4", size = 1902045, upload-time = "2026-04-25T17:10:10.083Z" }, + { url = "https://files.pythonhosted.org/packages/99/a9/900987ab5530c9b2d17dfbd40772125e468ed67eed604fac24e079c9444f/pyqrack_cpu-1.89.0-py3-none-macosx_15_0_arm64.whl", hash = "sha256:3b75ca238a8dd0c016ab31d3545d5bdb21c7459ef102942ae82b166fc80919fe", size = 1883866, upload-time = "2026-04-25T17:10:12.528Z" }, + { url = "https://files.pythonhosted.org/packages/84/4e/ac999a9a9aadee19d3c46d42a3a1cbe088e207b3537f0be8b34644b3cdae/pyqrack_cpu-1.89.0-py3-none-macosx_15_0_x86_64.whl", hash = "sha256:7c719e7fd3038a4e891faa1c865a8b23b9a6c3fb7375777b4de2e87678a2a275", size = 2071105, upload-time = "2026-04-25T17:10:14.855Z" }, + { url = "https://files.pythonhosted.org/packages/2e/52/2c4ebafcc1113f086dcabe54060e42c94cea5c04cd83b794ee1eae0860bb/pyqrack_cpu-1.89.0-py3-none-manylinux_2_35_x86_64.whl", hash = "sha256:ca92f8c3d34708c5625c928518ba5a5144dc463e6f9c9f786465d231c3ca4cba", size = 3078459, upload-time = "2026-04-25T17:10:17.528Z" }, + { url = "https://files.pythonhosted.org/packages/2f/77/2d62203d1e6589656f69a9e238daad018fbe7c3c61e10aa491b2e818dd1c/pyqrack_cpu-1.89.0-py3-none-manylinux_2_39_x86_64.whl", hash = "sha256:46bc2808c36f7ea1b45ec019890268f94cbce275a3a640ae0f96d135af2c594a", size = 3032387, upload-time = "2026-04-25T17:10:20.351Z" }, + { url = "https://files.pythonhosted.org/packages/e5/88/8ed6132343afeb0f31f22c58b246f029e46e6ef4abdc538aadd63bf0eba5/pyqrack_cpu-1.89.0-py3-none-win_amd64.whl", hash = "sha256:03a65d64131cbb4c2e31298de94c4372a7d90b61454839975a1d9c321a6091f7", size = 807305, upload-time = "2026-04-25T17:10:22.824Z" }, +] + +[[package]] +name = "pytest" +version = "9.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/42/bb4641652e58dedeac2ec51abc1f8cae4fee4ec63899a0999016229a0f2a/pytest-9.2.0.tar.gz", hash = "sha256:97c4f3b1f3c7414aa36465e09b8220f1d03627993bd51b1282e193753c80557b", size = 1797555, upload-time = "2026-10-27T21:30:20.728Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/39/1f5d8c8877a0fa327db959c19341d4be61660de1ab6b7391f9eb805bcd67/pytest-9.2.0-py3-none-any.whl", hash = "sha256:07acdcf88ec174f907dc01af70bf52d49b014bbab03faeeade31c96b18c2e588", size = 411776, upload-time = "2026-10-27T21:30:19.131Z" }, +] + +[[package]] +name = "python-dateutil" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/39/b3927f3616f6223832f9b760e4208e8a7c7e1dea2b4d9ad7d32a5d214c3a/python_dateutil-4.0.0.tar.gz", hash = "sha256:d7295ff14fdc0f92f662100bfb6c551d160ca090f2939f1ec5b9794265c03f06", size = 250419, upload-time = "2026-11-01T07:02:42.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/a9/52b89563d154433d79b51ed1eb4842bf7334cb2696891a7fe135618853d7/python_dateutil-4.0.0-py3-none-any.whl", hash = "sha256:a5e246f79eb80475e691bf93862cead98decd8a498cf53ba0516fcdc0f50dc1c", size = 92853, upload-time = "2026-11-01T07:02:40.797Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "scipy" +version = "1.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/74/66de6258867beb2ef08f35f9f2ac017a52cacd5081714d239ff1a442d458/scipy-1.18.1.tar.gz", hash = "sha256:52c4b7422442aba924d03ad4019852b08a92e64ea187b933135687bfe2747307", size = 30781235, upload-time = "2026-08-21T23:28:50.599Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/f7/240c110c08693826b4513a52f5717d62ec7c7af72f2920821247c03b17b3/scipy-1.18.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:457fd7a2a8edeb044ab6ffbc0aa03ff6cd18491356e5e0c834d76ce621b916d1", size = 31111061, upload-time = "2026-08-21T23:23:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/05/4a/78c6285577c375e7cf27277ea8ee6961224327f1e1a0c44af5f17f23635c/scipy-1.18.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:e708533e8b2ae2497d65346538a7dcc92814410b25b81432eac66de0f2af8265", size = 28733332, upload-time = "2026-08-21T23:23:50.015Z" }, + { url = "https://files.pythonhosted.org/packages/a5/f6/a5b82f8abbe14d134691b8b903696f701d25a081353a29dc655c364d9e62/scipy-1.18.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:7bbf207c4453ce1ad2e00b17313852b33310b83090c2311bdaf97f93c0380d12", size = 20475078, upload-time = "2026-08-21T23:23:54.138Z" }, + { url = "https://files.pythonhosted.org/packages/23/22/0858a0bbd6b3e825ceb8cd9baf9eaf3b2f2b1d77727eb6be40500bcdc92f/scipy-1.18.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:78c0665edead396b1abb4897c41a5c1d9bf090c8a637a4c20a61678e0a264e66", size = 23108904, upload-time = "2026-08-21T23:23:57.824Z" }, + { url = "https://files.pythonhosted.org/packages/75/9a/2e71719f31eaefe0e3a1706c4a1ded94e664bfd95ffca2b219a671faee01/scipy-1.18.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c085faa2cfa879c5141df483f836f4d691045a078224a670fa570fa01612d89", size = 34025113, upload-time = "2026-08-21T23:24:02.209Z" }, + { url = "https://files.pythonhosted.org/packages/df/64/ff35eb9e54894cf471ff4716abd3c81eb0a0626869217ce3e6ba4ccf17d7/scipy-1.18.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f55fa87b6c612ecd6b058f167c53231b1d14e412efe361d3d6e38b3631c73218", size = 35344199, upload-time = "2026-08-21T23:24:07.844Z" }, + { url = "https://files.pythonhosted.org/packages/d3/af/c5538be1792f7034c12c7db6ee67cace58253c7b87b122d68253eaf5de89/scipy-1.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c35d74ce0e193ff740c2f2be2ac913ddc232fe6c1ff40b26cfecb9c670c63314", size = 35639587, upload-time = "2026-08-21T23:24:13.05Z" }, + { url = "https://files.pythonhosted.org/packages/91/4c/075e4f66471bac101141ac739e9e135549be1bae584571bd03a530c056e1/scipy-1.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d2924a03db38dc2e848bca2fe9f077dafb891480b91a00a0963a8cf86dfc31c1", size = 37480330, upload-time = "2026-08-21T23:24:19.608Z" }, + { url = "https://files.pythonhosted.org/packages/39/e7/979fd14e75008623df31ba70d6bb144700f68feadcea042021c06a05bf82/scipy-1.18.1-cp312-cp312-win_amd64.whl", hash = "sha256:5e4d44984abc0020154ea81b247adeddcc3ac5527b975ff798bd1ba0adc513c2", size = 36658278, upload-time = "2026-08-21T23:24:25.463Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0b/e1525354ff9d7d5feb6d1b31af6d14072e5c91e9607b421fa1ec889660b3/scipy-1.18.1-cp312-cp312-win_arm64.whl", hash = "sha256:d65d448389b8436493abcf629cc94ad0cf32aecaf06e1acca1de53cc795f2f12", size = 24400588, upload-time = "2026-08-21T23:24:30.579Z" }, +] + +[[package]] +name = "sinter" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "stim" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/6b/b546cc9240fb1b64417c8ca00038ce1927ffd6e8a0d4e46ad237242dbcd8/sinter-1.16.0.tar.gz", hash = "sha256:fd0f7bff97cb951345893f53b347d76f99b53977590054abc3d057150f82037b", size = 177330, upload-time = "2026-05-22T05:41:49.762Z" } + +[[package]] +name = "stim" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/bd/c0f5d6241cdb806400a63e0c7febe22982ddf1c8761142bb0ea6b51d3f50/stim-1.16.0.tar.gz", hash = "sha256:9092a996429dcf616d8d4ca01fec886b7b310caf9425a39fcfe499005636bd52", size = 882497, upload-time = "2026-05-22T05:41:56.575Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/d9/8b70c39860e67e233178a9ef595c15a7ec718f0b88bc424ae2c6ad8f97da/stim-1.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3e2883216fb4f57411531c99dfa1838c0d8201c619ccd01b197b9afd54d326cf", size = 2067905, upload-time = "2026-05-22T05:41:34.9Z" }, + { url = "https://files.pythonhosted.org/packages/51/e3/45a8c0889f4629027cbdd8ed8e9f5824b5bd8b12b0f5d24be27ec0c2a3dc/stim-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b8580dfbe5ff27594dd15a83b24262630b82cf089d1463d29dbee90ffbc6898b", size = 1902644, upload-time = "2026-05-22T05:41:36.132Z" }, + { url = "https://files.pythonhosted.org/packages/e4/71/db565f5bd0f273414e90d85551eed1c75f7b689847bd605a7cf0c4c0386d/stim-1.16.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:883b24c3c95fa69818e931e8b60daf4fc8195d159d321e7548d8706dbac16558", size = 5307850, upload-time = "2026-05-22T05:41:37.69Z" }, + { url = "https://files.pythonhosted.org/packages/bb/65/0ddfa6f76c4a137aefeee4d51a65945e0ec77cc2221322f13a5768f4c488/stim-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:85b9c544c65377a42c6b5c9a57616a5ed5580e1cabb286a604800a045c7a12fb", size = 2760794, upload-time = "2026-05-22T05:41:39.731Z" }, +] + +[[package]] +name = "tqdm" +version = "4.70.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/ea/b2a5bd54b28a324dae8211928b2d730b6547500342c7e6c6dea08bd0a485/tqdm-4.70.1.tar.gz", hash = "sha256:cefd0eca11b2a37a3aee776544d4f4ae913f02688135b5556b8788dfa474afc4", size = 171846, upload-time = "2026-09-11T07:25:16.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/03/921a3d3c75785aca9ebfbfcabfbc3a1be12e2ab5265deb026d55a5a3f83e/tqdm-4.70.1-py3-none-any.whl", hash = "sha256:c293e525e6fef9c20e8728fd4612df02a0aa31bb5fe91ecd93e123b1b7bffa73", size = 80199, upload-time = "2026-09-11T07:25:14.599Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ff/50/0195198eb1d75bab716bb0a813abea4cc394bfa17a92a189f021a34859af/typing_inspection-0.4.5.tar.gz", hash = "sha256:7f16c411e7930dc79596d42ab44672a3fe5f60eb34b781a1647e7872363120c7", size = 81194, upload-time = "2026-11-04T14:13:23.774Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/0c/ea2544850a7c135e15033a5c7a8e7211136184b7ae63e2239d557c2b3019/typing_inspection-0.4.5-py3-none-any.whl", hash = "sha256:bc210535442b39e1bf2805e0c7a17dfd6a4ace760c84c7f7d16245d23a6b1c39", size = 14874, upload-time = "2026-11-04T14:13:22.616Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/29/6a1391d31cd00ff9e927215a224a880e1e84e826b64ba80a499e51c074d8/tzdata-2026.6.tar.gz", hash = "sha256:85d2cd9c09f81f0bb29db27759fc83af4f1e620efb814f8c5bf8b4cc4feece6d", size = 201017, upload-time = "2026-10-28T09:57:09.137Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/66/9a06c2227fedfd4919f0eaaa8b94377d9730882a7e4f95823c9a331ab5e1/tzdata-2026.6-py2.py3-none-any.whl", hash = "sha256:0a10eec6e13ef16b627fabed9a5f2ba61a62b1c67f327305f4e7e412a70b4aec", size = 348210, upload-time = "2026-10-28T09:57:07.276Z" }, +] diff --git a/.github/workflows/ppvm-sdk.yml b/.github/workflows/ppvm-sdk.yml new file mode 100644 index 00000000..366a2159 --- /dev/null +++ b/.github/workflows/ppvm-sdk.yml @@ -0,0 +1,67 @@ +name: PPVM SDK + +permissions: + contents: read + +on: + pull_request: + paths: + - '.agents/skills/ppvm-simulation/**' + - '.github/workflows/ppvm-sdk.yml' + - 'tests/fixtures/ppvm-*' + - 'tests/ppvm-*' + push: + branches: [main] + paths: + - '.agents/skills/ppvm-simulation/**' + - '.github/workflows/ppvm-sdk.yml' + - 'tests/fixtures/ppvm-*' + - 'tests/ppvm-*' + +jobs: + native-sdk: + runs-on: macos-latest + timeout-minutes: 45 + defaults: + run: + shell: bash + steps: + - uses: actions/checkout@v7 + - uses: actions/setup-node@v6 + with: + node-version: '24' + cache: npm + - run: npm ci --ignore-scripts + - uses: astral-sh/setup-uv@v7 + - name: Select isolated task directories + run: | + echo "OPENQUANTUM_PYTHON_ENV_ROOT=$RUNNER_TEMP/ppvm-python" >> "$GITHUB_ENV" + echo "UV_CACHE_DIR=$RUNNER_TEMP/ppvm-uv-cache" >> "$GITHUB_ENV" + echo "OPENQUANTUM_CARGO_HOME=$RUNNER_TEMP/ppvm-cargo" >> "$GITHUB_ENV" + echo "OPENQUANTUM_SDK_CHECK_OUTPUT=$RUNNER_TEMP/ppvm-evidence" >> "$GITHUB_ENV" + echo "RAYON_NUM_THREADS=2" >> "$GITHUB_ENV" + - name: Explicit preparation of the frozen source environment + run: | + rustc --version + node scripts/setup-sdk.mjs ppvm-simulation + git diff --exit-code -- .agents/skills/ppvm-simulation/pyproject.toml .agents/skills/ppvm-simulation/uv.lock + - name: Offline native user program through the existing SDK interface + env: + OPENQUANTUM_ECOSYSTEM_CHECKS: '1' + OPENQUANTUM_SDK_IDS: ppvm-simulation + run: node --test tests/sdk-ecosystem-live.test.mjs + - name: Independent numerical references and failure cases + run: | + mkdir -p "$OPENQUANTUM_SDK_CHECK_OUTPUT" + sandbox-exec -p '(version 1) (allow default) (deny network*)' "$OPENQUANTUM_PYTHON_ENV_ROOT/ppvm-simulation/bin/python" -B tests/fixtures/ppvm-validation.py 2>&1 | tee "$OPENQUANTUM_SDK_CHECK_OUTPUT/numerical.log" + - name: Save execution evidence + if: always() + uses: actions/upload-artifact@v7 + with: + name: ppvm-sdk-evidence + path: | + .agents/skills/ppvm-simulation/pyproject.toml + .agents/skills/ppvm-simulation/uv.lock + ${{ runner.temp }}/ppvm-evidence + include-hidden-files: true + if-no-files-found: error diff --git a/README.md b/README.md index 33ed0059..493984eb 100644 --- a/README.md +++ b/README.md @@ -206,6 +206,7 @@ npm run dev | 分子激发态与光谱 | [SlowQuant](.agents/skills/slowquant-response/SKILL.md):酉波函数、量子线性响应、跃迁性质与吸收谱 | 活性空间、响应近似与独立参考;[使用与验证边界](docs/integrations/SLOWQUANT.md) | | 非规则图张量网络 | [TNQS](.agents/skills/tnqs-dynamics/SKILL.md):图上的电路、动力学、有限平面 CTMRG 与采样 | 有效平面嵌入、截断与环境收敛;[使用与验证边界](docs/integrations/TNQS.md) | | 连续相对论场论 | [RcmpsCore](.agents/skills/rcmps-field-theory/SKILL.md):1+1 维标量场、RCMPS 优化与同真空激发 | 正常序、背景收敛与能隙定义;[使用与验证边界](docs/integrations/RCMPS.md) | +| 近 Clifford 与丢失/泄漏仿真 | [PPVM](.agents/skills/ppvm-simulation/SKILL.md):Pauli 传播、广义 tableau 与 Stim 格式采样 | 非对称丢失的存活反作用尚未实现;[使用与验证边界](docs/integrations/PPVM.md) | | 误差缓解与量子纠错 | Mitiq、Stim / PyMatching、LDPC、Chromobius;[纠错能力](docs/CAPABILITIES.md#误差缓解与量子纠错) | 采样预算、统计误差及解码器的适用模型 | | 检查 detector error model | [emlint](.agents/skills/emlint-dem-audit/SKILL.md):结构诊断、反例及不完整检查状态 | 保留告警、跳过项和缺失上下文;不证明码距或解码正确性 | | 动力学与实验模拟 | Trotter / qDrift、Dynamiqs、OQuPy、Bloqade、Pulser、PairInteraction;[模拟与硬件入口](docs/CAPABILITIES.md#哈密顿量模拟与开放系统) | 单位、截断、时间步长;模拟与真实设备操作分别说明 | @@ -218,6 +219,8 @@ TNQS 使用 `tnqs-dynamics` 入口:先显式运行 `node scripts/setup-sdk.mjs RcmpsCore 使用 `rcmps-field-theory` 入口:显式运行 `node scripts/setup-sdk.mjs rcmps-field-theory` 后编写 Julia 程序。传递 gap 不等于 Hamiltonian 能隙;试探态示例不证明相互作用基态或质量谱。 +PPVM 使用 `ppvm-simulation` 入口:显式运行 `node scripts/setup-sdk.mjs ppvm-simulation` 后编写 Python 程序,准备会构建固定版本 Rust 扩展。`LOST` 与比特分开,`reset_state` 不恢复丢失/泄漏;小规模对照不证明器件模型或性能优势。 + SlowQuant 使用 `slowquant-response` 入口:先显式运行 `node scripts/setup-sdk.mjs slowquant-response`,再通过 SDK 工作台运行自定义程序。已验证小规模离线响应;Qiskit 分子谱学与硬件另行核验。 @@ -225,7 +228,7 @@ SlowQuant 使用 `slowquant-response` 入口:先显式运行 `node scripts/set -当前源码分发 **189 个内置 Skill、91 个 MCP 服务连接、5 个原生量子 Tool**,并为 **117 个 SDK/源码环境**提供原生 API 使用路径。清单数量、配置启用、环境就绪与科学验收是不同状态;每项能力按需准备,平台、账户和许可限制见对应说明。 +当前源码分发 **190 个内置 Skill、91 个 MCP 服务连接、5 个原生量子 Tool**,并为 **118 个 SDK/源码环境**提供原生 API 使用路径。清单数量、配置启用、环境就绪与科学验收是不同状态;每项能力按需准备,平台、账户和许可限制见对应说明。 [完整 Skill 目录](docs/CAPABILITIES.md#内置-skills) · [MCP 服务及默认开关](docs/CAPABILITIES.md#mcp-服务目录) · [原生 Tool 与副作用](docs/CAPABILITIES.md#原生量子-tools) · [SDK API 与逐库验证](docs/integrations/FULL_SDK_ACCESS.md) · [相近方法怎么选](docs/integrations/CAPABILITY_SELECTION.md) diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index dbd6725e..7b13eb2e 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -221,3 +221,7 @@ Chromobius 1.1.1 为 Apache-2.0,固定上游提交 `efae0325e4a8fc13be981434d3 [physlib](https://github.com/leanprover-community/physlib),均为 Apache-2.0。 插件只包含项目模板、依赖锁和工作流指南,不捆绑完整工具链或库;准备所得源码保留上游许可。 固定版本及间接依赖见 `.agents/skills/lean-physics/lean-toolchain` 和 `lake-manifest.json`。 + +## PPVM 原生 SDK 工作流 + +[QuEraComputing/ppvm](https://github.com/QuEraComputing/ppvm) v0.3.0 为 Apache-2.0,固定提交 `3cc883fd93b2475cb10c892a8a31adcc09a7579c`;[许可证原文](https://github.com/QuEraComputing/ppvm/blob/3cc883fd93b2475cb10c892a8a31adcc09a7579c/LICENSE)。本仓库仅分发原创指南、示例、验证与依赖锁,不捆绑上游源码或二进制。显式准备时构建 `ppvm-python`,间接 Python 依赖由 `uv.lock` 固定,Rust 工作区来源由完整提交固定并保留其 Cargo.lock 与许可。各依赖保留自身许可,不将 Apache-2.0 扩展为所有传递依赖的统一许可证。 diff --git a/docs/CAPABILITIES.md b/docs/CAPABILITIES.md index b4646ded..5dbbe15b 100644 --- a/docs/CAPABILITIES.md +++ b/docs/CAPABILITIES.md @@ -150,7 +150,7 @@ OpenQuantum 为本地模拟、IBM Quantum、IonQ 和多家国内量子云保留 原生量子 Tools
-当前源码分发 **189 个内置 Skill、91 个 MCP 服务连接、5 个原生量子 Tool**。其中 66 个 Skill 来自 quantum-skills 的开源工作流适配,共用现有代码执行工具;其中 49 项提供可运行示例,覆盖 unitarylab_algorithms 的全部 39 个模块。Skill、Tool 和 MCP 连接分别统计。 +当前源码分发 **190 个内置 Skill、91 个 MCP 服务连接、5 个原生量子 Tool**。其中 66 个 Skill 来自 quantum-skills 的开源工作流适配,共用现有代码执行工具;其中 49 项提供可运行示例,覆盖 unitarylab_algorithms 的全部 39 个模块。Skill、Tool 和 MCP 连接分别统计。 当前配置共包含 **282 个可配置 Tool 名称**:258 个由 MCP 服务提供,18 个为 Harness 通用工具,6 个为平台原生工具(上面的 5 个量子动作及 1 个教学生成动作)。这是配置全集;`bash` / `pwsh` 按平台互斥,连接开关、环境和工具范围也会影响实际可调用集合。既有能力的逐项决定见[治理记录](architecture/EXTENSION_GOVERNANCE.md),新增中性原子动力学见 [Bloqade Analog](integrations/BLOQADE_ANALOG.md)。 @@ -161,7 +161,7 @@ OpenQuantum 为本地模拟、IBM Quantum、IonQ 和多家国内量子云保留 既有条目与治理情况见[治理清单](architecture/EXTENSION_GOVERNANCE.md);相近入口及大型可选服务的专业工具范围见[能力选择](integrations/CAPABILITY_SELECTION.md)。 -这 189 个 Skill 覆盖方法选择、计算实验、结果解释和平台诊断。其中 176 项可由 Agent 自动选择,13 个分类索引保留为用户手动导航;原名称和手动调用均可继续使用。点击名称即可查看完整的 `SKILL.md`;所需工具与连接分别配置。新增算法工作流的参数、安装与开源替换差异见[运行说明](../examples/quantum-algorithms/README.md)。 +这 190 个 Skill 覆盖方法选择、计算实验、结果解释和平台诊断。其中 177 项可由 Agent 自动选择,13 个分类索引保留为用户手动导航;原名称和手动调用均可继续使用。点击名称即可查看完整的 `SKILL.md`;所需工具与连接分别配置。新增算法工作流的参数、安装与开源替换差异见[运行说明](../examples/quantum-algorithms/README.md)。 下表按**研究方法与用途**介绍能力。各 Tool 提供的模型、参数和输入格式见[计算参数与运行方式](EXAMPLES.md#计算参数与运行方式)。 @@ -196,6 +196,7 @@ OpenQuantum 为本地模拟、IBM Quantum、IonQ 和多家国内量子云保留 | [`slowquant-response`](../.agents/skills/slowquant-response/SKILL.md) | 分子激发能、跃迁性质与量子线性响应 | 宿主代码 Tool;显式准备固定源码 SDK;保留响应近似与诊断 | | [`tnqs-dynamics`](../.agents/skills/tnqs-dynamics/SKILL.md) | 非规则图张量网络、电路、有限平面 CTMRG 与采样 | 宿主代码 Tool;显式准备固定 Julia SDK;保留几何与收敛边界 | | [`rcmps-field-theory`](../.agents/skills/rcmps-field-theory/SKILL.md) | 连续 RCMPS、标量场优化、正常序观测量与同真空激发 | 宿主代码 Tool;显式准备固定 Julia CPU SDK;区分传递 gap 与 Hamiltonian 能隙 | +| [`ppvm-simulation`](../.agents/skills/ppvm-simulation/SKILL.md) | Pauli 传播、广义 tableau 与丢失/泄漏采样 | 宿主代码 Tool;显式准备 Python/Rust SDK;区分近似、LOST 与重置语义 | | [`emlint-dem-audit`](../.agents/skills/emlint-dem-audit/SKILL.md) | DEM 结构诊断、反例与不完整检查状态 | 宿主代码 Tool;显式准备原生 SDK;不证明解码正确性 | | [`tesseract-decoding`](../.agents/skills/tesseract-decoding/SKILL.md) | Stim DEM、syndrome、搜索式解码器与统计 | 宿主代码 Tool;显式准备原生 SDK | | [`tqec-compilation`](../.agents/skills/tqec-compilation/SKILL.md) | BlockGraph、逻辑计算块、相关面与 Stim 线路生成 | 宿主代码 Tool;显式准备原生 SDK | @@ -617,7 +618,7 @@ OpenQuantum 提供以下 5 个原生量子动作,用于基态求解、调校 ## 可选上游 Skill -[OriginQ 官方 `pyqpanda3` Skill](https://github.com/OriginQ/pyqpanda3-skill) 提供电路编程、算法模板、迁移与 QCloud 使用指导。它**不计入上面的 189 个内置 Skill,也不会在首次启动时自动安装**;运行 `npm run skill:qpanda:setup` 后,固定审阅版本才会进入项目 Skill 目录。安装这个 Skill 不会自动启用 `qpanda_runtime`,也不会赋予云任务权限。 +[OriginQ 官方 `pyqpanda3` Skill](https://github.com/OriginQ/pyqpanda3-skill) 提供电路编程、算法模板、迁移与 QCloud 使用指导。它**不计入上面的 190 个内置 Skill,也不会在首次启动时自动安装**;运行 `npm run skill:qpanda:setup` 后,固定审阅版本才会进入项目 Skill 目录。安装这个 Skill 不会自动启用 `qpanda_runtime`,也不会赋予云任务权限。 ## 开源生态与致谢 diff --git a/docs/ecosystem/proposals/ppvm.md b/docs/ecosystem/proposals/ppvm.md new file mode 100644 index 00000000..e39f20fc --- /dev/null +++ b/docs/ecosystem/proposals/ppvm.md @@ -0,0 +1,38 @@ +# PPVM:丢失、泄漏与非 Clifford 电路模拟 + +用户于 2026-11-10 明确要求接入。本项是用户指定实施,不受自动发现队列的三项上限限制;沿用现有插件架构、隔离验证和 PR 交付边界。 + +## 价值与替代 + +OpenQuantum 面向量子科研、应用和教学。PPVM 的增量是把 Pauli 传播、广义 tableau、测量反馈和原子丢失/泄漏语义接入同一可编程 SDK,使 Agent 能表达中性原子噪声研究任务并保留可复核结果。现有 Clifft、TSim 和 Monoprop 已覆盖部分非 Clifford 采样及 Pauli 传播;Rust 实现或另一个采样器本身不是接入价值。 + +优先验证具体物理模型和错误解释,不预设性能优势;大型数字孪生、硬件真实性、截断收敛和千比特规模仍需逐任务验证。示例规模只界定开发证据,不限制上游公开 API。 + +## 固定来源与接入设计 + +- 官方源码:https://github.com/QuEraComputing/ppvm +- Release:v0.3.0,完整提交 `3cc883fd93b2475cb10c892a8a31adcc09a7579c`。 +- 论文:https://arxiv.org/abs/2610.18225 +- Apache-2.0;保留上游版权与许可,不复制数值实现。 +- Python 发行名 `bloqade-ppvm`,导入名 `ppvm`。2026-11-10 核查 PyPI 仅到 0.2.0,因此固定 v0.3.0 的源码构建,明确 Rust/Cargo 构建要求和间接依赖锁。版本事实以项目声明与锁文件为准。 +- 使用 L0 `ppvm-simulation` Skill + 现有原生 SDK 工作台。最小 Interface 是既有的 SDK `inspect`、显式 `setup` 和宿主文件/代码 Tool;不新增转发 Tool、MCP Server、宿主适配器或 Runtime。DSH/Codex 复用同一份目录与指南。 +- 共享清单仅添加 PPVM 条目,README 仅补充能力入口与边界;保留 #79/#77 的未合并内容,由后续合并顺序协调,不修改它们的分支。 + +## 验收范围 + +1. 只读发现返回完整公开 SDK 导航、固定依赖及独立环境的显式准备命令;发现不安装,执行不隐式安装。 +2. 通过现有准备入口从完整 SHA 与锁安装,验证用户自定义程序和结果工件;不将小示例包装成唯一功能。 +3. 真实数值对照覆盖:Heisenberg 门/噪声逆序、非 Clifford 小电路、丢失标记、相关丢失概率、泄漏与 `reset`/`reset_state` 区别;失败路径覆盖不支持或非法输入。解析结果或独立稠密矩阵作参考,不用上游相同实现充当答案。 +4. 现有 SDK、Skill 发现、Codex 投影/打包、清单一致性及 README 链接检查通过。新增执行行为按既有 SDK Interface 先复现失败再接通;数值检验属于开发回归,不新增科研验收 Profile 或阈值。 +5. 根 README 说明能力、入口、源码构建成本与科学边界。真实运行证据与自审结论分别保存;未完成项保留 Draft。CI 不替代科学验收或真实宿主 UI 验证。 + +## 必须保留的科学语义 + +- `PauliSum` 反向传播整个门/噪声序列,旋转角符号不因此反转;truncation 按任务记录并验证。 +- `reset_state` 保留丢失/泄漏状态,v0.3.0 的 `reset` 可恢复这些状态再置零。后者包含补回/恢复假设,不等同于任意硬件复位。 +- `MeasurementResult.LOST` 不是 0 或 1。泄漏为上游离散有效模型,不宣称完整多能级微观动力学。 +- 相关丢失参数的第二项是每个指定量子比特单独丢失的概率,恰好一个丢失的总概率为其两倍;已丢失一个时第三项另有条件语义。 +- Stim 格式支持范围由该版本及所选 backend 决定,不承诺全部 Stim 语法或自动生成 detector error model。 +- 所有证据保留 `scientificValidation=not_evaluated`;本次不添加 Validator/Acceptance Builder 集成,不声称硬件校准或量子优势。 + +补充固定版源码边界:Python tableau 支持 1–2048 qubit,实际可计算规模取决于非 Clifford 系数增长;非对称丢失不含存活分支反作用。本 PR 的开发检查须把这一近似明确记录为限制,不能当作完整物理通道通过。 diff --git a/docs/integrations/CAPABILITY_SELECTION.md b/docs/integrations/CAPABILITY_SELECTION.md index e6584cbf..9cb7f7f1 100644 --- a/docs/integrations/CAPABILITY_SELECTION.md +++ b/docs/integrations/CAPABILITY_SELECTION.md @@ -59,6 +59,11 @@ VQD 两个实现的输入、优化过程与结果合同不同,只合并选择 ## 厂商 SDK 与既有入口 +近 Clifford 电路优先按模型选择:普通 Clifford 采样继续用 Stim;现有 Tsim/Clifft 已覆盖的采样先复用其入口。 +需要明确区分丢失、泄漏、复位,或使用广义 tableau 时,选择 [PPVM 原生 SDK](PPVM.md);少数观测量也可用其 Pauli 反向传播。 +通用 Pauli/Majorana 传播可比较 monoprop。PPVM 的 Rust 实现不预设性能优势,非对称丢失尚缺存活反作用; +不同实现作为对照前必须统一门/噪声顺序、位序、截断与测量语义。 + - 用户给出结构化线路并需要 Pauli 期望及梯度时,在 PennyLane、DeepQuantum、TensorCircuit、 MindQuantum 中按指定 SDK 选择一个入口;需要修改算法代码或优化循环时继续使用既有算法示例。 - 电路优化选择 TKET 或既有 PyZX / Compact,比较前统一门集、线序与全局相位。 diff --git a/docs/integrations/FULL_SDK_ACCESS.md b/docs/integrations/FULL_SDK_ACCESS.md index cb0985a8..a707aeff 100644 --- a/docs/integrations/FULL_SDK_ACCESS.md +++ b/docs/integrations/FULL_SDK_ACCESS.md @@ -6,7 +6,7 @@ ## 全量梳理结果 -[SDK 清单](SDK_INVENTORY.md)当前覆盖 117 个环境入口:105 个 Python(含算法共享环境)、9 个 Julia、2 个原生源码或 ABI 入口、1 个 Lean 项目。2026-10-14 的[生态扩展](SDK_ECOSYSTEM_2026-10-14.md)增加 26 个入口;此前 85 个环境的日期化工程证据保留。它们不是 117 个不同的上游库;例如共享环境同时含 Qiskit、PennyLane、quimb 和 PySCF,同一库也可能因兼容性保留多个版本。 +[SDK 清单](SDK_INVENTORY.md)当前覆盖 118 个环境入口:106 个 Python(含算法共享环境)、9 个 Julia、2 个原生源码或 ABI 入口、1 个 Lean 项目。2026-10-14 的[生态扩展](SDK_ECOSYSTEM_2026-10-14.md)增加 26 个入口;此前 85 个环境的日期化工程证据保留。它们不是 118 个不同的上游库;例如共享环境同时含 Qiskit、PennyLane、quimb 和 PySCF,同一库也可能因兼容性保留多个版本。 每个条目记录原生模块、任务对象、直接依赖、固定依赖锁、原有便捷 Tool、启用条件和已知限制。其他能力单独列出:6 项外部 MCP、8 项原生实现或宿主工作流、66 项方法/知识参考。外部 MCP 连接和 OpenQuantum 自有模拟器不冒充供应商完整 SDK。 @@ -22,7 +22,7 @@ flowchart LR F --> E ``` -源码和 Desktop 使用仓库内的原生 Skill。Codex 的 SDK workbench 提供全目录导航,已启用的领域 Skill 投影保留同样的原生代码路径;当前源码候选随包携带 117 个环境的目录、依赖锁、显式 setup、完整算法代码和工件辅助脚本。原有未启用连接与 Skill 的状态保持不变。缓存 Skill 通过插件自己的 `mcp.json` 定位运行时,适配解压包与插件/运行时分开安装;不依赖研究项目的当前目录。 +源码和 Desktop 使用仓库内的原生 Skill。Codex 的 SDK workbench 提供全目录导航,已启用的领域 Skill 投影保留同样的原生代码路径;当前源码候选随包携带 118 个环境的目录、依赖锁、显式 setup、完整算法代码和工件辅助脚本。原有未启用连接与 Skill 的状态保持不变。缓存 Skill 通过插件自己的 `mcp.json` 定位运行时,适配解压包与插件/运行时分开安装;不依赖研究项目的当前目录。 执行、权限、超时、取消与进程管理继续由宿主负责。`sdk-access.mjs` 只读取目录和准备状态,不安装依赖、不 import 第三方包、不执行用户程序;没有新增通用任意 Python 执行 MCP 或另一套 Runtime。 @@ -144,3 +144,7 @@ node scripts/sdk-engineering-evidence.mjs .openquantum/sdk-checks/remaining \ ## 连续相对论标量场 `rcmps-field-theory` 使用固定 RcmpsCore 0.2.1 / Julia 1.12.7 CPU SDK,供用户编写连续 RCMPS 优化、观测量与同真空激发程序。传递 gap 与 Hamiltonian 能隙分别报告;[模型约定、使用与验证边界](RCMPS.md)。 + +## PPVM:Pauli 传播与丢失/泄漏 + +`ppvm-simulation` 使用固定 PPVM v0.3.0 源码与 Python 3.12,复用已有显式准备和完整原生 SDK 路径。可编写观测量传播、广义 tableau 和 Stim 格式采样程序;非对称丢失尚不包含存活反作用。方法选择、使用与逐项验证范围见 [PPVM](PPVM.md)。 diff --git a/docs/integrations/PPVM.md b/docs/integrations/PPVM.md new file mode 100644 index 00000000..15da2892 --- /dev/null +++ b/docs/integrations/PPVM.md @@ -0,0 +1,45 @@ +# PPVM 原生 SDK + +PPVM 补充近 Clifford 观测量、广义稳定子 tableau,以及丢失/泄漏电路建模。它通过既有 SDK 工作台和 `ppvm-simulation` Skill 使用完整原生 Python API;没有新增专用 Tool、MCP Server 或执行循环。DSH 和 Codex 共用这一份程序与依赖声明。 + +## 版本与准备 + +上游:[QuEraComputing/ppvm](https://github.com/QuEraComputing/ppvm),Apache-2.0。项目仍标记 alpha;后续升级先复核公开 API、噪声与 reset 语义,不自动追随 main。 +本次固定 [v0.3.0](https://github.com/QuEraComputing/ppvm/releases/tag/v0.3.0) 对应完整提交 `3cc883fd93b2475cb10c892a8a31adcc09a7579c`。发行名称 `bloqade-ppvm`,导入名 `ppvm`;版本权威是 [pyproject.toml](../../.agents/skills/ppvm-simulation/pyproject.toml) 和 [uv.lock](../../.agents/skills/ppvm-simulation/uv.lock)。本次核对时 PyPI 只有 0.2.0,因此固定 Git 源码的 Python 子项目,不用未发布 main。 + +```sh +node scripts/sdk-access.mjs inspect ppvm-simulation +node scripts/setup-sdk.mjs ppvm-simulation +node scripts/sdk-access.mjs inspect ppvm-simulation +``` + +发现只读,准备显式下载并编译,执行不安装。Python 固定 3.12;源码构建还需要支持 edition 2024 的 Rust 工具链、编译器和足够磁盘空间。沿用现有环境目录和缓存策略,不安装到用户全局 Python。然后使用 inspect 返回的解释器,在独立任务目录运行[可编辑示例](../../.agents/skills/ppvm-simulation/references/native-example.py)或用户程序。示例独占创建 `result.json`,避免覆盖旧结果;参数与两个 qubit 不是 API 限制。 + +## 如何选择 + +| 用户任务 | PPVM 路径 | 对照与限制 | +| --- | --- | --- | +| 带噪电路的少数 Pauli 观测量 | `PauliSum`、`LossyPauliSum` | 与小规模密度矩阵比较;整条门/噪声链倒序,角度不变;审查截断误差 | +| 非 Clifford 电路与测量 | `GeneralizedTableau` | 按物理时间正序;Python 绑定 1–2048 qubit,非 Clifford 系数增长决定实际成本 | +| 丢失、泄漏与重置语义 | tableau 的 loss/leakage/reset API | `reset_state` 保留丢失/泄漏,`reset` 恢复计算子空间;模型需要实验依据 | +| Stim 格式及 PPVM 扩展采样 | `StimProgram`、`sample_stim` | 先核实指令支持;保留 ZERO/ONE/LOST 原始记录,不直接把 LOST 转成 bool | + +普通 Clifford 采样仍可优先 Stim;已有 Tsim/Clifft 支持的噪声与采样任务先比较。monoprop 提供另一种算符传播路径;方法相近不是价值证据,PPVM 的增量主要是可明确检查的丢失/泄漏及广义 tableau 语义。Rust 实现本身不证明提速,也不替代现有库。 + +## 必须保留的科学边界 + +- `correlated_loss_channel(a,b,[p0,p1,p2])` 中 `p1` 是失去指定一方的概率,恰好失去一方为 `2*p1`;约束为 `p0,p1>=0`、`p0+2*p1<=1`、`0<=p2<=1`。 +- v0.3.0 的非对称丢失会按态给出丢失概率,但**不作用存活分支反作用**。这是一种轨迹近似,不是完整非对称量子通道。见固定版[实现说明](https://github.com/QuEraComputing/ppvm/blob/3cc883fd93b2475cb10c892a8a31adcc09a7579c/ppvm-python/src/ppvm/generalized_tableau.py)。 +- 泄漏是上游模型的有效标记及操作语义,不代表多能级器件物理已校准;不把丢失、泄漏、Pauli 噪声混同。 +- 保存种子、线程数、截断参数和规模;相同种子的复现不代表不同轨迹独立。复制 tableau 可能复制随机状态,应使用明确 seed 的 `fork`。 +- 完整原生 SDK 中的 Bloqade 编译、Lindbladian、对称性和其他路径可以按需探索;本次回归没有逐项认证它们。 + +## 验证入口 + +`tests/ppvm-sdk.test.mjs` 检查只读发现、固定源码与显式准备合同。准备后运行既有 `tests/sdk-ecosystem-live.test.mjs` 的 PPVM 项,保存用户程序、版本、锁摘要及输出。`tests/fixtures/ppvm-validation.py` 使用独立稠密门矩阵/态矢、解析预期与离散事件检查旋转/噪声顺序、非 Clifford、丢失、泄漏、重置、采样与失败路径。 + +数值回归在 GitHub macOS 隔离环境执行,计算阶段禁止网络;[CI 工作流](../../.github/workflows/ppvm-sdk.yml)保存原始结果。开发容差和统计区间不注册为科研 Acceptance Profile;`scientificValidation=not_evaluated`。没有真实器件、性能优势、大规模收敛或已安装宿主界面验收声明。 + +2026-11-10 的[实际运行](https://github.com/xi-zhao/OpenQuantum/actions/runs/42731058813)通过 46 项数值、语义和失败路径检查。两比特非 Clifford 电路的 tableau 与 Heisenberg 结果均符合独立稠密态矢参考(开发容差 `1e-10`);原生示例的带噪期望值为 `0.8037842898055502`,等于解析值。2048 次采样的相关单方丢失频率为 `0.572265625`(预期 `0.6`),Bell 测量为 1 的频率为 `0.5029296875`(预期 `0.5`),均落在每个均值的 Hoeffding 界 `±0.059516` 内(`δ=10⁻⁶`)。 + +[版本化验证记录](evidence/ppvm-2026-11-10.json)包含源码、锁文件、运行提交和输出摘要;[原始逐项结果](evidence/ppvm-2026-11-10/ppvm-validation.json)保留非对称丢失近似的反例。测试平台为 macOS arm64、Python 3.12.10、Rust 1.99.1;不外推为 Linux/Windows 数值验证或全部上游 API 认证。 diff --git a/docs/integrations/SDK_INVENTORY.md b/docs/integrations/SDK_INVENTORY.md index d319a10d..7b170b53 100644 --- a/docs/integrations/SDK_INVENTORY.md +++ b/docs/integrations/SDK_INVENTORY.md @@ -2,7 +2,7 @@ 由 `node scripts/audit-sdk-integration.mjs` 从 capability policy、SDK 导航、项目 manifest 和依赖锁生成;用 `--check` 检查是否过期。 -本表覆盖 117 个 SDK/源码环境入口:105 个 Python(包含算法共享环境)、9 个 Julia、2 个原生源码或 ABI 入口、1 个 Lean 项目。原生 QDMI 另有 Python 桥接依赖项目。一个入口可包含多个库,同一个库也可能有多个隔离版本,不能把入口数量当成独立 SDK 数量。所有锁摘要与间接依赖版本可通过 `node scripts/sdk-access.mjs inventory` 读出。 +本表覆盖 118 个 SDK/源码环境入口:106 个 Python(包含算法共享环境)、9 个 Julia、2 个原生源码或 ABI 入口、1 个 Lean 项目。原生 QDMI 另有 Python 桥接依赖项目。一个入口可包含多个库,同一个库也可能有多个隔离版本,不能把入口数量当成独立 SDK 数量。所有锁摘要与间接依赖版本可通过 `node scripts/sdk-access.mjs inventory` 读出。 **接入状态:原生路径与指南已提供;逐 API、可选依赖、平台与外部服务验证不由这张静态清单推断。** 环境是否准备需 `inspect`,实际执行证据见[完整接入记录](FULL_SDK_ACCESS.md)。 @@ -125,6 +125,7 @@ | `tyxonq-workbench` | TyxonQ | python | tyxonq==1.3.0 | 电路、门、测量与上游后端接口 | 按固定版本、已安装可选组件及目标平台核实 | | `vqnet-learning` | VQNet | python | pyvqnet==2.18.1, numpy==1.26.4 | tensor、量子/经典层、模型、数据与优化器 | 按固定版本、已安装可选组件及目标平台核实 | | `yao-circuits` | Yao.jl | julia | JSON3, Yao | 量子寄存器、block、电路、算符、参数与梯度 | 保留 block 作用线、位序、参数和精度。测量、态矢量与梯度的语义分别核对;跨框架导出须保留映射。 | +| `ppvm-simulation` | PPVM | python | bloqade-ppvm @ git+https://github.com/QuEraComputing/ppvm.git@3cc883fd93b2475cb10c892a8a31adcc09a7579c#subdirectory=ppvm-python | Pauli 传播、广义 tableau、近 Clifford 观测量与含丢失/泄漏的自定义电路采样 | 显式准备固定源码的 Python 3.12 / Rust 环境;完整原生 API 可用,成本取决于非 Clifford 分支与截断。 Heisenberg 计算倒序处理整条门和噪声链;LOST 与比特值分开;reset_state 不恢复丢失/泄漏。 非对称丢失的存活分支反作用尚未实现;开发数值对照不构成器件模型或科学验收。 | ## 外部 MCP(6 项) diff --git a/docs/integrations/evidence/ppvm-2026-11-10.json b/docs/integrations/evidence/ppvm-2026-11-10.json new file mode 100644 index 00000000..9cd140d2 --- /dev/null +++ b/docs/integrations/evidence/ppvm-2026-11-10.json @@ -0,0 +1,64 @@ +{ + "date": "2026-11-10", + "upstream": { + "url": "https://github.com/QuEraComputing/ppvm", + "version": "0.3.0", + "revision": "3cc883fd93b2475cb10c892a8a31adcc09a7579c", + "license": "Apache-2.0" + }, + "execution": { + "url": "https://github.com/xi-zhao/OpenQuantum/actions/runs/42731058813", + "head": "aa118e8927ec418b627ffca53ccba45bb881422d", + "artifactId": 13725676067, + "artifactSha256": "91432ddc8e0805a04bf0450e3175ab9af5dbf0f5f7b27c4213e4bfae2c736088", + "platform": "GitHub macos-26-arm64", + "python": "3.12.10", + "rust": "1.99.1", + "networkIsolation": "macOS sandbox-exec deny network*" + }, + "scope": "Fixed complete Python SDK with editable offline program; 46 scoped numerical, semantic and failure assertions against independent dense gates/statevectors, analytic noise expectations and discrete events. Not scientific acceptance.", + "numericalEvidence": { + "ppvm-validation.json": "64bf80adf4cdf47dfe7dd0fa05744a4ca34dad024c5d3a9c4a03df88b8c43d89", + "numerical.log": "179f4ab2809baf80306d907e0b69074f797fb5f8c26207b393d13f82371e54cf" + }, + "validationSources": [ + { + "path": "tests/fixtures/ppvm-validation.py", + "sha256": "564621248d10407e1d09cffa514193e5475a31edd9aa25673b98397ae7ce2f0f" + }, + { + "path": "tests/sdk-ecosystem-live.test.mjs", + "sha256": "64fd1fbebc4738a9ca3828b71026a13bac4c801021501ad0e5b9d5d02929e873" + } + ], + "limitations": [ + "Small CPU instances only; no scaling, speed or device calibration claim.", + "Asymmetric-loss surviving branch is intentionally recorded as an upstream approximation.", + "No Bloqade compilation, Lindbladian, Rust-only >2048-qubit or full Stim instruction coverage.", + "Sampling uses 2048 shots with a two-sided Hoeffding bound of delta=1e-6 per mean; this is a development regression, not an Acceptance Profile.", + "No Linux/Windows numerical execution, real device, installed host UI session or full public-API certification.", + "No Validator or Acceptance Profile added." + ], + "scientificValidation": "not_evaluated", + "receipt": { + "id": "ppvm-simulation", + "language": "python", + "status": "passed_scoped_engineering", + "scientificValidation": "not_evaluated", + "sourcePath": ".agents/skills/ppvm-simulation/references/native-example.py", + "sourceSha256": "7aa9a5c1f953402afc70603b85e6b23658f45dc087e56d783ebe873d4ff38b71", + "dependencyLockPath": ".agents/skills/ppvm-simulation/uv.lock", + "dependencyLockSha256": "e6a2f1d15b8af569f4bdb32662e9b52308cb5b95548b5c74741cf1445957797e", + "durableEvidenceDirectory": "docs/integrations/evidence/ppvm-2026-11-10", + "verificationSha256": "05a3bb394b8778770bd1af9041a8bc8f1ce37656308e98532ff33fc92fbe774f", + "artifacts": { + "attempt.json": "49bcee268078e161189c2e5dfedd466d570ef593bdbd965218f5cb8f547e4f3a", + "program.py": "7aa9a5c1f953402afc70603b85e6b23658f45dc087e56d783ebe873d4ff38b71", + "result.json": "ab6623746404bebdb7cea6fb26941fcf5dd00d1e622a8453bf5c3832c6dae863", + "runner.py": "4d8e55212145f22f02d8198f4582194f9aa937013038af3c543a95c6fa77e4b9", + "stderr.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "versions.json": "406acec55cea09248dce28b5322a7954201b482a3774da22958d702488eb7504" + } + } +} diff --git a/docs/integrations/evidence/ppvm-2026-11-10/attempt.json b/docs/integrations/evidence/ppvm-2026-11-10/attempt.json new file mode 100644 index 00000000..b5c7cd6f --- /dev/null +++ b/docs/integrations/evidence/ppvm-2026-11-10/attempt.json @@ -0,0 +1,7 @@ +{ + "id": "ppvm-simulation", + "startedAt": "2026-11-10T00:59:21.912Z", + "dependencyLockSha256": "e6a2f1d15b8af569f4bdb32662e9b52308cb5b95548b5c74741cf1445957797e", + "sourceSha256": "7aa9a5c1f953402afc70603b85e6b23658f45dc087e56d783ebe873d4ff38b71", + "scientificValidation": "not_evaluated" +} \ No newline at end of file diff --git a/docs/integrations/evidence/ppvm-2026-11-10/numerical.log b/docs/integrations/evidence/ppvm-2026-11-10/numerical.log new file mode 100644 index 00000000..9ad7bc11 --- /dev/null +++ b/docs/integrations/evidence/ppvm-2026-11-10/numerical.log @@ -0,0 +1 @@ +46 scoped numerical, semantic and failure checks passed; scientificValidation=not_evaluated diff --git a/docs/integrations/evidence/ppvm-2026-11-10/ppvm-validation.json b/docs/integrations/evidence/ppvm-2026-11-10/ppvm-validation.json new file mode 100644 index 00000000..128f87c8 --- /dev/null +++ b/docs/integrations/evidence/ppvm-2026-11-10/ppvm-validation.json @@ -0,0 +1,269 @@ +{ + "upstreamVersion": "0.3.0", + "status": "passed_scoped_engineering", + "checks": [ + { + "name": "tableau-dense-0.19-XI", + "actual": -6.938893903907228e-18, + "reference": 0.0, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-0.19-XI", + "actual": 0.0, + "reference": 0.0, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense-0.19-IZ", + "actual": -8.283304597789254e-17, + "reference": 5.551115123125783e-17, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-0.19-IZ", + "actual": 0.0, + "reference": 5.551115123125783e-17, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense-0.19-XX", + "actual": 0.7071067811865475, + "reference": 0.7071067811865476, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-0.19-XX", + "actual": 0.7071067811865476, + "reference": 0.7071067811865476, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense-0.19-XY", + "actual": 0.6943818538053307, + "reference": 0.6943818538053305, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-0.19-XY", + "actual": 0.6943818538053306, + "reference": 0.6943818538053305, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense-0.19-ZY", + "actual": -0.18885889497650057, + "reference": -0.18885889497650055, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-0.19-ZY", + "actual": -0.18885889497650057, + "reference": -0.18885889497650055, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense--0.61-XI", + "actual": -2.4286128663675293e-17, + "reference": 0.0, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense--0.61-XI", + "actual": 0.0, + "reference": 0.0, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense--0.61-IZ", + "actual": 0.0, + "reference": -2.7755575615628914e-17, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense--0.61-IZ", + "actual": 0.0, + "reference": -2.7755575615628914e-17, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense--0.61-XX", + "actual": 0.7071067811865476, + "reference": 0.7071067811865475, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense--0.61-XX", + "actual": 0.7071067811865476, + "reference": 0.7071067811865475, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense--0.61-XY", + "actual": 0.5795786716046509, + "reference": 0.5795786716046508, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense--0.61-XY", + "actual": 0.5795786716046509, + "reference": 0.5795786716046508, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense--0.61-ZY", + "actual": 0.5728674601004812, + "reference": 0.5728674601004812, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense--0.61-ZY", + "actual": 0.5728674601004813, + "reference": 0.5728674601004812, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense-1.17-XI", + "actual": 6.938893903907228e-18, + "reference": 5.551115123125783e-17, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-1.17-XI", + "actual": 0.0, + "reference": 5.551115123125783e-17, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense-1.17-IZ", + "actual": 0.0, + "reference": 8.326672684688674e-17, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-1.17-IZ", + "actual": 0.0, + "reference": 8.326672684688674e-17, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense-1.17-XX", + "actual": 0.7071067811865474, + "reference": 0.7071067811865475, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-1.17-XX", + "actual": 0.7071067811865476, + "reference": 0.7071067811865475, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense-1.17-XY", + "actual": 0.2758789016657027, + "reference": 0.27587890166570267, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-1.17-XY", + "actual": 0.2758789016657027, + "reference": 0.27587890166570267, + "tolerance": 1e-10 + }, + { + "name": "tableau-dense-1.17-ZY", + "actual": -0.9207505977361357, + "reference": -0.9207505977361354, + "tolerance": 1e-10 + }, + { + "name": "heisenberg-dense-1.17-ZY", + "actual": -0.9207505977361357, + "reference": -0.9207505977361354, + "tolerance": 1e-10 + }, + { + "name": "rx-then-damping-analytic", + "actual": 0.7334845671472799, + "reference": 0.7334845671472799, + "tolerance": 1e-10 + }, + { + "name": "wrong-noise-order-negative-control", + "passed": true + }, + { + "name": "state-reset-preserves-lost", + "passed": true + }, + { + "name": "full-reset-restores-lost", + "passed": true + }, + { + "name": "state-reset-preserves-leaked-pinned-one", + "passed": true + }, + { + "name": "full-reset-restores-leaked", + "passed": true + }, + { + "name": "correlated-loss-named-probability-analytic", + "actual": 0.4, + "reference": 0.4, + "tolerance": 1e-10 + }, + { + "name": "correlated-loss-trajectory-frequency", + "actual": 0.572265625, + "reference": 0.6, + "tolerance": 0.059515987500791664 + }, + { + "name": "stim-bell-record-shape-and-correlation", + "passed": true + }, + { + "name": "stim-bell-one-frequency", + "actual": 0.5029296875, + "reference": 0.5, + "tolerance": 0.059515987500791664 + }, + { + "name": "stim-fixed-seed-replay", + "passed": true + }, + { + "name": "stim-loss-is-not-bool", + "passed": true + }, + { + "name": "asymmetric-loss-survivor-approximation-detected", + "passed": true + }, + { + "name": "zero-qubit-tableau", + "rejected": "ValueError" + }, + { + "name": "python-tableau-binding-limit", + "rejected": "ValueError" + }, + { + "name": "incomplete-cnot-pair", + "rejected": "ValueError" + } + ], + "sampling": { + "shots": 2048, + "hoeffdingDeltaPerMean": 1e-06, + "tolerance": 0.059515987500791664 + }, + "limitations": [ + "Small CPU instances only; no scaling, speed or device calibration claim.", + "Asymmetric-loss surviving branch is intentionally recorded as an upstream approximation.", + "No Bloqade compilation, Lindbladian, Rust-only >2048-qubit or full Stim instruction coverage." + ], + "scientificValidation": "not_evaluated" +} diff --git a/docs/integrations/evidence/ppvm-2026-11-10/program.py b/docs/integrations/evidence/ppvm-2026-11-10/program.py new file mode 100644 index 00000000..020c029e --- /dev/null +++ b/docs/integrations/evidence/ppvm-2026-11-10/program.py @@ -0,0 +1,43 @@ +"""Editable public PPVM program; run in a new task directory after explicit setup.""" +import importlib.metadata +import json +import math +from pathlib import Path + +from ppvm import GeneralizedTableau, MeasurementResult, PauliSum + +theta, gamma, seed = 0.73, 0.23, 20261110 +# Physical order: Rx(theta), then amplitude damping. Heisenberg order reverses both. +observable = PauliSum.new(1, ["Z"]) +observable.amplitude_damping(0, gamma) +observable.rx(0, theta) +expectation = observable.overlap_with_zero() +reference = gamma + (1 - gamma) * math.cos(theta) +assert abs(expectation - reference) < 1e-10 + +state = GeneralizedTableau(2, seed=seed) +state.h(0) +state.cnot(0, 1) +bell_zz = state.expectation("ZZ") +assert abs(bell_zz - 1) < 1e-10 +state.loss_channel(1, 1.0) +state.reset_state(1) +lost = state.measure(1) +assert lost == MeasurementResult.LOST +state.reset(1) +restored = state.measure(1) +assert restored == MeasurementResult.ZERO + +result = { + "upstreamVersion": importlib.metadata.version("bloqade-ppvm"), + "parameters": {"theta": theta, "amplitudeDamping": gamma, "seed": seed}, + "zAfterRxAndDamping": expectation, + "analyticReference": reference, + "bellZZ": bell_zz, + "afterStateOnlyReset": lost.name, + "afterFullReset": restored.name, + "scope": "small public-API checks; not a hardware or performance benchmark", + "scientificValidation": "not_evaluated", +} +with Path("result.json").open("x", encoding="utf-8") as output: + output.write(json.dumps(result, indent=2) + "\n") diff --git a/docs/integrations/evidence/ppvm-2026-11-10/result.json b/docs/integrations/evidence/ppvm-2026-11-10/result.json new file mode 100644 index 00000000..3f978de3 --- /dev/null +++ b/docs/integrations/evidence/ppvm-2026-11-10/result.json @@ -0,0 +1,15 @@ +{ + "upstreamVersion": "0.3.0", + "parameters": { + "theta": 0.73, + "amplitudeDamping": 0.23, + "seed": 20261110 + }, + "zAfterRxAndDamping": 0.8037842898055502, + "analyticReference": 0.8037842898055502, + "bellZZ": 1.0, + "afterStateOnlyReset": "LOST", + "afterFullReset": "ZERO", + "scope": "small public-API checks; not a hardware or performance benchmark", + "scientificValidation": "not_evaluated" +} diff --git a/docs/integrations/evidence/ppvm-2026-11-10/runner.py b/docs/integrations/evidence/ppvm-2026-11-10/runner.py new file mode 100644 index 00000000..c8c89fa9 --- /dev/null +++ b/docs/integrations/evidence/ppvm-2026-11-10/runner.py @@ -0,0 +1,13 @@ +import importlib, importlib.metadata, json, pathlib, runpy, sys +def offline(event, args): + if event in ('socket.connect', 'socket.getaddrinfo'): + raise RuntimeError('Unexpected network access in offline SDK verification') +sys.addaudithook(offline) +if __name__ == '__main__': + program, modules = sys.argv[1], json.loads(sys.argv[2]) + sys.argv = [program] + runpy.run_path(program, run_name='__main__') + for name in modules: + importlib.import_module(name) + versions = {d.metadata['Name']: d.version for d in importlib.metadata.distributions() if d.metadata['Name']} + pathlib.Path('versions.json').write_text(json.dumps(versions, sort_keys=True)) diff --git a/docs/integrations/evidence/ppvm-2026-11-10/stderr.log b/docs/integrations/evidence/ppvm-2026-11-10/stderr.log new file mode 100644 index 00000000..e69de29b diff --git a/docs/integrations/evidence/ppvm-2026-11-10/stdout.log b/docs/integrations/evidence/ppvm-2026-11-10/stdout.log new file mode 100644 index 00000000..e69de29b diff --git a/docs/integrations/evidence/ppvm-2026-11-10/verification.json b/docs/integrations/evidence/ppvm-2026-11-10/verification.json new file mode 100644 index 00000000..700bc588 --- /dev/null +++ b/docs/integrations/evidence/ppvm-2026-11-10/verification.json @@ -0,0 +1,17 @@ +{ + "id": "ppvm-simulation", + "dependencyLockSha256": "e6a2f1d15b8af569f4bdb32662e9b52308cb5b95548b5c74741cf1445957797e", + "sourceSha256": "7aa9a5c1f953402afc70603b85e6b23658f45dc087e56d783ebe873d4ff38b71", + "networkIsolation": "macOS sandbox-exec deny network*", + "scientificValidation": "not_evaluated", + "status": "passed", + "files": { + "attempt.json": "49bcee268078e161189c2e5dfedd466d570ef593bdbd965218f5cb8f547e4f3a", + "program.py": "7aa9a5c1f953402afc70603b85e6b23658f45dc087e56d783ebe873d4ff38b71", + "result.json": "ab6623746404bebdb7cea6fb26941fcf5dd00d1e622a8453bf5c3832c6dae863", + "runner.py": "4d8e55212145f22f02d8198f4582194f9aa937013038af3c543a95c6fa77e4b9", + "stderr.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "versions.json": "406acec55cea09248dce28b5322a7954201b482a3774da22958d702488eb7504" + } +} \ No newline at end of file diff --git a/docs/integrations/evidence/ppvm-2026-11-10/versions.json b/docs/integrations/evidence/ppvm-2026-11-10/versions.json new file mode 100644 index 00000000..8577f181 --- /dev/null +++ b/docs/integrations/evidence/ppvm-2026-11-10/versions.json @@ -0,0 +1 @@ +{"PyMatching": "2.4.0", "Pygments": "2.21.0", "annotated-types": "0.8.0", "beartype": "0.23.1", "beliefmatching": "0.2.0", "bloqade-circuit": "0.15.5", "bloqade-decoders": "0.6.1", "bloqade-ppvm": "0.3.0", "contourpy": "1.4.0", "cycler": "0.12.1", "dnspython": "2.9.2", "fonttools": "4.68.0", "iniconfig": "2.3.1", "kirin-toolchain": "0.22.21", "kiwisolver": "1.5.1", "ldpc": "2.4.1", "markdown-it-py": "4.2.0", "matplotlib": "3.11.2", "mdurl": "0.1.2", "networkx": "3.7", "numpy": "2.2.6", "packaging": "26.3", "pandas": "3.1.1", "pillow": "13.0.0", "pluggy": "1.7.0", "pydantic": "2.14.3", "pydantic_core": "2.50.4", "pymongo": "4.19.0", "pyparsing": "3.3.3", "pyqrack-cpu": "1.89.0", "pytest": "9.2.0", "python-dateutil": "4.0.0", "rich": "15.0.0", "scipy": "1.18.1", "sinter": "1.16.0", "stim": "1.16.0", "tqdm": "4.70.1", "typing-inspection": "0.4.5", "typing_extensions": "4.16.0", "tzdata": "2026.6"} \ No newline at end of file diff --git a/site/index.html b/site/index.html index 6dbddca0..889da9aa 100644 --- a/site/index.html +++ b/site/index.html @@ -60,7 +60,7 @@开源开放的量子科研 AI 平台,汇聚社区的优秀软件与方法,推进可核对的研究。
开始使用