דלג לתוכן הראשי
פרויקט זה בשלב בטא. מצאת באג? פתח issue ב-GitHub. יש שאלה או רעיון? שאל ב-Discussions — נשמח לשמוע ממך!
מה איכות התרגום בדף זה?

טרנספילציה של מעגלים פרמיוניים

חשוב

המושגים במדריך הזה זמינים כרגע רק ב-API של Python. פונקציונליות מקבילה תהיה זמינה ב-API של C בגרסה עתידית.

המדריך הזה מסביר איך לבצע טרנספילציה של FermionicCircuit ל-QuantumCircuit רגיל. הוא ממשיך עם אותה דוגמת התפתחות בזמן ממדריך המעגלים הפרמיוניים.

שלבי הטרנספילציה​

כפי שמוסבר ב-qiskit_fermions.transpiler, מנהלי המעברים המוגדרים מראש בפרויקט הזה מחלקים את הטרנספילציה לשלבים הבאים:

קלט​

ממיר את מעגל הקלט למבנה נתונים של גרף מכוון אציקלי (DAG).

אופטימיזציה​

משאיר את המעגל במרחב הפרמיוני. המעברים האלה משתמשים במבנה הפרמיוני וביחסי החילוף בעוד הידע הממוקד בבעיה נשאר זמין במלואו. F2FSynthesis הוא המעבר שמבצע כאן טרוטריזציה של שער Evolution, בעזרת נוסחת מכפלה או בעזרת FermionicQDrift, ו-QDriftTrotterization הוא הווריאנט שלו שמודע לתפוסה; ראו מעברי אופטימיזציה לקבוצה המלאה, וסינתזה של שער Evolution במרחב הפרמיוני לאופן שבו נבחרת נוסחת מכפלה.

פריסה​

ממפה אוגרים של מודים פרמיוניים לאוגרים קוונטיים. במיפויים בבסיס התפוסה כמו ג'ורדן-וינגר, כל מוד פרמיוני ממופה לקיוביט יחיד. השלב הזה תומך גם במיפויים כלליים יותר שבהם מספר הקיוביטים שונה ממספר המודים הפרמיוניים.

סינתזה​

ממיר שערים פרמיוניים לפעולות על קיוביטים בעזרת מיפוי הפרמיון-לקיוביט שנבחר. מופעים של FermionicGate הופכים לרצפים של שערים קוונטיים רגילים. מחסום (barrier) מועבר הלאה אל כל קיוביט של כל אוגר שהוא נגע בו, כך שהוא ממשיך להפריד בין השערים משני צדיו במהלך שלב הקיוביטים.

קיוביט​

מבצע טרנספילציה למעגל הקיוביטים שהתקבל בעזרת שיטות Qiskit רגילות, כולל אופטימיזציה, פריסה וניתוב עבור חומרת היעד שלכם.

פלט​

ממיר את מבנה הנתונים הפנימי של ה-DAG לפורמט הפלט הרצוי.

דוגמה מעשית: טרנספילציה בעזרת ג'ורדן-וינגר​

השתמשו במנהל המעברים המוגדר מראש כדי לבצע טרנספילציה למעגל הפרמיוני שלכם עם מיפוי הפרמיון-לקיוביט של ג'ורדן-וינגר:

>>> 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.

שני תהליכי העבודה מפיקים מעגלים שקולים. עם זאת, תהליך העבודה המסורתי מחייב אתכם לממש שלבי אופטימיזציה ידנית, ואילו בגישה הפרמיונית תחילה אפשר לשלב אופטימיזציות הממוקדות בבעיה בתהליך הטרנספילציה.

תהליכי עבודה מתקדמים​

מנהל המעברים המוגדר מראש הוא נקודת התחלה נוחה. למקרי שימוש מתקדמים יותר אפשר לעשות את הדברים הבאים:

  • להתאים אישית את מעברי הטרנספילר שרצים בכל שלב.

  • לבחור את נוסחת המכפלה שמבצעת טרוטריזציה לשער Evolution במרחב הפרמיוני, בין אם לכל שער ובין אם לצינור שלם בעזרת F2FSynthesis (ראו סינתזה של שער Evolution במרחב הפרמיוני).

  • לממש מיפויי פרמיון-לקיוביט מותאמים אישית על ידי יצירת תוספי סינתזה (ראו F2QSynthesisPlugin).

  • לבנות מעברי טרנספילר מותאמים אישית.