量子线路可视化

量子线路可视化是一个用于呈现和分析量子电路的工具,它在量子计算和量子信息领域扮演着重要角色。

量子线路可视化的主要目的是通过图形化表示来理解和研究量子电路。通过直观的图像,可以更清楚地看到量子比特之间的相互作用、量子门的顺序以及量子算法的结构。

根据常用的使用场景,可视化输出主要分为 控制台终端打印输出为图片 等两大部分。

在控制台输出中,我们使用文本字符来模拟量子比特和量子门操作。 每个量子比特通常用一个小方框或者是一个字母来表示,而量子门操作则以其代表的操作名称缩写来表示,比如用"H"表示Hadamard门,用"CNOT"表示控制非门等。

量子比特之间的连接关系通过使用空格、竖线和斜线等特殊字符,例如,如果一个量子门操作作用在两个量子比特之间,我们可以在这两个量子比特之间画一条连线来表示它们之间的相互作用。这样可以清楚地看到量子比特之间是如何通过量子门进行信息交换和相互影响的。

pyqpanda中可以直接通过 printdraw_qprog 来输出和保存量子线路可视化结果

draw_qprog(prog, output=None, scale=0.7, filename=None, with_logo=False, line_length=100, NodeIter_first=None, NodeIter_second=None, console_encode_type='utf8')

draw_qprog提供了一个便捷的方式将量子线路以多种不同的视觉格式呈现,通过控制台格式化输出或保存量子线路函数,具体有以下功能

  • 文本形式 :通过使用文本图案,在控制台中显示量子线路的结构和操作序列。这种呈现方式适用于快速的调试和查看,能够以简洁的方式展示量子比特之间的连接关系和操作顺序。

  • 图像形式 :将量子线路绘制成图像,提供了更丰富的视觉信息。用户可以选择不同的图像输出格式,如PNG或SVG,以适应不同的用途。图像展示适合用于演示、教学和文档编写,可以突出量子比特之间的连接关系、量子门操作的分布以及线路的整体结构。

  • LaTeX源代码形式 :将量子线路转换为LaTeX源代码,使用户能够方便地将量子线路嵌入到LaTeX文档中。这对于学术论文、技术报告和课件制作非常有用。用户可以在文档中无缝地插入量子线路图,与其他数学和物理公式相结合,从而形成一体化的呈现方式。

参数:
  • prog (QuantumCircuit) -- 要绘制的量子线路。

  • output (str, optional) -- 指定绘制的输出格式,可选值为 "text"、"pic" 或 "latex"。默认为 None。

  • scale (float, optional) -- 绘制图像的缩放比例(如果小于1则缩小),仅在“pic”输出格式下使用。默认为 0.7。

  • filename (str, optional) -- 保存图像的文件路径,默认为 None。

  • with_logo (bool, optional) -- 是否在图像中包含标识,仅在“pic”输出格式下使用。默认为 False。

  • NodeIter_first (int, optional) -- 电路绘制的起始位置。默认为 None。

  • NodeIter_second (int, optional) -- 电路绘制的结束位置。默认为 None。

  • console_encode_type (str, optional) -- 目标控制台编码类型,支持 'utf8' 和 'gbk',仅在“pic”输出格式下使用。默认为 'utf8'。

  • line_length (int, optional) -- 设置“text”输出类型生成的行长度。默认为 100。

返回:

无返回值。

返回类型:

None

示例:

from numpy import pi
from pyqpanda import *
from pyqpanda.Visualization import circuit_draw

machine = CPUQVM()
machine.init_qvm()

qlist = machine.qAlloc_many(4)
clist = machine.cAlloc_many(4)

measure_prog = QProg()
measure_prog << hadamard_circuit(qlist) \
<< CZ(qlist[1], qlist[2]) \
<< RX(qlist[2], pi / 4) \
<< RX(qlist[1], pi / 4) \
<< CNOT(qlist[0], qlist[2]) \
<< Measure(qlist[0], clist[0])

print(measure_prog)

对于上面的一段量子程序,可以直接通过 print 输出到控制台

# 通过print直接输出量子线路字符画,该方法会在控制台输出量子线路,输出格式为utf8编码,所以在非utf8编码的控制台下,输出字符画会出现乱码情况。
# 同时,该方法会将当前量子线路字符画信息保存到文件,文件名为 “QCircuitTextPic.txt”,文件用utf8编码,并保存在当面路径下面,
# 所以用户也可以通过该文件查看量子线路信息,注意该文件要以uft8格式打开,否则会出现乱码。
print(measure_prog)

输出结果如下:

对于需要保存为图片的使用场景,可以使用 draw_qprog

draw_qprog(measure_prog, 'pic', filename='D:/test_cir_draw.png')

