Pular para o conteúdo principal
Este projeto está em fase beta. Encontrou um bug? Abra uma issue no GitHub. Tem uma pergunta ou ideia? Pergunte no Discussions — adoraríamos receber seu feedback!
Como está a qualidade da tradução nesta página?

Transpile circuitos fermiônicos

Importante

Os conceitos deste guia estão disponíveis atualmente apenas na API Python. Funcionalidade equivalente será disponibilizada na API C em uma versão futura.

Este guia explica como transpilar um FermionicCircuit para um QuantumCircuit padrão. Ele continua com o mesmo exemplo de evolução temporal do guia de circuitos fermiônicos.

Estágios da transpilação​

Como explicado em qiskit_fermions.transpiler, os gerenciadores de passagens predefinidos neste projeto dividem a transpilação nos seguintes estágios:

Entrada​

Converte o circuito de entrada em uma estrutura de dados de grafo acíclico dirigido (DAG).

Otimização​

Mantém o circuito no espaço fermiônico. Essas passagens usam a estrutura fermiônica e as relações de comutação enquanto o conhecimento específico do problema permanece totalmente disponível. F2FSynthesis é a passagem que trotteriza aqui uma porta Evolution, com uma fórmula de produto ou com FermionicQDrift, e QDriftTrotterization é sua variante com reconhecimento de ocupação; veja Passagens de otimização para o conjunto completo e Sintetize uma porta Evolution no espaço fermiônico para saber como uma fórmula de produto é escolhida.

Disposição​

Mapeia registradores de modos fermiônicos para registradores quânticos. Para mapeamentos na base de ocupação como Jordan-Wigner, cada modo fermiônico é mapeado para um único qubit. Esse estágio também oferece suporte a mapeamentos mais gerais em que o número de qubits difere do número de modos fermiônicos.

Síntese​

Converte portas fermiônicas em operações de qubit usando o mapeamento férmion-para-qubit escolhido. As instâncias de FermionicGate são transformadas em sequências de portas quânticas padrão. Uma barreira é levada para cada qubit de cada registrador que ela tocou, de modo que continue separando as portas de cada lado dela durante o estágio de qubits.

Qubit​

Transpila o circuito de qubits resultante usando métodos padrão do Qiskit, incluindo otimização, layout e roteamento para o seu hardware alvo.

Saída​

Converte a estrutura de dados DAG interna para o formato de saída desejado.

Um exemplo prático: transpilação usando Jordan-Wigner​

Use o gerenciador de passagens predefinido para transpilar seu circuito fermiônico com o mapeamento férmion-para-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.

Compare com o fluxo de trabalho tradicional​

O guia de circuitos fermiônicos descreve como o fluxo de trabalho tradicional realiza a codificação férmion-para-qubit antes de construir o QuantumCircuit. Compare as duas abordagens:

>>> 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 os fluxos de trabalho produzem circuitos equivalentes. No entanto, o fluxo tradicional exige que você implemente manualmente as etapas de otimização, enquanto com a abordagem fermiônica primeiro você pode integrar otimizações cientes do problema ao processo de transpilação.

Fluxos de trabalho avançados​

O gerenciador de passagens predefinido oferece um ponto de partida conveniente. Para casos de uso mais avançados, você pode fazer o seguinte: