Skip to main content
IBM Quantum Platform

SabreSwap

class qiskit.transpiler.passes.SabreSwap(*args, **kwargs)

GitHub

Bases: TransformationPass

Mapear o circuito de entrada em uma topologia de backend por meio da inserção de SWAPs.

Implementação da busca heurística baseada em SWAP do artigo [2] de mapeamento de qubit do SABRE (Algoritmo 1) com as modificações do artigo [1] do LightSABRE. O objetivo da heurística é minimizar o número de SWAPs com perdas inseridos e a profundidade do circuito.

Esse algoritmo parte de um layout inicial de qubits virtuais em qubits físicos e itera sobre o circuito DAG até que todas as portas estejam esgotadas, inserindo SWAPs ao longo do caminho. Ele considera apenas portas de 2 qubits, pois somente essas são relevantes para o problema de mapeamento (presume-se que as portas de mais de 3 qubits já estejam decompostas).

Em cada iteração, ele primeiro verificará se há alguma porta no site front_layer que possa ser aplicada diretamente. Em caso afirmativo, ele os aplicará e os removerá do site front_layer e, se possível, reabastecerá essa camada com novos portões. Caso contrário, ele tentará procurar SWAPs, inserir os SWAPs e atualizar o mapeamento.

A busca por SWAPs é restrita, no sentido de que consideramos apenas os qubits físicos na vizinhança dos qubits envolvidos em front_layer. Isso dá origem a um swap_candidate_list que é pontuado de acordo com alguma função de custo heurístico. O melhor SWAP é implementado e o site current_layout é atualizado.

Esta etapa do transpiler complementa o algoritmo SABRE, pois executa várias iterações do algoritmo com diferentes sementes. O melhor resultado, determinado pelo ensaio com o menor número de SWAPs inseridos, será selecionado entre os ensaios aleatórios.

Referências

[1] Henry Zou, Matthew Treinish, Kevin Hartman, Alexander Ivrii e Jake Lishman. “LightSABRE: A Lightweight and Enhanced SABRE Algorithm" (Algoritmo SABRE leve e aprimorado) arXiv:2409.08368 [2] Li, Gushu, Yufei Ding e Yuan Xie. "Resolvendo o problema de mapeamento de qubit para dispositivos quânticos da era NISQ" ASPLOS 2019. arXiv:1809.02573

SabreSwap inicializador.

Parâmetros

  • coupling_map (Union[CouplingMap, Target]) – CouplingMap do backend de destino.
  • heuristic (str) – O tipo de heurística a ser usada para decidir a melhor estratégia de swap ("básica" ou "lookahead" ou "decay").
  • seed (int) – semente aleatória usada para desempatar entre as trocas de candidatos.
  • fake_run (bool) – se verdadeiro, ele apenas finge fazer o roteamento, ou seja, nenhuma troca é efetivamente adicionada.
  • trials (int) – O número de testes de sementes para executar o sabre. Eles serão executados em paralelo (a menos que o PassManager já esteja sendo executado em paralelo). Se não for especificado, o padrão será o número de CPUs físicas no sistema local. Para obter resultados reproduzíveis, é recomendável que você defina isso explicitamente, pois a saída será determinística para um número fixo de tentativas.

Aumentos

TranspilerError - Se a heurística especificada não for válida.

Mais informações:

O espaço de pesquisa de possíveis SWAPs em qubits físicos é explorado atribuindo-se uma pontuação ao layout que resultaria de cada SWAP. A qualidade de um layout é avaliada com base em quão viável ele torna as portas virtuais restantes que devem ser aplicadas. Há suporte para algumas funções de custo heurísticas

  • "básico":

A soma das distâncias para os qubits físicos correspondentes dos qubits virtuais que interagem na camada frontal.

Hbasic=gateFD[π(gate.q1)][π(gate.q2)]H_{basic} = \sum_{gate \in F} D[\pi(gate.q_1)][\pi(gate.q2)]
  • 'lookahead':

