Pular para o conteúdo principal

Compilação quântica aproximada com redes tensoriais (AQC-Tensor)

O addon Qiskit de compilação quântica aproximada com redes tensoriais (AQC-Tensor) permite que usuários compilem a porção inicial de um circuito em uma aproximação quase equivalente desse circuito, mas com muito menos camadas. Isso é realizado usando redes tensoriais por meio do método descrito em [1]. Sua principal utilidade está em circuitos que simulam evolução temporal, mas pode ser aplicável a qualquer classe de circuitos que tenha acesso a:

  1. Um excelente estado intermediário, conhecido como "estado alvo", que pode ser obtido por simulação de rede tensorial; e,
  2. Um bom circuito que prepara uma aproximação do estado alvo, mas com menos camadas quando compilado para o dispositivo de hardware alvo.

A técnica gera um circuito ansatz baseado em um circuito alvo maior que o usuário deseja executar em um QPU. Isso é feito simulando primeiro uma parte do circuito alvo por métodos de rede tensorial e obtendo uma descrição precisa de um estado intermediário que o circuito ansatz irá aproximar. Uma vez encontrado esse estado intermediário, ele é usado como função de custo para otimizar os parâmetros do circuito ansatz. Após a conclusão da otimização, a parte restante do circuito alvo é adicionada ao ansatz e então executada em hardware quântico.

Instalar o pacote AQC-Tensor

Existem duas formas de instalar o pacote AQC-Tensor: via PyPI ou compilando a partir do código-fonte. Recomenda-se instalar esses pacotes em um ambiente virtual para garantir a separação entre dependências de pacotes.

Instalar via PyPI

A forma mais direta de instalar o pacote AQC-Tensor é pelo PyPI. Para usar o pacote, você também deve instalar pelo menos um backend de rede tensorial. O trecho de código a seguir instala o addon, junto com quimb (para suporte a redes tensoriais) e jax (para diferenciação automática). Se tiver interesse, confira o pacote no GitHub

pip install 'qiskit-addon-aqc-tensor[quimb-jax]'

Instalar a partir do código-fonte

Clique aqui para saber como instalar este pacote manualmente.

Se você deseja contribuir com este pacote ou instalá-lo manualmente, primeiro clone o repositório:

git clone git clone git@github.com:Qiskit/qiskit-addon-aqc-tensor.git

e instale o pacote via pip. Se você planeja executar os tutoriais encontrados no repositório do pacote, instale também as dependências de notebook. Se você planeja desenvolver no repositório, pode também instalar as dependências dev.

pip install tox jupyterlab -e '.[notebook-dependencies,dev]'

Embasamento teórico

O procedimento AQC-Tensor é explicado em detalhes em [1]. Esta seção fornece uma visão geral da técnica.

Diagrama representando o procedimento de compilação quântica aproximada

Em geral, o AQC-Tensor requer três elementos como entrada:

  1. Uma descrição do estado alvo na forma de uma rede tensorial. Isso pode ser gerado simulando um circuito em um simulador de rede tensorial, ou pode ser gerado de outra forma (por exemplo, realizando evolução temporal em um estado de produto de matrizes usando o princípio variacional dependente do tempo).
  2. Um circuito ansatz parametrizado. Idealmente, um que contenha conectividade eficiente em hardware, de modo que tenha uma profundidade razoável no hardware alvo.
  3. Parâmetros iniciais para inserir no circuito ansatz, de forma que o estado resultante já seja uma boa aproximação do estado alvo. (Isso não é, em princípio, obrigatório para AQC, mas ajuda a fornecer ao otimizador um ponto de partida sensato.)

A técnica consiste então em otimizar iterativamente os parâmetros do circuito ansatz, de forma que o estado gerado por ele seja o mais próximo possível do estado alvo.

Geração de ansatz

Para gerar (2) e (3) da lista acima, o pacote qiskit-addon-aqc possui uma função, generated_ansatz_from_circuit(), que recebe um circuito de entrada e produz um ansatz parametrizado e um conjunto inicial de parâmetros. Os parâmetros retornados pela função são tais que, quando inseridos no ansatz, geram um estado exatamente equivalente ao circuito de entrada, a menos de uma fase global.

O ansatz gerado por esta função usa 9 parâmetros por bloco de dois qubits e é baseado na decomposição KAK, que parametriza qualquer gate de dois qubits em termos de três parâmetros, a menos de rotações de qubit único. As rotações de qubit único são então decompostas como ZXZZXZ, cada uma com três parâmetros. Isso resulta no circuito ansatz contendo 3 parâmetros para cada bloco de dois qubits do circuito original, mais 3 parâmetros para uma rotação de qubit único de saída em cada um dos dois qubits (totalizando 9 parâmetros). Após adicionar esses blocos, o ansatz é completado adicionando uma camada de rotações de qubit único a cada qubit ativo no início do circuito.

Simulação de rede tensorial

Para obter uma descrição do estado alvo desejado, este addon usa um estado de produto de matrizes (a forma mais simples de uma rede tensorial) e suporta os seguintes simuladores de rede tensorial:

O parâmetro mais importante de uma rede tensorial é sua dimensão de ligação máxima, χ\chi. Esse parâmetro limita quanta emaranhamento pode ser representado com uma rede tensorial e, portanto, até qual profundidade um dado circuito pode ser simulado fielmente.

Dado um circuito com LL qubits, um estado de produto de matrizes precisa de no máximo uma dimensão de ligação de χexact=2L/2\chi_{exact} = 2^{L/2} para simular exatamente o circuito a qualquer profundidade. Isso está fora do alcance para circuitos de escala utilitária geral atuando em 100+ qubits. Por esse motivo, se você está tentando experimentar este addon com um problema de brinquedo com poucos qubits, é importante garantir que χ<2L/2\chi < 2^{L/2}. Dessa forma, ao escalar o problema para um circuito maior, o estado alvo permanece classicamente simulável.

Próximos passos

Recomendações

Referências

[1] Robertson, Niall F., et al. "Approximate Quantum Compiling for Quantum Simulation: A Tensor Network based approach" arXiv preprint arXiv:2301.08609 (2023).