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:
- Um excelente estado intermediário, conhecido como "estado alvo", que pode ser obtido por simulação de rede tensorial; e,
- 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.

Em geral, o AQC-Tensor requer três elementos como entrada:
- 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).
- Um circuito ansatz parametrizado. Idealmente, um que contenha conectividade eficiente em hardware, de modo que tenha uma profundidade razoável no hardware alvo.
- 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 , 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:
- Simulador MPS encontrado no Qiskit Aer
- Simulador eager
CircuitMPSdo Quimb - Simulador lazy
Circuitdo Quimb
O parâmetro mais importante de uma rede tensorial é sua dimensão de ligação máxima, . 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 qubits, um estado de produto de matrizes precisa de no máximo uma dimensão de ligação de 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 . Dessa forma, ao escalar o problema para um circuito maior, o estado alvo permanece classicamente simulável.
Próximos passos
- Leia a página sobre como começar com o AQC-Tensor
- Leia o tutorial sobre como usar o AQC para melhorar a evolução temporal Trotterizada.
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).