open-standards/wai/quantum-studio/README.zh-CN.md
Transaction Science 2e7a49cd7a
All checks were successful
standards workspaces build + test / which workspaces this change touches (pull_request) Successful in 10s
WAI breaking changes and the conformance runner / WAI breaking · does this change touch WAI (pull_request) Successful in 8s
WAI energy receipts / does this change touch it (pull_request) Successful in 11s
wai-quantum contract / does this change touch it (pull_request) Successful in 9s
wai-quantum contract / the policy is linked, and the deprecations page reads (pull_request) Successful in 6s
wai-quantum docs, course and locales / does this change touch it (pull_request) Successful in 8s
WAI breaking changes and the conformance runner / WAI breaking · wire, record and API against main · linux (pull_request) Successful in 33s
wai-quantum studio and desktop / does this change touch it (pull_request) Successful in 9s
wai-quantum docs, course and locales / the Studio's words in every locale · linux (pull_request) Successful in 10s
wai-quantum views in agent hosts / does this change touch it (pull_request) Successful in 8s
WAI Studio / does this change touch it (pull_request) Successful in 8s
WAI Studio / the catalogue's actions, the unit tests and the core · linux (pull_request) Successful in 1m23s
WAI breaking changes and the conformance runner / WAI breaking and conform · their tests, and the independent verifiers through wai conform · linux (pull_request) Successful in 2m27s
wai-quantum docs, course and locales / the course and the command line's languages · linux (pull_request) Successful in 2m32s
wai-quantum studio and desktop / studio · browser (pull_request) Successful in 3m41s
wai-quantum views in agent hosts / views · a scripted host (pull_request) Successful in 4m47s
wai-quantum views in agent hosts / views · the page and its engine (pull_request) Successful in 5m9s
wai-quantum contract / schemas and the committed tool lists · linux (pull_request) Successful in 6m38s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 7m18s
WAI energy receipts / energy receipts · macos (pull_request) Successful in 7m35s
wai-quantum studio and desktop / desktop app · linux (pull_request) Successful in 8m32s
wai-quantum studio and desktop / desktop app · windows (pull_request) Successful in 10m8s
wai-quantum contract / API compatibility · linux (pull_request) Successful in 12m3s
repository checks / lockfiles, advisories, tests in CI, workflow hygiene, spec and section references, public text (pull_request) Successful in 13m43s
WAI Studio / Studio in WebKit · linux (pull_request) Successful in 16m15s
wai-quantum studio and desktop / desktop app · macos (pull_request) Successful in 18m29s
WAI energy receipts / energy receipts · linux (pull_request) Successful in 28m58s
standards workspaces build + test / joule-code-rs (joule-code/joule-code-rs, joule-code-rs, linux-arm64, true) (pull_request) Successful in 8m15s
WAI Studio / Studio in Chromium and Firefox · macos (pull_request) Successful in 41m16s
wai-quantum docs, course and locales / every command and snippet in the docs · linux (pull_request) Successful in 43m34s
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Successful in 30m0s
Quantum Studio: a run on the job service whose answer is lost is sent again, safely
The Studio's runs on the job service sent each job once and gave up on
the first lost answer, of the submission or of any poll. A run now goes
under an Idempotency-Key of its own (a random UUID) to a service whose
description says it keeps keys, and is sent again under it, twice at
most, where no answer came back, so a job the service took is answered
rather than taken twice. A service that keeps no keys is sent no key,
which its CORS would refuse, and no job twice. A poll whose answer is
lost no longer ends the wait; five in a row do.

test/service.test.mjs holds each of these against a scripted fetch, and
the studio workflow runs it. The views page is unchanged: engine.js is
not among its sources, and rebuilt in CI's image it is the same bytes.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 06:27:10 -05:00

30 KiB
Raw Permalink Blame History

Quantum Studio

本文为机器辅助翻译,尚待熟练的读者审校。英文原文:README.md。

