ข้ามไปยังเนื้อหาหลัก
โครงการนี้อยู่ในช่วงเบต้า พบข้อผิดพลาด? สร้าง GitHub Issue มีคำถามหรือไอเดีย? ถามใน Discussions — ยินดีรับฟังความคิดเห็น!
คุณภาพการแปลในหน้านี้เป็นอย่างไร?

ทรานสไพล์วงจรเฟอร์มิออน

สำคัญ

แนวคิดในคู่มือนี้ใช้ได้เฉพาะใน Python API ในขณะนี้ ฟังก์ชันการทำงานที่เทียบเท่ากันจะมีใน C API ในรุ่นอนาคต

คู่มือนี้อธิบายวิธีทรานสไพล์ FermionicCircuit เป็น QuantumCircuit มาตรฐาน โดยต่อจากตัวอย่างวิวัฒนาการตามเวลาเดียวกันจากคู่มือวงจรเฟอร์มิออน

สเตจการทรานสไพล์​

ตามที่อธิบายใน qiskit_fermions.transpiler พาสเมเนเจอร์พรีเซ็ตในโปรเจกต์นี้แบ่งการทรานสไพล์เป็นสเตจต่อไปนี้:

อินพุต​

แปลงวงจรอินพุตเป็นโครงสร้างข้อมูลกราฟไร้วงวนแบบมีทิศทาง (DAG)

การเพิ่มประสิทธิภาพ​

คงวงจรไว้ในสเปซเฟอร์มิออน พาสเหล่านี้ใช้โครงสร้างเฟอร์มิออนและความสัมพันธ์การสลับที่ในขณะที่ความรู้เฉพาะปัญหายังมีครบ F2FSynthesis คือพาสที่ทำทรอตเตอร์ไรเซชัน Gate Evolution ที่นี่ ด้วยสูตรผลคูณหรือด้วย FermionicQDrift และ QDriftTrotterization คือตัวแปรที่คำนึงถึงการครอบครอง ดู Optimization Passes สำหรับชุดทั้งหมด และดู สังเคราะห์ Gate Evolution ในสเปซเฟอร์มิออน สำหรับวิธีเลือกสูตรผลคูณ

เลย์เอาต์​

แมปรีจิสเตอร์เฟอร์มิออนไปยังรีจิสเตอร์ควอนตัม สำหรับการแมปฐานจำนวนครอบครองอย่าง Jordan-Wigner แต่ละโหมดเฟอร์มิออนแมปไปยังคิวบิตเดียว สเตจนี้ยังรองรับการแมปทั่วไปกว่าที่จำนวนคิวบิตต่างจากจำนวนโหมดเฟอร์มิออนด้วย

การสังเคราะห์​

แปลง Gate เฟอร์มิออนเป็นการดำเนินการของคิวบิตโดยใช้การแมปเฟอร์มิออนเป็นคิวบิตที่เลือก อินสแตนซ์ของ FermionicGate ถูกแปลงเป็นลำดับของ Gate ควอนตัมมาตรฐาน แบริเออร์ถูกส่งผ่านไปยังทุกคิวบิตของแต่ละรีจิสเตอร์ที่มันแตะ จึงยังคงแยก Gate สองฝั่งของมันในสเตจคิวบิต

Qubit​

ทรานสไพล์วงจรคิวบิตที่ได้โดยใช้วิธีมาตรฐานของ Qiskit รวมถึงการปรับให้เหมาะสม เลย์เอาต์ และการจัดเส้นทางสำหรับฮาร์ดแวร์เป้าหมายของคุณ

เอาต์พุต​

แปลงโครงสร้างข้อมูล DAG ภายในเป็นรูปแบบเอาต์พุตที่ต้องการ

ตัวอย่างใช้งานจริง: การทรานสไพล์ด้วย Jordan-Wigner​

ใช้พาสเมเนเจอร์พรีเซ็ตเพื่อทรานสไพล์วงจรเฟอร์มิออนด้วยการแมปเฟอร์มิออนเป็นคิวบิตแบบ Jordan-Wigner:

