Wire Cutting ในรูปแบบคำสั่ง `Move` แบบสอง Qubit
ในบทแนะนำนี้ เราจะสร้างค่าความคาดหวัง (expectation values) ของ Circuit ขนาดเจ็ด Qubit ขึ้นใหม่ โดยแบ่งมันออกเป็นสอง Circuit ขนาดสี่ Qubit ผ่านการใช้ wire cutting
นี่คือขั้นตอนที่เราจะดำเนินการใน Qiskit pattern นี้:
- ขั้นตอนที่ 1: แมปปัญหาไปยัง Quantum Circuit และ Operator:
- แมป Hamiltonian ลงบน Quantum Circuit
- ขั้นตอนที่ 2: ปรับให้เหมาะสมสำหรับฮาร์ดแวร์เป้าหมาย [ใช้ cutting addon]:
- ตัด Circuit และ Observable
- Transpile subexperiment สำหรับฮาร์ดแวร์
- ขั้นตอนที่ 3: รันบนฮาร์ดแวร์เป้าหมาย:
- รัน subexperiment ที่ได้จากขั้นตอนที่ 2 โดยใช้ primitive
Sampler
- รัน subexperiment ที่ได้จากขั้นตอนที่ 2 โดยใช้ primitive
- ขั้นตอนที่ 4: ประมวลผลผลลัพธ์ [ใช้ cutting addon]:
- รวมผลลัพธ์จากขั้นตอนที่ 3 เพื่อสร้างค่าความคาดหวังของ Observable ที่ต้องการขึ้นใหม่
ขั้นตอนที่ 1: แมป
สร้าง Circuit สำหรับตัด
เริ่มต้นด้วย Circuit ที่ได้รับแรงบันดาลใจจาก Fig. 1(a) ของ arXiv:2302.03366v1
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-addon-cutting qiskit-aer qiskit-ibm-runtime
import numpy as np
from qiskit import QuantumCircuit
qc_0 = QuantumCircuit(7)
for i in range(7):
qc_0.rx(np.pi / 4, i)
qc_0.cx(0, 3)
qc_0.cx(1, 3)
qc_0.cx(2, 3)
qc_0.cx(3, 4)
qc_0.cx(3, 5)
qc_0.cx(3, 6)
qc_0.cx(0, 3)
qc_0.cx(1, 3)
qc_0.cx(2, 3)
<qiskit.circuit.instructionset.InstructionSet at 0x7f16ab191a80>
qc_0.draw("mpl")

ระบุ Observable
from qiskit.quantum_info import SparsePauliOp
observable = SparsePauliOp(["ZIIIIII", "IIIZIII", "IIIIIIZ"])
ขั้นตอนที่ 2: ปรับให้เหมาะสม
สร้าง Circuit ใหม่ที่มีคำสั่ง Move วางอยู่ในตำแหน่งที่ต้องการตัด
จาก Circuit ข้างต้น เราต้องการวาง wire cut สองจุดบนเส้น Qubit กลาง เพื่อให้ Circuit แยกออกเป็นสอง Circuit ขนาดสี่ Qubit แต่ละอัน วิธีหนึ่งคือการวางคำสั่ง Move แบบสอง Qubit ด้วยตนเอง เพื่อย้ายสถานะจาก Qubit wire หนึ่งไปยังอีกอัน คำสั่ง Move มีความหมายเทียบเท่ากับการ reset Qubit ที่สอง ตามด้วย SWAP gate ผลของคำสั่งนี้คือโอนสถานะของ Qubit แรก (ต้นทาง) ไปยัง Qubit ที่สอง (ปลายทาง) พร้อมกับทิ้งสถานะขาเข้าของ Qubit ที่สอง เพื่อให้การทำงานนี้เป็นไปตามที่ต้องการ สิ่งสำคัญคือ Qubit ที่สอง (ปลายทาง) ต้องไม่มีการพัวพันกับส่วนอื่นของระบบ มิฉะนั้นการ reset จะทำให้สถานะของส่วนที่เหลือของระบบยุบตัวบางส่วน
ที่นี่ เราสร้าง Circuit ใหม่ที่มี Qubit เพิ่มอีกหนึ่งตัวและการดำเนินการ Move ในตำแหน่งที่กำหนด ในตัวอย่างนี้ เราสามารถนำ Qubit กลับมาใช้ใหม่ได้: Qubit ต้นทางของ Move แรกกลายเป็น Qubit ปลายทางของการดำเนินการ Move ที่สอง
หมายเหตุ: เป็นทางเลือกแทนการทำงานกับคำสั่ง Move โดยตรง อาจเลือกทำเครื่องหมาย wire cut โดยใช้คำสั่ง CutWire แบบ single-qubit ฟังก์ชัน cut_wires มีไว้เพื่อแปลง CutWire เป็นคำสั่ง Move บน Qubit ที่จัดสรรใหม่ อย่างไรก็ตาม ต่างจากวิธีด้วยตนเอง วิธีอัตโนมัตินี้ไม่อนุญาตให้นำ Qubit wire กลับมาใช้ซ้ำ ดู how-to guide ของ CutWire สำหรับรายละเอียด
from qiskit_addon_cutting.instructions import Move
qc_1 = QuantumCircuit(8)
for i in [*range(4), *range(5, 8)]:
qc_1.rx(np.pi / 4, i)
qc_1.cx(0, 3)
qc_1.cx(1, 3)
qc_1.cx(2, 3)
qc_1.append(Move(), [3, 4])
qc_1.cx(4, 5)
qc_1.cx(4, 6)
qc_1.cx(4, 7)
qc_1.append(Move(), [4, 3])
qc_1.cx(0, 3)
qc_1.cx(1, 3)
qc_1.cx(2, 3)
qc_1.draw("mpl")