一个 OpenQASM 程序编辑器,可以在三个地方运行程序:

  • 这个浏览器:借助编译为 WebAssembly 的量子作业服务引擎,在一个 worker 中运行;
  • 这台计算机:借助以原生方式构建的同一个引擎,在桌面应用中运行;
  • 作业服务:通过 HTTP 运行。对于保存密钥的服务,每次运行都带上自己的密钥;若没有收到应答,就用同一个密钥再发送一次,因此服务已经接收的作业不会被重复接收。

在桌面应用中,你的硬件是第四个地方:你自己的某个提供方(wai-quantum providers add);运行前先向它询问估算,不免费的运行之前会显示一个对话框;凭据由应用持有,从不由页面持有。在提供方队列中的作业不会随窗口关闭而消失:“取消”会在提供方取消它,在后台等待会把它留在那里并让 Studio 可以继续使用,完成后其结果会存入历史;你的作业列出已发送的作业。在浏览器标签页中,这个切换开关只会说明此类运行须经由桌面应用或命令行进行(wai-quantum run --provider NAME),因为浏览器标签页不得持有提供方的凭据。

在桌面应用中,由其自身安装程序安装的副本会在打开时查找新版本,Studio 上方的一栏会提供它。在你选择 安装并重启 之前不会安装任何东西;只有当更新的签名能用本应用携带的密钥验证通过时,应用才会安装它。哪些副本会自我更新,见桌面应用的 README。浏览器标签页没有这一栏。

每个地方返回的都是同样的作业:请求、所用的方法及选择它的原因、结果,以及结果的回执。每次运行都会请求其判定,结果以徽章显示引擎检查所达到的级别,并附上其陈述,由回执封存;若结果来自不提供判定的主机,或运行被拒绝,其判定就在本设备上得出,并注明未经封存。Studio 以同样的方式显示它们,并在其运行所在的机器上检查每一份回执。同一个请求配上同一个种子,在每个地方都给出相同的计数。

编辑器:

  • 高亮显示 OpenQASM;

  • 补全标准门和程序自身的寄存器;

  • 在相应的行上标出引擎的诊断;

  • 随着你输入,画出线路并显示计划。

  • 让你通过线路图编辑线路(见下文);

  • 用引擎的措辞把线路读给屏幕阅读器,并把线路图保存为 SVG 或 LaTeX。

Ctrl+Enter(macOS 上为 ⌘+Enter)运行程序,Escape 取消运行。程序和运行历史保存在本设备上。“复制链接”(Copy link)把程序放进 URL 片段中,任何服务器都看不到它。

课程

课程(Course)打开量子线路课程(wai-quantum/course/):21 课,从第一个线路到资源估算,与 wai-quantum learn 运行的是同一门课程。每一课由一段简短的文字和一道练习组成:

  • 载入起始程序(Load the starter)把练习的起始程序放进编辑器;你的草稿保留在“版本”(Versions)中。
  • 检查(Check)用引擎对照练习运行编辑器中的程序(在这个浏览器中,或在桌面上以原生方式):给出每种情况的判定及其徽章,每条规则(允许的门、门的数量、T 门数、评析中的问题模式、估算的计数)以 ✓ 或 ✗ 标示,以及“已通过”或“尚未通过”。
  • 哪里出了问题?(What went wrong?)用你的语言说明读取器的诊断、判定和评析发现了什么,并在旁边附上引擎的原文。
  • 提示(Hint)逐条给出本课的提示,并附上引擎指出的“从哪里看起”。
  • 请助手给一条提示(Ask the assistant for a hint):在已连接模型时,向它请求一条提示,并告诉它不要写出程序;它回答中能通过这道练习的程序会被扣下,代码也不会显示。

这些都不会显示答案。进度(哪些课已通过、检查和提示各用了多少次)只保存在这个浏览器中,窗格上也如此注明。旁边链接了 Quantum, reconsidered,一门关于干涉与学习的课程。

链接也可以打开它:页面地址中的 #course 打开课程窗格,#course=<lesson> 则打开到那一课(#course=bell);它可以与 #qasm=… 一起使用。

语言

界面上的文字是数据:locales/<locale>/<area>.json,界面的每个部分一个文件,英文为源文本,简体中文与之并列(由 locales/index.js 汇集)。在你用页眉中的切换开关选定一种语言之前,Studio 跟随浏览器的语言;你的选择保存在这个浏览器中。宿主页面可以在挂载元素上用 data-lang 固定一种语言。引擎自身的消息(判定的陈述、诊断)保持引擎写出时的原样。中文文字为机器辅助翻译,在每个文件和页脚中均已注明,尚待熟练的读者审校。node test/locales.test.mjs 要求每种语言都具备每一个键,且占位符相同。

单步执行

线路下方的“单步执行”(Step through)在引擎的调试器上运行程序,每次执行一个门、一次测量或一次重置,在这个浏览器中进行(或在桌面上以原生方式进行)。它所用的方法对每个数值都是精确的:当每个角度都是 2π 的二进有理数倍时,用逐位精确(bit-exact)的态矢量,否则用双精度态矢量;在作业的噪声下则用密度矩阵,并在同一路径上给出无噪声态作对照。最多可单步执行 16 个量子比特,有噪声时最多 8 个;更宽的程序会被拒绝,并给出原因。

  • 滑块及其旁边的按钮用于前进和后退。后退时,程序从引擎保存的某个状态重新运行,因此同一步看两次得到的是相同的比特,其摘要也表明这一点。下一步会注明其所在的行,门则在线路图上标出。
  • 量子比特(Qubits):每个量子比特的相位圆盘(填充表示读到 1 的概率,指针表示绕 Z 轴的相位,外环表示纯度)及其 Bloch 球(一幅从一侧看去的简单图),下方附有引擎给出的数值。旁边给出前一半量子比特与其余量子比特之间的纠缠。
  • 振幅(Amplitudes):每个基态的振幅、概率和相位,概率最大的排在最前,每个都配有一个圆盘,其面积表示概率,指针表示相位。对于混合态,则给出概率。
  • 约化态(Reduced state):你勾选的量子比特的密度矩阵,每个元素按其大小以深浅着色,并附有其纯度和熵。
  • 与无噪声态对照(Against the noiseless state):有噪声时,把有噪声态的每个概率与无噪声态的相应概率并列,并给出两者之间的保真度。
  • 分支(Branches):程序中途每次测量的每个结果,以树的形式给出,每个都附有其概率和权重:对于无噪声的 Clifford 程序,这些都是精确的分数。每片叶子给出该分支上最终测量的分布。选择一个分支,路径就会走上它;若未选择,每次测量都取概率较大的结果。

显示的每个数值都来自引擎;图形只负责把它们摆放出来。

通过线路图编辑

线路图上方有一个门面板。把一个门拖到某条线上,或者先选中它再点击某个位置:它会放到那条线上(双量子比特门放在那条线及其下一条线上),位于放置点右侧所画的各门之前。把已画出的门上下拖动,可把它移到其他线上;左右拖动,可在其他门之间移动它。用键盘时,按 Tab 移到某个门:↑ 和 ↓ 在线之间移动它,← 和 → 把它移到前一个门之前或后一个门之后,Delete 删除它(“删除门”(Delete gate)也可以)。

引擎通过语法树,在程序自身的文本中完成每一次编辑,因此程序保留其名称、排版和注释。编辑器把它记录为你的编辑,就像你亲手输入的一样。不是由一条语句单独产生的门(寄存器上一次广播中的一个门、程序自定义门中的一个门,或循环中的一个门)不能在线路图上移动或删除:Studio 会指出应修改的那一行。生成器的线路取决于其输入,因此要在其文本中编辑。

线路的文字描述与文件

