Saltar al contenido principal
Este proyecto está en fase beta. ¿Encontraste un error? Abre un issue en GitHub. ¿Tienes una pregunta o una idea? Pregunta en Discussions — ¡nos encantaría tu opinión!
¿Cómo es la calidad de la traducción en esta página?

Transpilar circuitos fermiónicos

Importante

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:

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

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

The directly constructed QuantumCircuit of the fermionic time evolution.

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: