mindquantum.core.circuit

量子线路模块,通过有序地组织各种量子门,我们可以轻松地搭建出符合要求的量子线路,包括参数化量子线路。本模块还包含各种预设的量子线路以及对量子线路进行高效操作的模块。

Quantum Circuit

class mindquantum.core.circuit.Circuit(gates=None)[源代码]

量子线路模块。 量子线路包含一个或多个量子门,可以在量子模拟器中进行计算。可以通过添加量子门或另一电路的方式容易地构建量子线路。

参数:
  • gates (BasicGate, list[BasicGate]) - 可以通过单个量子门或门列表初始化量子线路。默认值:None。

样例:

>>> from mindquantum.core.circuit import Circuit
>>> from mindquantum.core.gates import RX, X
>>> circuit1 = Circuit()
>>> circuit1 += RX('a').on(0)
>>> circuit1 *= 2
>>> circuit1
q0: ──RX(a)────RX(a)──
>>> circuit2 = Circuit([X.on(0,1)])
>>> circuit3= circuit1 + circuit2
>>> assert len(circuit3) == 3
>>> circuit3.summary()
=======Circuit Summary=======
|Total number of gates  : 3.|
|Parameter gates        : 2.|
|with 1 parameters are  : a.|
|Number qubit of circuit: 2 |
=============================
>>> circuit3
q0: ──RX(a)────RX(a)────X──

q1: ────────────────────●──
property ansatz_params_name

获取线路中ansatz部分的参数名称。

返回:

list,线路中ansatz部分参数名称的list。

样例:

>>> from mindquantum.core.gates import RX, RY
>>> from mindquantum.core.circuit import Circuit
>>> circuit = Circuit(RX({'a': 1, 'b': 2}).on(0)).as_encoder()
>>> circuit += Circuit(RY('c').on(0)).as_ansatz()
>>> circuit.ansatz_params_name
['c']
append(gate)[源代码]

增加一个门。

参数:
  • gate (BasicGate) - 增加的门。

apply_value(pr)[源代码]

用输入的参数将该参数化量子线路转化为非参数量子线路。

参数:
  • pr (Union[dict, ParameterResolver]) - 应用到此线路中的参数。

返回:

Circuit,不含参线路。

样例:

>>> from mindquantum.core.gates import X, RX
>>> from mindquantum.core.circuit import Circuit
>>> circuit = Circuit()
>>> circuit += X.on(0)
>>> circuit += RX({'a': 2}).on(0)
>>> circuit = circuit.apply_value({'a': 1.5})
>>> circuit
q0: ──X────RX(3)──
as_ansatz(inplace=True)[源代码]

将该量子线路变为ansatz量子线路。

参数:
  • inplace (bool) - 是否原位设置。默认值: True

as_encoder(inplace=True)[源代码]

将该量子线路变为编码量子线路。

参数:
  • inplace (bool) - 是否原位设置。默认值: True

barrier(show=True)[源代码]

添加barrier。

参数:
  • show (bool) - 是否显示barrier。默认值:True。

compress()[源代码]

删除所有未使用的量子比特,并将量子比特映射到 range(n_qubits)

样例:

>>> from mindquantum.algorithm.library import qft
>>> qft([0, 2, 4])
q0: ──H────PS(π/2)────PS(π/4)─────────────────────────@──
              │          │                            │
q2: ──────────●──────────┼───────H────PS(π/2)─────────┼──
                         │               │            │
q4: ─────────────────────●───────────────●───────H────@──
>>> qft([0, 2, 4]).compress()
q0: ──H────PS(π/2)────PS(π/4)─────────────────────────@──
              │          │                            │
q1: ──────────●──────────┼───────H────PS(π/2)─────────┼──
                         │               │            │
q2: ─────────────────────●───────────────●───────H────@──
property encoder_params_name

获取线路中encoder部分的参数名称。

返回:

list,线路中encoder部分参数名称的list。

样例:

>>> from mindquantum.core.gates import RX, RY
>>> from mindquantum.core.circuit import Circuit
>>> circuit = Circuit(RX({'a': 1, 'b': 2}).on(0)).as_encoder()
>>> circuit += Circuit(RY('c').on(0)).as_ansatz()
>>> circuit.encoder_params_name
['a', 'b']
extend(gates)[源代码]

