بناء نماذج الضوضاء
إصدارات الحزم
الكود في هذه الصفحة تم تطويره باستخدام المتطلبات التالية. نوصي باستخدام هذه الإصدارات أو أحدث منها.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
qiskit-aer~=0.17
تُوضح هذه الصفحة كيفية استخدام وحدة noise في Qiskit Aer لبناء نماذج ضوضاء لمحاكاة الدوائر الكمية في ظل وجود أخطاء. يُفيد ذلك في محاكاة المعالجات الكمية الضوضائية ودراسة تأثير الضوضاء على تنفيذ الخوارزميات الكمية.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import Kraus, SuperOp
from qiskit.visualization import plot_histogram
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_aer import AerSimulator
# Import from Qiskit Aer noise module
from qiskit_aer.noise import (
NoiseModel,
QuantumError,
ReadoutError,
depolarizing_error,
pauli_error,
thermal_relaxation_error,
)
وحدة noise في Qiskit Aer
تحتوي وحدة noise في Qiskit Aer على فئات Python لبناء نماذج ضوضاء مخصصة للمحاكاة. هناك ثلاث فئات رئيسية:
-
فئة
NoiseModelالتي تخزّن نموذج الضوضاء المستخدم في المحاكاة الضوضائية. -
فئة
QuantumErrorالتي تصف أخطاء البوابات من نوع CPTP. ويمكن تطبيقها:- بعد تعليمات البوابة أو إعادة الضبط
- قبل تعليمات القياس.
-
فئة
ReadoutErrorالتي تصف أخطاء القراءة الكلاسيكية.
تهيئة نموذج ضوضاء من Backend
يمكنك تهيئة نموذج ضوضاء بمعاملات مُحدَّدة من أحدث بيانات المعايرة لـ Backend فيزيائي:
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.backend("ibm_fez")
noise_model = NoiseModel.from_backend(backend)
سيُنتج هذا نموذج ضوضاء يُقرِّب تقريباً الأخطاء التي ستواجهها عند استخدام ذلك الـ Backend. إذا أردت تحكماً أكثر تفصيلاً في معاملات نموذج الضوضاء، فستحتاج إلى إنشاء نموذجك الخاص كما هو موضح في بقية هذه الصفحة.
الأخطاء الكمية
بدلاً من التعامل مع كائن QuantumError مباشرةً، تتوفر العديد من الدوال المساعدة لإنشاء نوع محدد من أخطاء الكم المعلمة تلقائياً. وهي موجودة في وحدة noise وتشمل دوالاً لأنواع الأخطاء الشائعة في أبحاث الحوسبة الكمية. أسماء الدوال ونوع الخطأ الذي تُعيده هي:
| دالة الخطأ القياسية | التفاصيل |
|---|---|
kraus_error | قناة خطأ CPTP عامة لـ n-Qubit تُعطى كقائمة من مصفوفات Kraus . |
mixed_unitary_error | خطأ موحد مختلط لـ n-Qubit يُعطى كقائمة من المصفوفات الموحدة والاحتمالات . |
coherent_unitary_error | خطأ موحد متماسك لـ n-Qubit يُعطى كمصفوفة موحدة واحدة . |
pauli_error | قناة خطأ Pauli لـ n-Qubit (موحدة مختلطة) تُعطى كقائمة من عوامل Pauli والاحتمالات |
depolarizing_error | قناة خطأ إزالة الاستقطاب لـ n-Qubit مُعلمَنة باحتمال إزالة الاستقطاب . |
reset_error | خطأ إعادة ضبط Qubit واحد مُعلمَن باحتمالات لإعادة الضبط إلى حالة ، . |
thermal_relaxation_error | قناة استرخاء حراري لـ Qubit واحد مُعلمَنة بثوابت زمن الاسترخاء ، ، وزمن البوابة ، وعدد السكان الحرارية للحالة المثارة . |
phase_amplitude_damping_error | قناة خطأ تخميد الطور والسعة المُعمَّمة لـ Qubit واحد تُعطى بمعامل ت خميد السعة ، ومعامل تخميد الطور ، وعدد السكان الحرارية للحالة المثارة . |
amplitude_damping_error | قناة خطأ تخميد السعة المُعمَّمة لـ Qubit واحد تُ عطى بمعامل تخميد السعة ، وعدد السكان الحرارية للحالة المثارة . |
phase_damping_error | قناة خطأ تخميد الطور لـ Qubit واحد تُعطى بمعامل تخميد الطور . |
دمج الأخطاء الكمية
يمكن دمج كائنات QuantumError باستخدام التركيب وحاصل الضرب التنسوري وتوسيع التنسور (حاصل الضرب التنسوري بترتيب معكوس) لإنتاج QuantumErrors جديدة كما يلي:
- التركيب: باستخدام
error = error1.compose(error2) - حاصل الضرب التنسوري: باستخدام
error = error1.tensor(error2) - توسيع الضرب: باستخدام
error = error1.expand(error2)
مثال
لبناء خطأ قلب بت بنسبة 5% لـ Qubit واحد:
# Construct a 1-qubit bit-flip and phase-flip errors
p_error = 0.05
bit_flip = pauli_error([("X", p_error), ("I", 1 - p_error)])
phase_flip = pauli_error([("Z", p_error), ("I", 1 - p_error)])
print(bit_flip)
print(phase_flip)
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.05, Circuit =
┌───┐
q: ┤ X ├
└───┘
P(1) = 0.95, Circuit =
┌───┐
q: ┤ I ├
└───┘
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.05, Circuit =
┌───┐
q: ┤ Z ├
└───┘
P(1) = 0.95, Circuit =
┌───┐
q: ┤ I ├
└───┘
# Compose two bit-flip and phase-flip errors
bitphase_flip = bit_flip.compose(phase_flip)
print(bitphase_flip)
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.0025000000000000005, Circuit =
┌───┐┌───┐
q: ┤ X ├┤ Z ├
└───┘└───┘
P(1) = 0.0475, Circuit =
┌───┐┌───┐
q: ┤ X ├┤ I ├
└───┘└───┘
P(2) = 0.0475, Circuit =
┌───┐┌───┐
q: ┤ I ├┤ Z ├
└───┘└───┘
P(3) = 0.9025, Circuit =
┌───┐┌───┐
q: ┤ I ├┤ I ├
└───┘└───┘
# Tensor product two bit-flip and phase-flip errors with
# bit-flip on qubit-0, phase-flip on qubit-1
error2 = phase_flip.tensor(bit_flip)
print(error2)
QuantumError on 2 qubits. Noise circuits:
P(0) = 0.0025000000000000005, Circuit =
┌───┐
q_0: ┤ X ├
├───┤
q_1: ┤ Z ├
└───┘
P(1) = 0.0475, Circuit =
┌───┐
q_0: ┤ I ├
├───┤
q_1: ┤ Z ├
└───┘
P(2) = 0.0475, Circuit =
┌───┐
q_0: ┤ X ├
├───┤
q_1: ┤ I ├
└───┘
P(3) = 0.9025, Circuit =
┌───┐
q_0: ┤ I ├
├───┤
q_1: ┤ I ├
└───┘
التحويل من وإلى عوامل QuantumChannel
يمكننا أيضاً التحويل ذهاباً وإياباً بين كائنات QuantumError في Qiskit Aer وكائنات QuantumChannel في Qiskit.
# Convert to Kraus operator
bit_flip_kraus = Kraus(bit_flip)
print(bit_flip_kraus)
Kraus([[[-9.74679434e-01+0.j, 0.00000000e+00+0.j],
[ 0.00000000e+00+0.j, -9.74679434e-01+0.j]],
[[ 0.00000000e+00+0.j, 2.23606798e-01+0.j],
[ 2.23606798e-01+0.j, -4.96506831e-17+0.j]]],
input_dims=(2,), output_dims=(2,))
# Convert to Superoperator
phase_flip_sop = SuperOp(phase_flip)
print(phase_flip_sop)
SuperOp([[1. +0.j, 0. +0.j, 0. +0.j, 0. +0.j],
[0. +0.j, 0.9+0.j, 0. +0.j, 0. +0.j],
[0. +0.j, 0. +0.j, 0.9+0.j, 0. +0.j],
[0. +0.j, 0. +0.j, 0. +0.j, 1. +0.j]],
input_dims=(2,), output_dims=(2,))
# Convert back to a quantum error
print(QuantumError(bit_flip_kraus))
# Check conversion is equivalent to original error
QuantumError(bit_flip_kraus) == bit_flip
QuantumError on 1 qubits. Noise circuits:
P(0) = 1.0, Circuit =
┌───────┐
q: ┤ kraus ├
└───────┘
True
خطأ القراءة
تُحدَّد أخطاء القراءة الكلاسيكية بقائمة من متجهات احتمالية الإسناد :
- هي قيمة البت الكلاسيكي المسجَّلة
- هي قيمة البت الحقيقية التي أعادها القياس
على سبيل المثال، لـ Qubit واحد: .
# Measurement misassignment probabilities
p0given1 = 0.1
p1given0 = 0.05
ReadoutError([[1 - p1given0, p1given0], [p0given1, 1 - p0given1]])
ReadoutError([[0.95 0.05]
[0.1 0.9 ]])
يمكن أيضاً دمج أخطاء القراءة باستخدام compose وtensor وexpand، تماماً كما هو الحال مع الأخطاء الكمية.