تقليل عمق الدائرة باستخدام إضافة Qiskit للـ AQC-Tensor
في هذا الدفتر، سنعمل عبر خطوات نمط Qiskit مع استخدام التجميع الكمي التقريبي بشبكات الموترات (AQC-Tensor) لتحقيق عمق دائرة أقل مما يُحتاج إليه عادةً لأداء تطور Trotter.
هذه هي الخطوات التي سنتبع ها:
- الخطوة 1: التعيين إلى مسألة كمية
- تهيئة هاميلتونيان مسألتنا والعنصر/العناصر القابلة للرصد
- توليد حالة شبكة موترات هدف للجزء الأولي من الدائرة
- توليد دائرة ذات عمق منخفض تقارب الجزء المضغوط
- توليد نمط أولي عام من تلك الدائرة
- تحسين المعاملات لتقريب النمط الأولي قدر الإمكان من الهدف
- إضافة خطوات Trotter اللاحقة إلى النمط الأولي المُحسَّن
- الخطوة 2: التحسين للعتاد المستهدف
- نقل الدائرة (Transpile) للعتاد
- الخطوة 3: تنفيذ التجارب
- استخدام Backend وهمي للتبسيط
- الخطوة 4: إعادة بناء النتائج
- غير مطلوب؛ بدلاً من ذلك، نخرج العنصر القابل للرصد المقيس
الخطوة 1: التعيين إلى دائرة كمية ومؤثر
إعداد هاميلتوني نموذجي وعنصر قابل للرصد
في هذا الدفتر، نستخدم نموذج Ising على دائرة من 10 مواقع:
حيث تعني شروط الحدود الدورية أنه عند نحصل على ، و هي قوة الاقتران بين موقعين و هو المجال المغناطيسي الخارجي.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-addon-aqc-tensor qiskit-addon-utils qiskit-ibm-runtime quimb scipy
from qiskit.transpiler import CouplingMap
from qiskit_addon_utils.problem_generators import generate_xyz_hamiltonian
# Generate some coupling map to use for this example
coupling_map = CouplingMap.from_heavy_hex(3, bidirectional=False)
# Choose a 10-qubit circle on this coupling map
reduced_coupling_map = coupling_map.reduce([0, 13, 1, 14, 10, 16, 4, 15, 3, 9])
# Get a qubit operator describing the Ising field model
hamiltonian = generate_xyz_hamiltonian(
reduced_coupling_map,
coupling_constants=(0.0, 0.0, 1.0),
ext_magnetic_field=(0.4, 0.0, 0.0),
)
العنصر القابل للرصد الذي سنقيسه هو المغنطة الكلية.
from qiskit.quantum_info import SparsePauliOp
L = reduced_coupling_map.size()
observable = SparsePauliOp.from_sparse_list([("Z", [i], 1 / L / 2) for i in range(L)], num_qubits=L)
تحديد مقدار تطور الزمن الذي يمكن محاكاته كلاسيكيًا
هدفنا الإجمالي هو محاكاة تطور الزمن للهاميلتوني النموذجي أعلاه. نفعل ذلك عبر تطور Trotter، الذي نقسمه إلى جزأين:
- جزء أولي قابل للمحاكاة بحالات حاصل الضرب المصفوفي (MPS). سنقوم بـ"تجميع" هذا الجزء باستخدام AQC كما هو مقدَّم في https://arxiv.org/abs/2301.08609.
- جزء لاحق من الدائرة سيُنفَّذ على العتاد. نخطط لاستخدام AQC-Tensor لضغط دائرة تطور الزمن حتى الزمن ، ثم التطور باستخدام خطوات Trotter العادية حتى .
توليد الدوائر قبل الانقسام وبعده
بعد أن اخترنا الانقسام عند ، سنولّد دائرتين:
- دائرة "هدف" لجزء AQC من التطور، من إلى . نظرًا لأن هذه تُحاكى بمحاكي شبكة موترات، فإن عدد الطبقات يؤثر على وقت التنفيذ بعامل ثابت فحسب، لذا قد نستخدم عددًا سخيًا من الطبقات لتقليل خطأ Trotter.
from qiskit.synthesis import SuzukiTrotter
from qiskit_addon_utils.problem_generators import generate_time_evolution_circuit
aqc_evolution_time = 4.0
aqc_target_num_trotter_steps = 45
aqc_target_circuit = generate_time_evolution_circuit(
hamiltonian,
synthesis=SuzukiTrotter(reps=aqc_target_num_trotter_steps),
time=aqc_evolution_time,
)
- دائرة تطور لاحقة، تتطور من إلى . نظرًا لتشغيلها على عتاد كمي، من المرغوب استخدام أقل عدد ممكن من طبقات Trotter.
subsequent_evolution_time = 1.0
subsequent_num_trotter_steps = 5
subsequent_circuit = generate_time_evolution_circuit(
hamiltonian,
synthesis=SuzukiTrotter(reps=subsequent_num_trotter_steps),
time=subsequent_evolution_time,
)
لأغراض المقارنة لاحقًا، لنولّد أيضًا دائرة ثالثة: دائرة تتطور لـaqc_evolution_time ولكن لها نفس زمن التطور لكل خطوة Trotter كالدائرة اللاحقة. هذه هي الدائرة التي كنا سنعمل بها لو لم نستخدم عددًا سخيًا من خطوات Trotter للدائرة الهدف. سنشير إليها بـ_دائرة المقارنة_.
aqc_comparison_num_trotter_steps = int(
subsequent_num_trotter_steps / subsequent_evolution_time * aqc_evolution_time
)
aqc_comparison_num_trotter_steps
20
comparison_circuit = generate_time_evolution_circuit(
hamiltonian,
synthesis=SuzukiTrotter(reps=aqc_comparison_num_trotter_steps),
time=aqc_evolution_time,
)