扩展线路。

参数:
  • gates (Union[Circuit, list[BasicGate]]) - CircuitBasicGate 的list。

get_cpp_obj(hermitian=False)[源代码]

获取线路的cpp object。

参数:
  • hermitian (bool) - 是否获取线路cpp object的hermitian版本。默认值: False

get_qs(backend='mqvector', pr=None, ket=False, seed=None)[源代码]

获取线路的最终量子态。

参数:
  • backend (str) - 使用的后端。默认值:’mqvector’。

  • pr (Union[numbers.Number, ParameterResolver, dict, numpy.ndarray]) - 线路的参数,线路含参数时提供。默认值:None。

  • ket (str) - 是否以ket格式返回量子态。默认值:False。

  • seed (int) - 模拟器的随机种子。默认值:None。

h(obj_qubits, ctrl_qubits=None)[源代码]

添加一个hadamard门。

参数:
  • obj_qubits (Union[int, list[int]]) - H 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - H 门的控制量子比特。默认值: None

property has_measure_gate

检查线路是否有测量门。

返回:

bool,线路是否有测量门。

hermitian()[源代码]

获得量子线路的厄米共轭。

样例:

>>> from mindquantum.core.circuit import Circuit
>>> from mindquantum.core.gates import RX
>>> circ = Circuit(RX({'a': 0.2}).on(0))
>>> herm_circ = circ.hermitian()
>>> print(herm_circ)
q0: ──RX(-1/5*a)──
insert(index, gates)[源代码]

在索引处插入量子门或量子线路。

参数:
  • index (int) - 用来设置门的索引。

  • gates (Union[BasicGate, list[BasicGate]]) - 需要插入的量子门。

property is_measure_end

检查线路是否以测量门结束,每个量子比特上最多有一个测量门,并且该测量门应位于该量子比特门序列的末尾。

返回:

bool,线路是否以测量门结束。

property is_noise_circuit

检查线路是否有噪声信道。

返回:

bool,线路是否有噪声信道。

matrix(pr=None, big_end=False, backend='mqvector', seed=None)[源代码]

获取线路的矩阵表示。

参数:
  • pr (ParameterResolver, dict, numpy.ndarray, list, numbers.Number) - 含参量子线路的参数。默认值: None

  • big_end (bool) - 低索引量子比特是否放置在末尾。默认值: False

  • backend (str) - 进行模拟的后端。默认值: ‘mqvector’

  • seed (int) - 生成线路矩阵的随机数,如果线路包含噪声信道。

返回:

numpy.ndarray,线路的二维复矩阵。

样例:

>>> from mindquantum.core.circuit import Circuit
>>> circuit = Circuit().rx('a',0).h(0)
>>> circuit.matrix({'a': 1.0})
array([[ 0.62054458-0.33900505j,  0.62054458-0.33900505j],
       [ 0.62054458+0.33900505j, -0.62054458-0.33900505j]])
measure(key, obj_qubit=None)[源代码]

添加一个测量门。

参数:
  • key (Union[int, str]) - 如果 obj_qubitNone ,则 key 应为int,表示要测量哪个量子比特,否则, key 应为str,表示测量门的名称。

  • obj_qubit (int) - 要测量的量子比特。默认值:None。

measure_all(suffix=None)[源代码]

测量所有量子比特。

参数:
  • suffix (str) - 添加到测量门名称中的后缀字符串。

property n_qubits

获取量子线路所使用的比特数。

no_grad()[源代码]

设置量子线路中所有不需要梯度的含参门。

parameter_resolver()[源代码]

获取整个线路的parameter resolver。

说明

因为相同的参数可以在不同的门中,并且系数可以不同,所以这个parameter resolver只返回量子线路的参数是什么,哪些参数需要梯度。显示系数的更详细的parameter resolver位于线路的每个门中。

返回:

ParameterResolver,整个线路的parameter resolver。

property parameterized

检查线路是否是含参量子线路。

返回:

bool,线路是否是含参量子线路。

property params_name

获取线路的参数名称。

返回:

