Reduzindo a profundidade dos circuitos com retropropagação de operador
A retropropagação de operador é uma técnica que envolve absorver operações do final de um circuito quântico em um operador de Pauli, geralmente reduzindo a profundidade do circuito ao custo de termos adicionais no operador. O objetivo é retropropagar o máximo possível do circuito sem permitir que o operador cresça demais.
Uma maneira de permitir uma retropropagação mais profunda no circuito, ao mesmo tempo que se evita que o operador cresça demais, é truncar termos com coeficientes pequenos, em vez de adicioná-los ao operador. O truncamento de termos pode resultar em menos circuitos quânticos a serem executados, mas isso provoca algum erro no cálculo final do valor esperado, proporcional à magnitude dos coeficientes dos termos truncados. Neste tutorial, implementaremos um Qiskit pattern para simular a dinâmica quântica de uma cadeia de spins de Heisenberg usando retropropagação de operador:
- Etapa 1: Mapear para o problema quântico
- Mapear o Hamiltoniano evoluído no tempo para um circuito quântico
- Etapa 2: Otimizar o problema
- Fatiar o circuito
- Retropropagar fatias do circuito sobre um observável de Pauli
- Combinar as fatias restantes em um único circuito
- Transpilar o circuito para o backend
- Etapa 3: Executar experimentos
- Calcular o valor esperado usando o circuito reduzido e o observável expandido com um StatevectorEstimator por simplicidade neste notebook
- Etapa 4: Reconstruir resultados
- N.A.
Nota: O Qiskit descreve livremente as layers como partições de profundidade 1 do circuito em todos os qubits. Este pacote utiliza o termo slices para descrever camadas de profundidade arbitrária. A função qiskit_addon_obp.backpropagate foi projetada para retropropagar fatias inteiras de uma vez, então a escolha de como fatiar o circuito quântico pode ter um impacto significativo no desempenho da retropropagação para um determinado problema. Você aprenderá mais sobre slices abaixo.
Etapa 1: Mapear para o problema quântico
Mapear a evolução temporal de um modelo quântico de Heisenberg para um experimento quântico.
O pacote qiskit_addon_utils fornece algumas funcionalidades reutilizáveis para diversos propósitos.
Seu módulo qiskit_addon_utils.problem_generators fornece funções para gerar Hamiltonianos do tipo Heisenberg em um determinado grafo de conectividade. Esse grafo pode ser tanto um rustworkx.PyGraph quanto um CouplingMap, facilitando o uso em fluxos de trabalho centrados em Qiskit.
A seguir, primeiro geramos um CouplingMap heavy-hex, do qual extraímos uma cadeia linear de 10 qubits. Observe que os índices desse novo reduced_coupling_map são novamente baseados em zero.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-addon-obp qiskit-addon-utils qiskit-ibm-runtime rustworkx
from qiskit.transpiler import CouplingMap
coupling_map = CouplingMap.from_heavy_hex(3, bidirectional=False)
# Choose a 10-qubit linear chain on this coupling map
reduced_coupling_map = coupling_map.reduce([0, 13, 1, 14, 10, 16, 5, 12, 8, 18])
from rustworkx.visualization import graphviz_draw
graphviz_draw(reduced_coupling_map.graph, method="circo")
Em seguida, geramos um operador de Pauli que modela um Hamiltoniano XYZ de Heisenberg.
undefined