线路图的描述(供屏幕阅读器朗读)是引擎对线路的叙述:先是其量子比特和比特,然后是每一列,每个门及其在每个量子比特上的角色,每次测量及其比特,以及按图例写法给出的每个条件。“SVG”按引擎写出的样子保存线路图,这是一张独立的图像,颜色随其所在位置的文字颜色而变;“LaTeX”则把它保存为一幅纯 TikZ 图,只需要 \usepackage{tikz}。

“打开”(Open)接受 OpenQASM 程序,也接受 QIR(.ll、.qir)或 jeff(.jeff)文件,由引擎在页面中读取为 OpenQASM 3(engine_convert;格式说明页):程序放入编辑器,其下的一行说明格式及其版本、检查结果(程序写回原格式后再读取一次)以及读取器的每条说明及其代码。读取器拒绝的模块不会改变编辑器中的内容,状态行给出拒绝原因及其代码和位置。

设备

在设备(Device)下选择一个设备目标:内置目标之一(合成的,采用已公开格式的形态)、在此导入的目标(导入…(Import…)读取引擎能读取的任何格式的校准快照或目标快照,保存在这个浏览器中),或者在桌面应用中,用 wai-quantum targets import 保存的目标。耦合图中,每个耦合对按其双量子比特门误差着色,每个量子比特按其读出误差、单量子比特门误差或 T1 着色。颜色为同一色调的五档,按该设备自身数值的分位数划分;最差的耦合对画得更粗,每个标记在悬停时给出其数值,以表格显示(As a table)则把它们列出。选定设备后,运行会被编译为该设备的门,放置到最可能成功的量子比特和路由上,并在其噪声下模拟;噪声字段暂不起作用,因为噪声取自设备本身。计划选定的布局会在运行之前画在耦合图上。结果中的设备区块列出目标及其哈希(写入回执)、放置方式及其预期成功率(与交换次数最少的放置方式的预期成功率并列)、噪声,以及计数与理想计数相差多少。这是设备的一个模型,结果也如此注明。在作业服务上,内置目标按名称传递,其他目标则以其文档传递。

生成器

编辑器用引擎自己的读取器读取程序,每个入口用的都是这一个读取器:它覆盖 OpenQASM 3.1 的全部内容,每个问题都在其所在行上用读取器的代码([Q103])标出;engine_diagnostic_codes() 给出每个代码的含义。

声明了整数输入(input uint n;)的程序就是一个生成器:它的 for 循环和针对整数的 if 会为每个取值写出一条线路。Studio 在编辑器下方为每个输入显示一个字段,并按这些取值读取程序。lint 和评析读取的是生成器本身,因此问题或问题模式保留在生成器自身的行上。线路图、计划、运行(在这里或在作业服务上)、视角(lens)和备选方案(Alternatives)使用的则是它写出的线路。这些取值按名称保存在这个浏览器中。

工作台

工作台(Workbench)在一族线路中搜索代价最低的成员,引擎评判每一个建议。编辑器中的程序是参照。规格说明了:

  • 每个成员必须做到什么:从 |0…0⟩ 制备出相同的态,或者是同一条线路;
  • 要检查的规模(n = 3, 5, 8);
  • 允许的门,以及门可以连接任意一对量子比特,还是只能连接一条直线上的相邻量子比特;
  • 代价:评析各项度量的加权值,在各规模上求和;
  • 图上绘制的两项度量。

