SabreSwap
class qiskit.transpiler.passes.SabreSwap(*args, **kwargs)
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.
- '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, 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.
- '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).
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)
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
run
run(dag)
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
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)
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