Transpilar circuitos fermiónicos
Los conceptos de esta guía solo están disponibles actualmente en la API de Python. La funcionalidad equivalente estará disponible en la API de C en una versión futura.
Esta guía explica cómo transpilar un FermionicCircuit a un QuantumCircuit estándar. Continúa con el mismo ejemplo de evolución temporal de la guía de circuitos fermiónicos.
Etapas de transpilación
Como se explica en qiskit_fermions.transpiler, los gestores de pasos preestablecidos de este proyecto dividen la transpilación en las siguientes etapas:
Entrada
Convierte el circuito de entrada en una estructura de datos de grafo acíclico dirigido (DAG).
Optimización
Mantiene el circuito en el espacio fermiónico. Estos pasos usan la estructura fermiónica y las relaciones de conmutación mientras el conocimiento propio del problema sigue estando plenamente disponible. F2FSynthesis es el paso que trotteriza aquí una compuerta Evolution, con una fórmula de producto o con FermionicQDrift, y QDriftTrotterization su variante consciente de la ocupación; consulta Pasos de optimización para el conjunto completo y Sintetizar una compuerta Evolution en el espacio fermiónico para saber cómo se elige una fórmula de producto.
Disposición
Asigna los registros de modos fermiónicos a registros cuánticos. Para mapeos en base de ocupación como Jordan-Wigner, cada modo fermiónico se asigna a un único qubit. Esta etapa también admite mapeos más generales en los que el número de qubits difiere del número de modos fermiónicos.
Síntesis
Convierte las compuertas fermiónicas en operaciones de qubits usando el mapeo fermión a qubit elegido. Las instancias de FermionicGate se transforman en secuencias de compuertas cuánticas estándar. Una barrera se traslada a cada qubit de cada registro que tocaba, de modo que sigue separando las compuertas a ambos lados durante la etapa de qubits.
Qubit
Transpila el circuito de qubits resultante usando los métodos estándar de Qiskit, incluidas la optimización, la disposición y el enrutamiento para tu hardware objetivo.
Salida
Convierte la estructura de datos DAG interna al formato de salida deseado.
Un ejemplo práctico: transpilación con Jordan-Wigner
Usa el gestor de pasos preestablecido para transpilar tu circuito fermiónico con el mapeo fermión a qubit de Jordan-Wigner:
- Python
- C
>>> 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 C API for transpilation will be made available in a future release.
Comparación con el flujo de trabajo tradicional
La guía de circuitos fermiónicos describe cómo el flujo de trabajo tradicional realiza la codificación fermión a qubit antes de construir el QuantumCircuit. Compara los dos enfoques:
>>> 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 ...>
Ambos flujos de trabajo producen circuitos equivalentes. Sin embargo, el flujo tradicional requiere que implementes los pasos de optimización manualmente, mientras que con el enfoque fermiónico primero puedes integrar optimizaciones propias del problema en el proceso de transpilación.
Flujos de trabajo avanzados
El gestor de pasos preestablecido ofrece un punto de partida cómodo. Para casos de uso más avanzados, puedes hacer lo siguiente:
-
Personalizar los pasos del transpilador que se ejecutan en cada etapa.
-
Elegir la fórmula de producto que trotteriza una compuerta
Evolutionen el espacio fermiónico, ya sea por compuerta o para todo un flujo conF2FSynthesis(consulta Sintetizar una compuerta Evolution en el espacio fermiónico). -
Implementar mapeos fermión a qubit personalizados creando complementos de síntesis (consulta
F2QSynthesisPlugin). -
Crear pasos de transpilador personalizados.