“开始”(Start)在每个规模上检查参照,并以它为种子建立一个存档。存档在图的每个单元中保留代价最低的已验证生成器。有三个提出者向存档写入,每项发现都注明了是谁提出的:

  • 读者:“提交编辑器中的程序”(Submit the editor's program);
  • 内置的盲目搜索:“搜索 ×100”(Search ×100),对存档中已有内容做带种子的编辑。它是一个想法必须胜过的基线;
  • 模型(在已连接模型时):“询问模型 ×3”(Ask the model ×3)。它会被告知规格,并看到已找到的代价最低者,以及引擎测得的代价。

一个建议只有在能被读取、遵守规则,并在每个规模上都通过检查时,才算通过验证。每个保留的条目都用这个浏览器的密钥封存(在桌面应用中则用应用的密钥)。点击一个点会显示它的代价、检查方式、封存签名及来源;“在编辑器中打开”(Open in editor)把它放进编辑器。存档保存在这个浏览器中,重新打开页面时会恢复。“下载”(Download)把规格及其存档并排保存(NAME.json 和 NAME.archive.json),这样 wai-quantum discover verify NAME.json 就能检查每一个封存签名。在桌面应用中,搜索还会统计所用的秒数及其进程消耗的焦耳数。

重写

线路下方的“重写”(Rewrites)列出程序所容许的、保持其含义不变的每一种重写:相互抵消的门、可以合并的旋转门、夹在两个 Hadamard 门之间而变为其共轭的门、越过与之对易的部分而移动的门、互换位置的两个门。引擎在每个重写所涉及的量子比特上检查它。指向某个重写,会在线路图上标出其涉及的门;“采纳”(Take)把它作为引擎的建议提出,与其他建议一样接受审阅;列表随程序的变化而更新。在备选方案中,与草稿是同一条线路的候选会说明草稿如何变成它:一串经过检查的重写。

编译

线路下方的“编译”(Compile)让程序依次经过引擎的各遍处理(每一遍都在其作用之处经过检查),在预算 ε 之内编译到 Clifford+T(或编译到标准门,不做任何近似),级别可为 0、1 或 2。每一遍是表中的一行:处理前后的门、CNOT、T 门和旋转门的数量,以及它的检查结果(proof、exact,或附有距离的 approximate)。表格上方的一行说明:输出与程序相差多远(不计全局相位)、预算及其在各旋转门之间的分配、在稠密酉矩阵上(最多 8 个量子比特)对照程序测得的整个输出的距离,以及用这个浏览器的密钥(在桌面应用中则用应用的密钥)封存的证书是否在此处验证通过。最后一遍之后的线路画在表格下方;选择某一遍,就画出该遍之后的线路。“使用”(Use)把编译后的程序作为引擎的建议提出,与其他建议一样接受审阅。程序一旦改动,该次编译就会被标记为过时。各遍、各级别以及如何理解 ε,见编译器页面。

编译视角下方的“估算”(Estimate)说明一台容错量子计算机在所选的物理量子比特上、在给定的错误预算(允许这次运行失败的概率)之内运行该程序需要什么。它先给出程序的逻辑计数:逻辑量子比特(包括多控制门所需的辅助量子比特)、测量、T 门、Toffoli 门和旋转门、各旋转门合成所得门序列中的 T 门,以及 T 深度和总深度;然后给出每个旋转门在预算中所占的份额及其门序列用了多少个 T 门,以及用来选择码距的码模型(对于基于门的量子比特,拟合到引擎自己的精确匹配或并查集解码器,或采用平面模型所假定的模型)。估算本身是重点:物理量子比特数、T 工厂及其占用的量子比特份额、运行时间和码距。前沿图画出所有不被其他估算在物理量子比特数和运行时间两方面同时胜过的估算,横轴为运行时间、纵轴为量子比特数,均为对数刻度,并在一张表中列出它们;指向某个点或使其获得焦点,就会读出该点。每个估算都在资源估算回执族中用这个浏览器的密钥(在桌面应用中则用应用的密钥)封存,表格下方的一行说明这些封存签名是否验证通过,以及在此处重新运行请求是否能得出每一个数字。程序一旦改动,估算就会被标记为过时。每个数字及其假设,见估算页面。

新颖之处与“发现”

引擎会说明一个程序有什么新颖之处:它是被再次找到的某个已知构造;它经由另一条路径得到某个已知结果;或者它与所比较的程序中最近的那个相距多远。已知构造包括:以链式、倍增式和扇出式构造的 GHZ 态,均匀叠加态,以及量子傅里叶变换。这个距离是结构上的,从 0(构造相同)到 1(毫无共同之处),它由引擎给出,而不是文献检索的结果。

  • 备选方案:每张卡片都说明它相对已知构造和草稿有何新颖之处。经由另一条路径得到已知结果的卡片会被标出。
  • 工作台:每个保留的生成器都标明了它是什么,其条目在显示它时还列出它在哪些代价未计入的度量上优于参照。只违反规格中的一条规则(某个门,或直线相邻的限制)、若去掉这条规则就能通过验证的候选,称为异常。它永远不会被保留:日志会说明它的代价是多少,而“去掉这条规则再试”(Try without that rule)会放宽规格,在放宽后的规格下建立一个新的存档。
  • 发现(Found)保存值得再看一眼的内容:通往已知结果的另一条路径、异常、与所比较的一切都相距甚远的已验证条目。每一项都可以在编辑器中打开、附上备注保存,或者忽略。它的计数显示有多少项被标记、多少项被保存。它保存在这个浏览器中。

你自己的方式

在“版本”下,“你自己的方式”(Your own way)说明你的各个版本是否正在向模型的建议趋同:你最新的版本在构造方式上与它们相距多远,以及程序中有多少出自模型。“独自探索一段时间”(Explore on my own for a while)会在你工作期间暂停模型:

  • 助手只提问,不提供它的程序;
  • 备选方案中的“探索”(Explore)和工作台中的“询问模型”暂停等待;
  • 你创建的版本会被记为独自完成,这一行会把它们与建议之间的距离和其余版本的距离并列。

“结束”(End)让模型重新提出建议。这一模式保存在这个浏览器中。

研究

“研究”(Study)窗格让你参与一项关于人们如何借助引擎进行设计的研究,或者为自己保留一份记录:

  • 功能(Features):Studio 的每项功能都可以关闭。在你参与研究期间,研究的条件会设定并锁定这些功能,以便每一项都能与对照组比较。
  • 载入研究方案(Load a protocol):由研究者提供给你,在产生任何数据之前就已封存。在你作出选择之前,可以看到它研究的是什么。“参与”(Take part)根据这个浏览器的密钥分配你的条件,因此条件在你开始之前就已确定。
  • 经你要求后才保存,且只保存在这个浏览器中:
    • 你应用了“改进”(Improve)给出的哪些候选,以及引擎认为其中最好的那个;
    • 你在工作台中打开了哪个保留的生成器;
    • 你关于归属感的回答(“这有多少是你的?”,五个题项,每项从 1 到 7);
    • 你在助手暂停时完成的探测任务,由引擎评分。
  • 我的记录(My record):引擎对你所做的东西和所做的事的度量,每一项都根据它们重新计算。
  • 导出我的记录(Export my record):用这个浏览器的密钥封存你的记录,保存为一个文件,交给研究者。不会发送任何内容。“退出研究”(Leave the study)会把这些功能交还给你。

你的品味

工作台中的“你的品味”(Your taste)从你自己的选择中学习你的偏好:

  • 比较两个(Compare two)显示你的档案最拿不准的两个保留生成器。引擎会证明它们作用相同,因此这一选择关乎品味,而从不关乎正确性。“选这个”(This one)记下这次选择,“关于”(About)说明选择所依据的方面:经济性、清晰性、洞见、精确性或实用性。
  • 也来自备选方案:与草稿是同一条线路的备选方案,若被整体采纳或整体拒绝,就构成两者之间的一次选择。只采纳了一部分的则不说明任何偏好。一旦档案中有了选择,“改进”就会按你的档案对其候选排序。
  • 按我的品味排序(Rank by my taste)对保留的生成器排序。每个生成器都显示其典型度(它的构造与已知构造有多接近);档案从不学习典型度,只有旋钮能把排序从典型移向新颖。排序会指出某个方面或代价在哪里把另一个生成器排在首位,以及排在前三的生成器在构造上是否比按代价排在前三的更相似。
  • 档案(Profiles):每个名称都是一份独立的档案,保存在这个浏览器中;没有任何东西会把它们合并。摘要说明档案预测对了你的多少次选择,每一次都仅根据之前的选择来预测。

版本

“版本”窗格记录程序的每一处改动及其作者:

  • 读者输入的内容归读者所有,在其停顿时、运行之前,以及其他任何东西改动程序之前记录下来;
  • 建议归其提出者所有:助手的程序、备选方案(引擎的或模型的)、从工作台打开的生成器;
  • 修正归引擎所有;
  • 示例、文件、链接或较早的运行,则记为程序的来源。

建议逐处采纳。建议的改动连同其所在的行一一列出,每处都带一个复选框,在读者作出选择之前,程序保持不变。只有被采纳的改动才会进入程序。版本会保留完整的建议以及哪些改动被采纳,因此被拒绝的建议仍然可读。

工作线。各个版本被画成若干条工作线。“打开”(Open)把一个较早的版本放进编辑器,在它之上所做的改动会开始一条独立的工作线。“并入”(Bring in)把另一条工作线的末端版本对照程序逐处展示,被采纳的改动记录为两者的合并。

出自谁之手。“谁写的”(Who wrote it)在编辑器的行号栏中标出每一行、在线路图上标出每个门出自谁之手:读者、助手、某个智能体、引擎、其来源,或者模型写出后又经读者编辑的行,这样的行出自两者之手。窗格显示每位贡献者的门和行。

在回执上。运行的请求携带编辑器中那个版本的归属记录:它的摘要,以及出自每一方之手的门和行。回执将其绑定,结果则显示“作者”(written by),以及在此处根据各版本重新计算出的归属记录。各版本保存在这个浏览器中,每个都用浏览器的密钥封存(在桌面应用中则用应用的密钥)。“下载”保存 program.qasm 和 program.history.json,可用 wai-quantum history verify program.qasm 检查。

嵌入 Studio 的页面可以用 window.quantumStudio.propose(qasm, {kind, name}, note) 把一个程序作为某人的建议提出;读者作出选择后,它即完成(resolve)。

针对建议的规则

编辑器下方的“针对建议的规则”(Rules for proposals)规定任何建议都不得改动的内容:

  • 锁定的行:“锁定选中的行”(Hold the selected lines)在程序中用 // @lock 和 // @unlock 标记它们。它们在编辑器中以底色显示,其中的门在线路图上标出。
  • 门:建议可以添加的门,以及要避免的门。
  • 量子比特:“锁定量子比特声明”(Hold the qubit declarations)。
  • 要避免的文本(Text to avoid)。
  • 一个区域:“把下一个建议限定在选中的行内”(Keep the next proposal to the selected lines),该建议一经决定即解除。

引擎会逐处对照这些规则检查每一个建议:助手的程序、备选方案、修正、来自工作台的生成器。违反规则的改动会在审阅中连同该规则一起显示,且不能被采纳。“版本”中的该版本把它记录为已阻止。每一处改动都违反规则的备选方案会被略去,并注明原因。每次请求都会把这些规则告诉模型。你自己输入的内容,你可以随意改动。

助手

“助手”(Assistant)窗格与这台机器上的语言模型对话:任何具有 chat-completions 接口和工具调用功能的服务器,例如 JouleClaw 运行时或 llama.cpp 服务器。地址填写在“模型…”(Model…)下,默认为 http://127.0.0.1:8080/v1。除非地址指向别处,否则没有任何内容离开这台机器。在桌面应用中,调用由应用自己发出,因此不会受到浏览器的源(origin)规则的阻碍。

引擎是模型的工具,而不是事后补上的附属品:

  • 它的工具就是 Studio 的引擎:读取程序、lint、绘制、计划、运行,以及说明程序有何新颖之处。它的第一轮必须调用其中之一,因此每个回答都从引擎出发。只有当引擎这样说时,它才可以称一个程序为新颖的,而且只能以引擎给出的距离来表述,而不是文献检索的结果。
  • 它提出的每个程序在提供之前都会经过检查。引擎在这里读取它。无法解析的程序会连同引擎给出的原因退回给模型一次,以便更正。能够解析的程序会按模型所用的设置运行,因此它引用的计数就是显示的计数。然后“采纳”(Apply)把它放进编辑器。
  • 每个建议都以徽章显示其判定:引擎检查它所达到的级别(被拒绝、已读取、已运行、作为证据检查、作为证明检查),并附上引擎的陈述。模型被告知要给 run_job 提供一个意图并引用判定,绝不能超出判定去称一个程序有效。
  • 它只能陈述引擎返回的数字。它的文字中若有任何工具都未返回过的数字,会被标为“不是来自运行”(Not from a run)。
  • 回答是纯文本。模型若仍写出 LaTeX,会以 Unicode 显示。

node test/assistant-live.mjs URL 让助手对接一个真实的模型服务器运行,并打印它做了什么。它不属于 CI,因为 CI 中没有模型。

托管

用 npm ci && node build.mjs 构建。它会写出 dist/:

文件 内容
studio.js 打包后的界面
worker.js 引擎的 worker
studio.css Studio 的样式
tokens.css 站点的设计令牌,供 Studio 独立运行时使用
index.html 独立运行的页面

宿主页面把 Studio 挂载到一个元素上:

<div id="studio"
     data-engine-pkg="/quantum-ide/pkg/wai_quantum_ide.js"
     data-worker="/quantum-studio/worker.js"
     data-service="/quantum-jobs"></div>
<script type="module" src="/quantum-studio/studio.js"></script>

data-embedded 告诉 Studio 宿主页面有自己的标题,这样 Studio 的名称就不会成为第二个 h1。data-lang(en 或 zh-CN)固定语言。data-engine-pkg 指定引擎的浏览器包:以 quantum_engine 特性构建的 wai-web。node build.mjs --pkg DIR 把这样的包复制到 dist/pkg/ 中,供 index.html 使用。在桌面上,存在 window.__TAURI__,Studio 会改用原生引擎。

测试

node build.mjs --pkg PATH/TO/PKG && node test/studio.test.mjs

测试在已安装的浏览器中运行 Studio:

  • 在输入程序时进行 lint、绘制和计划;
  • 在浏览器中运行,并在浏览器中检查其回执;
  • 错误标在其所在的行上;
  • 在态矢量上运行一个旋转门;
  • 同一个作业在线上的作业服务上运行,给出与这里运行相同的计数,逐次一致;
  • Ctrl+Enter;
  • 程序和历史在重新载入后保留;
  • 估算窗格:三控制门经由一个辅助量子比特计数,在所选量子比特上的估算,前沿的绘制与列表,其封存签名的验证,以及在页面中重新运行请求;
  • 助手,对接一个按脚本应答的模型服务器:在引擎上执行的工具调用,引擎无法读取的建议连同原因被退回,更正后的建议在提供之前经过检查和运行,以及“采纳”;
  • 用逐位精确的方法单步执行量子隐形传态:滑块前进再后退回到相同的比特,下一步的注明和标记,每个量子比特的 Bloch 球和相位圆盘,振幅,一个约化态,各占四分之一的四个分支,选定其中一个及其留下的态,以及有噪声态与无噪声态的对照;
  • 通过线路图编辑:从门面板拖放到某条线上的门,拖到另一条线上的门,用键盘移动和删除的门,每一项都记录为你的编辑,以及广播中的一个门被拒绝并给出其所在行;
  • 用引擎的措辞描述的线路,以及保存为 SVG 和 LaTeX 的线路图;
  • 英文的课程:载入并检查一课的起始程序,哪里出了问题,附带引擎指引的提示,答案通过并保存在浏览器中,一条规则和一个生成器的各种情况各自附有判定;
  • 课程链接(#course=bell)打开到那一课;
  • 根据浏览器语言显示的中文课程,切换到英文再切换回来,以及打开课程时在手机宽度下的布局;
  • 手机宽度下的布局。

STUDIO_SKIP_SERVICE=1 会跳过作业服务这一步。测试会把两种配色方案的截图保存在 test/screenshots/ 中。