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?

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 fatias (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 fatias 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 — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"numpy": "numpy", "qiskit": "qiskit", "qiskit_addon_obp": "qiskit-addon-obp", "qiskit_addon_utils": "qiskit-addon-utils", "qiskit_ibm_runtime": "qiskit-ibm-runtime", "rustworkx": "rustworkx"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
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")

Code output

Em seguida, geramos um operador de Pauli que modela um Hamiltoniano XYZ de Heisenberg.

undefined