list,包含参数名称的list。

样例:

>>> from mindquantum.core.gates import RX
>>> from mindquantum.core.circuit import Circuit
>>> circuit = Circuit(RX({'a': 1, 'b': 2}).on(0))
>>> circuit.params_name
['a', 'b']
phase_shift(para, obj_qubits, ctrl_qubits=None)[源代码]

添加一个PhaseShift门。

参数:
  • para (Union[dict, ParameterResolver]) - PhaseShift 门的参数。

  • obj_qubits (Union[int, list[int]]) - PhaseShift 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - PhaseShift 门的控制量子比特。默认值:None。

remove_barrier()[源代码]

移除所有barrier门。

remove_measure()[源代码]

移除所有的测量门。

remove_measure_on_qubits(qubits)[源代码]

移除某些量子比特上所有的测量门。

参数:
  • qubit (Union[int, list[int]]) - 需要删除测量门的量子比特。

样例:

>>> from mindquantum.core.circuit import UN
>>> from mindquantum.core.gates import H, Measure
>>> circ = UN(H, 3).x(0, 1).x(1, 2).measure_all()
>>> circ += H.on(0)
>>> circ += Measure('q0_1').on(0)
>>> circ.remove_measure_on_qubits(0)
q0: ──H────X────H───────────

q1: ──H────●────X────M(q1)──

q2: ──H─────────●────M(q2)──
remove_noise()[源代码]

删除量子线路中的所有噪声信道。

requires_grad()[源代码]

将量子线路中的所有含参门都设置为需要梯度。

reverse_qubits()[源代码]

将线路翻转成大端头(big endian)。

样例:

>>> from mindquantum.core.circuit import Circuit
>>> circ = Circuit().h(0).x(2, 0).y(3).x(3, 2)
>>> circ
q0: ──H────●───────

q2: ───────X────●──

q3: ──Y─────────X──
>>> circ.reverse_qubits()
q0: ──Y─────────X──

q1: ───────X────●──

