尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SymPy 量子电路绘图指南:使用 circuit_plot 与 CircuitPlot 可视化量子线路

SymPy 量子电路绘图指南:使用 circuit_plot 与 CircuitPlot 可视化量子线路 SymPy 量子电路绘图指南使用 circuit_plot 与 CircuitPlot 可视化量子线路【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympySymPy 的sympy.physics.quantum.circuitplot模块提供了基于 Matplotlib 的量子电路绘图能力只需把若干量子门Gate相乘组成电路再调用circuit_plot即可得到一张可读的量子线路图。本文以该模块的官方文档circuitplot.rst为主线结合源码逐一讲解CircuitPlot、circuit_plot、labeller、render_label等核心 API以及测量门、受控门、SWAP 门在绘图中的底层实现读完你就能在自己的 SymPy 会话中绘制出带量子位标签与初始态的电路图。模块定位与依赖circuitplot是 SymPy 量子计算子包sympy.physics.quantum中的绘图模块专门用于把由 Gate 相乘构成的电路渲染成 Matplotlib 图形。从源码 circuitplot.py 可以看到它的依赖关系电路本身是sympy.core.mul.Mul多个门的乘积或单个Gate实例门类型来自 gate.pyGate、OneQubitGate、CGate、CGateS数值与绘图分别依赖numpy与matplotlib二者通过sympy.external.import_module惰性导入。模块的__init__顶部明确说明numpy与matplotlib缺失或处于无显示环境时会抛出ImportError其中 Matplotlib 的导入特意捕获了RuntimeError因为无显示环境如纯服务器会触发该异常。因此使用本模块前请确保这两个依赖已安装。模块对外暴露的公共 API见源码中的__all__为名称说明CircuitPlot负责管理电路绘图的类封装了网格、图形、导线与门的全部绘制逻辑circuit_plot便捷函数直接返回一个CircuitPlot实例labeller为量子位自动生成导线标签render_label把标签渲染为 LaTeX 风格的 $\left|q_0\right\rangle$ 文本Mz、Mx用于绘图的 z / x 测量门占位符CreateOneQubitGate元类动态创建新的单量子位门CreateCGate函数通过闭包动态创建受控门快速上手绘制你的第一条量子电路绘制电路最直接的方式是调用circuit_plot其签名与参数在源码中的 docstring 中定义circuit_plot(c, nqubits, **kwargs)c要绘制的电路应为Gate实例的乘积Mul。注意在 SymPy 中g1 * g2表示先应用g2再应用g1与量子电路自左向右的时间顺序相反因此源码 circuitplot.py 的_gates方法使用reversed(self.circuit.args)逐个取出门保证按正确顺序绘制nqubits电路包含的量子位总数必须不小于所有门所需的最小量子位数Gate.min_qubits**kwargs透传给CircuitPlot的实例属性用于定制标签、初始态、缩放等。一个最简单的示例取自测试文件 test_circuitplot.pyfrom sympy.physics.quantum.circuitplot import circuit_plot, labeller from sympy.physics.quantum.gate import CNOT # CNOT(1,0)控制位为 1目标位为 0 c circuit_plot(CNOT(1, 0), 2, labelslabeller(2))这里CNOT(1, 0)是一个受控非门控制量子位是 1、目标量子位是 0。nqubits2表示电路有两条导线。执行后 Matplotlib 会弹出电路图两条水平导线左侧带有q_1、q_0标签控制位位置画实心圆点目标位位置画⊕符号受控 X 门的简化记号。核心类 CircuitPlot 的结构与绘制流程CircuitPlot是绘图的总指挥。构造时依次执行以下步骤见__init__与各私有方法update(kwargs)把用户传入的关键字参数直接写入实例字典作为覆盖类级默认值的配置_create_grid()用numpy.arange生成导线网格与门网格。导线位于y 0, scale, 2*scale, ...门位于x 0, scale, 2*scale, ...scale默认1.0_create_figure()按(ngates*scale, nqubits*scale)创建 Matplotlib 图形关闭坐标轴显示设置aspectequal_plot_wires()逐条绘制水平导线并在导线左端用render_label写出标签_plot_gates()遍历门列表调用每个门的plot_gate(self, gate_idx)完成绘制_finish()关闭所有对象的裁剪clip使大电路平移缩放更顺滑。类级可配置属性及其默认值见 circuitplot.py属性默认值作用scale1.0网格与图形尺寸的整体缩放fontsize20.0标签与门名文本字号linewidth1.0导线与图形线条宽度control_radius0.05控制点实心圆半径not_radius0.15NOT 门⊕空心圆半径swap_delta0.05SWAP 叉号对角线长度labels[]导线标签列表labels[i]对应第 i 根导线inits{}导线初始态字典如{q0: 0}label_buffer0.5标签与第一条导线起点的水平间距这些默认值均可通过circuit_plot(..., scale2.0, fontsize14)之类的关键字参数覆盖。门级绘制从图元到完整电路CircuitPlot本身只提供图元绘制方法具体某个门长什么样由门的plot_gate决定动态分派见 gate.py。单量子位门方框文本OneQubitGate.plot_gate调用circ_plot.one_qubit_box(...)即在目标导线上画一个带黑色边框、白色填充的方框框内是门的名称文本如H、X、S、T。UGate等其他单比特门同理。受控门控制线与控制点CGate.plot_gate的流程是计算控制位与目标位的最小、最大导线编号调用control_line画一条竖直控制线连接这些导线在每个控制位上画实心控制点control_point目标门按自身类型绘制。关键开关是simplify_cgateCGateS将其置为True源码第 491-495 行当它为真时受控 X 门会调用XGate.plot_gate_plus画出经典的⊕not_point受控 Z 门则直接在目标位画控制点否则目标门退化为普通方框绘制。测试文件 test_circuitplot.py 中的test_cnot正是验证了这一路径能正常渲染。SWAP 门交叉记号SwapGate.plot_gateSWAP的底层类先在两条目标导线间画竖直控制线再在两端各画一个×swap_point。测量门导线加倍Mz与Mx是模块自定义的测量门占位符非真实量子门仅用于绘图设置了measurement True。CircuitPlot._measurements会收集每条被测导线及对应的测量门下标_plot_measured_wires随后把被测后的导线向下平移dy 0.04画一条加倍的粗化导线并同步把该导线上后续受控门的控制线也偏移以符合常见的测量后双线表示。测试 test_qasm.py 也导入了Mz说明测量门占位符在解析流程中同样被复用。标签与初始态渲染labeller(n, symbolq)用于生成导线标签 from sympy.physics.quantum.circuitplot import labeller labeller(2) [q_1, q_0] labeller(3, j) [j_2, j_1, j_0]注意顺序labeller按量子位编号从大到小排列q_1, q_0这对应电路图中顶部导线是最高位。render_label(label, inits{})把标签渲染成 LaTeX 风格文本并支持附加初始态 from sympy.physics.quantum.circuitplot import render_label render_label(q0) $\\left|q0\\right\\rangle$ render_label(q0, {q0: 0}) $\\left|q0\\right\\rangle\\left|0\\right\\rangle$对应地在circuit_plot中可传入labelslabeller(2)与inits{q_1: 0, q_0: 1}显示每个量子位的初始态有初始态时标签左侧会额外空出0.25的缓冲见_plot_wires。动态创建自定义门模块提供了两个工具用于快速定义绘图专用的新门例如你只需要它画成方框不关心它的酉矩阵实现from sympy.physics.quantum.circuitplot import CreateOneQubitGate, CreateCGate # 元类方式创建单量子位门 Q Qgate CreateOneQubitGate(Q) str(Qgate(0)) # Q(0) # 闭包方式创建受控门 CQ返回的函数接收 (controls, target) CQ CreateCGate(Q) str(CQ([1], 0)) # C((1),Q(0))CreateOneQubitGate是元类动态生成继承自OneQubitGate的新门类gate_name与gate_name_latex由传入名称及可选 LaTeX 名填充CreateCGate用闭包返回ControlledGate(ctrls, target)内部委托给CGate(tuple(ctrls), onequbitgate(target))。这两个工具的行为均有对应测试test_create1、test_createc。完整示例三量子位电路综合测试 test_circuitplot.py 中的test_ex4可以绘制一个包含 Hadamard、受控 S、受控 T 与 SWAP 的三量子位电路from sympy.physics.quantum.circuitplot import circuit_plot, labeller from sympy.physics.quantum.gate import CNOT, H, SWAP, CGate, S, T c circuit_plot( SWAP(0, 2) * H(0) * CGate((0,), S(1)) * H(1) * CGate((0,), T(2)) * CGate((1,), S(2)) * H(2), 3, labelslabeller(3, j), )该电路共 7 个门、3 根导线标签为[j_2, j_1, j_0]。运行后会看到三条导线从左到右依次经过 H 方框、受控 S/T 的控制点与方框以及 SWAP 的交叉记号——这正是把量子门乘积变成可读电路图的完整演示。已知限制模块源码 docstring 明确列出了待办事项使用时需要知晓这些边界大电路的打印性能尚未优化单个门非Mul虽然_gates中做了处理但整体支持有限docstring 标注get this to work with single gates尚不能绘制多目标门multi-target gates初始态与末态ket 态绘制未实现测量门的绘制属于占位方案官方认为可能需要重新设计测量在门体系中的位置scale与figsize的协调方式有待改进。此外two_qubit_box方法目前仅打印网格坐标尚未真正绘制双比特门方框docstring 中标注Does not work yet因此绘制多比特门时请依赖CGate/SWAP这类自带plot_gate的门类型。小结sympy.physics.quantum.circuitplot提供了一条从符号电路到图形的捷径用labeller生成标签、用circuit_plot一行绘图、用inits标注初始态、用Mz/Mx表示测量、用CreateOneQubitGate/CreateCGate扩展自定义门。其实现以CircuitPlot为总控、以各Gate的plot_gate为分派点辅以 Matplotlib 图元构成了一个轻量但可扩展的量子电路可视化方案。对于需要把 SymPy 量子计算表达式渲染为论文插图或教学示意图的场景这是一个开箱即用的选择。【免费下载链接】sympyA computer algebra system written in pure Python项目地址: https://gitcode.com/GitHub_Trending/sy/sympy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表