Parâmetros comumente usados para transpilagem
O código desta página foi desenvolvido usando os seguintes requisitos. Recomendamos o uso dessas versões ou de versões mais recentes.
qiskit[all]~=2.5.0 qiskit-ibm-runtime~=0.47.0
Esta página descreve alguns dos parâmetros mais comumente usados para transpilação local. Esses parâmetros são configurados usando argumentos para generate_preset_pass_manager ou transpile.
Grau de aproximação
Você pode usar o grau de aproximação para especificar a proximidade com que deseja que o circuito resultante corresponda ao circuito desejado (de entrada). Trata-se de um valor flutuante no intervalo ( 0.0 - 1.0 ), em que 0.0 é a aproximação máxima e 1.0 (padrão) é nenhuma aproximação. Valores menores trocam a precisão da saída pela facilidade de execução (ou seja, menos portas). O valor padrão é 1.0.
Na síntese unitária de dois qubits (usada nos estágios iniciais de todos os níveis e para o estágio de otimização com o nível de otimização 3), esse valor especifica a fidelidade de destino da decomposição de saída. Ou seja, quanto erro é introduzido quando uma representação matricial de um circuito é convertida em portas discretas. Se o grau de aproximação for um valor mais baixo (mais aproximação), o circuito de saída da síntese será mais diferente da matriz de entrada, mas provavelmente também terá menos portas (porque qualquer operação arbitrária de dois qubits pode ser decomposta perfeitamente com no máximo três portas CX) e será mais fácil de executar.
Quando o grau de aproximação é menor do que 1.0, os circuitos com uma ou duas portas CX podem ser sintetizados, resultando em menos erros do hardware, mas mais da aproximação. Como a CX é a porta mais cara em termos de erro, pode ser vantajoso diminuir o número delas ao custo da fidelidade na síntese (essa técnica foi usada para aumentar o volume quântico em dispositivos IBM® : Validating quantum computers using randomized model circuits (Validando computadores quânticos usando modelos de circuitos aleatórios ).
Como exemplo, geramos um UnitaryGate de dois qubits aleatório que será sintetizado no estágio inicial. A configuração de approximation_degree menor que 1.0 pode gerar um circuito aproximado. Também devemos especificar o endereço basis_gates para que o método de síntese saiba quais portas ele pode usar para a síntese aproximada.
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager
UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)
qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
optimization_level=1,
approximation_degree=0.85,
basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])Output:
2
Isso gera uma saída de 2 porque a aproximação requer menos portas CX.
Semente do gerador de números aleatórios
Algumas partes do transpilador são estocásticas, portanto, execuções repetidas de transpilação podem retornar resultados diferentes. Para obter um resultado reproduzível, você pode definir a semente para o gerador de números pseudoaleatórios usando o argumento seed_transpiler . Execuções repetidas usando a mesma semente retornarão os mesmos resultados.
Exemplo:
pass_manager = generate_preset_pass_manager(
optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")Output:
Layout inicial
Antes da transpilação, os qubits contidos em seu circuito são qubits virtuais que não correspondem necessariamente a qubits físicos no backend de destino. Você pode especificar o mapeamento inicial de qubits virtuais para qubits físicos usando o argumento initial_layout . Observe que o layout final do qubit pode ser diferente do layout inicial porque o transpilador pode permutar os qubits usando portas de troca ou outros meios.
No exemplo abaixo, construímos um layout inicial para o backend FakeSherbrooke backend simulado criando um objeto Layout objeto. Nosso layout mapeia o primeiro qubit do nosso circuito para o qubit 5 de Sherbrooke e mapeia o segundo qubit do nosso circuito para o qubit 6 de Sherbrooke. Observe que os qubits físicos são sempre representados por números inteiros.
Nestes exemplos, é utilizado o backend FakeSherbrooke``qiskit_ibm_runtime simulado do, mas você pode testá-lo em qualquer backend real ou simulado compatível com o Qiskit. Seus resultados podem ser diferentes.
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout
backend = FakeSherbrooke()
a, b = qubits
initial_layout = Layout({a: 5, b: 6})
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)Output:
Além de especificar um objeto Layout, você também pode passar uma lista de números inteiros, em que o -ésimo elemento da lista contém o qubit físico para o qual o -ésimo qubit deve ser mapeado. Por exemplo:
initial_layout = [5, 6]
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)Output:
Você pode usar a função plot_error_map para gerar um diagrama do gráfico do dispositivo com informações de erro e com os qubits físicos rotulados. Você também pode visualizar diagramas semelhantes na página Recursos de computação.
from qiskit.visualization import plot_error_map
plot_error_map(backend, figsize=(30, 24))Output:
Opções do estágio do transpiler e do plug-in
Essas opções são sufixadas com _method. Eles influenciam o funcionamento do transpilador e são usados para tentar obter um resultado melhor, diferente ou específico do transpilador.
-
init_method(str) - O plug-in a ser usado no estágio de inicialização. -
layout_method(str) - A passagem de seleção de layout (trivial,dense,sabre). Esse também pode ser o nome do plug-in externo a ser usado para o estágio de layout. -
optimization_method(str) - O plug-in a ser usado no estágio de otimização. -
routing_method(str) - Nome da passagem de roteamento (basic,lookahead,default,sabre,none). Esse também pode ser o nome do plug-in externo a ser usado para o estágio de roteamento. -
scheduling_method(str) - Nome do passe de agendamento. Esse também pode ser o nome do plug-in externo a ser usado na etapa de agendamento.as_soon_as_possible: Agende instruções com avidez: o mais cedo possível em um recurso de qubit (alias:asap).as_late_as_possible: Programar instruções com atraso. Ou seja, mantenha os qubits no estado fundamental sempre que possível (pseudônimo:alap).
-
translation_method(str) - Nome da passagem de tradução (unroller,translator,synthesis). Esse também pode ser o nome do plug-in externo a ser usado para o estágio de tradução. -
unitary_synthesis_method(str) - O nome do método de síntese unitária a ser usado. Por padrão,defaulté usado.
Para ver uma lista de todos os plug-ins instalados em um determinado estágio, execute list_stage_plugins("stage_name"). Por exemplo, se você quiser ver uma lista de todos os plug-ins instalados para o estágio de roteamento, execute list_stage_plugins(routing).
Próximas etapas
- Consulte o tópico Opções padrão e definições de configuração.
- Aprenda a definir o nível de otimização.
- Experimente o guia Comparar configurações do transpiler.
- Consulte a documentação da API do transpiler.