>>> from qiskit_fermions.circuit import FermionicCircuit
>>> from qiskit_fermions.circuit.library import Evolution
>>> from qiskit_fermions.operators import FermionOperator, cre, ann
>>> from qiskit_fermions.transpiler.presets import generate_preset_jw_pass_manager
>>>
>>> # Create the same fermionic circuit from the previous guide
>>> circuit = FermionicCircuit(4)
>>> hamiltonian = FermionOperator.from_terms([
... ([cre(0), ann(2)], 0.5),
... ([cre(2), ann(0)], 0.5),
... ([cre(1), ann(3)], 0.5),
... ([cre(3), ann(1)], 0.5),
... ])
>>> hamiltonian.groups = [0, 0, 1, 1]
>>> evolution = Evolution(4, hamiltonian, time=1.0)
>>> circuit.append(evolution, circuit.register)
>>>
>>> # Generate the Jordan-Wigner transpilation pipeline
>>> pm = generate_preset_jw_pass_manager()
>>>
>>> # Transpile the fermionic circuit to a qubit circuit
>>> qubit_circuit = pm.run(circuit)
>>>
>>> # The result is a standard QuantumCircuit
>>> print(type(qubit_circuit))
<class 'qiskit.circuit.quantumcircuit.QuantumCircuit'>

The transpiled QuantumCircuit of the fermionic time evolution.

เปรียบเทียบกับเวิร์กโฟลว์แบบดั้งเดิม​

คู่มือวงจรเฟอร์มิออน อธิบายว่าเวิร์กโฟลว์แบบดั้งเดิมทำการเข้ารหัสเฟอร์มิออนเป็นคิวบิตก่อนสร้าง QuantumCircuit อย่างไร เปรียบเทียบสองแนวทาง:

>>> from qiskit_fermions.mappers.library import jordan_wigner
>>> from qiskit.circuit import QuantumCircuit
>>> from qiskit.circuit.library import PauliEvolutionGate
>>>
>>> # Map the fermionic Hamiltonian to a qubit operator
>>> qubit_hamiltonian = jordan_wigner(hamiltonian, 4).simplify()
>>>
>>> # Build the QuantumCircuit directly
>>> quantum_circuit = QuantumCircuit(4)
>>> pauli_evolution = PauliEvolutionGate(qubit_hamiltonian, time=1.0)
>>> quantum_circuit.append(pauli_evolution, quantum_circuit.qubits)
<qiskit.circuit.instructionset.InstructionSet object at ...>

The directly constructed QuantumCircuit of the fermionic time evolution.

ทั้งสองเวิร์กโฟลว์สร้างวงจรที่เทียบเท่ากัน อย่างไรก็ตาม เวิร์กโฟลว์แบบดั้งเดิมต้องให้คุณทำขั้นตอนการปรับให้เหมาะสมด้วยตนเอง ขณะที่แนวทางเฟอร์มิออนก่อนทำให้คุณผสานการปรับให้เหมาะสมที่คำนึงถึงปัญหาเข้าไปในกระบวนการทรานสไพล์ได้

เวิร์กโฟลว์ขั้นสูง​

พาสเมเนเจอร์พรีเซ็ตเป็นจุดเริ่มต้นที่สะดวก สำหรับกรณีใช้งานขั้นสูงกว่า คุณสามารถทำสิ่งต่อไปนี้:

  • ปรับแต่งพาสทรานสไพล์เลอร์ที่รันในแต่ละสเตจ

  • เลือกสูตรผลคูณที่ทำทรอตเตอร์ไรเซชัน Gate Evolution ในสเปซเฟอร์มิออน ไม่ว่าจะต่อ Gate หรือสำหรับทั้งไปป์ไลน์ด้วย F2FSynthesis (ดูสังเคราะห์ Gate Evolution ในสเปซเฟอร์มิออน)

  • implement การแมปเฟอร์มิออนเป็นคิวบิตแบบกำหนดเองโดยสร้างปลั๊กอินการสังเคราะห์ (ดู F2QSynthesisPlugin)

  • สร้างพาสทรานสไพล์เลอร์แบบกำหนดเอง