mindquantum.simulator.Simulator
- class mindquantum.simulator.Simulator(backend, n_qubits=None, seed=None, dtype=None, *args, **kwargs)[源代码]
模拟量子线路的量子模拟器。
- 参数:
backend (str) - 想要的后端。通过调用 get_supported_simulator() 可以返回支持的后端。
n_qubits (int) - 量子模拟器的量子比特数量。默认值:
None
。seed (int) - 模拟器的随机种子,如果为
None
,种子将由 numpy.random.randint 生成。默认值:None
。dtype (mindquantum.dtype) - 模拟器的数据类型。
- 异常:
TypeError - 如果 backend 不是str。
TypeError - 如果 n_qubits 不是int。
TypeError - 如果 seed 不是int。
ValueError - 如果不支持 backend 。
ValueError - 如果 n_qubits 为负数。
ValueError - 如果 seed 小于0或大于 \(2^23 - 1\) 。
样例:
>>> from mindquantum.algorithm.library import qft >>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqvector', 2) >>> sim.apply_circuit(qft(range(2))) >>> sim.get_qs() array([0.5+0.j, 0.5+0.j, 0.5+0.j, 0.5+0.j])
- apply_circuit(circuit, pr=None)[源代码]
在模拟器上应用量子线路。
- 参数:
circuit (Circuit) - 要应用在模拟器上的量子线路。
pr (Union[ParameterResolver, dict, numpy.ndarray, list, numbers.Number]) - 线路的ParameterResolver。如果线路不含参数,则此参数应为None。默认值:
None
。
- 返回:
MeasureResult或None,如果线路具有测量门,则返回MeasureResult,否则返回None。
样例:
>>> import numpy as np >>> from mindquantum.core.circuit import Circuit >>> from mindquantum.core.gates import H >>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqvector', 2) >>> sim.apply_circuit(Circuit().un(H, 2)) >>> sim.apply_circuit(Circuit().ry('a', 0).ry('b', 1), np.array([1.1, 2.2])) >>> sim mqvector simulator with 2 qubits (little endian). Current quantum state: -0.0721702531972066¦00⟩ -0.30090405886869676¦01⟩ 0.22178317006196263¦10⟩ 0.9246947752567126¦11⟩ >>> sim.apply_circuit(Circuit().measure(0).measure(1)) shots: 1 Keys: q1 q0│0.00 0.2 0.4 0.6 0.8 1.0 ───────────┼───────────┴───────────┴───────────┴───────────┴───────────┴ 11│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │ {'11': 1}
- apply_gate(gate, pr=None, diff=False)[源代码]
在此模拟器上应用门,可以是量子门或测量算子。
- 参数:
gate (BasicGate) - 要应用的门。
pr (Union[numbers.Number, numpy.ndarray, ParameterResolver, list]) - 含参门的参数。默认值:
None
。diff (bool) - 是否在模拟器上应用导数门。默认值:
False
。
- 返回:
int或None,如果是该门是测量门,则返回坍缩态,否则返回None。
- 异常:
TypeError - 如果 gate 不是BasicGate。
ValueError - 如果 gate 的某个量子比特大于模拟器本身的量子比特。
ValueError - 如果 gate 是含参的,但没有提供参数。
TypeError - 如果 gate 是含参的,但 pr 不是ParameterResolver。
样例:
>>> import numpy as np >>> from mindquantum.core.gates import RY, Measure >>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqvector', 1) >>> sim.apply_gate(RY('a').on(0), np.pi/2) >>> sim.get_qs() array([0.70710678+0.j, 0.70710678+0.j]) >>> sim.apply_gate(Measure().on(0)) 1 >>> sim.get_qs() array([0.+0.j, 1.+0.j])
- apply_hamiltonian(hamiltonian: Hamiltonian)[源代码]
将hamiltonian应用到模拟器上,这个hamiltonian可以是hermitian或non hermitian。
说明
应用hamiltonian后,量子态可能不是归一化量子态。
- 参数:
hamiltonian (Hamiltonian) - 想应用的hamiltonian。
样例:
>>> from mindquantum.core.circuit import Circuit >>> from mindquantum.core.operators import QubitOperator, Hamiltonian >>> from mindquantum.simulator import Simulator >>> import scipy.sparse as sp >>> sim = Simulator('mqvector', 1) >>> sim.apply_circuit(Circuit().h(0)) >>> sim.get_qs() array([0.70710678+0.j, 0.70710678+0.j]) >>> ham1 = Hamiltonian(QubitOperator('Z0')) >>> sim.apply_hamiltonian(ham1) >>> sim.get_qs() array([ 0.70710678+0.j, -0.70710678+0.j]) >>> sim.reset() >>> ham2 = Hamiltonian(sp.csr_matrix([[1, 2], [3, 4]])) >>> sim.apply_hamiltonian(ham2) >>> sim.get_qs() array([1.+0.j, 3.+0.j])
- astype(dtype, seed=None)[源代码]
将模拟器转化给定的数据类型。
说明
量子模拟器中的状态将从原始模拟器中复制。
- 参数:
dtype (mindquantum.dtype) - 新模拟器的数据类型。
seed (int) - 新模拟器的随机数种子。默认值:
None
。
- copy()[源代码]
复制模拟器。
- 返回:
模拟器,当前模拟器的副本。
样例:
>>> from mindquantum.core.gates import RX >>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqvector', 1) >>> sim.apply_gate(RX(1).on(0)) >>> sim2 = sim.copy() >>> sim2.apply_gate(RX(-1).on(0)) >>> sim2 mqvector simulator with 1 qubit (little endian). Current quantum state: 1¦0⟩
- property dtype
返回模拟器的数据类型。
- entropy()[源代码]
计算当前量子态的冯诺伊曼熵。
冯诺伊曼熵 \(S\) 的定义如下。
\[S(\rho) = -\text{tr}(\rho \ln \rho)\]其中 \(\rho\) 是密度矩阵。
- 返回:
numbers.Number,当前量子态的冯诺伊曼熵。
样例:
>>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqmatrix', 1) >>> sim.set_qs([[0.5, 0], [0, 0.5]]) >>> sim.entropy() 0.6931471805599453
- get_expectation(hamiltonian, circ_right=None, circ_left=None, simulator_left=None, pr=None)[源代码]
得到给定hamiltonian的期望。hamiltonian可能是非厄米共轭的。该方法旨在计算期望值,如下所示:
\[E = \left<\varphi\right|U_l^\dagger H U_r \left|\psi\right>\]其中 \(U_l\) 是circ_left,\(U_r\) 是circ_right,\(H\) 是hams,\(\left|\psi\right>\) 是模拟器当前的量子态,\(\left|\varphi\right>\) 是 simulator_left 的量子态。
- 参数:
hamiltonian (Hamiltonian) - 想得到期望的hamiltonian。
circ_right (Circuit) - 表示 \(U_r\) 的线路。如果为
None
,则选择空线路。默认值:None
。circ_left (Circuit) - 表示 \(U_l\) 的线路。如果为
None
,则将设置成circ_right
一样的线路。默认值:None
。simulator_left (Simulator) - 包含 \(\left|\varphi\right>\) 的模拟器。如果无,则 \(\left|\varphi\right>\) 被假定等于 \(\left|\psi\right>\)。默认值:
None
。pr (Union[Dict[str, numbers.Number], ParameterResolver]) - 线路中的参数。默认值:
None
.
- 返回:
numbers.Number,期望值。
样例:
>>> from mindquantum.core.circuit import Circuit >>> from mindquantum.core.operators import QubitOperator, Hamiltonian >>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqvector', 1) >>> sim.apply_circuit(Circuit().ry(1.2, 0)) >>> ham = Hamiltonian(QubitOperator('Z0')) >>> sim.get_expectation(ham) (0.36235775447667357+0j) >>> sim.get_expectation(ham, Circuit().rx('a', 0), Circuit().ry(2.3, 0), pr={'a': 2.4}) (-0.25463350745693886+0.8507316752782879j) >>> sim1, sim2 = Simulator('mqvector', 1), Simulator('mqvector', 1) >>> sim1.apply_circuit(Circuit().ry(1.2, 0).rx(2.4, 0)) >>> sim2.apply_circuit(Circuit().ry(1.2, 0).ry(2.3, 0)) >>> sim1.apply_hamiltonian(ham) >>> from mindquantum.simulator import inner_product >>> inner_product(sim2, sim1) (-0.25463350745693886+0.8507316752782879j)
- get_expectation_with_grad(hams, circ_right, circ_left=None, simulator_left=None, parallel_worker=None, pr_shift=False)[源代码]
获取一个返回前向值和关于线路参数梯度的函数。该方法旨在计算期望值及其梯度,如下所示:
\[E = \left<\varphi\right|U_l^\dagger H U_r \left|\psi\right>\]其中 \(U_l\) 是circ_left,\(U_r\) 是circ_right,\(H\) 是hams,\(\left|\psi\right>\) 是模拟器当前的量子态,\(\left|\varphi\right>\) 是 simulator_left 的量子态。
- 参数:
hams (Union[
Hamiltonian
, List[Hamiltonian
]]) - 需要计算期望的Hamiltonian
或者一组Hamiltonian
。circ_right (
Circuit
) - 上述 \(U_r\) 电路。circ_left (
Circuit
) - 上述 \(U_l\) 电路,默认情况下,这个线路将为None
,在这种情况下, \(U_l\) 将等于 \(U_r\) 。默认值:None
。simulator_left (
Simulator
) - 包含 \(\left|\varphi\right>\) 的模拟器。如果无,则 \(\left|\varphi\right>\) 被假定等于 \(\left|\psi\right>\)。默认值:None
。parallel_worker (int) - 并行器数目。并行器可以在并行线程中处理batch。默认值:
None
。pr_shift (bool) - 是否使用 parameter-shift rule。仅在mqvector模拟器中可用,当电路包含噪声信道时该参数将自动启用。请注意,并非所有门都适用于相同移位值 π/2,因此 FSim 门和自定义参数化门的梯度将通过有限差分法计算,差分值为 0.001。默认值:
False
。
- 返回:
GradOpsWrapper,一个包含生成梯度算子信息的梯度算子包装器。
样例:
>>> import numpy as np >>> from mindquantum.core.circuit import Circuit >>> from mindquantum.core.operators import QubitOperator, Hamiltonian >>> from mindquantum.simulator import Simulator >>> circ = Circuit().ry('a', 0) >>> ham = Hamiltonian(QubitOperator('Z0')) >>> sim = Simulator('mqvector', 1) >>> grad_ops = sim.get_expectation_with_grad(ham, circ) >>> grad_ops(np.array([1.0])) (array([[0.54030231+0.j]]), array([[[-0.84147098+0.j]]])) >>> sim1 = Simulator('mqvector', 1) >>> prep_circ = Circuit().h(0) >>> ansatz = Circuit().ry('a', 0).rz('b', 0).ry('c', 0) >>> sim1.apply_circuit(prep_circ) >>> sim2 = Simulator('mqvector', 1) >>> ham = Hamiltonian(QubitOperator("")) >>> grad_ops = sim2.get_expectation_with_grad(ham, ansatz, Circuit(), simulator_left=sim1) >>> f, g = grad_ops(np.array([7.902762e-01, 2.139225e-04, 7.795934e-01])) >>> f array([[0.99999989-7.52279618e-05j]])
- get_partial_trace(obj_qubits)[源代码]
计算当前密度矩阵的偏迹。
- 参数:
obj_qubits (Union[int, list[int]]) - 对哪些量子比特(子系统)求偏迹。
- 返回:
numpy.ndarray,密度矩阵的偏迹。
样例:
>>> from mindquantum.core.circuit import Circuit >>> from mindquantum.simulator import Simulator >>> circ = Circuit().h(0).x(1, 0) >>> sim = Simulator('mqmatrix', 2) >>> sim.apply_circuit(circ) >>> mat = sim.get_partial_trace(0) >>> mat array([[0.5-0.j, 0. -0.j], [0. +0.j, 0.5-0.j]])
- get_pure_state_vector()[源代码]
若当前密度矩阵是纯态,则获得相应的态矢量。
密度矩阵 \(\rho\) 和态矢量 \(\left| \psi \right>\) 的关系如下。
\[\rho = \left| \psi \right>\!\left< \psi \right|\]注意:态矢量 \(\left| \psi \right>\) 可能包含一个任意的全局相位 \(e^{i\phi}\)。
- 返回:
numpy.ndarray,由当前纯态密度矩阵计算出的态矢量。
样例:
>>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqmatrix', 1) >>> sim.set_qs([[0.5, 0.5], [0.5, 0.5]]) >>> sim.get_pure_state_vector() array([0.70710678+0.j, 0.70710678+0.j])
- get_qs(ket=False)[源代码]
获取模拟器的当前量子态。
- 参数:
ket (bool) - 是否以ket格式返回量子态。默认值:
False
。
- 返回:
numpy.ndarray,当前量子态。
样例:
>>> from mindquantum.algorithm.library import qft >>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqvector', 2) >>> sim.apply_circuit(qft(range(2))) >>> sim.get_qs() array([0.5+0.j, 0.5+0.j, 0.5+0.j, 0.5+0.j])
- property n_qubits
获取模拟器的量子比特数。
- 返回:
int,当前模拟器的量子比特数。
- purity()[源代码]
计算当前量子态的纯度。
纯度 \(\gamma\) 的定义如下所示。
\[\gamma \equiv \text{tr}(\rho^2)\]其中 \(\rho\) 是密度矩阵。
- 返回:
numbers.Number,当前量子态的纯度。
样例:
>>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqmatrix', 1) >>> sim.set_qs([[0.5, 0], [0, 0.5]]) >>> sim.purity() 0.5
- reset()[源代码]
将模拟器重置为0态。
样例:
>>> from mindquantum.algorithm.library import qft >>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqvector', 2) >>> sim.apply_circuit(qft(range(2))) >>> sim.reset() >>> sim.get_qs() array([1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j])
- sampling(circuit, pr=None, shots=1, seed=None)[源代码]
在线路中对测量比特进行采样。采样不会改变模拟器的量子态。
- 参数:
circuit (Circuit) - 要进行演化和采样的电路。
pr (Union[None, dict, ParameterResolver]) - 线路的parameter resolver,如果线路是含参线路则需要提供pr。默认值:
None
。shots (int) - 采样线路的次数。默认值:
1
。seed (int) - 采样的随机种子。如果为None,则种子将是随机的整数。默认值:
None
。
- 返回:
MeasureResult,采样的统计结果。
样例:
>>> from mindquantum.core.circuit import Circuit >>> from mindquantum.core.gates import Measure >>> from mindquantum.simulator import Simulator >>> circ = Circuit().ry('a', 0).ry('b', 1) >>> circ += Measure('q0_0').on(0) >>> circ += Measure('q0_1').on(0) >>> circ += Measure('q1').on(1) >>> sim = Simulator('mqvector', circ.n_qubits) >>> res = sim.sampling(circ, {'a': 1.1, 'b': 2.2}, shots=100, seed=42) >>> res shots: 100 Keys: q1 q0_1 q0_0│0.00 0.122 0.245 0.367 0.49 0.612 ──────────────────┼───────────┴───────────┴───────────┴───────────┴───────────┴ 000│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ 011│▒▒▒▒▒▒▒▒▒ │ 100│▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓ │ 111│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ │ {'000': 18, '011': 9, '100': 49, '111': 24}
- set_qs(quantum_state)[源代码]
设置模拟器的量子态。
- 参数:
quantum_state (numpy.ndarray) - 想设置的量子态。
样例:
>>> import numpy as np >>> from mindquantum.simulator import Simulator >>> sim = Simulator('mqvector', 1) >>> sim.get_qs() array([1.+0.j, 0.+0.j]) >>> sim.set_qs(np.array([1, 1])) >>> sim.get_qs() array([0.70710678+0.j, 0.70710678+0.j])