Essa é a soma de dois custos: o primeiro é igual ao custo básico. Em segundo lugar, temos o custo básico, mas agora avaliado também para o conjunto ampliado (ou seja, E|E| número de sucessores imediatos das portas na camada anterior F). Isso é ponderado por um valor EXTENDED_SET_WEIGHT (W) para indicar que os portões seguintes são menos importantes do que a camada frontal.

Hdecay=1FgateFD[π(gate.q1)][π(gate.q2)]+W1EgateED[π(gate.q1)][π(gate.q2)]H_{decay}=\frac{1}{\left|{F}\right|}\sum_{gate \in F} D[\pi(gate.q_1)][\pi(gate.q2)] + W*\frac{1}{\left|{E}\right|} \sum_{gate \in E} D[\pi(gate.q_1)][\pi(gate.q2)]
  • 'decadência':

Isso é o mesmo que "lookahead", mas o custo total é multiplicado por um fator de decaimento. Isso aumenta o custo se o SWAP que gerou o layout de teste tiver sido usado recentemente (ou seja, penaliza o aumento da profundidade).

Hdecay=max(decay(SWAP.q1),decay(SWAP.q2))1FgateFD[π(gate.q1)][π(gate.q2)]+W1EgateED[π(gate.q1)][π(gate.q2)]H_{decay} = max(decay(SWAP.q_1), decay(SWAP.q_2)) { \frac{1}{\left|{F}\right|} \sum_{gate \in F} D[\pi(gate.q_1)][\pi(gate.q2)]\\ + W *\frac{1}{\left|{E}\right|} \sum_{gate \in E} D[\pi(gate.q_1)][\pi(gate.q2)] }

Atributos

coupling_map

dist_matrix

is_analysis_pass

Verificar se o passe é um passe de análise.

Se a passagem for um AnalysisPass,, isso significa que a passagem pode analisar o DAG e escrever os resultados dessa análise no conjunto de propriedades. As modificações no DAG não são permitidas por esse tipo de passe.

is_transformation_pass

Verificar se o passe é um passe de transformação.

Se a passagem for um TransformationPass,, isso significa que a passagem pode manipular o DAG, mas não pode modificar o conjunto de propriedades (mas pode ser lido).


Métodos

execute

execute(passmanager_ir, state, callback=None)

GitHub

Executar a tarefa de otimização para a entrada Qiskit IR.

Parâmetros

  • passmanager_ir (Any) – Qiskit IR para otimizar.
  • state (PassManagerState) – Estado associado à execução do fluxo de trabalho pelo próprio gerenciador de passes.
  • callback (Callable | None) – Uma função de retorno de chamada que é chamada a cada execução da tarefa de otimização.

Retorna

Qiskit IR otimizado e estado do fluxo de trabalho.

Tipo de retorno

tupla [ Any, PassManagerState ]

name

name()

GitHub

Nome do passe.

Tipo de retorno

str

run

run(dag)

GitHub

Execute o passe SabreSwap no dag.

Parâmetros

dag (DAGCircuit) – o gráfico acíclico direcionado a ser mapeado.

Retorna

Um dag mapeado para ser compatível com o coupling_map.

Tipo de retorno

DAGCircuit

Aumentos

  • TranspilerError - Se o mapa de acoplamento ou o layout não forem
  • compatível com o DAG**, ou ** se o coupling_map=None -

update_status

update_status(state, run_state)

GitHub

Atualizar o status do fluxo de trabalho.

Parâmetros

  • state (PassManagerState) – Passar o estado do gerenciador para atualizar.
  • run_state (RunState) – Status de conclusão da tarefa atual.

Retorna

Estado do gerenciador de passes atualizado.

Tipo de retorno

PassManagerState

Esta página foi útil?
Relate um bug, erro de digitação ou solicite conteúdo no GitHub.