噪声 -- NoiseModel, QuantumError, NoiseOpType
pyqpanda3 中噪声建模的 API 参考。噪声框架通过在量子操作上应用错误信道来模拟真实的量子硬件。
NoiseModel
管理模拟期间应用的量子错误和读出错误的集合。
签名
class NoiseModel:
def __init__() -> None方法
NoiseModel.is_enabled
is_enabled() -> bool检查噪声模型是否包含任何错误。
NoiseModel.copy / copy / deepcopy
copy() -> NoiseModel0.5.0 新增:copy() 返回独立的浅拷贝,且模型实现了 copy 与 deepcopy 协议,copy.copy(model) 与 copy.deepcopy(model) 均按预期工作。
import copy
from pyqpanda3.core import NoiseModel
model = NoiseModel()
model.add_read_out_error([[0.9, 0.1], [0.2, 0.8]], 0)
duplicate = copy.deepcopy(model)
snapshot = model.copy()
print(duplicate is not model, snapshot is not model)运行结果:
True True约定(0.5.0):Kraus 算符矩阵为行主序、读出矩阵按
M[true][measured]索引、量子误差作用于其所附着指令之后、按量子比特的局部误差覆盖默认误差而非与之复合。
NoiseModel.add_read_out_error
add_read_out_error(probs: list[list[float]], qubit: int) -> None| 参数 | 类型 | 说明 |
|---|---|---|
| probs | list[list[float]] | 混淆矩阵 M 按 M[true][measured] 索引(0.5.0 起):元素 [i][j] 为真实状态为 i 时记录到结果 j 的概率,即行索引为真实态、列索引为测量结果。 |
| qubit | int | 应用读出错误的量子比特索引 |
NoiseModel.add_all_qubit_read_out_error
add_all_qubit_read_out_error(probs: list[list[float]]) -> None| 参数 | 类型 | 说明 |
|---|---|---|
| probs | list[list[float]] | 混淆矩阵 M 按 M[true][measured] 索引(0.5.0 起):元素 [i][j] 为真实状态为 i 时记录到结果 j 的概率,即行索引为真实态、列索引为测量结果。 |
NoiseModel.add_quantum_error(指定量子比特)
add_quantum_error(error: QuantumError, gate_type: GateType, qubits: list[int]) -> None
add_quantum_error(error: QuantumError, gate_types: list[GateType], qubits: list[int]) -> None| 参数 | 类型 | 说明 |
|---|---|---|
| error | QuantumError | 要添加的量子错误 |
| gate_type(s) | GateType 或 list[GateType] | 应用错误的门类型 |
| qubits | list[int] | 应用错误的量子比特索引 |
NoiseModel.add_all_qubit_quantum_error
add_all_qubit_quantum_error(error: QuantumError, gate_type: GateType) -> None
add_all_qubit_quantum_error(error: QuantumError, gate_types: list[GateType]) -> None| 参数 | 类型 | 说明 |
|---|---|---|
| error | QuantumError | 要添加的量子错误 |
| gate_type(s) | GateType 或 list[GateType] | 应用错误的门类型 |
示例
from pyqpanda3.core import (
NoiseModel, GateType,
pauli_x_error, depolarizing_error,
CPUQVM, QProg, H, CNOT, measure
)
# 创建噪声模型
model = NoiseModel()
# 向所有 H 门添加单量子比特去极化噪声
model.add_all_qubit_quantum_error(depolarizing_error(0.01), GateType.H)
# 向所有 CNOT 门添加双量子比特泡利-X 噪声
model.add_all_qubit_quantum_error(pauli_x_error(0.02), GateType.CNOT)
# 含噪声运行
qvm = CPUQVM()
prog = QProg()
prog << H(0) << CNOT(0, 1) << measure(0, 0) << measure(1, 1)
qvm.run(prog, 1000, model)
print(qvm.result().get_counts())运行结果(示例输出,每次运行结果不同):
{'01': 18, '00': 481, '10': 18, '11': 483}QuantumError
表示量子错误信道,可以通过 Kraus 矩阵或泡利错误概率指定。
签名
class QuantumError:
def __init__() -> None
def __init__(karus_matrices: list[list[complex]]) -> None
def __init__(probabilities: dict[str, float]) -> None| 参数 | 类型 | 说明 |
|---|---|---|
| karus_matrices | list[list[complex]] | Kraus 矩阵。每个内部列表是一个展平的(按行主序)矩阵,例如 2x2 Kraus 算符变为 [a, b, c, d] |
| probabilities | dict[str, float] | 泡利错误标签和概率(例如 {"X": 0.01}) |
方法
QuantumError.tensor
tensor(quantum_error: QuantumError) -> QuantumError| 参数 | 类型 | 说明 |
|---|---|---|
| quantum_error | QuantumError | 要进行张量积操作的量子错误 |
与另一个量子错误进行张量积操作。
QuantumError.expand
expand(quantum_error: QuantumError) -> QuantumError| 参数 | 类型 | 说明 |
|---|---|---|
| quantum_error | QuantumError | 要扩展的量子错误 |
将错误扩展到更大的量子比特系统。
QuantumError.compose
compose(quantum_error: QuantumError) -> QuantumError| 参数 | 类型 | 说明 |
|---|---|---|
| quantum_error | QuantumError | 要组合的量子错误 |
将错误与另一个量子错误组合。
QuantumError.qubit_num
qubit_num() -> int错误影响的量子比特数。
QuantumError.error_type
error_type() -> NoiseOpType错误表示的类型(Kraus 矩阵或噪声线路)。
QuantumError.error_circuit
error_circuit(qubits: list[int]) -> QCircuit| 参数 | 类型 | 说明 |
|---|---|---|
| qubits | list[int] | 应用错误线路的量子比特索引 |
错误的线路表示。
QuantumError.error_karus
error_karus(qubits: list[int]) -> Karus| 参数 | 类型 | 说明 |
|---|---|---|
| qubits | list[int] | 获取 Kraus 矩阵的量子比特索引 |
错误的 Kraus 矩阵表示。返回的 Karus 对象是一个 C++ 类型,在 Python 端的互操作性有限。注意:此方法对 KARUS_MATRIICES 类型(通过 Kraus 矩阵创建)的错误能正确工作,但对 NOISE 类型(通过泡利概率或工厂函数如 depolarizing_error 创建)的错误会导致挂起。
Karus
Karus 封装了一组 Kraus 算符及其作用的量子比特,用于噪声信道表示。用户通常通过 QuantumError.error_karus(qubits) 获取该对象,也可以直接构造。
签名
class Karus:
def __init__(qubits: list[int], matrices: list[list[complex]])
def remap(remap_qubits: list[int]) -> Karus
def remap(remap_qubits: dict[int, int]) -> Karus
def qubits() -> list[int]
def karus_matrices() -> list[list[complex]]Karus.init
Karus(qubits: list[int], matrices: list[list[complex]])从显式的量子比特索引和 Kraus 矩阵列表构造 Kraus 信道。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
| qubits | list[int] | 信道作用的物理量子比特索引。 |
| matrices | list[list[complex]] | 展平的 Kraus 算符列表。每个内部列表是一个按行主序展平的矩阵,对于 n 量子比特信道,长度为 4^n。 |
Karus.remap(按列表)
Karus.remap(remap_qubits: list[int]) -> Karus使用索引表重映射此 Kraus 信道的量子比特。当前量子比特索引 i 被替换为 remap_qubits[i]。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
| remap_qubits | list[int] | 旧量子比特索引到新索引的映射表。 |
返回
重映射后自身的引用。
Karus.remap(按字典)
Karus.remap(remap_qubits: dict[int, int]) -> Karus使用字典重映射此 Kraus 信道的量子比特。字典中未出现的量子比特保持不变。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
| remap_qubits | dict[int, int] | 旧量子比特索引到新索引的映射字典。 |
返回
重映射后自身的引用。
Karus.qubits
Karus.qubits() -> list[int]返回此 Kraus 信道作用的量子比特索引。
返回
与 Kraus 矩阵关联的量子比特索引列表。
Karus.karus_matrices
Karus.karus_matrices() -> list[list[complex]]返回展平的 Kraus 矩阵。
返回
此信道存储的展平 Kraus 矩阵列表。
示例
from pyqpanda3.core import Karus, QuantumError, depolarizing_error
# 直接构造
k = Karus([0], [[1+0j, 0j, 0j, 1+0j]])
print(k.qubits()) # [0]
print(len(k.karus_matrices())) # 1
# 通过 QuantumError 获取
err = depolarizing_error(0.01)
k2 = err.error_karus([2])
print(k2.qubits()) # [2]
# 重映射量子比特
k2.remap({2: 5})
print(k2.qubits()) # [5]NoiseOpType
噪声操作表示类型的枚举。
| 值 | 说明 |
|---|---|
KARUS_MATRIICES | 通过 Kraus 矩阵表示的错误 |
NOISE | 通过噪声线路表示的错误 |
错误工厂函数
pauli_x_error
pauli_x_error(prob: float) -> QuantumError| 参数 | 类型 | 说明 |
|---|---|---|
| prob | float | 泡利-X 错误的概率 |
创建单量子比特泡利-X(比特翻转)错误信道。以概率
pauli_y_error
pauli_y_error(prob: float) -> QuantumError创建泡利-Y(比特相位翻转)错误信道。
pauli_z_error
pauli_z_error(prob: float) -> QuantumError创建泡利-Z(相位翻转)错误信道。
depolarizing_error
depolarizing_error(prob: float) -> QuantumError创建去极化错误信道。以概率
amplitude_damping_error
amplitude_damping_error(prob: float) -> QuantumError创建振幅阻尼(T1 弛豫)错误信道,模拟能量耗散。
其中
phase_damping_error
phase_damping_error(prob: float) -> QuantumError创建相位阻尼(T2 去相位)错误信道,模拟相位相干性的损失。
decoherence_error
decoherence_error(T1: float, T2: float, time_param: float) -> QuantumError| 参数 | 类型 | 说明 |
|---|---|---|
| T1 | float | T1(振幅阻尼)弛豫时间 |
| T2 | float | T2(相位阻尼)去相位时间 |
| time_param | float | 门操作时间 |
创建组合退相干错误,同时模拟 T1(振幅阻尼)和 T2(相位阻尼)过程。