输出的量子线路图片效果如下:

密度矩阵

对于一些低量子比特系统而言,能够展示整个系统的量子态分布、密度矩阵分布或者Bloch轨迹,对于算法研究有很大帮助。 pyqpanda提供了类似的功能接口。

对于量子态,可以通过 state_to_density_matrix 转化为密度矩阵,参数是 量子态数组 ,可以参考如下示例。

state_to_density_matrix(quantum_state)

该函数用于将量子态转换为密度矩阵。

参数:

quantum_state (list of complex numbers) -- 要转换的量子态,以复数列表形式表示。

返回:

密度矩阵。

返回类型:

numpy.ndarray

抛出:

RuntimeError -- 如果输入不是有效的量子态。

一个简单的例子:

from pyqpanda import *
import numpy as np

machine = CPUQVM()
machine.init_qvm()
qubits = machine.qAlloc_many(3)

prog = QProg()
prog << X(qubits[0:2])\
    << Z(qubits[:2])\
    << H(qubits[:])

machine.directly_run(prog)
state = machine.get_qstate()
density_matrix = state_to_density_matrix(state)
print(density_matrix)

输出结果如下:

[[ 0.125+0.j -0.125-0.j -0.125-0.j  0.125+0.j  0.125+0.j -0.125-0.j
-0.125-0.j  0.125+0.j]
[-0.125+0.j  0.125+0.j  0.125+0.j -0.125+0.j -0.125+0.j  0.125+0.j
0.125+0.j -0.125+0.j]
[-0.125+0.j  0.125+0.j  0.125+0.j -0.125+0.j -0.125+0.j  0.125+0.j
0.125+0.j -0.125+0.j]
[ 0.125+0.j -0.125-0.j -0.125-0.j  0.125+0.j  0.125+0.j -0.125-0.j
-0.125-0.j  0.125+0.j]
[ 0.125+0.j -0.125-0.j -0.125-0.j  0.125+0.j  0.125+0.j -0.125-0.j
-0.125-0.j  0.125+0.j]
[-0.125+0.j  0.125+0.j  0.125+0.j -0.125+0.j -0.125+0.j  0.125+0.j
0.125+0.j -0.125+0.j]
[-0.125+0.j  0.125+0.j  0.125+0.j -0.125+0.j -0.125+0.j  0.125+0.j
0.125+0.j -0.125+0.j]
[ 0.125+0.j -0.125-0.j -0.125-0.j  0.125+0.j  0.125+0.j -0.125-0.j
-0.125-0.j  0.125+0.j]]

量子态分布

如果需要打印量子态的分布,可以使用 plot_state_city 接口,函数定义如下

plot_state_city(quantum_state, title='', figsize=None, color=None, ax_real=None, ax_imag=None)

该函数用于绘制量子态的立体分布图。

参数:
  • quantum_state (list of complex) -- 要绘制城市图的量子态,应为复数列表。

  • title (str, optional) -- 图的标题,默认为空字符串。

  • figsize (tuple, optional) -- 图的尺寸,格式为 (宽度, 高度),默认为 None。

  • color (str, optional) -- 图的颜色设置,默认为 None。

  • ax_real (matplotlib.axes.Axes, optional) -- 用于绘制实部的 Matplotlib 坐标轴,默认为 None。

  • ax_imag (matplotlib.axes.Axes, optional) -- 用于绘制虚部的 Matplotlib 坐标轴,默认为 None。

返回:

Matplotlib 图形对象。

返回类型:

matplotlib.figure.Figure

使用示例:

from pyqpanda import *
import numpy as np

machine = CPUQVM()
machine.set_configure(50, 50)
machine.init_qvm()
q = machine.qAlloc_many(4)
c = machine.cAlloc_many(4)
prog = QProg()
prog.insert(X(q[1]))\
    .insert(T(q[0]))\
    .insert(RX(q[1], np.pi/2))\
    .insert(RZ(q[0], np.pi/4))
machine.directly_run(prog)
result = machine.get_qstate()
plot_state_city(result)
machine.finalize()

终端会通过matplot绘制具体的量子态分布如下

../_images/plot_state_city.png

对于密度矩阵,我们可以通过 plot_density_matrix 来打印密度矩阵,函数定义如下:

plot_density_matrix(M, xlabels=None, ylabels=None, title=None, limits=None, phase_limits=None, fig=None, axis_vals=None, threshold=None)

该函数用于绘制给定量子态的密度矩阵图像,以直观地呈现量子态的结构和性质。