q3: ──H────●───────
rx(para, obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 RX 门。

参数:
  • para (Union[dict, ParameterResolver]) - RX 门的参数。

  • obj_qubits (Union[int, list[int]]) - RX 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - RX 门的控制量子比特。默认值: None

ry(para, obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 RY 门。

参数:
  • para (Union[dict, ParameterResolver]) - RY 门的参数。

  • obj_qubits (Union[int, list[int]]) - RY 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - RY 门的控制量子比特。默认值: None

rz(para, obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 RZ 门。

参数:
  • para (Union[dict, ParameterResolver]) - RZ 门的参数。

  • obj_qubits (Union[int, list[int]]) - RZ 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - RZ 门的控制量子比特。默认值:None。

s(obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 S 门。

参数:
  • obj_qubits (Union[int, list[int]]) - S 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - S 门的控制量子比特。默认值:None。

summary(show=True)[源代码]

打印当前线路的信息,包括块的数量、门的数量、不含参门的数量、含参门的数量和参数的个数。

参数:
  • show (bool) - 是否显示信息。默认值:True。

样例:

>>> from mindquantum.core.circuit import Circuit
>>> from mindquantum.core.gates import RX, H
>>> circuit = Circuit([RX('a').on(1), H.on(1), RX('b').on(0)])
>>> circuit.summary()
=========Circuit Summary=========
|Total number of gates  : 3.    |
|Parameter gates        : 2.    |
|with 2 parameters are  : a, b. |
|Number qubit of circuit: 2     |
=================================
svg(style=None, width=None)[源代码]

在Jupyter Notebook中将当前量子线路用SVG图展示。

参数:
  • style (dict, str) - 设置svg线路的样式。目前,我们支持’official’,’light’和’dark’。默认值:None。

  • width (int, float) - 设置量子线路的最大宽度。默认值:None。

swap(obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 SWAP 门。

参数:
  • obj_qubits (Union[int, list[int]]) - SWAP 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - SWAP 门的控制量子比特。默认值: None

un(gate, maps_obj, maps_ctrl=None)[源代码]

将量子门作用于多个目标量子比特和控制量子比特,详见类 mindquantum.core.circuit.UN

参数:
  • gate (BasicGate) - 要执行的量子门。

  • maps_obj (Union[int, list[int]]) - 执行该量子门的目标量子比特。

  • maps_ctrl (Union[int, list[int]]) - 执行该量子门的控制量子比特。默认值:None。

with_noise(noise_gate=mq_gates.AmplitudeDampingChannel(0.001))[源代码]

在每个量子门后面添加一个噪声信道。

参数:
  • noise_gate (NoiseGate) - 想要添加的噪声信道。默认值:AmplitudeDampingChannel(0.001)

x(obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 X 门。

参数:
  • obj_qubits (Union[int, list[int]]) - X 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - X 门的控制量子比特。默认值:None。

xx(para, obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 XX 门。

参数:
  • para (Union[dict, ParameterResolver]) - XX 门的参数。

  • obj_qubits (Union[int, list[int]]) - XX 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - XX 门的控制量子比特。默认值:None。

y(obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 Y 门。

参数:
  • obj_qubits (Union[int, list[int]]) - Y 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - Y 门的控制量子比特。默认值:None。

yy(para, obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 YY 门。

参数:
  • para (Union[dict, ParameterResolver]) - YY 门的参数。

  • obj_qubits (Union[int, list[int]]) - YY 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - YY 门的控制量子比特。默认值:None。

z(obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 Z 门。

参数:
  • obj_qubits (Union[int, list[int]]) - Z 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - Z 门的控制量子比特。默认值:None。

zz(para, obj_qubits, ctrl_qubits=None)[源代码]

在电路中添加 ZZ 门。

参数:
  • para (Union[dict, ParameterResolver]) - ZZ 门的参数。

  • obj_qubits (Union[int, list[int]]) - ZZ 门的目标量子比特。

  • ctrl_qubits (Union[int, list[int]]) - ZZ 门的控制量子比特。默认值:None。

class mindquantum.core.circuit.SwapParts(a: Iterable, b: Iterable, maps_ctrl=None)[源代码]

交换量子线路中两个不同的部分,可以增加控制比特,也可以不加。

参数:
  • a (Iterable) - 您需要交换的第一部分。

  • b (Iterable) - 您需要交换的第二部分。

  • maps_ctrl (int, Iterable) - 通过单个量子比特或不同量子比特来控制交换,或者不加控制量子比特。默认值:None。

样例:

>>> from mindquantum.core.circuit import SwapParts
>>> SwapParts([1, 2], [3, 4], 0)
q0: ──●────●──
      │    │
q1: ──@────┼──
      │    │
q2: ──┼────@──
      │    │
q3: ──@────┼──

q4: ───────@──
class mindquantum.core.circuit.U3(theta, phi, lam, obj_qubit=None)[源代码]

该电路表示任意单量子比特门。

U3门的矩阵为:

\[\begin{split}U3(\theta, \phi, \lambda) = \begin{pmatrix} cos \left( \frac{\theta}{2} \right) & -e^{i \lambda} sin \left( \frac{\theta}{2} \\ e^{i \phi} sin \left( \frac{\theta}{2} & e^{i (\phi + \lambda)} cos \left( \frac{\theta}{2} \end{pmatrix}\end{split}\]

它可以被分解为:

\[U3(\theta, \phi, \lambda) = RZ(\phi) RX(-\pi/2) RZ(\theta) RX(\pi/2) RZ(\lambda)\]
参数:
  • theta (Union[numbers.Number, dict, ParameterResolver]) - U3电路的第一个参数。

  • phi (Union[numbers.Number, dict, ParameterResolver]) - U3电路的第二个参数。

  • lam (Union[numbers.Number, dict, ParameterResolver]) - U3电路的第三个参数。

  • obj_qubit (int) - U3电路将作用于哪个量子比特上。默认值:None。

样例:

>>> from mindquantum.core.circuit import U3
>>> U3('theta','phi','lambda')
q0: ──RZ(lambda)────RX(π/2)────RZ(theta)────RX(-π/2)────RZ(phi)──
class mindquantum.core.circuit.UN(gate: BasicGate, maps_obj, maps_ctrl=None)[源代码]

将量子门映射到多个目标量子位和控制量子位。

参数:
  • gate (BasicGate) - 量子门。

  • maps_obj (Union[int, list[int]]) - 目标量子比特。

  • maps_ctrl (Union[int, list[int]]) - 控制量子比特。默认值: None

返回:

Circuit,返回一个量子线路。

样例:

>>> from mindquantum.core.circuit import UN
>>> from mindquantum.core.gates import X
>>> circuit1 = UN(X, maps_obj = [0, 1], maps_ctrl = [2, 3])
>>> print(circuit1)
q0: ──X───────

q1: ──┼────X──
      │    │
q2: ──●────┼──

q3: ───────●──
>>> from mindquantum.core.gates import SWAP
>>> circuit2 = UN(SWAP, maps_obj =[[0, 1], [2, 3]]).x(2, 1)
>>> print(circuit2)
q0: ──@───────

q1: ──@────●──

q2: ──@────X──

q3: ──@───────
mindquantum.core.circuit.add_prefix(circuit_fn, prefix: str)[源代码]

在含参量子线路或含参量子算子(可以生成含参量子线路的函数)的参数上添加前缀。

参数:
  • circuit_fn (Union[Circuit, FunctionType, MethodType]) - 量子线路,或可以生成量子线路的函数。

  • prefix (str) - 添加到每个参数中的前缀。

返回:

Circuit,或可以生成Circuit的函数。

异常:
  • TypeError - 如果前缀不是字符串。

  • TypeError - circuit_fn 不是Circuit或者未返回Circuit。

样例:

>>> from mindquantum.algorithm.library import qft
>>> from mindquantum.core.circuit import add_prefix
>>> from mindquantum import RX, H, Circuit
>>> u = lambda qubit: Circuit([H.on(0), RX('a').on(qubit)])
>>> u1 = u(0)
>>> u2 = add_prefix(u1, 'ansatz')
>>> u3 = add_prefix(u, 'ansatz')
>>> u3 = u3(0)
>>> u2
q0: ──H────RX(ansatz_a)──
>>> u3
q0: ──H────RX(ansatz_a)──
mindquantum.core.circuit.add_suffix(circuit_fn, suffix: str)[源代码]

在含参量子线路或含参量子算子(可以生成含参量子线路的函数)的参数上添加后缀。

参数:
  • circuit_fn (Union[Circuit, FunctionType, MethodType]) - 量子线路,或可以生成量子线路的函数。

  • suffix (str) - 添加到每个参数中的后缀。

返回:

Circuit,或可以生成Circuit的函数。

异常:
  • TypeError - 如果后缀不是字符串。

  • TypeError - circuit_fn 不是Circuit或者未返回Circuit。

样例:

>>> from mindquantum.algorithm.library import qft
>>> from mindquantum.core.circuit import add_suffix
>>> from mindquantum import RX, H, Circuit
>>> u = lambda qubit: Circuit([H.on(0), RX('a').on(qubit)])
>>> u1 = u(0)
>>> u2 = add_suffix(u1, '1')
>>> u3 = add_suffix(u, '1')
>>> u3 = u3(0)
>>> u2
q0: ──H────RX(a_1)──
>>> u3
q0: ──H────RX(a_1)──
mindquantum.core.circuit.apply(circuit_fn, qubits)[源代码]

将量子线路或量子算子(可以生成量子线路的函数)作用到不同的量子比特上。

参数:
  • circuit_fn (Union[Circuit, FunctionType, MethodType]) - 量子线路,或可以生成量子线路的函数。

  • qubits (list[int]) - 要应用的新量子比特。

返回:

Circuit,或可以生成Circuit的函数。

异常:
  • TypeError - 如果量子比特不是list。

  • ValueError - 如果量子比特的任何元素为负数。

  • TypeError - 如果 circuit_fn 不是Circuit或不返回Circuit。

样例:

>>> from mindquantum.algorithm.library import qft
>>> from mindquantum.core.circuit import apply
>>> u1 = qft([0, 1])
>>> u2 = apply(u1, [1, 0])
>>> u3 = apply(qft, [1, 0])
>>> u3 = u3([0, 1])
>>> u2
q0: ──────────●───────H────@──
              │            │
q1: ──H────PS(π/2)─────────@──
>>> u3
q0: ──────────●───────H────@──
              │            │
q1: ──H────PS(π/2)─────────@──
mindquantum.core.circuit.as_ansatz(circuit_fn)[源代码]

将线路转化为ansatz线路的装饰器。

参数:
  • circuit_fn (Union[Circuit, FunctionType, MethodType]) - 量子线路,或可以生成量子线路的函数。

返回:

Function, 如果 circuit_fn 是一个返回值为 Circuit 的函数。 Circuit,如果 circuit_fn 本身就是 Circuit

样例:

>>> from mindquantum.core.circuit import as_ansatz, Circuit
>>> from mindquantum.core.gates import RX
>>> @as_ansatz
... def create_circuit():
...     circ = Circuit()
...     circ += RX('a').on(0)
...     return circ
>>> circ = create_circuit()
>>> circ.ansatz_params_name
['a']
>>> circ.as_encoder()
>>> circ.ansatz_params_name
[]
>>> circ = as_ansatz(circ)
>>> circ.ansatz_params_name
['a']
mindquantum.core.circuit.as_encoder(circuit_fn)[源代码]

将线路转化为编码线路的装饰器。

参数:
  • circuit_fn (Union[Circuit, FunctionType, MethodType]) - 量子线路,或可以生成量子线路的函数。

返回:

Function,如果 circuit_fn 是一个返回值为线路的函数。 Circuit,如果 circuit_fn 本身就是线路。

样例:

>>> from mindquantum.core.circuit import as_encoder, Circuit
>>> from mindquantum.core.gates import RX
>>> @as_encoder
... def create_circuit():
...     circ = Circuit()
...     circ += RX('a').on(0)
...     return circ
>>> circ = create_circuit()
>>> circ.encoder_params_name
['a']
>>> circ.as_ansatz()
>>> circ.encoder_params_name
[]
>>> circ = as_encoder(circ)
>>> circ.encoder_params_name
['a']
mindquantum.core.circuit.change_param_name(circuit_fn, name_map)[源代码]

更改含参量子线路或含参量子算子(可以生成含参量子线路的函数)里的参数名称。

参数:
  • circuit_fn (Union[Circuit, FunctionType, MethodType]) - 量子线路,或可以生成量子线路的函数。

  • name_map (dict) - 参数名称映射的dict。

返回:

Circuit,或可以生成Circuit的函数。

异常:
  • TypeError - 如果 name_map 不是映射。

  • TypeError - 如果 name_mapkey 不是字符串。

  • TypeError - 如果 name_mapvalue 不是字符串。

  • TypeError - 如果 circuit_fn 不是Circuit或不能返回Circuit。

样例:

>>> from mindquantum.algorithm.library import qft
>>> from mindquantum.core.circuit import change_param_name, Circuit
>>> from mindquantum.core.gates import RX, H
>>> u = lambda qubit: Circuit([H.on(0), RX('a').on(qubit)])
>>> u1 = u(0)
>>> u2 = change_param_name(u1, {'a': 'b'})
>>> u3 = change_param_name(u, {'a': 'b'})
>>> u3 = u3(0)
>>> u2
q0: ──H────RX(b)──
>>> u3
q0: ──H────RX(b)──
mindquantum.core.circuit.controlled(circuit_fn)[源代码]

在量子线路或量子算子(可以生成量子线路的函数)上添加控制量子比特。

参数:
  • circuit_fn (Union[Circuit, FunctionType, MethodType]) - 量子线路,或可以生成量子线路的函数。

返回:

可以生成Circuit的函数。

异常:
  • TypeError - circuit_fn 不是Circuit或无法返回Circuit。

样例:

>>> from mindquantum.algorithm.library import qft
>>> from mindquantum.core.circuit import controlled
>>> u1 = qft([0, 1])
>>> u2 = controlled(u1)
>>> u3 = controlled(qft)
>>> u3 = u3(2, [0, 1])
>>> u2(2)
q0: ──H────PS(π/2)─────────@──
      │       │            │
q1: ──┼───────●───────H────@──
      │       │       │    │
q2: ──●───────●───────●────●──
>>> u3
q0: ──H────PS(π/2)─────────@──
      │       │            │
q1: ──┼───────●───────H────@──
      │       │       │    │
q2: ──●───────●───────●────●──
mindquantum.core.circuit.dagger(circuit_fn)[源代码]

获取量子线路或量子算子(可以生成量子线路的函数)的共轭转置。

参数:
  • circuit_fn (Union[Circuit, FunctionType, MethodType]) - 量子线路,或可以生成量子线路的函数。

返回:

Circuit,或可以生成Circuit的函数。

异常:
  • TypeError - 如果 circuit_fn 不是Circuit或无法返回Circuit。

样例:

>>> from mindquantum.algorithm.library import qft
>>> from mindquantum.core.circuit import dagger
>>> u1 = qft([0, 1])
>>> u2 = dagger(u1)
>>> u3 = dagger(qft)
>>> u3 = u3([0, 1])
>>> u2
q0: ──@─────────PS(-π/2)────H──
      │            │
q1: ──@────H───────●───────────
>>> u3
q0: ──@─────────PS(-π/2)────H──
      │            │
q1: ──@────H───────●───────────
mindquantum.core.circuit.decompose_single_term_time_evolution(term, para)[源代码]

将时间演化门分解成基本的量子门。

这个函数只适用于只有单个泡利词的哈密顿量。 例如, \(exp^{-it\text{ham}}\)\(\text{ham}\) 只能是一个泡利词,如 \(\text{ham}=X_0 Y_1 Z_2\) 。此时,结果是 ((0, ‘X’), (1, ‘Y’), (2, ‘Z’))。 当演化时间被表示成 \(t=ax+by\) 时,参数将是 {‘x’:a, ‘y’:b}

参数:
  • term (tuple, QubitOperator) - 仅演化量子算子的哈密顿量项。

  • para (Union[dict, numbers.Number]) - 演化算子的参数。

返回:

Circuit,量子线路。

异常:
  • ValueError - 如果 term 里有多个泡利句。

  • TypeError - 如果 term 不是 map

样例:

>>> from mindquantum.core.operators import QubitOperator
>>> from mindquantum.core.circuit import decompose_single_term_time_evolution
>>> ham = QubitOperator('X0 Y1')
>>> circuit = decompose_single_term_time_evolution(ham, {'a':1})
>>> print(circuit)
q0: ─────H───────●───────────────●───────H──────
                 │               │
q1: ──RX(π/2)────X────RZ(2*a)────X────RX(7π/2)──
mindquantum.core.circuit.pauli_word_to_circuits(qubitops)[源代码]

将单泡利词的量子算子转换成量子线路。

参数:
  • qubitops (QubitOperator, Hamiltonian) - 单泡利词的量子算子。

返回:

Circuit,量子线路。

异常:
  • TypeError - 如果 qubitops 不是 HamiltonianQubitOperator

  • ValueError - 如果 qubitopsQubitOperator,但不是在 ‘origin’ 模式下。

  • ValueError - 如果 qubitops 有多个泡利词。

样例:

>>> from mindquantum.core import X
>>> from mindquantum.core.operators import QubitOperator
>>> from mindquantum.core.circuit import pauli_word_to_circuits
>>> qubitops = QubitOperator('X0 Y1')
>>> pauli_word_to_circuits(qubitops) + X(1, 0)
q0: ──X────●──

q1: ──Y────X──
mindquantum.core.circuit.shift(circ, inc)[源代码]

移动给定线路的量子比特范围。

参数:
  • circ (circuit) - 进行移位操作的电路。

  • inc (int) - 移动量子比特位的距离。

返回:

Circuit,移位后的线路。

样例:

>>> from mindquantum.core.circuit import shift, Circuit
>>> circ = Circuit().x(1, 0)
>>> circ
q0: ──●──

q1: ──X──
>>> shift(circ, 1)
q1: ──●──

q2: ──X──
mindquantum.core.circuit.qfi(circuit: Circuit, backend='mqvector')[源代码]

根据给定参数计算参数化量子线路的量子fisher信息。 量子fisher信息定义如下:

\[\text{QFI}_{i,j} = 4\text{Re}(A_{i,j} - B_{i,j})\]

其中:

\[A_{i,j} = \frac{\partial \left<\psi\right| }{\partial x_{i}} \frac{\partial \left|\psi\right> }{\partial x_{j}}\]

并且:

\[B_{i,j} = \frac{\partial \left<\psi\right| }{\partial x_i}\left|\psi\right> \left<\psi\right|\frac{\partial \left|\psi\right> }{\partial x_{j}}\]
参数:
  • circuit (Circuit) - 一个给定的参数化量子线路。

  • backend (str) - 一个受支持的量子模拟器后端。请参考 mindquantum.simulator.Simulator 的描述。默认值:’mqvector’。

返回:

Function,一个函数,该函数输入参数化量子线路的值,返回量子fisher信息。

样例:

>>> import numpy as np
>>> from mindquantum.core.circuit import qfi, Circuit
>>> circ = Circuit().rx('a', 0).ry('b', 0).rz('c', 0)
>>> qfi_ops = qfi(circ)
>>> qfi_ops(np.array([1, 2, 3]))
array([[ 1.        ,  0.        , -0.90929743],
       [ 0.        ,  0.29192658, -0.18920062],
       [-0.90929743, -0.18920062,  0.94944468]])
mindquantum.core.circuit.partial_psi_partial_psi(circuit: Circuit, backend='mqvector')[源代码]

根据给定参数化量子线路,计算如下矩阵:

\[\begin{split}A_{i,j} = \frac{\partial \left<\psi\right| }{\partial x_{i}} \frac{\partial \left|\\psi\right> }{\partial x_{j}}\end{split}\]
参数:
  • circuit (Circuit) - 一个给定的参数化量子线路。

  • backend (str) - 一个受支持的量子模拟器后端。请参考 mindquantum.simulator.Simulator 的描述。默认值:’mqvector’。

返回:

Function,一个函数,该函数输入参数化量子线路的值,返回量子态对不同参数的导数之间的内积。

样例:

>>> import numpy as np
>>> from mindquantum.core.circuit import partial_psi_partial_psi, Circuit
>>> circ = Circuit().rx('a', 0).ry('b', 0).rz('c', 0)
>>> pppp_ops = partial_psi_partial_psi(circ)
>>> pppp_ops(np.array([1, 2, 3]))
array([[ 0.25      +0.j        ,  0.        +0.13507558j,
        -0.22732436-0.08754387j],
       [ 0.        -0.13507558j,  0.25      +0.j        ,
         0.        +0.12282387j],
       [-0.22732436+0.08754387j,  0.        -0.12282387j,
         0.25      +0.j        ]])
mindquantum.core.circuit.partial_psi_psi(circuit: Circuit, backend='mqvector')[源代码]

根据给定参数化量子线路,计算如下矩阵:

\[B_i = \frac{\partial \left<\psi\right| }{\partial x_i}\left|\psi\right>\]
参数:
  • circuit (Circuit) - 一个给定的参数化量子线路。

  • backend (str) - 一个受支持的量子模拟器后端。请参考 mindquantum.simulator.Simulator 的描述。默认值:’mqvector’。

返回:

Function,一个函数,该函数输入参数化量子线路的值,返回量子态对不同参数的导数与量子态本身的内积。

样例:

>>> import numpy as np
>>> from mindquantum.core.circuit import partial_psi_psi, Circuit
>>> circ = Circuit().rx('a', 0).ry('b', 0).rz('c', 0)
>>> ppp = partial_psi_psi(circ)
>>> ppp(np.array([1, 2, 3]))
array([0.+0.j        , 0.-0.42073549j, 0.-0.11242255j])

functional

如下的操作符是对应量子线路操作符的简写。

functional

high level circuit operators

mindquantum.core.circuit.C

mindquantum.core.circuit.controlled

mindquantum.core.circuit.D

mindquantum.core.circuit.dagger

mindquantum.core.circuit.A

mindquantum.core.circuit.apply

mindquantum.core.circuit.AP

mindquantum.core.circuit.add_prefix

mindquantum.core.circuit.CPN

mindquantum.core.circuit.change_param_name