SabreLayout
class qiskit.transpiler.passes.SabreLayout(*args, **kwargs)
Bases: TransformationPass
Escolha um layout por meio de roteamento bidirecional iterativo do circuito de entrada.
Começando com um layout inicial aleatório, o algoritmo faz um roteamento completo do circuito (por meio do método routing_pass) para chegar a um layout final. Esse layout final é então usado como layout inicial para rotear o circuito reverso. O algoritmo itera várias vezes até encontrar um layout inicial que reduza o custo total do roteamento.
Esse método explora a reversibilidade dos circuitos quânticos e tenta incluir informações globais do circuito na escolha do_layout inicial.
Por padrão, esta etapa executará tanto o layout quanto o roteamento e transformará o circuito de modo que o layout seja aplicado ao DAG de entrada (o que significa que o circuito de saída terá qubits auxiliares alocados para os qubits não utilizados no mapa de acoplamento e os qubits serão reordenados para corresponder aos qubits físicos mapeados); em seguida, o roteamento será aplicado (inserindo SwapGate objetos para compensar a conectividade limitada). Isso difere da maioria das outras etapas de layout, que são AnalysisPass objetos e se limitam a encontrar um layout inicial e defini-lo no conjunto de propriedades. Isso é feito porque, por padrão, a etapa executa simulações paralelas com diferentes sementes aleatórias para selecionar o layout inicial aleatório e, em seguida, seleciona a saída roteada que resulta no menor número de portas de troca necessárias.
Você pode usar o argumento routing_pass para que essa passagem funcione como uma passagem de layout típica. Quando especificado, isso usará a passagem de roteamento especificada para selecionar apenas um layout inicial e não executará vários testes de sementes.
Além de começar com um layout inicial aleatório, o passe também pode receber uma lista adicional de layouts iniciais que serão usados para testes adicionais. Se o sabre_starting_layouts estiver presente no conjunto de propriedades quando essa passagem for executada, ele será usado para testes adicionais. Ainda haverá layout_trials de layouts iniciais totalmente aleatórios e o conteúdo de sabre_starting_layouts será executado além desses. Será usada a saída que resultar na menor quantidade de portas de troca (seja das tentativas aleatórias ou do ponto inicial do conjunto de propriedades). O valor desse campo de conjunto de propriedades deve ser uma lista de objetos Layout objetos que representam os layouts iniciais a serem usados. Se um qubit virtual estiver faltando em um Layout objeto da lista, será selecionado um qubit aleatório.
Campos definidos da propriedade Ler
sabre_starting_layouts (list[Layout])
Uma lista opcional de objetos Layout objetos a serem usados para testes de layout adicionais. Isso é um acréscimo às tentativas aleatórias completas especificadas com o argumento layout_trials .
Valores definidos para propriedades gravados
layout (Layout)
O mapeamento inicial escolhido de qubits virtuais para qubits físicos, incluindo a alocação de ancilla.
final_layout (Layout)
Uma permutação de como as trocas foram aplicadas aos qubits de entrada no final do circuito.
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
SabreLayout inicializador.
param coupling_map
gráfico direcionado que representa um mapa de acoplamento.
tipo coupling_map
UnionCouplingMap[, Target]
param routing_pass
a passagem de roteamento a ser usada durante a iteração. Se especificado, esse passe funciona como um AnalysisPass e preencherá apenas o campo layout no conjunto de propriedades e o registro de entrada será retornado sem modificações. Esse argumento é mutuamente exclusivo dos argumentos swap_trials e layout_trials e, se for especificado ao mesmo tempo que qualquer um deles, será gerado um erro.
tipo routing_pass
BasePass
param seed
semente para definir um layout de primeira tentativa aleatória.
tipo de semente
int
param max_iterations
número de iterações para frente e para trás.
tipo max_iterations
int
param swap_trials
O número de tentativas a serem executadas de SabreSwap para cada iteração. Isso é equivalente ao argumento trials em SabreSwap. Se isso não for especificado (e routing_pass não estiver definido), por padrão, será usado o número de CPUs físicas em seu sistema local. Para que haja reprodutibilidade entre ambientes, é melhor definir esse valor como um número explícito, pois o resultado dependerá potencialmente do número de tentativas executadas. Essa opção é mutuamente exclusiva do argumento routing_pass e será gerado um erro se ambos forem usados.
tipo swap_trials
int
param layout_trials
O número de tentativas de sementes aleatórias para executar o layout. Quando > 1, será selecionada a tentativa que resultar na saída com o menor número de portas de troca. Se isso não for especificado (e routing_pass não estiver definido), o número de CPUs físicas locais será usado como o valor padrão. Essa opção é mutuamente exclusiva do argumento routing_pass e será gerado um erro se ambos forem usados. São executadas 3 ou 4 tentativas adicionais, dependendo do valor coupling_map , com layouts comuns além da contagem de tentativas aleatórias especificadas por esse valor.
tipo layout_trials
int
param skip_routing
Se isso for definido como True e routing_pass não for usado, o roteamento não será aplicado ao circuito de saída. Somente o layout será definido no conjunto de propriedades. Essa é uma troca para executar o roteamento personalizado com várias tentativas de layout, pois o uso dessa opção fará com que o site SabreLayout execute o estágio de roteamento internamente, mas não use esse resultado.
tipo skip_routing
bool
aumentos TranspilerError
Se ambos routing_pass e swap_trials ou
levanta ambos routing_pass e layout_trials são especificados
Atributos
coupling_map
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 SabreLayout no dag.
Parâmetros
dag (DAGCircuit) – DAG para encontrar o layout.
Retorna
A saída dag se o mapeamento de swap foi executado
(caso contrário, o dag de entrada é retornado sem modificações).
Tipo de retorno
Aumentos
TranspilerError - se o dag for mais largo que o alvo.
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