参数:
  • M (list of complex) -- 要绘制的量子态的复数列表(密度矩阵)。密度矩阵是量子力学中描述量子态的矩阵表示,包含了量子态的全部信息。

  • xlabels (list, optional) -- 用于自定义X轴标签的列表。每个标签对应密度矩阵的一列。默认为 None。

  • ylabels (list, optional) -- 用于自定义Y轴标签的列表。每个标签对应密度矩阵的一行。默认为 None。

  • title (str, optional) -- 图像的标题,用于指明图像的主题或特定含义。默认为 None。

  • limits (tuple, optional) -- 图像的显示范围,可控制颜色的映射范围。默认为 None。

  • phase_limits (tuple, optional) -- 相位的显示范围,用于调整相位颜色的映射范围。默认为 None。

  • fig (matplotlib.figure.Figure, optional) -- Matplotlib图像对象,用于在现有图像上绘制。默认为 None。

  • axis_vals (list, optional) -- 自定义轴的值,用于更改轴上的刻度值。默认为 None。

  • threshold (float, optional) -- 阈值,用于控制在图像中隐藏低于此值的元素。默认为 None。

返回:

Matplotlib图像对象,呈现了量子态的密度矩阵图像。

返回类型:

matplotlib.figure.Figure

使用示例:

from pyqpanda import *
import numpy as np

machine = CPUQVM()
machine.set_configure(50, 50)
machine.init_qvm()
q = machine.qAlloc_many(4)
c = machine.cAlloc_many(4)
prog = QProg()
prog.insert(X(q[1]))\
    .insert(H(q[0]))\
    .insert(H(q[1]))\
    .insert(T(q[2]))\
    .insert(RX(q[1], np.pi/2))\
    .insert(RY(q[3], np.pi/3))\
    .insert(RZ(q[0], np.pi/4))\
    .insert(RZ(q[1], np.pi))\
    .insert(RZ(q[2], np.pi))\
    .insert(RZ(q[3], np.pi))
machine.directly_run(prog)
result = machine.get_qstate()
rho = state_to_density_matrix(result)
plot_density_matrix(rho)
machine.finalize()

终端会通过matplot绘制具体的密度矩阵分布如下:

../_images/state_to_density_matrix.png

Bloch球轨迹

对于单个比特而言,有些情况下我们需要研究它的Bloch球运动轨迹,这个功能可以通过 plot_bloch_circuit 接口,函数定义如下:

plot_bloch_circuit(circuit, trace=True, saveas=None, fps=20, secs_per_gate=1)

该函数用于绘制一个量子线路的 Bloch 球视图,仅支持单量子比特。

参数:
  • circuit (QuantumCircuit) -- 要绘制的量子线路。

  • trace (bool, optional) -- 是否显示 Bloch 球轨迹。默认为 True。

  • saveas (str, optional) -- 保存图像的文件路径。默认为 None。

  • fps (int, optional) -- 动画的帧率。默认为 20。

  • secs_per_gate (int, optional) -- 每个门操作的显示时间(秒)。默认为 1。

返回:

Bloch 球视图的图像。

返回类型:

Figure

使用代码示例:

from pyqpanda import *
import numpy as np

machine = CPUQVM()
machine.set_configure(50, 50)
machine.init_qvm()
q = machine.qAlloc_many(2)
c = machine.cAlloc_many(2)
cir = QCircuit()
cir.insert(RX(q[0], np.pi/2)) \
    .insert(RZ(q[0], np.pi / 2)) \
    .insert(RZ(q[0], np.pi/6))\
    .insert(RY(q[0], np.pi/3))\
    .insert(RX(q[0], np.pi/9))
plot_bloch_circuit(cir)
machine.finalize()

终端会动态展示单个量子比特线路的Bloch轨迹如下:

../_images/bolch_cir.jpg

概率分布

在运行一个量子线路得到概率分布后,可以通过 draw_probailitydraw_probaility_dict 绘制具体的概率分布, 他们的区别是第一个函数参数是dict类型,包含量子态二进制表示与对应的概率,另一个函数参数是list,表示量子态概率数组,运行示例如下:

draw_probability(probability_dict)

该函数用于绘制量子态概率分布的字典。

参数:

probability_dict (dict) -- 要绘制的量子态概率分布字典,其中键是量子态,值是概率值。

返回:

无返回值。

返回类型:

None

一个简单的例子如下:

from pyqpanda import *

machine = CPUQVM()
machine.init_qvm()
qubits = machine.qAlloc_many(3)

prog = QProg()
prog << Z(qubits[0])\
    << X1(qubits[1])\
    << H(qubits[:2])

machine.directly_run(prog)
result_dict = machine.prob_run_dict(prog, qubits, -1)
draw_probaility_dict(result_dict)
machine.finalize()

绘制的概率分布图如下:

../_images/draw_probaility_dict.png